我正在尝试编写一个表达式,其中用括号括起来的重音表达式在括号上方有重音。例如,
\vec{(\dot{x})}
当没有加载 amsmath 时,排版很好,但是当存在 amsmath 时,x 被排版到点的右侧,就好像内部表达式被视为
\dot{}x
仅当右括号(或方括号或大括号)是外部重音参数的一部分时,才会发生此行为。
我能找到的最佳解决方法是使用覆盖作为外部重音,而不是实际的重音命令(或重音集)。
这种行为在任何地方都有预期或记录吗?
我相信这个问题之前曾被问过 amsmath 可能存在的错误:\dot 超过括号 \dot{x},但被错误地标记为\dot over \vec over :amsmath 错误/功能?后面这个问题是关于点下标和点下标在排版上的区别。
答案1
这与一个长期存在的问题有关amsmath
,请参阅为什么使用 amsmath 时嵌套 \tilde 或 \breve 命令的参数会重新出现?
我可以提供一个解决方法。
\documentclass{article}
\usepackage{amsmath}
\makeatletter
\newcommand{\dblacc}[2]{\mathpalette\dblacc@{{#1}{#2}}}
\newcommand{\dblacc@}[2]{\dblacc@@#1#2}
\newcommand{\dblacc@@}[3]{%
\begingroup
\sbox\z@{$\m@th#1#3$}%
#2{\box\z@}%
\endgroup
}
\makeatother
\begin{document}
\begin{gather*}
\dblacc\vec{(\dot{x})}
\\
\dblacc\dot{\begin{bmatrix} x \\ \dot{x} \end{bmatrix}}
\\
\dblacc\vec{(\exp \dot{x})}
\end{gather*}
\end{document}
还适用于以下版本accents
:
\documentclass{article}
\usepackage{amsmath}
\usepackage{accents}
\makeatletter
\newsavebox{\dblacc@boxa}
\newsavebox{\dblacc@boxb}
\DeclareRobustCommand{\dblacc}[2]{\mathpalette\dblacc@{{#1}{#2}}}
\newcommand{\dblacc@}[2]{\dblacc@@#1#2}
\newcommand{\dblacc@@}[3]{%
\begingroup
\sbox\dblacc@boxa{$\m@th#1#3$}%
\sbox\dblacc@boxb{$\m@th#1#2{\copy\dblacc@boxa}$}%
\box\dblacc@boxb
\endgroup
}
\makeatother
\begin{document}
\begin{gather*}
\dblacc\vec{(\dot{x})}\quad\scriptscriptstyle\dblacc\vec{(\dot{x})}
\\
\dblacc\dot{\begin{bmatrix} x \\ \dot{x} \end{bmatrix}}
\\
\dblacc\vec{(\exp \dot{x})}
\end{gather*}
\end{document}
答案2
以下重新定义了 的内部amsmath
。此后,示例的输出看起来不错。我不知道这是否有可能破坏其他内容。我添加了 egreg 在他的答案中使用的每个测试用例,输出看起来不错。accents
但它不适用于该包。
\documentclass[]{article}
\usepackage[]{amsmath}
\makeatletter
\protected\def\mathaccentV#1#2#3#4#5%
{%
\ifmmode
\mathaccentV@do{#2}{#3}{#4}{#5}%
\else
\@xp\nonmatherr@\csname #1\endcsname
\fi
}
\def\mathaccentV@do#1#2#3#4%
{%
\global\let\macc@nucleus\@empty
\mathaccent"\accentclass@#1#2#3{#4}\macc@nucleus
}
\makeatother
\begin{document}
\begin{gather*}
\vec{(\dot{x})}
\\
\dot{\begin{bmatrix} x \\ \dot{x} \end{bmatrix}}
\\
\vec{(\exp \dot{x})}
\end{gather*}
\end{document}