我尝试使用babel
语言和magyar
软件包。appendix
hyperref
马扎尔巴别塔的警告我还有一个与为 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}
这是运行示例时在.aux
and文件中生成的。.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?):在您的示例中,它加载得太早了。