根据每个命令重新定义下划线。

根据每个命令重新定义下划线。

是否可以仅在特定命令中重新定义下划线?这有点相关于:重新定义下划线以产生罗马下标

我想:

\mycmd       -->    S
\mycmd_0     -->    S_{modifier 0}
\mycmd_t     -->    S_{modifier t}
\othercmd_0  -->    X_0
Y_t          -->    Y_t

所以我希望将下划线的修改限制在 \mycmd 内。

答案1

是的,这是可能的。你只需要定义\mycmd正确的方法。

如果modifier是一个接受参数的宏(如\mathrm),那么您只需执行以下操作:

\makeatletter
\def\mycmd{%
    S% <- put the actual \mycmd here.
    \@ifnextchar_{_\expandafter\mathrm\@gobble}{}%
}
\makeatother

\@ifnextchar#1#2#3是来自 LaTeX 内核的一个宏,它仅检查以下字符是否等于#1。如果是,则执行#2,否则执行#3。在我们的例子中,我们检查是否\mycmd后面跟着下划线(请注意,任何空格都会被删除)。如果是,则_\expandafter\mathrm\@gobble执行。这\mathrm是实际的modifier。我们希望在修饰符之前加上下划线,因此我们在开头插入它并删除用户输入的下划线\@gobble\@gobble只是删除它的参数)。确保在查找其参数\expandafter之前删除下划线(否则会尝试将其作为其参数,导致错误)。\mathrm\mathrm\@gobble

如果\modifier的行为类似于\itshape\color,则必须做一些更复杂的事情才能获得正确的分组:

\makeatletter
\def\myothercmd{%
    T%
    \@ifnextchar_{\myothercmd@}{}%
}
\def\myothercmd@_#1{%
    _{{\color{red}#1}}%
}
\makeatother

这里,在搜索其参数时删除了下划线\myothercmd@,该参数指定为_#1。然后将下划线后的组(即#1)与下划线和其前面的修饰符一起重新插入。当然,此解决方案也适用于第一种情况的修饰符,例如定义\myothercmd@_{\mathrm{#1}}


如果你还想允许上标,你可以使用

\makeatletter
\def\mycmd{%
    T%
    \@ifnextchar_{\mycmd@d}{\@ifnextchar^{\mycmd@u}{}}%
}
\def\mycmd@d_#1{%
    _{{\color{red} #1}}%
    \@ifnextchar^{\mycmd@u}{}%
}
\def\mycmd@u^#1{%
    ^{\mathrm{#1}}%
    \@ifnextchar_{\mycmd@d}{}%
}
\makeatother

相关内容