\expandafter 在宏调用之前展开宏

\expandafter 在宏调用之前展开宏

我正在尝试添加一张图片:

\documentclass{article}
\usepackage{graphicx}
\begin{document}

\newcommand{\ext}{.pdf}

\def\incPIC#1{ \expandafter\includegraphics{#1}}

{
\tracingmacros=1
\tracingassigns=1
\incPIC{../graphics/PerformancePlots/figureTree-P-0-10\ext}
}

\end{document}

上面的方法不起作用,因为\ext首先在命令内部深处展开\includegraphics,我想在调用之前展开它\includegraphics?我做错了什么。不应该先\expandafter展开吗#1

答案1

\expandafter命令尝试扩展一个级别紧跟下一个标记。

使用您的代码,尝试的令牌是{,它是不可扩展的。

使用 不可能到达参数中的最后一个标记\expandafter,因为您不知道有多少个标记。

不过,有些技巧是可行的。最简单的方法是强制完全展开参数:

\documentclass{article}
\usepackage{graphicx}

\newcommand{\ext}{.jpg}

\newcommand\incPIC[1]{%
  \begingroup\edef\x{\endgroup
    \noexpand\includegraphics{#1}%
  }\x
}

\begin{document}

\incPIC{example-image\ext}

\end{document}

另一方面,\ext最好在定义中这样写:

\documentclass{article}
\usepackage{graphicx}

\newcommand{\ext}{.jpg}

\newcommand\incPIC[1]{%
  \begingroup\edef\x{\endgroup
    \noexpand\includegraphics{#1\ext}%
  }\x
}

\begin{document}

\incPIC{example-image}

\end{document}

xparse使用 和的不同技巧expl3,因此也很容易容纳 的可选参数\includegraphics

\documentclass{article}
\usepackage{graphicx}
\usepackage{xparse}

\newcommand{\ext}{.jpg}

\ExplSyntaxOn
\cs_new_protected:Nn \gabriel_includegraphics:nnn
 {
  \includegraphics[#2]{#3#1}
 }
\cs_generate_variant:Nn \gabriel_includegraphics:nnn { V }

\NewDocumentCommand\incPIC {O{}m}
 {
  \gabriel_includegraphics:Vnn \ext { #1 } { #2 }
 }
\ExplSyntaxOff

\begin{document}

\incPIC{example-image}

\incPIC[width=3cm]{example-image}

\end{document}

也可以看看选择在 PDFLaTeX 中是否包含 PDF 或 PNG针对不同的策略。

相关内容