使 \def 的模式依赖于另一个宏

使 \def 的模式依赖于另一个宏

我想设置一个类似这样的宏定义:

\def\processline string: #1.#2\relax{\gdef\errorline{#1}}

问题是字符串应该由另一个宏的内容给出。我尝试使用\expandafters 来执行此操作,但结果出错了。(请注意,下面的代码保存在名为 的文件中errortest.tex。)

\documentclass{article}
\edef\filename{\jobname-funny_name}
\def\processline errortest-funny_name.asy: #1.#2\relax{\gdef\errorline{#1}}
% The following line does not work:
%\expandafter\def\expandafter\processline\filename.asy: #1.#2\relax{\gdef\errorline{#1}}
\edef\oneline{errortest-funny_name.asy: 5.6 syntax error}
{\expandafter\processline\oneline\relax}

\begin{document}
stuff

\errorline
\end{document}

为什么会失败?如何才能让它发挥作用?

答案1

这是类别代码问题,\jobname展开时不会产生正常的类别代码。您可以使用以下方法解决此问题\scantokens

\documentclass{article}

\edef\filename{\scantokens\expandafter{\jobname\noexpand}-funny_name}
\expandafter\def\expandafter\processline\filename.asy: #1.#2\relax{\gdef\errorline{#1}}
\edef\oneline{errortest-funny_name.asy: 5.6 syntax error}
{\expandafter\processline\oneline\relax}

\begin{document}
stuff

\errorline
\end{document}

或者,您也可以\filename直接在定义中使用\oneline(这样做的好处是允许在处理的文件名中使用更多外来字符):

\documentclass{article}

\edef\filename{\jobname-funny_name}
\expandafter\def\expandafter\processline\filename.asy: #1.#2\relax{\gdef\errorline{#1}}
\expandafter\edef\expandafter\oneline\expandafter{\filename.asy: 5.6 syntax error}
{\expandafter\processline\oneline\relax}

\begin{document}
stuff

\errorline
\end{document}

相关内容