为什么使用 amsmath 时嵌套 \tilde 或 \breve 命令的参数会重新出现?

为什么使用 amsmath 时嵌套 \tilde 或 \breve 命令的参数会重新出现?

LaTeX 社区当使用 amsmath 时,我注意到嵌套\tilde和命令出现了一个奇怪的问题。\breve

在此代码中,X 也出现在第二个和第三个公式的输出中:

\documentclass{article}
\usepackage{amsmath}
\begin{document}
\[
\breve{\tilde{X}}
\]
\[
\breve{\breve{{T}}\breve{{v}}}
\]
\[
\tilde{{\tilde{T}}{\tilde{v}}}
\]
\end{document}

在此处输入图片描述

如果我不加载amsmath,代码可以正常工作。这似乎是 amsmath 中的一个错误。如何解决?

答案1

问题已经通过一个“更简单”的例子出现了:

\documentclass{article}
\usepackage{amsmath}
\begin{document}
$\breve{\breve{a}\breve{b}}$
\end{document}

产生

! Undefined control sequence.
\macc@adjust ->\dimen@ \macc@kerna 
                                   \advance \dimen@ \macc@kernb \kern -\dimen@ 

从而表明问题在于不仅在符号的重复中。所有用 定义的数学重音都会发生这种情况\mathaccentV

\hat \check \tilde \acute \grave \dot \ddot \bar \vec \mathring

因为这些重音符号的工作原理是查看其参数是否包含另一个重音符号,以便精确堆叠重音符号。这需要进行一些全局定义,但不知何故,如果参数包含两个这样的重音符号,该机制就会失败。

“重复符号”包含在宏中\macc@nucleus:在之后$\tilde{\breve{X}$,它会扩展为X,这就是该符号重复的原因(但我没有深入挖掘细节),因为的定义\macc@nucleus是通过完成的\gdef

数学文档没有指出只有堆叠的重音符号应该使用符号,实际上,在子公式上加重音是安全的假如它不包含重音符号。

解决方案。

由于宏非常复杂,需要全局赋值,因此对其进行修改似乎非常困难,因此采用不同的方法会更容易。定义

\newsavebox{\accentbox}
\newcommand{\compositeaccents}[2]{%
  \sbox\accentbox{$#2$}#1{\usebox\accentbox}}

现在\breve{\breve{a}\breve{b}}可以改为

\compositeaccents{\breve}{\breve{a}\breve{b}}

一切顺利。正如我们所见,参数在应用“全局重音”之前已排版并存储在一个容器中,我们可以安全地将“全局重音”放在容器上。

如果上标或下标也需要这样的构建

\newcommand{\compositeaccentsX}[2]{%
  \let\accenttemp#1\mathpalette\docompositeaccents{#2}}
\def\docompositeaccents#1#2{\compositeaccents\accenttemp{#1#2}}

并且$A_{\compositeaccentsX{\breve}{\breve{a}\breve{b}}}$会起作用。最好坚持使用更简单的命令,因为“扩展”命令需要排版四次相同的公式。

奇怪的是,口音软件包在如下情况下会出现错误:

\documentclass{article}
\usepackage{amsmath,accents}
\begin{document}
$\breve{\breve{a}\breve{b}}$
\end{document}

不会产生任何错误,但会吃掉“a”。

TeX.SE 上的第 10000 个问题非常好!

答案2

这当然是一个错误,并且已经向 报告过[email protected]。它已被添加到下次软件包大修的列表中amsmath

这里还有两个额外的小测试可以提供有用的信息:

\documentclass[11pt]{article}
\usepackage[]{amsmath}
\begin{document}
\[
\breve{\breve{T} v}
\]
\end{document}

这导致一切都严重混乱。

\documentclass[11pt]{article}
\usepackage[]{amsmath}
\begin{document}
\[
\breve{\breve{T} \breve{v}}
\]
\end{document}

崩溃了

! Undefined control sequence.
\macc@adjust ->\dimen@ \macc@kerna 
                                   \advance \dimen@ \macc@kernb \kern -\dimen@ 
l.6 \breve{\breve{T} \breve{v}}

感谢您的补充诊断和建议。

答案3

如果你加载accents包(如果您使用设置了选项的方法来加载amsmath(http://msdn.microsoft.com/en-us/library/ms12345.aspx) single,那么您将不会遇到您描述的问题:

\documentclass{article}
\usepackage{amsmath}
\usepackage[single]{accents}
\begin{document}
$\breve{\breve{a}\breve{c}}$, $\tilde{\tilde{T}\tilde{v}}$
\end{document}

在此处输入图片描述

请注意,如果下面的重音符号的高度和/或宽度明显不同(如上面的第二个示例),则上部(二层)重音符号的定位会很差。如果可用,则应使用宽的上层(二层)重音符号的变体,例如,

$\widetilde{\tilde{T}\tilde{v}}$

当然,(据我所知)没有“宽”版本的短音重音,所以这条建议并不适用于所有重音……

附录:关于此解决方案的通用性,需要注意一点:我刚刚发现,如果使用该accents包来获取它提供的一些附加重音符号(例如\ddddot),则不能在上面的示例的上方位置使用这些附加重音符号,因为在这种情况下,第一个字母(但奇怪的是,不是它的重音符号)将被吞噬。ddddot为了确保万无一失,我只用重音符号测试过,但这个问题可能影响更广泛。:-(

答案4

另一种方法可以\macc@nucleus在合适的地方重新设置,比如这里:

\documentclass{article}
\usepackage{amsmath}
\let\amsmathaccentV\mathaccentV
\makeatletter
\def\mathaccentV#1#2#3#4#5{%
  \amsmathaccentV{#1}{#2}{#3}{#4}{#5}%
  \global\let\macc@nucleus\@empty
}
\makeatother
\begin{document}
\[
\breve{\tilde{X}}
\]
\[
\breve{\breve{{T}}\breve{{v}}}
\]
\[
\tilde{{\tilde{T}}{\tilde{v}}}
\]
\end{document}

这使:

嵌套重音

但是,仍然存在一个悬而未决的问题,即完整的重音表达式可能没有其自然的宽度,如果我们让字符或符号跟随,就会看到这种情况。

在寻找良好解决方案的过程中提到了这一点amsmath

相关内容