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 \expandafter
em 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.tex
contiver 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 plot1
um shellout.tex
arquivo, você pode simplesmente modificar esse comando shell para que ele crie
\includegraphics{plot1}
em vez disso, simples plot1
no shelloupt.tex
arquivo. E você pode simplesmente usar
\input shellout
Mas se você insiste na ideia de que seu comando shell cria apenas plot1
em seu shellout.tex
arquivo 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 \includegraphics
como \pytexplot
acima e \def\pytexplot#1{#1}
. Mas se você estiver usando o comando \includegraphics
para outras necessidades, isso não é tão simples. Você precisa implementar mais inteligência em sua \includegraphics
redefinição.
Comentários:
O
\tmp
no meu primeiro código remove o espaço gerado por\endlinechar
. Mas a configuração\endlinechar=-1
local (sugerida pelo jfbu) parece ser melhor, então uso isso no meu segundo código.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 \includegraphics
você pode usá-lo \temp
como argumento se \temp
expandir para um nome de arquivo legítimo. Mas se \temp
precisar fazer definições ou contiver uma \write
operação, você está condenado (não importa com quantas \expandafter
você tente mexer)