如何使用宏作为 \includegraphics 的(主要)参数

如何使用宏作为 \includegraphics 的(主要)参数

免责声明:我已经尝试寻找答案,但我找到的所有内容都与选修的\includegraphics或其他宏及其特定实现的参数。

我正在开发一个包含使用外部程序生成的图像的(LuaLaTeX)包。

\lily{ c' }

将内容包装c'到适当的文档中,调用 LilyPond 乐谱编写器来生成乐谱,然后将生成的 PDF 包含在文档中.tex(使用类似tex.print('\includegraphics{<resulting-file-hash>}')

为了使二次封装能够使用生成的结果我实现了一个选项raw-pdf,而不是发出\includegraphics简单地将生成的哈希打印回 .tex 文档(tex.sprint(<generated-filename>)

\lily[raw-pdf]{ c' }

正常工作并将在编译的.tex 文档中打印生成的文件名。

但当我尝试做

\includegraphics{\lily[raw-pdf]{ c' }}

我收到错误

! TeX capacity exceeded, sorry [input stack size=5000].
<argument> \@protected@testopt \lily 
                      \\lily {}[raw-pdf]{ c' }
l.19 ...dafter\includegraphics{\lily[raw-pdf]{ c' }}

我猜想这与扩张有关,但我完全不知道到底发生了什么。有人告诉我尝试

\expandafter\includegraphics{\lily[raw-pdf]{ c' }}

但这没有帮助。

这是一个完整的最小示例

\documentclass{scrartcl}
\usepackage{lyluatex}
\begin{document}
\includegraphics{\lily[raw-pdf]{ c' }}
\end{document}

请注意,lyluatex必须使用来自https://github.com/jperon/lyluatex而不是 TeXLive 中已有的版本!

答案1

您可以使用扩展到参数中的名称的宏,但不能使用任意定义,您的示例如下

 \includegraphics{\def\foo{aaa}\def\zz{bbb}\foo\zz}

这是行不通的。

工作是什么

  \def\foo{aaa}\def\zz{bbb}\includegraphics{\foo\zz}

因此,您需要安排您使用的宏返回某个宏中的名称,然后该宏可以与一起使用\includegraphics

也就是说

为了让辅助包能够使用生成的结果,我实现了一个选项raw-pdf,它不是\includegraphics简单地将生成的哈希打印回 .tex 文档(tex.sprint(<generated-filename>))

你可能想要\lily[raw-pdf]{..}定义一个宏,\lilyrawpdf 然后你可以这样做

\lily[raw-pdf]{...}\includegraphics{\lilyrawpdf}

请注意,这并不特定于\includegraphics如果你看看你自己的\lily命令,很可能

\lily{\def\foo{c}\foo}

不像

\lily{c}

或者

\def\foo{c}\lily{\foo}

相关内容