定义包含无法在序言中执行的命令的命令

定义包含无法在序言中执行的命令的命令

我有一个这样的命令:

\def\command#1{%
    \calc{#1}%
    \doStuff%
}

\calc根据当前大小设置特定长度。因此,它无法在前导码中执行。这按预期工作。

但是我想定义一个新命令

\def\command2{%
    \command{default}%
}

我该怎么做?我无法将上述内容放在序言中,因为编译器正在尝试评估\calc并且发生了预期的错误。

答案1

如果您想要推迟某些操作以免在可预置中执行,则可以使用\AtBeginDocument{}\AtEndPreamble{}

参考:

答案2

\def\command#1{%
    \calc{#1}%
    \doStuff%
}
% ...
\def\command2{%
    \command{default}%
}

我想您误解了错误信息:

\def不会触发但会阻止评估。

但是在读取/标记 .tex 输入文件时,TeX 会将该序列标记\command2化为控制字标记,后面跟着类别 12(其他)的\command显式字符标记。2

因此,将\def\command2{\command{default}}控制字标记\command重新定义为由2和 分隔的东西,作为替换文本,它提供控制字标记来调用自身(这意味着不必要的递归) ,\command后面跟着字符标记{de、 、、fa和。ult}

\command任何尝试扩展不带尾随的宏2都会产生一条关于使用情况与其\command定义不匹配的消息。

即使 的第一个实例\command后面跟着 ,2您也会收到此消息,因为在这种情况下 的扩展\command 2\command {default}产生一个控制字标记的实例,\command而该实例后面没有2


你也许\makeatletter..\makeatother可以做类似的事情

\def\command#1{%
    \calc{#1}%
    \doStuff%
}%
% ... 
% defining the command:
\@namedef{command2}{%
    \command{default}%
}%
% ...
% calling/using the command:
\@nameuse{command2}%

\@namedef/\@nameuse内部用于\csname..\endcsname构造控制字标记,其名称也可能包含数字,如2.)

相关内容