Recibí una pregunta muy similar a esta publicación (\includegraphics{\input{|comando shell}}) que lamentablemente no ha sido realmente respondida.
El objetivo es crear un comando que invoque un script en Python para crear una figura argumental, que luego se inserta en LaTeX. Lo que he probado hasta ahora es lo siguiente:
principal.tex:
\newcommand\pytexplot[1]{
\immediate\write18{python pytexplot.py #1}
\input{shellout}
}
\begin{document}
\includegraphic{\pytexplot{plot1}}
\includegraphic{\pytexplot{plot2}}
\end{document}
pytexplot.py es un script de Python que crea diferentes gráficos según el parámetro proporcionado y guarda un archivo shellout.tex que contiene el nombre y la ubicación de la imagen del gráfico generado.
El error así informado es una secuencia de control indefinida (más de 100 en total), por lo que me temo que esto no ayudará mucho.
Hasta ahora pensé que tenía que ver con expansiones macroeconómicas e intenté colocarlas \expandafter
en diferentes posiciones, pero fue en vano.
EDITAR: la segunda sugerencia de Wipet parece funcionar, pero incluye la misma trama dos veces. Además, no sé cómo combinarlo con el comando de shell.
¿Alguien podría ayudarme con esto?
Respuesta1
Si el archivo shellout.tex
solo contiene una línea con el nombre del archivo generado, entonces
\usepackage{catchfile}
\newcommand{\includeplot}[2][]{%
\immediate\write18{python pytexplot.py #2}%
\CatchFileDef\plotpath{shellout.tex}{\endlinechar=-1 }%
\includegraphics[#1]{\plotpath}%
}
en el preámbulo, con
\includeplot{plot1}
en el documento o
\includeplot[<options for \includegraphics>]{plot1}
debe hacer lo que necesita.
Respuesta2
Cuando tiene un comando de shell que crea plot1
en shellout.tex
un archivo, simplemente puede modificar este comando de shell para que cree
\includegraphics{plot1}
en lugar simple plot1
en el shelloupt.tex
archivo. Y puedes simplemente usar
\input shellout
Pero si insistes en la idea de que tu comando de shell crea solo plot1
en tu shellout.tex
archivo, entonces el código es un poco más complicado:
{\everyeof={\noexpand}\xdef\filecontent{\csname @@input\endcsname shellout }}
\def\tmp#1 {\def\filecontent{#1}}\expandafter\tmp\filecontent
\expandafter\includegraphics\expandafter{\filecontent}
Editar:La pregunta fue editada, a continuación se muestra la reacción a esta modificación.
puedes definir
\def\pytexplot#1{%
\immediate\write18{python pytexplot.py #1}%
{\endlinechar=-1\everyeof={\noexpand}\xdef\filecontent{\csname @@input\endcsname shellout }}%
\includegraphics\filecontents
}
y solo puedes usar
\pytexplot{plot1}
\pytexplot{plot2}
Si necesita escribir explícitamente \includegraphics{\pytexplot{...}}
en su documento, debe redefinir \includegraphics
como \pytexplot
se indicó anteriormente y \def\pytexplot#1{#1}
. Pero si está utilizando el comando \includegraphics
para otras necesidades, entonces esto no es tan simple. Necesita implementar más inteligencia en su \includegraphics
redefinición.
Comentarios:
En
\tmp
mi primer código elimina el espacio generado por\endlinechar
. Pero configurarlo\endlinechar=-1
localmente (sugerido por jfbu) parece ser mejor, así que lo uso en mi segundo código.En mi humilde opinión, la solución más simple es generar
\includegraphics{out1}
,\includegraphics{out2}
mediante Python y definir:\def\pytexplot#1{\immediate\write18{python pytexplot.py #1}\input shellout }
Respuesta3
[movido de un comentario]
Solo para proporcionar contexto adicional a las respuestas ya dadas:
En general, no se puede esperar pasar a algún comando de LaTeX esperando algo como un nombre de archivo, una macro como argumento; en el mejor de los casos (y no siempre) el comando será del tipo que intenta expandir su argumento, y tan pronto como este argumento lo hagano ampliablecosas, es muy probable que el comando no funcione.
En el caso de, \includegraphics
puede usarlo \temp
como argumento si \temp
se expande a un nombre de archivo legítimo. Pero si \temp
necesita hacer definiciones o contiene una \write
operación, está condenado (no importa \expandafter
con cuántas intente manipular)