我不擅长 TeX 编程。我寻找了检测宏中参数的下标或上标的方法。使用包的现有相关答案xifthen
(检测命令参数中的下标) 对我来说有点冗长,难以理解。具体来说,我想创建一个宏,如果参数有下标,则\dot{}
仅应用于基字符。它的形式为
\newcommand{\rdot}[1]{'code body'}
例如,\rdot{a_{bcd}}
将给出
代替得出\dot{a_{bcd}}
。\rdot
应以相同的方式应用于上标。
编辑:我注意到答案中的一些宏对于粗体字母会产生不同的结果。例如,考虑\rdot{\bf{v}_{abc}}
。我不知道它会产生如此大的不同。
答案1
答案2
这个问题也一直困扰着我。例如,如果你定义一个命令,\abcd
将其扩展为a_{bcd}
,那么\dot{\abcd}
它将扩展为\dot{a_{bcd}}
而不是\dot{a}_{bcd}
。你可以用自己的方法解决这个问题,但它永远无法足够强大地覆盖你可能遇到的所有情况。这是我开发这个包的部分动机,semantex
它允许这样的事情工作,但使用不同的语法:
\documentclass{article}
\usepackage{semantex}
\NewVariableClass\MyVar[
output=\MyVar,
define keys={
{dot}{ command=\dot },
},
]
\NewObject\MyVar\va{a}
\NewObject\MyVar\vb{b}
\NewObject\MyVar\vc{c}
\NewObject\MyVar\vd{d}
\NewObject\MyVar\vect{\mathbf{v}}[sep i=\va]
\begin{document}
\( \va[\vb\vc\vd, dot] \)
\( \va[\vb\vc\vd][dot] \)
\NewObject\MyVar\abcd[copy=\va,sep i=\vb\vc\vd]
\( \abcd[dot] \)
\( \vect[dot] \)
\end{document}
答案3
您可以使用命令\IfSubStr
(包中的xstring
)检查参数是否包含_
,然后使用\StrBefore
和\StrBehind
。如果变量由多个字符组成,这也会将点置于变量的中心。
代码:
\documentclass{article}
\usepackage{xstring}
\makeatletter
\newcommand{\rdot}[1]{%
\IfSubStr{#1}{_}{%
\StrBefore{#1}{_}[\@tempa]%
\StrBehind{#1}{_}[\@tempb]%
\dot{\@tempa}_{\@tempb}%
}{%
#1%
}%
}
\makeatother
\begin{document}
$\rdot{a}, \rdot{a_{bcd}}, \rdot{asdf_{bcd}}$
\end{document}
结果:
答案4
我相信打字更自然\dot{a}_{x}
,但如果你真的想,你可以做到。
\documentclass{article}
\ExplSyntaxOn
\NewDocumentCommand{\rdot}{m}
{
\hermis_check_subsup:nn { \dot } { #1 }
}
% define analogously \rddot` and so on
\cs_new_protected:Nn \hermis_check_subsup:nn
{
\regex_match:nnTF { (\^|\_) } { #2 }
{% there is a _ or ^ in the argument
\tl_set:Nn \l_tmpa_tl { #2 }
\regex_replace_once:nnN { (.*?)(\^|\_)(.*) } { \c{dot}\cB\{\1\cE\}\2\3 } \l_tmpa_tl
\tl_use:N \l_tmpa_tl
}
{% no _ or ^ in the argument
#1{#2}
}
}
\ExplSyntaxOff
\begin{document}
$\rdot{a}+\rdot{a_{x}}+\rdot{a_{x_1}}+\rdot{a^2_x}+\rdot{a^2}+\rdot{a_x^2}$
$\rdot{\mathit{abc}_x}+\rdot{\mathit{ab}^2_x}$
\end{document}