我想定义类似的命令,一个带下划线,另一个不带下划线。然而,这种方法会抛出一个错误
\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}
两份文件均表明: