我收到了一个与这篇文章非常相似的问题(\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
如果你有一个创建文件的 shell 命令plot1
,shellout.tex
那么你可以简单地修改这个 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