由于 utf8 字符导致附录、书签、超链接和 magyar babel 之间发生冲突

由于 utf8 字符导致附录、书签、超链接和 magyar babel 之间发生冲突

我尝试使用babel语言和magyar软件包。appendixhyperref马扎尔巴别塔的警告我还有一个与为 Babel 加载荷兰语时出现的问题类似。我的方法是将以下解决方案混合在一起mweA.tex

\UseRawInputEncoding % [2]
\documentclass{book}
\usepackage{hyperref} % either I have it or not
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}

\def\magyarOptions{defaults=hu-min} % [2]
\usepackage[magyar]{babel}

\usepackage[titletoc]{appendix}
\usepackage{bookmark} % [1]

\begin{document}

\tableofcontents

\begin{appendices}
\chapter{test appendix}
\end{appendices}
\end{document}

mweB.tex

\documentclass{book}    
\usepackage{hyperref} % either I have it or not
\usepackage[T1]{fontenc}

\def\magyarOptions{defaults=hu-min,suggestions=no} % [2]
\usepackage[magyar]{babel}

\usepackage[titletoc]{appendix}
\usepackage{bookmark} % [1]

\begin{document}

\tableofcontents

\begin{appendices}
\chapter{test appendix}
\end{appendices}
\end{document}

(代码中引用:[1] [2])但在这两种情况下我都出现了以下错误:

! Undefined control sequence.
\GenericError  ...                                
                                                    #4  \errhelp \@err@     ...
l.1 ...mberline {A}test appendix}{3}{függelék.a.A}

这里出了什么问题?我该如何将附录包与 magyar babel 一起使用?

我发现如果没有,\usepackage{hyperref}我也会遇到同样的错误,但如果我删除\usepackage{bookmark},问题就会消失。但我想使用 \usepackage{hyperref} 包。

答案1

问题似乎是

\contentsline {chapter}{f\"uggel\'ek \numberline {A}test appendix}{3}{függelék.1.A}

这是运行示例时在.auxand文件中生成的。.toc

尤其是最后一个参数\contentsline,即链接目标标签,包含非 ASCII 字符,这似乎确实困扰了 pdfTeX,因为标签中应避免使用非 ASCII 字符(请参阅标签中的非 ASCII 字符\label / \ref 中的非英语标识符(“缺少 \endcsname 插入”)) (MWE 都可以很好地与 LuaLaTeX 配合使用。有趣的是,XeLaTeX 似乎也遇到了一些问题,这是我没有想到的……)

您可以指示appendix不要使用翻译的字符串függelék作为标签,而是坚持使用appendix定义的安全\Hy@appendixstring

\UseRawInputEncoding
\documentclass{book}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\def\magyarOptions{defaults=hu-min}
\usepackage[magyar]{babel}
\usepackage[titletoc]{appendix}
\usepackage{hyperref}
\usepackage{bookmark}

\makeatletter
\renewcommand{\@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
    \xdef\Hy@chapapp{\Hy@appendixstring}% <- changed appendixname to \Hy@appendixstring
  \fi
  \restoreapp
}
\renewcommand{\@resets@ppsub}{\par
  \stepcounter{@pps}
  \if@chapter@pp
    \setcounter{section}{0}
    \renewcommand{\thesection}{\setthesection}
  \else
    \setcounter{subsection}{0}
    \renewcommand{\thesubsection}{\setthesubsection}
  \fi
  \if@pphyper
    \if@chapter@pp
      \renewcommand{\theHsection}{\theH@pps.\setthesection}%
    \else
      \renewcommand{\theHsubsection}{\theH@pps.\setthesubsection}%
    \fi
    \xdef\Hy@chapapp{\Hy@appendixstring}% <- changed appendixname to \Hy@appendixstring
  \fi
}
\makeatother

\begin{document}

\tableofcontents

\begin{appendices}
\chapter{test appendix}
\end{appendices}
\end{document}

该示例应该可以编译。\xdef\Hy@chapapp{\Hy@appendixstring}而不是appendix.sty\def\Hy@chapapp{\appendixname}直接从hyperref.sty的定义中获取的\appendix。这正是导致问题的原因babel、hyperref 和 appendix 包之间的冲突也一样,但那里提到的解决方法在这里没有帮助——我们真的必须直接解决问题的根源。另请参阅Apéndices(附录西班牙语口音)如何使附录和 hyperref 包与西里尔字母(非 ASCII)字符一起工作?Hyperref、Bookmark 和附录包:使附录内的标签发挥作用

您可能应该删除临时文件并从头开始重新编译,以避免辅助文件中的旧代码残余造成混乱。

您可能还想考虑appendix.sty就此问题写信给 的维护者。至少对我来说,在这里使用安全字符串\Hy@appendixstring而不是潜在危险的似乎是一个好主意\appendixname

请注意,我稍微改变了序言中的加载顺序。hyperref通常应该是您加载的最后一个包(有一些记录在案的例外情况,例如cleveref和一些品味问题,例如与以下顺序一起bookmark我应该先加载哪个包:hyperref 还是 bookmark?):在您的示例中,它加载得太早了。

相关内容