hyperref 和 \renewcommand\appendix

hyperref 和 \renewcommand\appendix

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 文件中,注释掉\renewcommandhyperref 后,它正在做正确的事情。大概您想重新定义,以便它执行与注释中描述的不同的操作。在这种情况下,您不应该查看来自\appendix的标准定义,而应该查看的定义,如下所示:\appendixreport.clshyperref\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 命令。

相关内容