\inputgraphic{} の引数としての \input{}

\inputgraphic{} の引数としての \input{}

この投稿と非常によく似た質問を受けました(\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

コメント:

  1. 最初のコードのは\tmp、 によって生成されたスペースを削除します\endlinechar。ただし、\endlinechar=-1ローカルに設定する (jfbu の提案) 方が適切と思われるため、2 番目のコードではこれを使用します。

  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

関連情報