\inputgraphic{}에 대한 인수인 \input{}

\inputgraphic{}에 대한 인수인 \input{}

이 게시물과 매우 유사한 질문을 받았습니다(\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

코멘트:

  1. 첫 번째 코드 \tmp에서는 \endlinechar. 하지만 \endlinechar=-1jfbu에서 제안한 로컬 설정이 더 나은 것 같아서 두 번째 코드에서는 이것을 사용합니다.

  2. 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

관련 정보