\input{} como argumento para \inputgraphic{}

\input{} como argumento para \inputgraphic{}

Recebi uma pergunta muito parecida com esta postagem (\includegraphics{\input{|comando shell}}) que infelizmente não foi realmente respondido.

O objetivo é fazer um comando que invoque um script python para fazer uma figura de plotagem, que é então inserida em LaTeX. O que tentei até agora é o seguinte:

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 é um script python que faz plotagens diferentes dependendo do parâmetro fornecido e salva um arquivo shellout.tex contendo o nome e localização da imagem da plotagem gerada.

O erro relatado é uma sequência de controle indefinida (mais de 100 no total), então temo que isso não ajude muito.

Até agora achei que tinha a ver com expansões macro e tentei colocar \expandafterem posições diferentes, mas sem sucesso.

EDIT: a segunda sugestão do limpet parece funcionar, mas inclui o mesmo enredo duas vezes. Além disso, não sei como combiná-lo com o comando shell

Alguém poderia me ajudar nisso?

Responder1

Se o arquivo shellout.texcontiver apenas uma linha com o nome do arquivo gerado, então

\usepackage{catchfile}
\newcommand{\includeplot}[2][]{%
  \immediate\write18{python pytexplot.py #2}%
  \CatchFileDef\plotpath{shellout.tex}{\endlinechar=-1 }%
  \includegraphics[#1]{\plotpath}%
}

no preâmbulo, com

\includeplot{plot1}

no documento ou

\includeplot[<options for \includegraphics>]{plot1}

deve fazer o que você precisa.

Responder2

Quando você tem um comando shell que cria plot1um shellout.texarquivo, você pode simplesmente modificar esse comando shell para que ele crie

\includegraphics{plot1}

em vez disso, simples plot1no shelloupt.texarquivo. E você pode simplesmente usar

\input shellout

Mas se você insiste na ideia de que seu comando shell cria apenas plot1em seu shellout.texarquivo então o código é um pouco mais complicado:

{\everyeof={\noexpand}\xdef\filecontent{\csname @@input\endcsname shellout }}
\def\tmp#1 {\def\filecontent{#1}}\expandafter\tmp\filecontent
\expandafter\includegraphics\expandafter{\filecontent}

Editar:A pergunta foi editada, segue a reação a esta modificação.

Você pode definir

\def\pytexplot#1{%
   \immediate\write18{python pytexplot.py #1}%
   {\endlinechar=-1\everyeof={\noexpand}\xdef\filecontent{\csname @@input\endcsname shellout }}%
   \includegraphics\filecontents
}

e você pode usar apenas

\pytexplot{plot1}
\pytexplot{plot2}

Se você precisar escrever explicitamente \includegraphics{\pytexplot{...}}em seu documento, será necessário redefinir \includegraphicscomo \pytexplotacima e \def\pytexplot#1{#1}. Mas se você estiver usando o comando \includegraphicspara outras necessidades, isso não é tão simples. Você precisa implementar mais inteligência em sua \includegraphicsredefinição.

Comentários:

  1. O \tmpno meu primeiro código remove o espaço gerado por \endlinechar. Mas a configuração \endlinechar=-1local (sugerida pelo jfbu) parece ser melhor, então uso isso no meu segundo código.

  2. A solução mais simples da IMHO é gerar o \includegraphics{out1}, \includegraphics{out2}por python e definir: \def\pytexplot#1{\immediate\write18{python pytexplot.py #1}\input shellout }

Responder3

[movido de um comentário]

Apenas para fornecer contexto adicional às respostas já dadas:

Você não pode, em geral, esperar passar para algum comando LaTeX esperando algo como um nome de arquivo, uma macro como argumento; na melhor das hipóteses (e nem sempre), o comando será do tipo que tenta expandir o seu argumento, e assim que este argumento o fizerinexpansívelcoisas, é altamente provável que o comando não funcione.

No caso de \includegraphicsvocê pode usá-lo \tempcomo argumento se \tempexpandir para um nome de arquivo legítimo. Mas se \tempprecisar fazer definições ou contiver uma \writeoperação, você está condenado (não importa com quantas \expandaftervocê tente mexer)

informação relacionada