hyperref
以一般的方式,我怎样才能更改(或)自动生成的书签的格式bookmark
?
所谓通用,是指无需修改文档 TeX 即可自定义、、part
等书签格式的能力。理想情况下,它将包含在类包装器中。chapter
section
书签格式创意:
- 未编号的部分、已编号的章节、未编号的节/小节(但它们都已编号 -
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
(导致两个单独的补丁)。
无需加载hyperref
。bookmark
加载hyperref
并使用其部分代码。请参阅我应该先加载哪个包:hyperref
或者bookmark
?