问题

问题

正如@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它不会插入上述内容。因此,最终会错误地测量单元格的宽度,并使用这个错误的值来确定应在列前/列后/列间插入多少空间。\hboxamsmath


解决方案

(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 @

\patchcmdetoolbox包,已经被加载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}

好输出

相关内容