2009-06-24 12 views
52

Llamo a pdflatex desde dentro de mi programa (C++) usando el sistema(), no hace falta decir que todo lo que pone en pantalla la basura pdflatex es un poco irritante en este caso.Ejecutar pdflatex silenciosamente

Entonces ... ¿cómo animo a pdflatex a renunciar a las salidas largas? Sería aún mejor si sólo los errores serían visibles ...

+1

Relatex en tex SE: http://tex.stackexchange.com/questions/27878/pdflatex-bash-script-to-supress-all-output-except-error-messages –

Respuesta

22

simplemente ignorar todas las salidas, redirigir la salida estándar pdflatex a/dev/null:

system("pdflatex yourdocument >/dev/null"); 

Es posible que desee añadir \nonstopmode al principio de su documento para indicarle a tex que continúe incluso cuando encuentre errores.

Para obtener los mensajes de error, canalice la salida pdflatex a su programa y busque errores en las filas que comienzan con !, p.

FILE *outputf = popen("pdflatex yourdocument", "r"); 

// ... read and analyze output from outputf ... 

pclose(outputf); 
+2

No estoy seguro si pdflatex lo hace , pero muchos programas de línea de comandos escriben en stdout (que será capturado por su ">/dev/null") y stderr (que no lo hará). Para silenciar * ambos *, agregue "2> & 1" después de su cadena del sistema() existente. –

+2

También: En Windows, el dispositivo necesario simplemente se llama "NUL" (nota 1 "L"), no "/ dev/null". La parte "2> & 1" funciona como * nix. –

+0

El problema con esto es que si tiene un error, pdflatex se detiene, esperando la entrada, pero nunca lo entendería. La respuesta de Will Robertson es mejor (aunque pdflatex aún muestra un par de líneas) – Shahbaz

61

Desafortunadamente (La) TeX en realidad no cumplir con las reglas de stdout y sterr, debido (supongo) a sus orígenes en los años 80. Pero hay algunos modificadores que puede invocar para alterar la cantidad de información que se muestra.

Ejecute latex con los conmutadores -interaction=nonstopmode o -interaction=batchmode para un comportamiento sin interrupciones incluso en el caso de un error de sintaxis. nonstopmode imprimirá todas las líneas habituales, simplemente no se detendrá. batchmode suprimirá todas menos unas pocas líneas declarativas ("esto es pdfTeX v3.14 ...").

También se pueden invocar desde el documento con \batchmode y \nonstopmode, pero esto es menos útil para la situación que está describiendo.

+0

¿Qué quiere decir con "en realidad no cumple con las reglas de' stdout' y 'stderr'?" ¿Utiliza otras transmisiones de salida? –

+0

@Matthew Ha pasado un tiempo desde que miré esto, pero mi memoria es que tratar de redirigir solo, por ejemplo, los mensajes de error en algún lugar no funciona en absoluto. Pero podría estar equivocado; perdón por ser vago –

+0

@Matthew Leingang: por casualidad encontré [Re: silenciamiento del látex (modo silencioso/por lotes)?] (Http://newsgroups.derkeiler.com/Archive/Comp/comp.text.tex/2007-09/msg00520.html); Creo que eso aclara? ¡Aclamaciones! – sdaau

Cuestiones relacionadas