使用未定义的标记作为参数

使用未定义的标记作为参数

我遇到了一个(可能)不太常见的问题。

伪代码:

\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

相关内容