我有一个这样的命令:
\def\command#1{%
\calc{#1}%
\doStuff%
}
\calc
根据当前大小设置特定长度。因此,它无法在前导码中执行。这按预期工作。
但是我想定义一个新命令
\def\command2{%
\command{default}%
}
我该怎么做?我无法将上述内容放在序言中,因为编译器正在尝试评估\calc
并且发生了预期的错误。
答案1
答案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
后面跟着字符标记{
、d
、e
、 、、f
、a
和。u
l
t
}
\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
.)