\newcommand 中带下标的粗体字母上方居中显示帽子

\newcommand 中带下标的粗体字母上方居中显示帽子

我对 LaTex 相对缺乏经验,正在尝试将其用于\newcommand更大的项目。我有几个级联的\newcommands 无法按照我想要的方式运行:

\renewcommand{\vec}[1]{\boldsymbol{#1}}
\newcommand{\gyrobias}{\vec{b}_{g}}
\newcommand{\est}[1]{\hat#1}

有了这个,我希望能够写$\est{\gyrobias}$一顶帽子,而不是一个大胆的b带有下标 g。这几乎可行,但帽子覆盖了整个表达式,而不仅仅是 b。

类似的问题这里基本上涵盖了这一点\expandafter。所以我尝试了以下

\newcommand{\est}[1]{\expandafter\hat#1}

但这给了我以下编译错误:

Extra }, or forgotten $ $\est{\gyrobias}

\hat{}如果我按照惯例在 中添加花括号,文本就可以正常编译,但是帽子不会移动到我想要的位置。

\newcommand{\est}[1]{\expandafter\hat{#1}}

删除花括号以\hat匹配链接问题中的答案,并\gyrobias在没有\vect给出所需帽子位置的情况下进行定义,但当然,现在 b 不再是粗体

\newcommand{\gyrobias}{b_{g}}
\newcommand{\est}[1]{\hat#1}

我怀疑我需要更多\expandafter,但我不知道在哪里,因为我不完全了解它们的作用。


编辑

我对@steven-b-segletes 的回答做了一些修改,使它能够正常工作:

\renewcommand{\vec}[1]{\boldsymbol{#1}}
\newcommand{\est}[1]{\expandafter\hat#1}
\newcommand{\gyrobias}{{\vec{b}}_{g}}

我现在想用几个稍微复杂一点的符号来实现同样的事情:

\newcommand{\rquat}[2]{{\overline{q}}^{#1}_{#2}}
\newcommand{\camrot}{\rquat{O}{C}}

\newcommand{\pos}[4]{_{#4}\vec{#1}_{#2 #3}}
\newcommand{\trans}[3]{\pos{t}{#1}{#2}{#3}} %\trans{from}{to}{in}
\newcommand{\campos}{\trans{O}{C}{O}}

我希望\est{\camrot}\est{\campos}将帽子仅放置在“中央字母”上方。目前它设置在整个\rquat/上\trans。同样\dot{\camrot}, 和\dot{\est{\camrot}}等应该仅放置在中央字母的顶部,而不是子/上标

答案1

关键是要\vec在其自己的组中设置重新定义(用额外的括号表示)。

\documentclass{article}
\usepackage{bm}
\renewcommand{\vec}[1]{{\boldsymbol{#1}}}
\newcommand{\gyrobias}{\vec{b}_{g}}
\newcommand{\est}[1]{\hat#1}
\begin{document}
$\est{\gyrobias}$
\end{document}

在此处输入图片描述

如果这种方法在其他方面产生了不良影响\vec,那么人们可以将额外的组应用于 的定义\gyrobias,而不是:

\documentclass{article}
\usepackage{bm}
\renewcommand{\vec}[1]{\boldsymbol{#1}}
\newcommand{\gyrobias}{{\vec{b}}_{g}}
\newcommand{\est}[1]{\hat#1}
\begin{document}
$\est{\gyrobias}$
\end{document}

跟进

在本后续文章中,我使用 OP 的语法解决了在目标字母上出现\hat或的问题。但是,它没有解决在同一个字母上出现多个变音符号的问题,例如。\dot\dot{\est{\camrot}}

\documentclass{article}
\usepackage{bm}
\renewcommand{\vec}[1]{\boldsymbol{#1}}
\newcommand{\gyrobias}{{\vec{b}}_{g}}
\newcommand{\rquat}[2]{{\overline{q}}^{#1}_{#2}}
\newcommand{\camrot}{\rquat{O}{C}}
\newcommand{\pos}[5][]{{_{#5}}#1{\vec{#2}}_{#3 #4}}
\newcommand{\trans}[4][]{\pos[#1]{t}{#2}{#3}{#4}} %\trans{from}{to}{in}
\newcommand{\campos}[1][]{\trans[#1]{O}{C}{O}}
\newcommand{\est}[1]{\applydiacritic{\hat}{#1}}
\newcommand{\Dot}[1]{\applydiacritic{\dot}{#1}}
\newcommand\applydiacritic[2]{\ifx\campos#2\campos[#1]\else\expandafter#1#2\fi}
\begin{document}
$\est{\gyrobias}$\medskip

$\camrot\quad\est{\camrot}\quad\Dot{\camrot}$\medskip

$\campos\quad\est{\campos}\quad\Dot{\campos}$\medskip
\end{document}

在此处输入图片描述

OP 指出上述代码不适用于amsmath。这里有一个解决方案,但我注意到amsmath包会影响字母“t”上变音符号的位置,并且我已经验证它与我的解决方案无关,这可以在我的输出的第一行中看到(amsmath插入/删除时)。

\documentclass{article}
\usepackage{bm}
\usepackage{amsmath}% THIS PACKAGE EFFECTS PLACEMENT OF DIACRITICS OVER \boldsymbol{t}
\renewcommand{\vec}[1]{\boldsymbol{#1}}
\newcommand{\gyrobias}[1][]{#1{\vec{b}}_{g}}
\newcommand{\rquat}[3][]{#1{\overline{q}}^{#2}_{#3}}
\newcommand{\camrot}[1][]{\rquat[#1]{O}{C}}
\newcommand{\pos}[5][]{{_{#5}}#1{\vec{#2}}_{#3 #4}}
\newcommand{\trans}[4][]{\pos[#1]{t}{#2}{#3}{#4}} %\trans{from}{to}{in}
\newcommand{\campos}[1][]{\trans[#1]{O}{C}{O}}
\newcommand{\est}[1]{\applydiacritic{\hat}{#1}}
\newcommand{\mydot}[1]{\applydiacritic{\dot}{#1}}
\newcommand\applydiacritic[2]{%
  \ifx\gyrobias#2\gyrobias[#1]\else
  \ifx\campos#2\campos[#1]\else
  \ifx\camrot#2\camrot[#1]\else
  #1#2\fi\fi\fi}
\begin{document}
$\boldsymbol{t}\quad\hat{\boldsymbol t}\quad\dot{\boldsymbol t}$\medskip

$\gyrobias\quad\est{\gyrobias}\quad\mydot{\gyrobias}$\medskip

$\camrot\quad\est{\camrot}\quad\mydot{\camrot}$\medskip

$\campos\quad\est{\campos}\quad\mydot{\campos}$\medskip
\end{document}

在此处输入图片描述

答案2

我建议采取不同的策略:重新定义\vec帽子*形式的 -variant。

\documentclass{article}
\usepackage{amsmath,bm,xparse}

\RenewDocumentCommand{\vec}{sm}{%
  \IfBooleanTF{#1}
    {\hat{\bm{#2}}}
    {\bm{#2}}% 
}
\NewDocumentCommand{\gyrobias}{s}{%
  \IfBooleanTF{#1}
    {\vec*{b}_{g}}
    {\vec{b}_{g}}%
}

\begin{document}

$\vec{x}_{g}+\vec*{x}_{g}+\gyrobias+\gyrobias*$

\end{document}

在此处输入图片描述

相关内容