\input{} como argumento para \inputgraphic{}

\input{} como argumento para \inputgraphic{}

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 \expandafteren 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.texsolo 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 plot1en shellout.texun archivo, simplemente puede modificar este comando de shell para que cree

\includegraphics{plot1}

en lugar simple plot1en el shelloupt.texarchivo. Y puedes simplemente usar

\input shellout

Pero si insistes en la idea de que tu comando de shell crea solo plot1en tu shellout.texarchivo, 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 \includegraphicscomo \pytexplotse indicó anteriormente y \def\pytexplot#1{#1}. Pero si está utilizando el comando \includegraphicspara otras necesidades, entonces esto no es tan simple. Necesita implementar más inteligencia en su \includegraphicsredefinición.

Comentarios:

  1. En \tmpmi primer código elimina el espacio generado por \endlinechar. Pero configurarlo \endlinechar=-1localmente (sugerido por jfbu) parece ser mejor, así que lo uso en mi segundo código.

  2. 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, \includegraphicspuede usarlo \tempcomo argumento si \tempse expande a un nombre de archivo legítimo. Pero si \tempnecesita hacer definiciones o contiene una \writeoperación, está condenado (no importa \expandaftercon cuántas intente manipular)

información relacionada