我需要将各部分的标题置于目录中。我正在尝试以下两种方法:
\documentclass{article}
\usepackage{hyperref}
\usepackage{tocloft}
\cftpagenumbersoff{part}
\begin{document}
\tableofcontents
\addcontentsline{toc}{part}{\centerline{Part A}}
\addcontentsline{toc}{section}{Section A}
\addcontentsline{toc}{part}{\hfill{Part B}\hfill}
\addcontentsline{toc}{section}{Section B}
\end{document}
在生成PDF时,书签存在一些问题:
- A 部分在书签中显示为“toPart A”。
- B 部分按层次结构显示在 A 部分下。
- B 部分在书签中显示正确,但未正确位于页面中央。
我该怎么做才能解决这个问题?谢谢!
答案1
\hfill
或\centerline
没有有效的书签内容。使用\texorpdfstring{ToC content}{bookmark content}
。
还要使用正确的加载顺序:,,tocloft
以获得正确的层次结构。hyperref
bookmark
\documentclass{article}
\usepackage{tocloft}
\usepackage{hyperref}
\usepackage{bookmark}
\cftpagenumbersoff{part}
\begin{document}
\tableofcontents
\addcontentsline{toc}{part}{\texorpdfstring{\centerline {Part A}}{Part A}}
\addcontentsline{toc}{section}{Section A}
\addcontentsline{toc}{part}{\texorpdfstring{\centerline {Part B}}{Part B}}
\addcontentsline{toc}{section}{Section B}
\end{document}
答案2
如果您想要一个好的书签层次结构,您应该添加锚点。在我看来,部分条目的外观应该通过 tocloft 命令来设置:
\documentclass{article}
\usepackage{tocloft}
\cftpagenumbersoff{part}
\renewcommand \cftpartfont {\hfill}
\renewcommand \cftpartafterpnum{\hfill\mbox{}}
\usepackage{hyperref}
\begin{document}
\tracingmacros=1
\tableofcontents
\phantomsection\addcontentsline{toc}{part}{Part A}
\phantomsection\addcontentsline{toc}{section}{Section A}
\phantomsection\addcontentsline{toc}{part}{Part B}
\phantomsection\addcontentsline{toc}{section}{Section B}
\end{document}
答案3
\addcontentsline
使用最新的锚点设置作为书签。问题的示例不包含命令的明确锚点设置\addcontentsline
,因此它们都共享相同的最新锚点,在本例中是文档开头的锚点。
如果有多个书签共享同一个锚点,则书签算法无法正常工作。通过添加包可以解决这个问题bookmark
。
可以设置一个锚点\phantomsection
,并应确保位置正确,因为这是书签的目标。通常可以看到以下模式:
\cleardoublepage
\phantomsection
\addcontentsline{toc}{part}{...}
Part stuff.
类似这样的宏\centerline
没有意义,并且在书签中不起作用,可以通过全局禁用\pdfstringdefDisableCommands
,例如:
\pdfstringdefDisableCommands{\let\centerline\@firstofone}
但是,\centerline
里面看起来不太好\addcontentsline
。通常最好更改目录的布局(例如,重新定义\l@part
或使用处理目录布局的包)。