babel、hyperref 和 appendix 包之间的冲突

babel、hyperref 和 appendix 包之间的冲突

在撰写论文时,我使用了hyperrefappendix包,就像下面的小例子中的那样。

测试.tex

\documentclass{book}
\usepackage{hyperref}
\usepackage[titletoc]{appendix}

\begin{document}

\tableofcontents

\chapter{First chapter}
\section{Chapter section}
\chapter{Second chapter}

\begin{appendices}
\input{extra}
\end{appendices}

\end{document}

附加文本

\chapter{First appendix}
\section{Appendix section}

此示例不会产生任何错误。最终结果是一个内容表,其中包含指向所有章节(包括附录中的章节)的可点击链接,并且按照我想要的方式格式化。

编译(pdfLaTeX)时会生成以下文件:

检验出

\BOOKMARK [0][-]{chapter.1}{First chapter}{}% 1
\BOOKMARK [1][-]{section.1.1}{Chapter section}{chapter.1}% 2
\BOOKMARK [0][-]{chapter.2}{Second chapter}{}% 3
\BOOKMARK [0][-]{Appendix.1.A}{Appendix First appendix}{}% 4
\BOOKMARK [1][-]{section.1.A.1}{Appendix section}{Appendix.1.A}% 5

当然,我的论文要大得多(章节更多,附录更多)。虽然结构相似,但编译我的论文会导致许多神秘的错误(意味着我不理解它们)。我在下面列出了一些。注释包hyperref允许我进行编译,但也会禁用 PDF 文档中的链接和书签。

! Missing \endcsname inserted.
<to be read again> 
                   \penalty 
l.46 ...@skip {}lage.1.D}{B\377lage Afkortingen}{}
                                                  % 46
The control sequence marked <to be read again> should
not appear between \csname and \endcsname.

! Missing number, treated as zero.
<to be read again> 
                   {
l.46 ...@skip {}lage.1.D}{B\377lage Afkortingen}{}
                                                  % 46
A number should have been here; I inserted `0'.
(If you can't figure out why I needed to see a number,
look up `weird error' in the index to The TeXbook.)

! Extra \endcsname.
\check@bm@number ...0\else \csname B_#1\endcsname 
                                                  \fi 
l.46 ...@skip {}lage.1.D}{B\377lage Afkortingen}{}
                                                  % 46
I'm ignoring this, since I wasn't doing a \csname.

)
! Missing $ inserted.
<inserted text> 
                $
l.154 \begin{document}

我的论文的 .out 文件看起来很好,直到你到达附录书签。

...
\BOOKMARK [1][-]{section.5.4}{Optimalisatie}{chapter.5}% 32
\BOOKMARK [0][-]{chapter.6}{Conclusie}{}% 33
\BOOKMARK [0][-]{chapter*.28}{Bibliografie}{}% 34
\BOOKMARK [0][-]{B\penalty \@M \hskip \z@skip i\kern -0.02em j\penalty \@M \hskip \z@skip {}lage.1.A}{B\377lage Stopwoordlijsten}{}% 35
\BOOKMARK [1][-]{section.1.A.1}{Nederlandse stopwoorden}{B\penalty \@M \hskip \z@skip i\kern -0.02em j\penalty \@M \hskip \z@skip {}lage.1.A}% 36
\BOOKMARK [1][-]{section.1.A.2}{Engelse stopwoorden}{B\penalty \@M \hskip \z@skip i\kern -0.02em j\penalty \@M \hskip \z@skip {}lage.1.A}% 37
 ...

我相信这个帖子与我的问题有关,但我搞不懂(我对 LaTeX 还比较陌生)。有人能帮我启用论文中的链接和书签吗?

问候,

桑德

编辑

将该包添加babel到示例中可重现该问题。

\usepackage[dutch]{babel}

答案1

错误报告

babel这是软件包附录中的一个错误。如果加载了语言选项,则会触发此错误dutch。从我向软件包维护者提交的错误报告中可以看出:

以下文档在第二次运行中损坏:

\documentclass{book}
\usepackage[dutch]{babel}
\usepackage{hyperref}
\usepackage[titletoc]{appendix}

\begin{document}   

\tableofcontents

\chapter{First chapter}
\section{Chapter section}
\chapter{Second chapter}

\begin{appendices}
\chapter{First appendix}
\section{Appendix section}
\end{appendices}

\end{document}  

.out 文件包含:

\BOOKMARK [0][-]{B\penalty \@M \hskip \z@skip i\kern -0.02em j\penalty \@M
\hskip \z@skip {}lage.1.A}{B\377lage First appendix}{}% 4

用于目标名称的计数器名称已损坏,因为语言相关字符串:B"ylage。原因是:

\newcommand{\@resets@pp}{\par
  \@ppsavesec
  \stepcounter{@pps}
  \setcounter{section}{0}%
  \if@chapter@pp
    \setcounter{chapter}{0}%
    \renewcommand\@chapapp{\appendixname}%
    \renewcommand\thechapter{\@Alph\c@chapter}%
  \else
    \setcounter{subsection}{0}%
    \renewcommand\thesection{\@Alph\c@section}%
  \fi
  \if@pphyper
    \if@chapter@pp
      \renewcommand{\theHchapter}{\theH@pps.\Alph{chapter}}%
    \else
      \renewcommand{\theHsection}{\theH@pps.\Alph{section}}%
    \fi
    \def\Hy@chapapp{\appendixname}%
  \fi
  \restoreapp
}

\Hy@chapapp被重新定义为,\appendixname并且这是语言相关的,由于简写扩展,在荷兰语中会中断。但\Hy@chapapp在目的地名称中使用,通常是“章节”(来自反章节),只有在\appendix名称chapter更改为后appendix 才能获得更好的唯一目的地名称。没有必要使它依赖于语言。只需使用:

\def\Hy@chapapp{appendix}

或者

\def\Hy@chapapp{\Hy@appendixstring}

\@resets@ppsub还需修复其他出现的问题。

解决方法/解决方案

还有一个独立于包中错误修复的解决方法。只需在之后appendix加载包即可。它对书签具有更强大的算法,并使用 编码( )处理文件中的损坏。此外,书签会更早更新。bookmarkhyperrefB"ylage.auxhexbase16

\documentclass{book}
\usepackage[dutch]{babel}
\usepackage{hyperref}
\usepackage{bookmark}
\usepackage[titletoc]{appendix}

此外,hyperrefv6.83b 将停用目标名称中的简写(\hypercurrent 和 \contentsline 中的目标名称)。

书签中的“IJ”和“ij”

这些字符,大写/小写 i 和 j 的连字符,在 PDFDocEncoding 中不可用。但它们可以通过 Unicode 书签访问,即 hyperref选项pdfencoding=autounicode

hyperref编码中用“ÿ”替换PD1是一个错误,将在 v6.83b 中修复。

顺便说一句,可以通过将书签的宏重新定义放入以下内容来将其限制为书签(pdf 字符串)\pdfstringdefDisableCommands

\pdfstringdefDisableCommands{%
  \renewcommand*{\appendixname}{Bookmark-Appendix}%
} 

答案2

从所有评论中汇编而来的完整解决方案。

\documentclass{book}
\usepackage[dutch]{babel}
\usepackage[titletoc]{appendix}
\usepackage{hyperref}
\usepackage{bookmark} % handles the encoding in the .out file

\addto\captionsdutch{\renewcommand{\appendixname}{Bijlage}} % changes 'Bÿlage' to 'Bijlage' for the bookmarks

\begin{document}

\tableofcontents

\chapter{First chapter}
\section{Chapter section}
\chapter{Second chapter}

\begin{appendices}
\input{extra}
\end{appendices}

\end{document}

问候,

桑德

相关内容