\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

如果你有一个创建文件的 shell 命令plot1shellout.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重新定义实施更多的智能。

评论:

  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

相关内容