PDF 中的书签乱了

PDF 中的书签乱了

我需要将各部分的标题置于目录中。我正在尝试以下两种方法:

\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时,书签存在一些问题:

  1. A 部分在书签中显示为“toPart A”。
  2. B 部分按层次结构显示在 A 部分下。
  3. B 部分在书签中显示正确,但未正确位于页面中央。

我该怎么做才能解决这个问题?谢谢!

答案1

\hfill\centerline没有有效的书签内容。使用\texorpdfstring{ToC content}{bookmark content}

还要使用正确的加载顺序:,,tocloft以获得正确的层次结构。hyperrefbookmark

\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或使用处理目录布局的包)。

相关内容