有人能告诉我为什么以下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}
奇怪的是,当我删除时,代码可以编译任意一个以下的:
- 首先
\DeclareMathAlphabet
, \let\mathbb\undefined
,$\mathbb{Q}$
\pause
,- 环境
itemize
。
当然,该文档的前两行是多余的,但我想知道出了什么问题。
我使用的beamer
是 TeXLive 2011 3.10 版本。
答案1
这个错误肯定与投影机尝试拆分覆盖层的材料时的内部工作。我没有跟踪错误,但我有一些怀疑:
使得
\let\mathbb\undefined
LaTeX 在条件中遵循与找到定义的命令时不同的分支;由于数学家族有 16 个的严格限制,因此仅在需要时才对数学字母进行评估(这解释了为什么省略
\mathbb{Q}
不会触发错误);\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}