是否可以仅在特定命令中重新定义下划线?这有点相关于:重新定义下划线以产生罗马下标
我想:
\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