我想设置一个类似这样的宏定义:
\def\processline string: #1.#2\relax{\gdef\errorline{#1}}
问题是字符串应该由另一个宏的内容给出。我尝试使用\expandafter
s 来执行此操作,但结果出错了。(请注意,下面的代码保存在名为 的文件中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}