背景:15 多年来,我一直在研究一份 600 页的 LaTeX 文档(一份包含大量数学知识的科学论文)。该文档的来源是三种语言(英语、挪威语和西班牙语),所有章节/图表/表格/方程式的编号都相同。它被(半)自动翻译成一系列 Beamer 幻灯片 - 每种语言一个幻灯片 - 同样对上述相同的文本元素使用相同的编号。我们的想法是编写和维护一段代码,使文本元素的交叉引用更容易(更不用说可能),以便同时为不同年级(从硕士到博士)的不同人教授同一门学科,既可以面对面也可以在线授课。该软件多年来运行良好(并为我节省了大量时间),直到外部世界的变化让我更难坚持良好的意图。一周前,我决定在新电脑上安装我的旧脚本,看看我是否可以保存该项目,令我高兴的是,它再次编译(经过多年的休眠)。开源软件的又一次胜利!
然而,在西班牙语版本的 Beamer 幻灯片中出现了一个新的错误,提示“!额外的 \else”。其余所有材料都编译得很好。现在,问题的根源似乎是无意中误用了 Beamer 框架中的 \vpageref,但前提是该框架是通过 \include 语句的一部分文件插入的。我的问题主要不是如何修复问题,而是问题的原因是什么,这样我就可以学会如何在将来避免。我发现这样的错误很难处理——也许我对 TeX 语言的理解太少了。
这是 MWE:
% Mac OS Big Sur v11.4
% This is pdfTeX, Version 3.14159265-2.6-1.40.21 (TeX Live 2020/MacPorts 2020.54632_4)
% LaTeX2e <2020-02-02> patch level 5
% Document Class: beamer 2019/09/29 v3.57
\documentclass{beamer}
\usepackage{varioref}
\begin{document}
\include{./includefile}
\end{document}
包含文件是:
\begin{frame}
\vpageref{aRef} % or \vref{aRef}
\end{frame}%
确切的错误信息是:
! Extra \else.
\@include ...ediate \closeout \@partaux \fi \else
\deadcycles \z@ \@nameuse ...
l.9 \include{./inputfile}
答案1
beamer
负载hyperref
和nameref
这会改变标签的内部结构:
标签的第二个参数现在有五个子参数:
\newlabel{abc}{{}{1}} %without hyperref
\newlabel{abc}{{}{1}{}{Doc-Start}{}} %with hyperref
varioref
没有考虑到这一点。在一个地方,如果标签未知,它会给它一个带有两个子参数的虚拟定义,然后代码从下面的代码中获取其余部分,各种事情都可能失败。
您可以尝试以下操作:
\documentclass{beamer}
\usepackage{varioref}
\makeatletter
\def\vref@pagenum#1#2{%
\@ifundefined{r@#2}{\@namedef{r@#2}{{??}{??}{??}{??}{??}}}{}% 5 arguments
\expandafter\expandafter\expandafter\vref@@pagenum
\csname r@#2\endcsname{}{}\@nil#1%
}
\makeatother
\begin{document}
\include{includefile}% \vpageref{aRef}
\end{document}