带支撑输出的宏

带支撑输出的宏

我写了一个代码:

\documentclass{article}

\usepackage{amsmath}

\newcommand{\tvm}[1]{{\mathbf{#1}}}

\newcommand{\tdot}[1]{\expandafter\dot#1}

\newcommand{\vecta}{{\tvm{v}}_{abc}^{def}}
\newcommand{\vectb}{\tvm{v}_{abc}^{def}}

\begin{document}
$ \tdot{\vecta} $ % line a
\\
$ \tdot{\vectb} $ % line b
\end{document}

其中,仅\tdot适用\dot于具有下标的参数的基本字符,而“line a”给出了正确的结果,即

在此处输入图片描述

但是使用 的“行 b”\vectb会出现错误。差异来自 周围的括号\tvm{v}。我想让宏\tvm在内部对其输出进行一定程度的支撑,这样我就不需要在每次使用 时都写上括号\tvm

\tvm请注意,我使用的实际定义是

\makeatletter
\newcommand{\vm}[1]{
    \@tfor\next:=#1\do{
        \ifcat\next\relax
        {\boldsymbol{\next}}
        \else
        {\mathbf{\next}}
        \fi
    }
}
\makeatother

区分英语和希腊语。

答案1

这是有效的,如果你使用宏的变体\rdot(现在神秘地变成了\tdot)我建议https://tex.stackexchange.com/a/617510/4427

\documentclass{article}

\ExplSyntaxOn

\NewDocumentCommand{\tdot}{m}
 {
  \hermis_check_subsup:nn { \dot } { #1 }
 }
% define analogously \tddot and so on

\cs_new_protected:Nn \hermis_check_subsup:nn
 {
  \exp_args:Nne \regex_match:nnTF { (\^|\_) } { \text_expand:n { #2 } }
   {% there is a _ or ^ in the argument
    \tl_set:Nx \l_tmpa_tl { \text_expand:n { #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

\makeatletter
\DeclareRobustCommand{\vm}[1]{%
  \@tfor\next:=#1\do{%
    \ifcat\next\relax
      \boldsymbol{\next}%
    \else
      \mathbf{\next}%
    \fi
  }%
}
\makeatother

\newcommand{\vecta}{{\vm{v}}_{abc}^{def}}
\newcommand{\vectb}{\vm{v}_{abc}^{def}}


\begin{document}

$\tdot{a}+\tdot{a_{x}}+\tdot{a_{x_1}}+\tdot{a^2_x}+\tdot{a^2}+\tdot{a_x^2}$

$\tdot{\mathit{abc}_x}+\tdot{\mathit{ab}^2_x}$

$ \tdot{\vecta} $ % line a

$ \tdot{\vectb} $ % line b

\end{document}

您的命令中有太多间接性,因此简单的方法\expandafter无法起作用。

在此处输入图片描述

相关内容