hyperref
搞砸了\renewcommand\appendix
。这虽然\appendix
是更新确切地因为它是在 中定义的report.cls
(并且与之一起工作hyperref
!)
问题:.toc 文件第 4 项发生\contentsline
变更(即链接错误)。
无需重新定义\appendix
.toc 文件
\contentsline {chapter}{\numberline {1}Chap}{2}{chapter.1}
\contentsline {chapter}{\numberline {A}App}{3}{appendix.A}
重新定义后\appendix
,.toc 文件变为
\contentsline {chapter}{\numberline {1}Chap}{2}{chapter.1}
\contentsline {chapter}{\numberline {A}App}{3}{chapter.1}
梅威瑟:
\documentclass{report}
\usepackage{hyperref}
%\makeatletter
%\renewcommand\appendix{\par
% \setcounter{chapter}{0}%
% \setcounter{section}{0}%
% \gdef\@chapapp{\appendixname}%
% \gdef\thechapter{\@Alph\c@chapter}}
%\makeatother
\begin{document}
\tableofcontents
\chapter{Chap}
\appendix
\chapter{App}
\end{document}
为什么?如何解决?
答案1
软件包hyperref
已\appendix
通过添加前缀\appendix
来修复锚点名称。您对 的重新定义\appendix
会丢弃该修复。因此,重新定义 不是hyperref
错误的。
选项:
重新定义
\appendix
前包hyperref
,因为重新定义具有防御性,并保留重新定义hyperref
的当前含义。\appendix
\appendix
如果
\appendix
应该重新定义后包hyperref
或任何其他定义/重新定义 的包\appendix
,则应以防御性方式定义,例如通过包 的 patch 命令etoolbox
。或者您需要将 的添加hyperref
放入 的新定义中\appendix
。
答案2
[这可能不是一个完整的解决方案,但对于评论来说太长了......]
我不确定您想要实现什么,因为在您的 MWE pdf 文件中,注释掉\renewcommand
hyperref 后,它正在做正确的事情。大概您想重新定义,以便它执行与注释中描述的不同的操作。在这种情况下,您不应该查看来自\appendix
的标准定义,而应该查看的定义,如下所示:\appendix
report.cls
hyperref
\appendix
\def\appendix{%
\ltx@IfUndefined{chapter}{%
\gdef\theHsection{\Hy@AlphNoErr{section}}%
}{%
\gdef\theHchapter{\Hy@AlphNoErr{chapter}}%
}%
\xdef\Hy@chapapp{\Hy@appendixstring}%
\HyOrg@appendix
}
请注意,根据 hyperref.sty, 。因此,您应该更改\HyOrg@appendix=\appendix
而不是修改。例如,如果您使用\appendix
\HyOrg@appendix
\renewcommand\HyOrg@appendix={\par
\setcounter{chapter}{0}%
\setcounter{section}{0}%
\gdef\@chapapp{\appendixname}%
\gdef\thechapter{\@Alph\c@chapter}}
那么 pdf 文件现在是正确的。根据您要实现的目标,您可能还需要修改上面的 hyperref 命令。