我写了一个代码:
\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
无法起作用。