![使用未定义的标记作为参数](https://linux22.com/image/337499/%E4%BD%BF%E7%94%A8%E6%9C%AA%E5%AE%9A%E4%B9%89%E7%9A%84%E6%A0%87%E8%AE%B0%E4%BD%9C%E4%B8%BA%E5%8F%82%E6%95%B0.png)
我遇到了一个(可能)不太常见的问题。
伪代码:
\def\head{\titel } % \titel = undefined
\func{\head} % func is defined and handles \titel without any issues
\func{\titel} % throws an exception
发布实际代码(超过 3 页)不是一个好主意,也不可能在 MWE 中重现它。如果我可以重现它,我可能自己就能解决它。我已经尝试过\unexpanded
了\noexpand
。
我想要在这里得到的是:提示导致此问题的原因。如果需要,我可以为您提供整个代码。但这至少需要两个文件。
编辑1:
已删除,因为没有关于该问题的更多有用信息
编辑2:
这是核心函数。它打印 的每个标记#4
。如果任何标记未定义,它将调用函数\GFM@<tokenWithRemoved'\'>
。实际上,此函数应该递归工作,但它会在内部函数中引发错误(因为参数未定义)。#4
可能需要 double {{ }}
。
\def\printLayout#1#2#3#4{{%#1=Liederbuch #2=Liednummer '#3=Liedvariante
%
%Definition of subroutines
%
\def\rest{\empty}%
%
\def\eaterB##1##2;{##2}%
%
\def\printer##1##2;{%
\ifx##1\undefined%
\edef\tempDefA{\expandafter\eaterB\string##1;}%
\csname GFM@\tempDefA\endcsname% !!!What will be called if undefined!!!
\else%
##1%
\fi%
\edef\rest{\expandafter\unexpanded{##2}}%
}%
%
%
%Actual routine
%
\let\rest#4%
\newif\iflooping%
\loopingtrue%
\loop%
\ifx\rest\empty%
\loopingfalse%
\else%
\expandafter%
\printer\rest;\relax%
\fi%
\iflooping\repeat%
}}
我决定在这个项目中采用不同的方法。Edit2 适用于遇到类似问题并被这个问题困扰的人。您可以但不需要解决这个问题。
答案1
您没有提供太多信息,但是这个纯 tex 文件显示了所描述的行为,第一次调用有效,第二次调用出现错误。
\def\func#1{\expandafter\string#1}
\def\head{\titel } % \titel = undefined
\func{\head} % func is defined and handles \titel without any issues
\func{\titel}
\bye