更改 hyperref 生成的 PDF 书签的格式

更改 hyperref 生成的 PDF 书签的格式

hyperref以一般的方式,我怎样才能更改(或)自动生成的书签的格式bookmark

所谓通用,是指无需修改文档 TeX 即可自定义、、part等书签格式的能力。理想情况下,它将包含在类包装器中。chaptersection

书签格式创意:

  • 未编号的部分、已编号的章节、未编号的节/小节(但它们都已编号 - not@star)。
  • 部分格式:“部分 <#>:”或“,部分 <#>”
  • 将数字移至标题之后

梅威瑟:

\document{scrbook}
\usepackage{hyperref}
\usepackage[numbered]{bookmark}
\begin{document}
\part{Test Part}
\chapter{Test Chapter}
\section{Test Section}
\part{Test Part}
\chapter{Test Chapter}
\section{Test Section}
\end{document}

这是索引输出 (evince),上面标有我想要执行的操作。也许重写bookmark/hyperref命令就可以了?

示例输出

答案1

以下提供在书签中交换标题和数字的功能:

在此处输入图片描述

\documentclass{scrbook}% http://ctan.org/pkg/KOMA-script
% \usepackage{hyperref}% http://ctan.org/pkg/hyperref
\usepackage[numbered]{bookmark}% http://ctan.org/pkg/bookmark
\usepackage{etoolbox}% http://ctan.org/pkg/etoolbox

\makeatletter
\let\store@Hy@writebookmark\Hy@writebookmark
% Argument patching inside a macro: https://tex.stackexchange.com/q/113147/5764
\catcode`\#=12
% Swap num/title in bookmarks
\newcommand{\reversetitlenumswap}{%
  % \patchcmd{<cmd>}{<search>}{<replace>}{<success>}{<failure>}
  \patchcmd{\Hy@writebookmark}{#2}{\BKM@reversetitle}{}{}%
  \patchcmd{\Hy@writebookmark}{\bookmark}{\let\numberline\@gobble\edef\BKM@reversetitle{#2\ #1}\bookmark}{}{}%
}
\catcode`\#=6
\newcommand{\reverttitlenumswap}{\let\Hy@writebookmark\store@Hy@writebookmark}% Revert num/title swap in bookmarks
% Section-specific swapping of num/title in bookmarks
\newcommand{\parttitlenumswap}{\renewcommand{\addparttocentry}[2]{{\reversetitlenumswap\addtocentrydefault{part}{##1}{##2}}}}
\newcommand{\chaptertitlenumswap}{\renewcommand{\addchaptertocentry}[2]{{\reversetitlenumswap\addtocentrydefault{chapter}{##1}{##2}}}}
\newcommand{\sectiontitlenumswap}{\renewcommand{\addsectiontocentry}[2]{{\reversetitlenumswap\addtocentrydefault{section}{##1}{##2}}}}
\makeatother

\begin{document}

\parttitlenumswap% Swap \part num/title in bookmarks
\sectiontitlenumswap% Swap \section num/title in bookmarks

\part{Test Part}
\chapter{Test Chapter}
\section{Test Section}

\part{Test Part}
\chapter{Test Chapter}
\section{Test Section}

\end{document}

上面的 MWE 提供了\reversetitlenum充当开关的功能。调用此宏后,所有后续的分段单元将在书签中交换编号/标题。\reverttitlenum是一个恢复到默认显示的开关。

还提供了针对每个部分单元的单独宏(\part\chapter\section,尽管也可以根据需要定义其他),以选择性地激活书签结构的交换。

这个解决方案的主要方法是侵入\Hy@writebookmark最终调用来构造书签的宏(来自bookmark.dtx):

\def\Hy@writebookmark#1#2#3#4#5{%
  \ifnum#4>\BKM@depth\relax
  \else
    \def\BKM@type{#5}%
    \ifx\BKM@type\Hy@bookmarkstype
      \begingroup
        \ifBKM@numbered
          \let\numberline\Hy@numberline
          \let\booknumberline\Hy@numberline
          \let\partnumberline\Hy@numberline
          \let\chapternumberline\Hy@numberline
        \else
          \let\numberline\@gobble
          \let\booknumberline\@gobble
          \let\partnumberline\@gobble
          \let\chapternumberline\@gobble
        \fi
        \bookmark[level=#4,dest={#3}]{#2}%
      \endgroup
    \fi
  \fi
}

它需要 5 个参数,其中前 2 个从视觉/最终用户的角度来看是最重要的。#1包含分段单元编号<num>(尽管从未使用过),而#2包含形式为 的 ToC 类条目\protect\numberline{<num>}<title>。默认仅使用#2。建议的补丁\reversetitlenumswap使用两者,将其打印为,#2\ #1同时暂时停用宏\numberline。补丁插入到\bookmark条目正上方,同时还更新仅的使用#2(导致两个单独的补丁)。

无需加载hyperrefbookmark加载hyperref并使用其部分代码。请参阅我应该先加载哪个包:hyperref或者bookmark

相关内容