概述
我目前正在用 LaTeX 重写我的一些讲义。我的母语是西班牙语,所以我正在使用这个babel
软件包。我还想为生成的文档添加一些实用功能,例如书签和可点击的引用。然而,就在昨天,我偶然发现了一个编译错误,它阻碍了我的进度,我很难理解问题出在哪里。
详细信息和 MWE
我编写了一个测试文档来检查软件包是否存在问题,经过大量测试后我最终得到了以下代码,我将其命名为main.tex
:
\documentclass[10pt, spanish, openany]{memoir}
\usepackage{babel}
\usepackage[T1]{fontenc}
\usepackage{blindtext}
\usepackage{amsmath, amsthm}
\usepackage[backend=biber]{biblatex}
\usepackage{csquotes}
\usepackage[pdfencoding=auto, psdextra]{hyperref}
\usepackage{cleveref} % this package breaks everything for some reason
\usepackage[numbered]{bookmark}
\begin{document}
\frontmatter
{
\hypersetup{hidelinks}
\tableofcontents
}
\chapter*{Sample introduction}
\addcontentsline{toc}{chapter}{Sample introduction} % So this section gets added to ToC
\blindtext
\begin{align}
\label{sample:eq1}
x + y = 2
\end{align}
\blindtext
\mainmatter
\chapter{Sample chapter}
\blindtext
\section{Sample section}
\blindtext
\end{document}
我在本测试文档中包含的一些包没有使用;但是,我的原始项目确实使用了它们,所以我认为在测试时最好保留它们。现在,经过一番折腾,我想我已经找到了罪魁祸首:(babel
带spanish
参数)和cleveref
包。当包含这两个包并\frontmatter
使用命令时,我收到编译错误:c:/TeX Projects/Hyperref Frontmatter Test/main.tex:24: Missing } inserted. <inserted text>
。
我还发现删除\frontmatter
(同时保留babel
和cleveref
)会导致编译成功。同样,删除babel
或cleveref
(同时保留命令\frontmatter
)时,MWE 可以成功编译。如果可能的话,我想在babel
、cleveref
和\frontmatter
都存在的情况下编译我的文档。另一件让我感到困惑的事情是,我很确定几周前我能够很好地编译我的原始项目(包括现在有问题的三个项目)。
答案1
更新:解决方案如下
评论有点太长了,在完全更新的 TeXLive 2021 上,我可以将 MWE 降低到
\documentclass{book}
\usepackage[spanish]{babel}
\usepackage[T1]{fontenc}
\usepackage{amsmath}
\usepackage{cleveref}
\begin{document}
\frontmatter
\begin{align}
\label{sample:eq1}
x + y = 2
\end{align}
\end{document}
英语运行良好。因此,这似乎是\frontmatter
、spanish
babel amsmath
(因为 没有问题equation
)和之间的交互cleveref
。
我不知道问题是什么。我得到的错误是
! Missing } inserted.
<inserted text>
}
l.11 \end{align}
正如 Ulrike 在评论中提到的那样,这个问题众所周知,因为spanish
babel 会弄乱罗马数字。
在手册中babel-spanish
提到,加载babel
选项时es-lcroman
,小写字母(\frontmatter
使用)也不会改变。
因此这有效
\documentclass{book}
\usepackage[spanish,es-lcroman]{babel}
\usepackage[T1]{fontenc}
\usepackage{amsmath}
\usepackage{cleveref}
\begin{document}
\frontmatter
\begin{align}
\label{sampleEq1}
x + y = 2
\end{align}
\end{document}
答案2
中有一个错误cleveref
,它会使用任意代码进行完全扩展。合法的页码如下炸弹:
\documentclass{book}
\usepackage{cleveref}
\renewcommand{\thepage}{\arabic{chapter}\textbf{/}\arabic{page}}
\begin{document}
Text.\label{bug}
\end{document}
问题是以下分配,在\label@noarg
:
\edef\@tempb{\thepage}%
它应读取(很有可能,因为我不使用cleveref
):
\protected@edef\@tempb{\thepage}%
由于\thepage
可以是任意代码,我们不能假设它可以用 完全扩展\edef
。这是一个相当常见的错误(我自己有时也会犯这个错误)。
greek
例如,也存在类似的问题。
该错误已报告给作者,但与此同时,您可以使用建议的解决方法。或者,您可以修改它cleveref
并查看它是否适合您。