我在使用 和 -commandetoc
时hyperref
遇到问题:KOMA-script
\addchap
\documentclass{scrbook}
\usepackage{etoc}
\newcommand*\chaptertoc{
\etocsetnexttocdepth{2}
\etocsettocstyle{\section*{Local contents}}{}
\localtableofcontents
}
\usepackage{hyperref}
\begin{document}
\addchap{ALPHA}
\chaptertoc
\section{Alpha}
\section{Beta}
\addchap{BETA}
\chaptertoc
\section{Alpha}
\section{Beta}
\end{document}
第二章目录的链接指向第一章的章节。当我使用时\chapter
,这不是问题;但是,我想保留\addchap
。有什么办法吗?
答案1
hypertexnames=false
为包设置选项hyperref
:
\documentclass{scrbook}
\usepackage{etoc}
\newcommand*\chaptertoc{
\etocsetnexttocdepth{2}
\etocsettocstyle{\section*{Local contents}}{}
\localtableofcontents
}
\usepackage[hypertexnames=false]{hyperref}% <- changed
\begin{document}
\addchap{ALPHA}
\chaptertoc
\section{Alpha}
\section{Beta}
\addchap{BETA}
\chaptertoc
\section{Alpha}
\section{Beta}
\end{document}
附加信息
正如 @jfbu 提到的,该问题与软件包无关etoc
。因此,我将使用不带软件包的 MWE etoc
:
\documentclass{scrbook}
\usepackage{hyperref}
\begin{document}
\tableofcontents
\addchap{ALPHA}
\section{Alpha}
\section{Beta}
\addchap{BETA}
\section{Alpha (2)}
\section{Beta (2)}
\end{document}
结果:
如您所见,有两个带有数字的部分0.1
和两个带有数字的部分,0.2
因为\addchap
不会步进章节计数器,而是重置部分计数器。
包默认hyperref
使用hypertexnames=true
。因此 hyperref 根据链接类型和相应的计数器构建链接名称(您可以在 *.aux 和 *.toc 中找到这些链接名称):
chapter*.2
section.0.1
section.0.2
chapter*.3
section.0.1
section.0.2
如您所见,有两个带有 name 的链接section.0.1
和两个带有 name 的链接section.0.2
。并且您会收到两个相关警告:
pdfTeX 警告(ext4):具有相同标识符(name{section.0.1})的目标已被使用,重复项被忽略
和
pdfTeX 警告(ext4):具有相同标识符(name{section.0.2})的目标已被使用,重复项被忽略
因此,指向编号为 0.1 或 0.2 的部分的所有链接分别转到文档中编号为 0.1 和 0.2 的第一个部分。
为了避免此问题,您必须使用唯一的链接名称。可以使用hypertexnames=false
package选项来完成此操作hyperref
:
\usepackage
[hypertexnames=false]% <- added
{hyperref}
然后所有链接名称仅使用一个计数器
chapter*.2
section.3
section.4
chapter*.5
section.6
section.7
生成的文档与上面的文档相同,但链接名称是唯一的。因此目录条目 »0.2 Beta (2)« 链接到第二章的第二节。
但我认为,如果一个章节编号在一个文档中出现不超过一次会更好。
您可以结合\addchap
和\addsec
:
\documentclass{scrbook}
\usepackage{hyperref}
\begin{document}
\tableofcontents
\addchap{ALPHA}
\addsec{Alpha}
\addsec{Beta}
\addchap{BETA}
\addsec{Alpha (2)}
\addsec{Beta (2)}
\end{document}
结果:
或者,你可以独立于章节计数器使用部分计数器:
\documentclass{scrbook}
\usepackage{hyperref}
\RedeclareSectionCommand[
counterwithout=chapter
]{section}
\begin{document}
\tableofcontents
\addchap{ALPHA}
\section{Alpha}
\section{Beta}
\addchap{BETA}
\section{Alpha (2)}
\section{Beta (2)}
\end{document}
结果:
答案2
原始答案
(这只是部分答案,但对于评论来说太长了)
etoc
该问题与以下最小示例无关,其中所有etoc
相关事项均已被注释掉:
\documentclass{scrbook}
% \usepackage{etoc}
% \newcommand*\chaptertoc{
% \etocsetnexttocdepth{2}
% \etocsettocstyle{\section*{Local contents}}{}
% \localtableofcontents
% }
\usepackage{hyperref}
\begin{document}
\tableofcontents
\addchap{ALPHA}
%\chaptertoc
\section{Alpha}
\section{Beta}
\addchap{BETA}
%\chaptertoc
\section{Alpha (2)}
\section{Beta (2)}
\end{document}
这将生成如下的主目录:
PDF 在 Acrobat Reader 中打开,显示红色的 hyperref 框,表示内部链接(并非所有 PDF 查看器都显示,例如 Mac OS 上的 Skim 就不显示)。但是,部分Alpha (2)
和的链接Beta (2)
是错误的。
hyperref
因此,与此处使用\addchap
的不兼容KOMA-script
。也许 的文档KOMA-script
有相关信息?
更新了概念证明
\documentclass{scrbook}
\usepackage{hyperref}
\newcounter{unnumberedchapter}
\def\theHsection{\the\value{chapter}.\the\value{unnumberedchapter}.\the\value{section}}
\def\myaddchap{\refstepcounter{unnumberedchapter}\addchap}
\begin{document}
\tableofcontents
\myaddchap{ALPHA}
\section{Alpha}
\section{Beta}
\myaddchap{BETA}
\section{Alpha (2)}
\section{Beta (2)}
\end{document}
这给出了正确的链接。
我认为 KOMA 应该做类似的事情。
(不使用上述概念证明,而是使用一种常用方法,将编号和未编号的章节用作链接目标名称;无论是通用计数器,还是像其他标记语言那样输出到 html 以将章节标题转换为 ID 等……我完全没有理由认为内部链接必须能够同时具有编号和未编号的目标,应该永远使用实际的印刷编号。如果是这样,那么使用不是罪过吗\phantomsection
?它创建了太多“不可猜测”的名称,尽管很难确切地说出“不可猜测”的含义,因为这些名称确实遵循明确的逻辑,它们不是随机的,因此任何拥有该文档的人都可以“猜出”这些名称。但为了什么呢?)