Conflito entre pacote babel, hyperref e apêndice

Conflito entre pacote babel, hyperref e apêndice

Ao escrever minha tese eu uso os pacotes hyperrefand appendixcomo no pequeno exemplo abaixo.

teste.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}

extra.tex

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

Este exemplo não produz erros. O resultado final é uma tabela de conteúdo com links clicáveis ​​para todos os capítulos (inclusive os dos apêndices) e formatada da maneira que desejo.

Durante a compilação (pdfLaTeX) o seguinte arquivo é produzido:

testar

\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

Minha tese é, obviamente, muito maior (mais capítulos e mais apêndices). Embora a estrutura seja semelhante, compilar minha tese resulta em vários erros enigmáticos (o que significa que não os entendo). Listei alguns abaixo. Comentar o hyperrefpacote me permite compilar, mas também desativa os links e os marcadores no documento 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}

O arquivo .out da minha tese parece bom até você chegar aos marcadores do apêndice.

...
\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
 ...

Eu acreditoesta postagemestá relacionado ao meu problema, mas não consigo entender isso (ainda sou relativamente novo no LaTeX). Alguém pode me ajudar a ativar os links e marcadores na minha tese?

Saudações,

Lixadeira

EDITAR

Adicionar o babelpacote ao exemplo reproduz o problema.

\usepackage[dutch]{babel}

Responder1

Relatório de erro

É um bug no apêndice do pacote. O bug é acionado se babelfor carregado com a opção de idioma dutch. Do meu relatório de bug para o mantenedor do pacote:

O seguinte documento é quebrado na segunda execução:

\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}  

O arquivo .out contém:

\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

O nome do contador usado para o nome de destino está quebrado devido à string dependente do idioma: B"ylage. A razão é:

\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é redefinido como \appendixnamee isso depende do idioma e é interrompido no caso do holandês devido à expansão abreviada. Mas \Hy@chapappé usado em nomes de destino, geralmente é "capítulo" (do capítulo contador), somente depois que \appendixo nome chapteré alterado para appendix para obter melhores nomes de destino exclusivos. Não há necessidade de tornar esse idioma dependente. Apenas use:

\def\Hy@chapapp{appendix}

ou

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

Além disso, a outra ocorrência \@resets@ppsubprecisa ser corrigida.

Solução alternativa/solução

Há também uma solução alternativa independente da correção de bugs no package appendix. Basta carregar o pacote bookmarkdepois hyperref. Possui um algoritmo muito mais robusto para os bookmarks e trata das quebras B"ylagedo .auxarquivo por meio hexda codificação ( base16). Além disso, os marcadores são atualizados anteriormente.

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

Além disso, hyperrefa v6.83b desativará abreviações em nomes de destino (\hypercurrent e nome de destino em \contentsline).

"IJ" e "ij" nos favoritos

Esses caracteres, ligaduras de i e j maiúsculos/minúsculos, não estão disponíveis em PDFDocEncoding. Mas eles são acessíveis por marcadores Unicode, ou seja, hyperrefopção pdfencoding=autoou unicode.

A substituição por "ÿ" na codificação hyperrefde PD1é um bug e será corrigida na v6.83b.

Aliás, as redefinições de macros para os marcadores podem ser limitadas aos marcadores (strings de PDF), colocando-os em \pdfstringdefDisableCommands:

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

Responder2

Uma solução completa compilada a partir de todos os comentários.

\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}

Saudações,

Lixadeira

informação relacionada