\input{} 作為 \inputgraphic{} 的參數

\input{} 作為 \inputgraphic{} 的參數

我有一個與這篇文章非常相似的問題(\includegraphics{\input{|shell 指令}})不幸的是還沒有得到真正的答案。

目的是創建一個命令來呼叫 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 是一個 Python 腳本,它根據提供的參數繪製不同的圖,並保存一個檔案 shellout.tex,其中包含生成的圖圖像的名稱和位置。

由此報告的錯誤是一個未定義的控制序列(總共100+),所以我擔心這不會有太大幫助..

到目前為止,我認為這與巨集擴展有關,並嘗試將其放在\expandafter不同的位置,但無濟於事。

編輯:wipet 的第二個建議似乎有效,但它包含兩個相同的情節。另外,我不知道如何將它與 shell 命令結合起來

有人可以幫我解決這個問題嗎?

答案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

當您有一個plot1shellout.tex檔案中建立的 shell 命令時,您可以簡單地修改此 shell 命令以使其創建

\includegraphics{plot1}

plot1在文件中很簡單shelloupt.tex。你可以簡單地使用

\input shellout

但是,如果您堅持認為 shell 命令僅在文件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. 恕我直言,最簡單的解決方案是透過 python 產生\includegraphics{out1},\includegraphics{out2}並定義: \def\pytexplot#1{\immediate\write18{python pytexplot.py #1}\input shellout }

答案3

[摘自評論]

只是為了為已經給出的答案提供額外的背景:

一般來說,你不能希望傳遞給某些 LaTeX 指令,期望像是檔名、巨集這樣的東西作為參數;最好(但並非總是)該命令將是嘗試擴展其參數的類型,並且一旦該參數擴展不可擴展的事情,該命令很可能無法運行。

在這種情況下,\includegraphics您可以將它與擴展為合法檔案名稱的\temp參數一起使用。\temp但如果\temp需要定義,或包含一個\write操作,你就注定失敗(無論\expandafter你嘗試擺弄多少個)

相關內容