2010-07-15 26 views
42

que estoy tratando de hacer lo siguiente en LaTeX:¿Cómo ejecutar el script de shell desde LaTeX?

\documentclass{article} 
\begin{document} 
\execute{/usr/local/bin/my-shell-script.sh} 
\end{document} 

La idea es ejecutar /usr/local/bin/my-shell-script.sh en el momento de .tex procesamiento de documentos e inyectar su producción en la corriente del látex. ¿Es posible?

+1

Ver también http://stackoverflow.com/questions/2671079/how-can-i-save- shell-output-to-a-variable-in-latex –

+3

Es curioso cómo esto se cierra como 'fuera del tema'. – Orion

Respuesta

40

me gustaría hacer algo como lo siguiente (parcialmente motivado b Y lo que sugirió romana): hacer que su archivo de LaTeX ser

\documentclass{article} 
\begin{document} 
\input{scriptoutput.tex} 
\end{document} 

y generar el archivo scriptoutput.tex usando

/usr/local/bin/my-shell-script.sh > scriptoutput.tex 

Usted puede codificar esto en un makefile si desea que se ejecute automáticamente cuando es necesario. Como alternativa, puede utilizar el TeX \write18 command,

\documentclass{article} 
\immediate\write18{/usr/local/bin/my-shell-script.sh > scriptoutput.tex} 
\begin{document} 
\input{scriptoutput.tex} 
\end{document} 

y creo que eso se ejecute automáticamente el script cada vez que se compila el documento. El \immediate es necesario para garantizar que el script se ejecuta cuando LaTeX encuentra el comando, en lugar de esperar hasta que se escriba una página de salida. (Ver this question para más información sobre la rutina shipout.)

+0

Su solución es ciertamente más limpia que la mía. Sin embargo, el mío es útil si tienes muchas sustituciones. –

+2

+1 para makefile idea – Gabe

+0

David, muchas gracias, esto es exactamente lo que estaba buscando! – yegor256

-1

No creo que esto sea posible. Yo usaría un preprocesador simple para eso. Es decir. cambiar el documento a

\documentclass{article} 
\begin{document} 
%%OUTPUT%% 
\end{document} 

y preproceso con

#!/usr/bin/perl -lp 
BEGIN { $output = `/usr/local/bin/my-shell-script.sh`; } 
s/%%OUTPUT%%/$output/g; 

Comando:

perl so.pl template.tex > preprocessed.tex 

o en el lugar:

perl -i so.pl template.tex 
1

A menos que sea imprescindible que el script se ejecuta mientras látex se postulo que recomendaría usar sólo make ejecutar LaTeX y guión.

He utilizado ese enfoque para agregar conteo de palabras para artículos e incluir estadísticas sobre referencias bibliográficas.

Deje que su script genere un archivo .tex e inclúyalo en su archivo fuente LaTeX.

A continuación se muestra un fragmento de una de mis Makefile:

TEX = /usr/texbin/pdflatex 
PREVIEW = /usr/bin/open 

REPORT = SimMon 
REPORT_MASTER = $(REPORT).tex 

TEX_OPTIONS = -halt-on-error 

SimMon: $(REPORT_MASTER) countRefferedPages 
    $(TEX) $(TEX_OPTIONS) $(REPORT_MASTER) 
    @$(PREVIEW) $(REPORT).pdf 

countRefferedPages: BibTeXPageCount 
    cat *.tex | support/BPC/build/Debug/BPC Castle.bib > litteraturTotal.tex 
6

Usted puede hacer esto en TeX. Este paper (PDF) le muestra cómo escribir y ejecutar un virus dentro de TeX. Los mismos principios se aplican para ejecutar un script de shell. Sin embargo, en mi opinión, es más práctico escribir un archivo Makefile, que se ejecuta antes de ejecutar LaTeX e inserta el resultado.

28

Como señaló David, puede usar \write18 para llamar a programas externos, luego \input el archivo de salida resultante. Sin embargo, es probable que desee utilizar \immediate\write18 para asegurarse de que el script se ejecuta antes de llamar al \input.

Como alternativa, si utiliza las nuevas versiones de PDF tex (la) (después de 1,40, creo), se puede canalizar la salida directamente en el documento, mediante el uso de un comando de entrada entubada:

\documentclass{article} 
\begin{document} 
\input{|"/usr/local/bin/my-shell-script.sh"} 
\end{document} 

Para cualquiera de los dos métodos necesitará habilitar las llamadas al programa externo. Para las distribuciones de TeXlive, debe llamar al látex con la opción -shell-escape, o para MikTeX, creo que la opción es -enable-write18.

2

En Ubuntu 11.10 GNU/Linux

pdflatex --enable-pipes --shell-escape mytexfile 

con

... 
[This section currently is 
\input{|"wc kmb-box.tex| tr -s ' ' | cut -d' ' -f 4"} 
/2000 allowed characters] 

\input{kmb-box} 

... 

funciona muy bien. es decir, usa wordcount (wc) para informar cuántos caracteres hay en el archivo kmb-box.tex, que forma parte (incluido en) el documento.

(por cierto Si quisiera palabras en lugar de caracteres, sólo cambia el número en "-f 4")

+0

Recibo errores cuando cambio el comando a "ls". ¿Hay algún problema con las nuevas líneas en la salida del comando? –

Cuestiones relacionadas