在包含 LaTeX 代码的目录中添加自定义行

在包含 LaTeX 代码的目录中添加自定义行

我想在目录中添加自定义行。此自定义行由两个元素组成:缩写和标题。缩写可以由 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功能将使用伪造的章节号A01Z书签,其中 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}

在此处输入图片描述

这是左对齐版本:

在此处输入图片描述

相关内容