この投稿と非常によく似た質問を受けました(\includegraphics{\input{|シェルコマンド}}) 残念ながら、実際には答えられていません。
目的は、Python スクリプトを呼び出してプロット図を作成し、それを LaTeX に挿入するコマンドを作成することです。これまでに試したことは次のとおりです。
メイン.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 の 2 番目の提案は機能しているようですが、同じプロットが 2 回含まれています。また、シェル コマンドと組み合わせる方法がわかりません。
誰かこれを手伝ってくれませんか?
答え1
ファイルshellout.tex
に生成されたファイル名が1行だけ含まれている場合は、
\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 の提案) 方が適切と思われるため、2 番目のコードではこれを使用します。\includegraphics{out1}
私見では、最も簡単な解決策は、 Python でを生成し\includegraphics{out2}
、次のように定義することです。\def\pytexplot#1{\immediate\write18{python pytexplot.py #1}\input shellout }
答え3
[コメントから移動]
すでに与えられた回答にさらにコンテキストを追加します:
一般的に、ファイル名のようなものを期待するLaTeXコマンドにマクロを引数として渡すことは期待できません。最良の場合(常にではありませんが)、コマンドは引数を展開しようとするタイプであり、この引数が拡張不可能物事によっては、コマンドが機能しない可能性が高くなります。
の場合、正当なファイル名に展開されるなら引数として\includegraphics
使用できます。しかし、定義が必要であったり、操作が含まれていたりすると、(いくらいじろうとしても)失敗します。\temp
\temp
\temp
\write
\expandafter