奇怪的投影机问题

奇怪的投影机问题

有人能告诉我为什么以下beamer文档无法编译吗?

\documentclass{beamer}

\DeclareMathAlphabet{\mathbb}{U}{msb}{m}{n}
\let\mathbb\undefined
\DeclareMathAlphabet{\mathbb}{U}{msb}{m}{n}

\begin{document}
\begin{frame}
$\mathbb{Q}$
\pause
\begin{itemize}
 \item Test
\end{itemize}
\end{frame}
\end{document}

奇怪的是,当我删除时,代码可以编译任意一个以下的:

  1. 首先\DeclareMathAlphabet
  2. \let\mathbb\undefined
  3. $\mathbb{Q}$
  4. \pause
  5. 环境itemize

当然,该文档的前两行是多余的,但我想知道出了什么问题。

我使用的beamer是 TeXLive 2011 3.10 版本。

答案1

这个错误肯定与投影机尝试拆分覆盖层的材料时的内部工作。我没有跟踪错误,但我有一些怀疑:

  1. 使得\let\mathbb\undefinedLaTeX 在条件中遵循与找到定义的命令时不同的分支;

  2. 由于数学家族有 16 个的严格限制,因此仅在需要时才对数学字母进行评估(这解释了为什么省略\mathbb{Q}不会触发错误);

  3. \pause由于没有“延迟扩展”(类似于 TeX 写出辅助文件时),因此不会显示错误。

你会得到同样的错误

\documentclass[a4paper]{article}
\DeclareMathAlphabet{\mathbb}{U}{msb}{m}{n}
\let\mathbb\undefined
\DeclareMathAlphabet{\mathbb}{U}{msb}{m}{n}
\begin{document}
\tableofcontents
\section{A $\mathbb{Q}$}
\end{document}

但第一次运行时不会出现这种情况:只有在第二次.toc读取文件时才会显示错误。

运行第二个示例两次,并使用 return 跳过错误,

! LaTeX Error: Too many math alphabets used in version normal.

将显示错误消息。这意味着 LaTeX 正在一遍又一遍地定义相同的数学字母表。如果\let\mathbb\undefined省略,则不会发生这种情况,因为重新分配数学字母表选择命令是合法的。插入时,系统处于不稳定状态,因为\mathbb没有意义,而\csname mathbb \endcsname具有旧含义(这与“命令稳健”有关)。在代码中\DeclareMathAlphabet有一个条件,它取决于第一个是否被定义。如果没有,第二个将被附加到数学字母表列表中进行初始化,我相信这里出了问题:LaTeX 在列表中两次找到相同的命令,\mv@normal扩展到

\getanddefine@fonts \symoperators \OT1/cmr/m/n
\getanddefine@fonts \symletters \OML/cmm/m/it
\getanddefine@fonts \symsymbols \OMS/cmsy/m/n
\getanddefine@fonts \symlargesymbols \OMX/cmex/m/n
\install@mathalphabet \mathbf  {\select@group \mathbf  \M@OT1 \OT1/cmr/bx/n }
\install@mathalphabet \mathsf  {\select@group \mathsf  \M@OT1 \OT1/cmss/m/n }
\install@mathalphabet \mathit  {\select@group \mathit  \M@OT1 \OT1/cmr/m/it }
\install@mathalphabet \mathtt  {\select@group \mathtt  \M@OT1 \OT1/cmtt/m/n }
\install@mathalphabet \mathbb  {\select@group \mathbb  \M@U \U/msb/m/n }
\install@mathalphabet \mathbb  {\select@group \mathbb  \M@U \U/msb/m/n }

(为了清晰起见,添加了行尾符号)。可以清楚地看到\mathbb (名称中有空格)出现了两次。我不明白为什么这会在排版目录时(或在内存中存储带有的框架)成为一个\pause问题投影机),但显然和这次重复有关。

\let\xyz\undefined何时\xyz由或执行类似任务的另一个命令定义\DeclareRobustCommand然后重新定义总是有风险的\xyz

答案2

为什么使用\DeclareMathAlphabet而不是\usepackage{amssymb}?据我所知,下面的方法似乎运行良好:

\documentclass{beamer}
\usepackage{lmodern} % To avoid ``LaTeX Font Warning: Font shape `OT1/cmss/m/n' in
                     % size <4> not available'' warnings
\usepackage{amssymb}

\begin{document}
\begin{frame}
$\mathbb{Q}$
\pause
\begin{itemize}
 \item Test
\end{itemize}
\end{frame}
\end{document}

相关内容