命令定义中的非字母名称

命令定义中的非字母名称

我想定义类似的命令,一个带下划线,另一个不带下划线。然而,这种方法会抛出一个错误

\def\Fix#1{\mathrm{Fix}(#1)}
\def\Fix_#1#2{\mathrm{Fix}_{\,#1}(#2)}

我尝试更改下划线的 catcode 并将其重新设置,但\Fix_似乎完全一样\Fix

\def\Fix#1{\mathrm{Fix}(#1)}
\catcode`\_=11
\def\Fix_#1#2{\mathrm{Fix}_{\,#1}(#2)}
\catcode`\_=8

正确的做法是什么?

答案1

第一种方法行不通,因为 TeX 不能对同一个命令有两个定义,所以第二个定义会覆盖第一个。第二种方法有点行得通,因为你有两个命令,\Fix\Fix_,但你无法\Fix_正常访问。

您必须定义\Fix以提前查找可选的_。例如\@ifnextchar

\documentclass{article}
\makeatletter
\DeclareRobustCommand\Fix{\@ifnextchar_{\@FixU}{\@Fix}}
\def\@Fix#1{\mathrm{Fix}(#1)}
\def\@FixU_#1#2{\mathrm{Fix}_{\,#1}(#2)}
\makeatother
\begin{document}
$\Fix{a}$ and $\Fix_{b}{a}$
\end{document}

或者,更简单(并且更强大),使用xparse

\documentclass{article}
\usepackage{xparse}
\NewDocumentCommand\Fix { e{_} m }
  {\mathrm{Fix}\IfValueT{#1}{_{\,#1}}(#2)}
\begin{document}
$\Fix{a}$ and $\Fix_{b}{a}$
\end{document}

两份文件均表明:

在此处输入图片描述

相关内容