이 게시물과 매우 유사한 질문을 받았습니다(\includegraphics{\input{|쉘 명령}}) 불행히도 실제로 답변되지 않았습니다.
목표는 Python 스크립트를 호출하여 플롯 그림을 만든 다음 LaTeX에 삽입하는 명령을 만드는 것입니다. 지금까지 시도한 것은 다음과 같습니다.
main.tex:
\newcommand\pytexplot[1]{
\immediate\write18{python pytexplot.py #1}
\input{shellout}
}
\begin{document}
\includegraphic{\pytexplot{plot1}}
\includegraphic{\pytexplot{plot2}}
\end{document}
pytexplot.py는 제공된 매개변수에 따라 다양한 플롯을 만들고 생성된 플롯의 이미지 이름과 위치가 포함된 shellout.tex 파일을 저장하는 Python 스크립트입니다.
이렇게 보고된 오류는 정의되지 않은 제어 시퀀스(총 100개 이상)이므로 별 도움이 되지 않을 것 같습니다..
지금까지 나는 그것이 매크로 확장과 관련이 있다고 생각하고 \expandafter
다른 위치에 배치하려고 시도했지만 소용이 없었습니다.
편집: Wipet의 두 번째 제안은 작동하는 것 같지만 동일한 플롯이 두 번 포함됩니다. 또한 쉘 명령과 결합하는 방법을 모르겠습니다.
누군가 나를 도와줄 수 있나요?
답변1
파일 shellout.tex
에 생성된 파일의 파일 이름이 포함된 한 줄만 포함되어 있는 경우
\usepackage{catchfile}
\newcommand{\includeplot}[2][]{%
\immediate\write18{python pytexplot.py #2}%
\CatchFileDef\plotpath{shellout.tex}{\endlinechar=-1 }%
\includegraphics[#1]{\plotpath}%
}
서문에서,
\includeplot{plot1}
문서에서 또는
\includeplot[<options for \includegraphics>]{plot1}
필요한 일을 해야 합니다.
답변2
plot1
파일 에 생성되는 쉘 명령이 있으면 shellout.tex
이 쉘 명령을 생성 순서대로 간단히 수정할 수 있습니다.
\includegraphics{plot1}
대신 파일 plot1
에서 간단합니다 shelloupt.tex
. 그리고 당신은 간단히 사용할 수 있습니다
\input shellout
plot1
그러나 쉘 명령이 파일 에서만 생성된다는 생각을 고집한다면 shellout.tex
코드는 약간 더 복잡해집니다.
{\everyeof={\noexpand}\xdef\filecontent{\csname @@input\endcsname shellout }}
\def\tmp#1 {\def\filecontent{#1}}\expandafter\tmp\filecontent
\expandafter\includegraphics\expandafter{\filecontent}
편집하다:질문이 편집되었으며 이 수정에 대한 반응은 다음과 같습니다.
정의할 수 있습니다.
\def\pytexplot#1{%
\immediate\write18{python pytexplot.py #1}%
{\endlinechar=-1\everyeof={\noexpand}\xdef\filecontent{\csname @@input\endcsname shellout }}%
\includegraphics\filecontents
}
그리고 당신은 사용할 수 있습니다
\pytexplot{plot1}
\pytexplot{plot2}
\includegraphics{\pytexplot{...}}
문서에 명시적으로 작성해야 하는 경우 위와 \includegraphics
같이 재정의해야 합니다 . 그러나 다른 요구에 맞게 명령을 사용하는 경우에는 이것이 그렇게 간단하지 않습니다. 재정의 에 더 많은 지능을 구현해야 합니다 .\pytexplot
\def\pytexplot#1{#1}
\includegraphics
\includegraphics
코멘트:
첫 번째 코드
\tmp
에서는\endlinechar
. 하지만\endlinechar=-1
jfbu에서 제안한 로컬 설정이 더 나은 것 같아서 두 번째 코드에서는 이것을 사용합니다.IMHO 가장 간단한 해결책은 Python으로 생성 하고 다음
\includegraphics{out1}
을\includegraphics{out2}
정의하는 것입니다.\def\pytexplot#1{\immediate\write18{python pytexplot.py #1}\input shellout }
답변3
[댓글에서 이동됨]
이미 제공된 답변에 대한 추가 컨텍스트를 제공하기 위해:
일반적으로 파일 이름이나 매크로 같은 것을 인수로 기대하는 일부 LaTeX 명령에 전달할 수는 없습니다. 기껏해야 (항상 그런 것은 아니지만) 명령은 인수를 확장하려고 시도하는 유형이 될 것이며 이 인수가 확장되자마자확장할 수 없는즉, 명령이 작동하지 않을 가능성이 매우 높습니다.
경우에 합법적인 파일 이름으로 확장 되면 인수 \includegraphics
로 사용할 수 있습니다 . 그러나 정의를 내려야 하거나 작업이 포함되어 있으면 운명이 정해져 있습니다(아무리 많이 조작하려고 해도).\temp
\temp
\temp
\write
\expandafter