我想在目录中添加自定义行。此自定义行由两个元素组成:缩写和标题。缩写可以由 1 到 3 个字符组成,但无论其长度如何,都应始终占用完全相同的预定义空间,以便目录中的标题彼此对齐。
下面这个最小的例子几乎可以正常工作:
\documentclass{article}
\usepackage{hyperref}
\begin{document}
\tableofcontents
\section*{Some starred section}
\addcontentsline{toc}{section}{\protect\parbox{3em}{A01} Some title}
Foo
\section*{Some other starred section}
\addcontentsline{toc}{section}{\protect\parbox{3em}{Z} Some other title}
Bar
\end{document}
正如您在下面看到的,缩写在目录中以相同的长度出现,并且标题彼此整齐对齐:
但是,hyperref 生成的 PDF 索引(例如,可以在 Acrobat Reader 的侧边栏中看到)很乱。条目如下:
- 3emA01 一些标题
- 3emZ 其他标题
由于某种原因,在生成 PDF 索引时会考虑“3em”部分。这是不行的,PDF 索引应该包含:
- A01 部分标题
- Z 其他标题
我该如何实现这一点?请注意,我并不反对使用\parbox
上述以外的其他解决方案,只要缩写占据预定义的固定空间并且标题在目录中对齐,同时 PDF 索引也正确生成。
答案1
章节号框的宽度可以随包装tocloft
和\cftsecnumwidth
长度而改变(我1.5em
在这里添加的,随意更改为更合适的值)该bookmarksnumbered=true
功能将使用伪造的章节号A01
和Z
书签,其中 as\numberline
负责目录条目
\documentclass{article}
\usepackage{tocloft}
\usepackage[bookmarksnumbered=true]{hyperref}
\addtolength{\cftsecnumwidth}{1.5em}
\begin{document}
\tableofcontents
\phantomsection
\addcontentsline{toc}{section}{\protect\numberline{A01}Some title}
\section*{Some starred section}
Foo
\phantomsection
\addcontentsline{toc}{section}{\protect\numberline{Z}Some other title}
\section*{Some other starred section}
Bar
\end{document}
答案2
\parbox
不支持仅由单行组成的书签。以下示例定义了标记宏\abbrnum
,该宏针对书签进行了重新定义。
\documentclass{article}
\usepackage{hyperref}
\usepackage{bookmark}% faster updated bookmarks
\DeclareRobustCommand*{\abbrnum}[1]{%
\parbox{3em}{#1}%
}
\pdfstringdefDisableCommands{\let\abbrnum\@firstofone}
\begin{document}
\tableofcontents
\section*{Some starred section}
\addcontentsline{toc}{section}{\abbrnum{A01} Some title}
Foo
\section*{Some other starred section}
\addcontentsline{toc}{section}{\abbrnum{Z} Some other title}
Bar
\end{document}
如果未使用编号部分,则\numberline
可以使用通常的方法。可以通过更好的类或包或修补来增加编号的空间:
\documentclass{article}
\usepackage{hyperref}
\usepackage{bookmark}% faster updated bookmarks
\bookmarksetup{numbered}
% Patch \l@section to increase space for number from 1.5em to 3em.
\usepackage{etoolbox}
\makeatletter
\patchcmd\l@section{\setlength\@tempdima{1.5em}}%
{\setlength\@tempdima{3em}}{}{%
\errmessage{\noexpand\l@section could not be patched}%
}
\makeatother
\begin{document}
\tableofcontents
\section*{Some starred section}
\addcontentsline{toc}{section}{\protect\numberline{A01}Some title}
Foo
\section*{Some other starred section}
\addcontentsline{toc}{section}{\protect\numberline{Z}Some other title}
Bar
\end{document}
目录和书签中有章节编号,但在实际章节位置却没有,这对我来说很奇怪,因此我只需重新定义\thesection
以显示新编号即可。然后引用也会按预期工作。
\documentclass{article}
\usepackage{hyperref}
\usepackage{bookmark}% faster updated bookmarks
\bookmarksetup{numbered}
% Patch \l@section to increase space for number from 1.5em to 3em.
\usepackage{etoolbox}
\makeatletter
\patchcmd\l@section{\setlength\@tempdima{1.5em}}%
{\setlength\@tempdima{3em}}{}{%
\errmessage{\noexpand\l@section could not be patched}%
}
\makeatother
\begin{document}
\tableofcontents
\renewcommand*{\thesection}{A01}
\section{Some starred section}
Foo
\renewcommand*{\thesection}{Z}
\section{Some other starred section}
Bar
\end{document}
答案3
这里我引入了\preplabel{}
,它将标签放在\ttfamily
右对齐字段中,以便所有标签在内容页面上的宽度相同。如果希望左对齐,则更改很简单……只需重新定义\preplabelhelp
为以下内容:
\def\preplabelhelp#1#2#3{\ttfamily#1#2#3\ifx#3\relax~\fi\ifx#2\relax~\fi~~~\rmfamily}
当然,由于 PDF 书签字体不是\ttfamily
并且不允许在其中间更改字体,因此书签本身的间距不会显得统一。
\documentclass{article}
\usepackage{hyperref}
\newcommand\preplabel[1]{\preplabelhelp#1\relax\relax}
\def\preplabelhelp#1#2#3{\ttfamily\ifx#3\relax~\fi\ifx#2\relax~\fi#1#2#3~~~\rmfamily}
\begin{document}
\tableofcontents
\section*{Some starred section}
\addcontentsline{toc}{section}{\preplabel{A01} Some title}
Foo
\section*{Some other starred section}
\addcontentsline{toc}{section}{\preplabel{Z} Some other title}
Bar
\end{document}
这是左对齐版本: