我对 LaTex 相对缺乏经验,正在尝试将其用于\newcommand
更大的项目。我有几个级联的\newcommand
s 无法按照我想要的方式运行:
\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}