检测参数下标的宏

检测参数下标的宏

我不擅长 TeX 编程。我寻找了检测宏中参数的下标或上标的方法。使用包的现有相关答案xifthen检测命令参数中的下标) 对我来说有点冗长,难以理解。具体来说,我想创建一个宏,如果参数有下标,则\dot{}仅应用于基字符。它的形式为

\newcommand{\rdot}[1]{'code body'}

例如,\rdot{a_{bcd}}将给出 在此处输入图片描述 代替在此处输入图片描述得出\dot{a_{bcd}}\rdot应以相同的方式应用于上标。

编辑:我注意到答案中的一些宏对于粗体字母会产生不同的结果。例如,考虑\rdot{\bf{v}_{abc}}。我不知道它会产生如此大的不同。

答案1

_的测试很脆弱,如果下标隐藏在宏中或者用\sb而不是制作_,或者如果它遵循^所以基数不是“之前的所有内容_”,则测试很可能会失败。

我认为没有必要,因为重音会自然地应用于第一个标记或括号组。

在此处输入图片描述

\documentclass{article}

\newcommand\rdot[1]{\dot #1}

\begin{document}


$\rdot{a_{bcd}}$ and $\rdot{a}$ or even $\rdot{a^{2}_b}$

\end{document}

答案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}

在此处输入图片描述

相关内容