我想自定义我的目录,让它看起来或多或少像运动山物理教科书,包括可点击的页码。我决定使用hyperref
和titletoc
包。现在看来,这两者(我猜)的兼容性存在问题。
背景。我的 -class 文档的目录article
仅显示章节和子章节。章节(带标签/编号和不带标签/编号的)应使用 basic 格式\titlecontents
,而子章节应使用带星号的版本。看起来后者是导致链接错误的原因。
问题。每当给定节位于带有子节的节之后时,前者就会错误地链接到这些子节中的第一个。其他所有节和所有子节均正常。
梅威瑟:
\documentclass{article}
\usepackage[cp1250]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{titletoc}
\titlecontents{section}[.5pc]%
{\addvspace{.5pc}\normalsize\makebox[2pc][r]{\thecontentspage\hspace{1pc}}}%
{\makebox[2.5pc][r]{\thecontentslabel\hspace{1pc}}}%
{\makebox[2.5pc][r]{\null}}%
{}%
% comment this starred part and it does work...
\titlecontents*{subsection}[6.5pc]%
{\small}{}{}%
{\hspace{5pt}\thecontentspage}%
[\ \textbullet\ ]
\usepackage[colorlinks,linktoc=page]{hyperref}
\begin{document}
% Frontmatter - only unnumbered/unlabeled sections
\pagenumbering{roman}
\section*{Frontmatter Section Pre-TOC}
% TOC ...goes to TOC.
\clearpage
\phantomsection
\addcontentsline{toc}{section}{\contentsname}
\tableofcontents
\clearpage
\phantomsection
\section*{Frontmatter Section 1}
\addcontentsline{toc}{section}{Frontmatter Section 1}
\clearpage
\phantomsection
\section*{Frontmatter Section 2}
\addcontentsline{toc}{section}{Frontmatter Section 2}
% Mainmatter - only numbered/labeled sections
\clearpage
\pagenumbering{arabic}
\clearpage
\section{Section 1}
\subsection{Subsection 1.1}
\subsection{Subsection 1.2}
\subsection{Subsection 1.3}
\clearpage
\section{Section 2}
\clearpage
\section{Section 3}
\subsection{Subsection 3.1}
\subsection{Subsection 3.2}
\clearpage
\section{Section 4}
\subsection{Subsection 4.1}
\subsection{Subsection 4.2}
\subsection{Subsection 4.3}
\subsection{Subsection 4.4}
\subsection{Subsection 4.5}
\clearpage
\section{Section 5}
\clearpage
\section{Section 6}
\subsection{Subsection 6.1}
\subsection{Subsection 6.2}
\subsection{Subsection 6.3}
% Backmatter - all (sub)sections w/o labels
\clearpage
\phantomsection
\section*{Backmatter Section 1}
\addcontentsline{toc}{section}{Backmatter Section 1}
\phantomsection
\subsection*{Backmatter Subsection 1.1}
\addcontentsline{toc}{subsection}{Backmatter Subsection 1.1}
\phantomsection
\subsection*{Backmatter Subsection 1.2}
\addcontentsline{toc}{subsection}{Backmatter Subsection 1.2}
\clearpage
\phantomsection
\section*{Backmatter Section 2}
\addcontentsline{toc}{section}{Backmatter Section 2}
\clearpage
\phantomsection
\section*{Backmatter Section 3}
\addcontentsline{toc}{section}{Backmatter Section 3}
\end{document}
因此看起来这一切都是由星号引起的\titlecontents*
……
我添加\clearpage
s 只是为了延长输出文件并添加一些页面,这不会改变其他任何东西。
提前感谢你帮助我解决这个问题。
编辑:
也许一个可能的解决方法是使用etoolbox
带有自定义计数器的列表,很可能也带有自定义链接?
编辑2:
有没有人至少设法用给定的 MWE 重现了错误?;-) 我知道这hyperref
没什么大不了的titletoc
,但不知道它们在多大程度上是不兼容的。换句话说,我的问题是一个常见问题吗?或者可能恰恰相反:过于本地化? 这个问题的答案对我来说也意义重大 :-)
总结一下:这似乎都是关于星号titlecontents*
宏的一些问题。所有链接都可以使用经典的——只有当您将 ToC 条目分组到一个段落中时才会变得混乱......
我做了一些胆怯的尝试来解决这个问题,找到了一些例子并取得了一些进展......现在我明白了hyperref
,这只是分组目录中的链接算法出了问题。起初我titletoc
只是责怪,所以尝试使用其他工具使我的目录看起来一样。那当然至少可以说,这是一个死路。链接每次都是以同样的方式出错。我感到很无助...
无论如何,也许有人可以帮我一下,尝试处理这些链接仅此而已?我会很感激哪怕最微小的反馈 :-)
答案1
我的解决方案是这样的(我实际上扩展了它以包括子部分):
加载
hyperref
无目录链接(选项linktoc=none
)以手动定义它们。在这里我决定章节应该链接到它们开始的整个页面,而子章节则正常链接。为数字子部分定义自定义计数器 - 仅供参考,仅用于主要事项。
使用自定义部分目录条目
titletoc
(这样更容易)。借助一些切换按钮,分别重新定义
\l@subsection
和自定义子部分和子子部分的目录条目。我可以使用自定义这些条目,但它们不会对齐,因此看起来会更糟糕。\l@subsubsection
etoolbox
titletoc
最后,切换
\hypersetup{linktoc=page}
以便图表列表等页面上的链接能够正常工作。
代码:
\documentclass[12pt]{article}
\usepackage[cp1250]{inputenc}
\usepackage{lmodern} % for the looks
\usepackage{biolinum} % for the looks
\usepackage[T1]{fontenc}
\usepackage{etoolbox}
\usepackage{titletoc}
\usepackage[colorlinks,linktoc=none]{hyperref}
\newcounter{numSubSection}
\setcounter{numSubSection}{0}
\gpreto{\subsection}{%
\refstepcounter{numSubSection}}%
\titlecontents{section}[0pt]%
{\addvspace{6pt}\sffamily\bfseries\normalsize%
\makebox[18pt][r]{%
\hyperlink{page.\thecontentspage}{\textbf{\thecontentspage}}%
\hspace{6pt}}}%
{\makebox[30pt][r]{\thecontentslabel\hspace{12pt}}}%
{\makebox[30pt][r]{\null}}%
{}%
\makeatletter
\newlength{\TOCleftSkip}
\setlength{\TOCleftSkip}{66pt}%
\newlength{\TOCrightSkip}
\setlength{\TOCrightSkip}{18pt}%
\newtoggle{ifSub}
\togglefalse{ifSub}%
\newtoggle{ifSection}
\toggletrue{ifSection}%
\newcounter{RefSubSection}%
\setcounter{RefSubSection}{0}%
\renewcommand*\theRefSubSection{\@arabic\c@RefSubSection}%
\renewcommand*{\tableofcontents}{%
\section*{\contentsname}%
\addcontentsline{toc}{section}{\contentsname}%
\toggletrue{ifSection}%
\setcounter{RefSubSection}{0}%
\@starttoc{toc}}%
\gpreto{\l@section}{%
\nottoggle{ifSection}
{\par%
\addtolength{\leftskip}{-\TOCleftSkip}%
\addtolength{\rightskip}{-\TOCrightSkip}%
\togglefalse{ifSub}}{}%
\toggletrue{ifSection}}%
\renewcommand*{\l@subsection}[2]{%
\stepcounter{RefSubSection}%
\toggletrue{ifSub}%
\iftoggle{ifSection}
{\togglefalse{ifSection}%
\addtolength{\leftskip}{\TOCleftSkip}%
\addtolength{\rightskip}{\TOCrightSkip}%
\noindent}%
{\unskip\begingroup\upshape\small\ \textbullet~\endgroup}%
\begingroup%
\upshape\small#1\ \hyperlink{numSubSection.\theRefSubSection}{\textbf{#2}}%
\endgroup}%
\renewcommand*{\l@subsubsection}[2]{%
\iftoggle{ifSection}
{\togglefalse{ifSection}%
\addtolength{\leftskip}{\TOCleftSkip}%
\addtolength{\rightskip}{\TOCrightSkip}%
\noindent}%
{\iftoggle{ifSub}
{\togglefalse{ifSub}\relax%
\unskip\begingroup\upshape\small:\ \endgroup}%
{\unskip\begingroup\itshape\small,\ \endgroup}}%
\begingroup\itshape\small#1\endgroup}%
\renewcommand*{\numberline}[1]{}%
\makeatother
% solution ends here, code below is just for the example
\begin{document}
% Frontmatter - only unnumbered/unlabeled sections
\pagenumbering{roman}
\clearpage
\tableofcontents
\clearpage
\section*{Preface}
\addcontentsline{toc}{section}{Preface}
\clearpage
\section*{Another Preface}
\addcontentsline{toc}{section}{Another Preface}
% Mainmatter - only numbered/labeled sections
\clearpage
\addtocontents{toc}{\protect\vspace{18pt}} % just some separation
\pagenumbering{arabic}
%\clearpage
\section{First}
\subsection{Australia}
\subsubsection{Alpha}
\subsubsection{Beta}
\subsubsection{Charlie}
\subsubsection{Delta}
\subsubsection{Echo}
\subsubsection{Foxtrot}
\subsection{Brazil}
\subsubsection{Golf}
\subsubsection{Hotel}
\subsubsection{India}
\subsection{Canada}
\clearpage
\section{Second}
\clearpage
\section{Third}
\subsection{Denmark}
\subsubsection{Juliet}
\subsubsection{Kilo}
\subsubsection{Lima}
\subsubsection{Mike}
\subsubsection{November}
\subsection{Egypt}
\subsubsection{Oscar}
\subsubsection{Papa}
\subsubsection{Quebec}
\subsubsection{Romeo}
\clearpage
\section{Fourth}
\subsection{Georgia}
\subsubsection{Sierra}
\subsection{Haiti}
\subsubsection{Tango}
\subsubsection{Uniform}
\subsubsection{Victor}
\subsubsection{Whiskey}
\subsection{Iceland}
\subsection{Japan}
\subsubsection{X-ray}
\subsubsection{Yankee}
\subsubsection{Zulu}
\subsubsection{Alpha}
\subsubsection{Beta}
\subsubsection{Charlie}
\subsubsection{Delta}
\subsubsection{Echo}
\subsection{Kenya}
\subsubsection{Foxtrot}
\subsection{Laos}
\subsubsection{Golf}
\subsubsection{Hotel}
\subsubsection{India}
\subsubsection{Juliet}
\subsubsection{Kilo}
% Backmatter - all (sub)sections w/o labels
\clearpage
\addtocontents{toc}{\protect\vspace{18pt}} % just some separation
\hypersetup{linktoc=page}
\section*{References}
\addcontentsline{toc}{section}{References}
\clearpage
\section*{List of Figures}
\addcontentsline{toc}{section}{List of Figures}
\clearpage
\section*{Index}
\addcontentsline{toc}{section}{Index}
\end{document}
这很可能可以做得更容易/更漂亮,但至少它完成了工作。希望一切都很清楚 ;-)
该代码翻译过来就是这个样子: