![问题](https://linux22.com/image/368397/%E9%97%AE%E9%A2%98.png)
正如@daleif所建议的,这是我之前的一个相关问题邮政,现在我有以下代码beamer
,
\documentclass{beamer}
\begin{document}
\begin{frame}
\texttt{align} environment:
\begin{align}
\label{eq:1}
\begin{bmatrix}
x\\y\\z
\end{bmatrix}&=
\begin{bmatrix}
1&&\\&2&\\&&3
\end{bmatrix}
\begin{bmatrix}
1\\2\\3
\end{bmatrix} \\
\label{eq:2}
&=
\begin{bmatrix}
1&&\\&2&\\&&3
\end{bmatrix}
\begin{bmatrix}
d\\e\\f
\end{bmatrix}\\
\label{eq:3}
a&=b
\end{align}
\texttt{equation} environment:
\begin{equation}
\label{eq:4}
a^{2}+b^{2}=c^{2}
\end{equation}
\end{frame}
\end{document}
正如@daleif在他的评论中所建议的那样回答,改为\label{eq:1}
会有{\label{eq:1}}
帮助。
也是建议环绕{}
环境bmatrix
也会有帮助。
另外提一下我原来的麻烦的解决方案,即&&
在每行之前(可能还有之后)添加以伪装成多重对齐,然后数字也会排列整齐。
当然,目前{\label{eq:1}}
这是最简单的解决方案,但为什么会发生这种情况,有没有更“标准”的方法来处理这个问题?
答案1
问题
问题实际上并不局限于环境bmatrix
,从以下示例中可以看出:
\documentclass{beamer}
\usepackage{showframe} %% <- make the text area visible
\begin{document}
\begin{frame}
\begin{align}
\label{eq:1}
A %% <- This is fine
\end{align}
\begin{align}
\label{eq:2}
\left(A\right) %% <- Not fine
\end{align}
\begin{align}
\label{eq:3}
-A %% <- Not fine
\end{align}
\begin{align}
\label{eq:4}
\begin{bmatrix}A\end{bmatrix} %% <- Not fine
\end{align}
\begin{align}
\begin{bmatrix}A\end{bmatrix} %% <- This is fine
\end{align}
\end{frame}
\end{document}
发生这种情况的原因是beamer
修改\label
并且修改后的命令会创建一个\hbox
。这\hbox
本身不占用空间,但由于它是等式的一部分,因此当它后面或前面有特定类型的对象时,可能会导致插入水平跳跃。例如,如果它前面/后面是二元运算符(如+
或-
)、二元关系(如=
或<
)、运算符(如\sin
或\sum
)或“内部原子”(如\left[
和),就会发生这种情况\right]
。(我不会列出所有可能性,但请参阅表格这个答案。
在您的例子中,在 的开头处,将\thinmuskip
(as resulting by \,
) 插入到此\hbox
和之间。在上面的例子中,将(as resulting by ) 插入到and之前\left[
bmatrix
-A
\medmuskip
\:
-
其他 \medmuskip
插入到它后面是因为这个运算符现在被解释为二元运算符!
之所以会弄乱方程标签的位置,是因为它align
对其内容进行了两次排版:一次是为了测量其大小,一次是实际测量。在“测量阶段”,它被重新定义为不执行任何操作,这特别意味着在测量时\label
它不会插入上述内容。因此,最终会错误地测量单元格的宽度,并使用这个错误的值来确定应在列前/列后/列间插入多少空间。\hbox
amsmath
解决方案
(1)手动解决
使用{\label{<name>}}
(或例如\label{<name>}{}
或\label{<name>}\hbox{}
)只能部分解决这个问题。如果使用它,在测量阶段amsmath
仍会看到一个空组( ),这与用于间隔目的的和{}
相同。因此,它通过在测量阶段引入相同的不必要的跳过来固定方程编号的位置。(此外:上面第三个方程中的和之间的空格仍然是错误的!)\hbox{…}
{\hbox{…}}
-
A
如果您想解决这个问题,但又不想破解beamer
的 重新定义\label
,那么您可以在单元格开头用 替换 。这是因为 Open 原子后从未插入任何空格\label{<name>}
。\mathopen{\label{<name>}}
\documentclass{beamer}
\usepackage{showframe} %% <- make the text area visible
\begin{document}
\begin{frame}
\begin{align}
\label{eq:1}
A %% <- Still fine
\end{align}
\begin{align}
\mathopen{\label{eq:2}}
\left(A\right) %% <- Now fine!
\end{align}
\begin{align}
\mathopen{\label{eq:3}}
-A %% <- Now fine!
\end{align}
\begin{align}
\mathopen{\label{eq:4}}
\begin{bmatrix}A\end{bmatrix} %% <- Now fine!
\end{align}
\begin{align}
\begin{bmatrix}A\end{bmatrix} %% <- Still fine
\end{align}
\end{frame}
\end{document}
(请注意,-A
现在 also 的间距也正确了!)
(在单元格末尾替换\label{<name>}
为通常有效,但并非总是如此:如果标签前面有标点符号(如),仍会插入跳过。\mathclose{\label{<name>}}
,
)
(2)修补beamer
您还可以修补beamer
以确保\hbox
首先不会插入任何内容。违规行为\hbox
可以在这里找到(在beamerbasenavigation.sty
):
\def\beamer@inserttarget#1{%
\ifbeamer@inframe%
\ifvmode%
\nointerlineskip\vbox to0pt{#1}%
\else%
\hbox{#1}% %% <- This is the problem!
\fi%
\else% defer to next frame
\expandafter\gdef\expandafter\beamer@framehypertargets\expandafter{\beamer@framehypertargets#1}%
\fi%
}
(#1
形式为\hypertarget{<label name>}{}
,它设置了指向该等式的超链接的目标。)
\hbox{#1}
如果删除此行,问题就解决了,但我们不想这样做,因为那会破坏超链接。如果用 替换,问题也会解决#1
,但我们也不想这样做,因为这\hbox
可能是有原因的(这可能不适用于数学模式)。
因此这里有一个建议:如果你将以下内容添加到你的序言中,#1
将直接插入数学模式,并且\hbox
在其他地方使用时将被编辑。
\makeatletter %% <- make @ usable in command names
\patchcmd{\beamer@inserttarget}
{\hbox{#1}}{\ifmmode#1\else\hbox{#1}\fi}{}{}
\makeatother %% <- revert @
(\patchcmd
是etoolbox
包,已经被加载beamer
。)
结果如下:
\documentclass{beamer}
\usepackage{showframe} %% <- make the text area visible
\makeatletter %% <- make @ usable in command names
\patchcmd{\beamer@inserttarget}
{\hbox{#1}}{\ifmmode#1\else\hbox{#1}\fi}{}{}
\makeatother %% <- revert @
\begin{document}
\begin{frame}
\begin{align}
\label{eq:1}
A %% <- Still fine
\end{align}
\begin{align}
\label{eq:2}
\left(A\right) %% <- Also fine!
\end{align}
\begin{align}
\label{eq:3}
-A %% <- Also fine!
\end{align}
\begin{align}
\label{eq:4}
\begin{bmatrix}A\end{bmatrix} %% <- Also fine!
\end{align}
\begin{align}
\begin{bmatrix}A\end{bmatrix} %% <- Still fine
\end{align}
\end{frame}
\begin{frame}
The hyperlinks in the references \ref{eq:1} and \ref{eq:4} still work.
\end{frame}
\end{document}