我有一個與這篇文章非常相似的問題(\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
當您有一個plot1
在shellout.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
重新定義實施更多智慧。
評論:
\tmp
我的第一個程式碼中的 刪除了\endlinechar
.但\endlinechar=-1
本地設定(jfbu 建議)似乎更好,所以我在第二個程式碼中使用它。恕我直言,最簡單的解決方案是透過 python 產生
\includegraphics{out1}
,\includegraphics{out2}
並定義:\def\pytexplot#1{\immediate\write18{python pytexplot.py #1}\input shellout }
答案3
[摘自評論]
只是為了為已經給出的答案提供額外的背景:
一般來說,你不能希望傳遞給某些 LaTeX 指令,期望像是檔名、巨集這樣的東西作為參數;最好(但並非總是)該命令將是嘗試擴展其參數的類型,並且一旦該參數擴展不可擴展的事情,該命令很可能無法運行。
在這種情況下,\includegraphics
您可以將它與擴展為合法檔案名稱的\temp
參數一起使用。\temp
但如果\temp
需要定義,或包含一個\write
操作,你就注定失敗(無論\expandafter
你嘗試擺弄多少個)