使用 \contentsline 和 hyperref 时出现额外的花括号错误

使用 \contentsline 和 hyperref 时出现额外的花括号错误

我想在目录中在章节名称下方添加一些评论文字。以下目录中没有页码的章节我对此进行了修改,创建了一个\fakesection隐藏页码的命令。它看起来很棒(见下面的渲染),但它不会与包共存hyperref。第二次失败pdflatex如下:

[Loading MPS to PDF converter (version 2006.09.02).]
))) (/usr/share/texlive/texmf-dist/tex/latex/hyperref/nameref.sty
(/usr/share/texlive/texmf-dist/tex/generic/oberdiek/gettitlestring.sty))
(./test.out) (./test.out) (./test.toc
! Argument of \contentsline has an extra }.
<inserted text> 
                \par 
l.3 \contentsline
                  {chapter}{\numberline {2}EFGH}{5}{chapter.2}%
?

如果我只有一章,结果如下:

[Loading MPS to PDF converter (version 2006.09.02).]
))) (/usr/share/texlive/texmf-dist/tex/latex/hyperref/nameref.sty
(/usr/share/texlive/texmf-dist/tex/generic/oberdiek/gettitlestring.sty))
(./test.out) (./test.out) (./test.toc)
Runaway argument?
! File ended while scanning use of \contentsline.
<inserted text> 
                \par 
l.23 \tableofcontents
                     
?

以下是 MWE 和 TOC 的呈现:

\documentclass[12pt]{book}
\usepackage{tocloft}
\usepackage{lipsum}
% Uncommenting this will result in ! Argument of \contentsline has an extra }.
%\usepackage[pdfusetitle,colorlinks]{hyperref}

\newcommand\fakesection[2][]{%
  \ifx&#1&%
    \fakesection[#2]{#2}%
  \else
    \section*{#2}%
    \sectionmark{#1}%
    \addtocontents{toc}{\protect\contentsline{section}{#1}{}}%
  \fi
}

\renewcommand\cftchapdotsep{\cftdotsep}%
\renewcommand\cftsecdotsep{200}
\makeatletter
\renewcommand\cftsecpagefont{\@gobble}
\makeatother

\begin{document}
\tableofcontents

\chapter{ABCD}
\fakesection{The First Four Letters}
\lipsum[1-5]
\chapter{EFGH}
\fakesection{The Next Four Letters}
\lipsum[6-10]
\chapter{IJKL}
\fakesection{Halfway Through}
\lipsum[11-15]
\chapter{MNOP}
\fakesection{The Middle of the Alphabet}
\lipsum[16-20]
\chapter{QRST}
\fakesection{Over the Hill of Letters}
\lipsum[21-25]
\chapter{UVWX}
\fakesection{Almost Done}
\lipsum[26-30]
\chapter{YZ}
\fakesection{The Two Stragglers}
\lipsum[31-35]
\end{document}

在此处输入图片描述

答案1

\contentsline应该有参数,因为 hyperref 需要这个(它将目标名称存储在第四个参数中)。在当前的 LaTeX 中\contentsline始终有四个参数,因此即使不涉及 hyperref,使用四个参数也不会有什么坏处。

还可以删除\renewcommand\cftsecpagefont{\@gobble}或在第三个参数中放入一些可以实际处理的\contentsline内容\@gobble

相关内容