理解 titletoc 示例(以及行上的垂直对齐)

理解 titletoc 示例(以及行上的垂直对齐)

编辑:TLDR 摘要(正如我在评论中所写):我想从这个问题中得到什么(以及本文引用的其他几项) 是: - section number(标签)是顶部对齐title+AND我想要title 底部对齐page number- 在同一条线-- 当目录条目被排版时(我使用框架只是为了进行视觉调试)


我问更改行中间项目的垂直对齐方式(用于目录条目)并在那里得到了一个建议,我应该尝试一下titletoc。确实,在文档的第 14 页中,有一个例子看起来正是我想要的(强调部分):

titlesec-手册

...但是,我根本无法得到一个可行的例子。

第一个问题是我真的不明白那些特定的<left><right>在 PDF 中,我无法搜索包含的括号),或者我如何更改它们。目前我在手册中看到的最接近的定义是这些定义:

\titlecontents{ <section> }[ <left> ]{ <above-code> }
              { <numbered-entry-format> }{ <numberless-entry-format> }
              { <filler-page-format> }[ <below-code> ]

\contentsmargin[ <correction> ]{ <right> }

... 显然,我已经开始<left>\titlecontents- 并且我已经开始<right>\contentsmargin;对吗?!

具体来说,该手册继续写道:

您需要做的就是以正确的方式放置这些元素。如果您已使用 预留了空间 \hspace*{-2pc},只需放置一个包含部分标签或页面的 2 pc 宽度的框,以便检索此空间;...

...但我不明白两件事:

  • 这个预留空间在哪里\hspace*{-2pc}完成?(\titlecontents
  • 这个 2 件宽度的盒子应该放在哪里?(\titlecontents?还是在线\addtocontents

我正在尝试基于此(下面的 MWE)构建一个示例,我能得到的最接近的是对这个代码片段的分析(为了进行可视化调试而添加的字母):

\contentsmargin{-4em}
\titlecontents{part}[2.3em]
  {A}
  {B\filbreak C\contentslabel{2.3em}D}
  {E\fbox{\hspace*{2.3em}F\rule{2.3em}{2pt}}}
  {G\titlerule*[1pc]{.}H\contentspage I\nobreak}

...结果是:

我的例子.png

...我只能说:

  • ATOC 条目以( <above-code>)开头
  • B, C,D被忽略 ( <numbered-entry-format>)
  • E紧接着开始(F同时显示),直到章节编号排版完毕(<numberless-entry-format>
  • 标题按原样排版;如果没有定义宽度的段落环境(\addtocontents),长线将不是休息 (手册在给出插图时没有明确说明这一点
    • 如果我使用 aminipage来设置条目的宽度 - 那么所有内容都会居中,并且我又回到了与原始问题
  • G打印在引导点之前 - H(并且,我猜,也是I)打印在引导点之后,但在页码之前(<filler-page-format>);
    • 我不明白\contentspage那里应该做什么

...这就是我所能理解的全部内容;但我真的不明白如何才能获得我想要的 TOC 条目格式。

更糟糕的是,当我用构建 MWE 时pdflatex,它会通知以下信息:

(./test.aux) )
(see the transcript file for additional information)pdfTeX warning (dest): name
{\040\\unhbox\040\\voidb@x\040\\setbox\040\\@tempboxa\040\\hbox\040{\\color@beg
ingroup\040\\kern\040\\fboxsep\040{\040part.III}\\kern\040\\fboxsep\040\\endgra
f\040\\endgroup\040}\\@tempdima\040\\fboxrule\040\\advance\040\\@tempdima\040\\
fboxsep\040\\advance\040\\@tempdima\040\\dp\040\\@tempboxa\040\\hbox\040{\\lowe
r\040\\@tempdima\040\\hbox\040{\\vbox\040{\\hrule\040height\\fboxrule\040\\hbox
\040{\\vrule\040width\\fboxrule\040\\relax\040\\vbox\040{\\vskip\040\\fboxsep\0
40\\box\040\\@tempboxa\040\\vskip\040\\fboxsep\040}\\relax\040\\vrule\040width    \fboxrule\040}\\hrule\040height\\fboxrule\040}}}\040} has been referenced but d
oes not exist, replaced by a fixed one

pdfTeX warning (dest): name{\040...{\040part.II}...\040}
 has been referenced but does not exist, replaced by a fixed one

pdfTeX warning (dest): name{\040...{\040part.I}...\040} 
has been referenced but does not exist, replaced by a fixed one

...因此显然有些地方出了问题——即使运行完成(并且生成了 PDF)。

那么,有人知道现有的 MWE 可以实现手册第 13/14 页上的插图titletoc吗?或者,有人能帮忙修复 MWE 以使其实现相同的示例吗?

MWE 代码在这里:

\documentclass{book}

\usepackage{hyperref}
\hypersetup{pdftex, colorlinks=true, linkcolor=black}
\usepackage{titletoc}

% like definition for \phantomsection, but for part
% "Re: documentation for \phantomsection"
% http://newsgroups.derkeiler.com/Archive/Comp/comp.text.tex/2006-01/msg01612.html
\makeatletter
\def\phantompart{%
 \stepcounter{part}%
 \xdef\@currentHref{part.\thepart}%
 \Hy@raisedlink{\hyper@anchorstart{\@currentHref}\hyper@anchorend}%
}
\makeatother

\fboxsep=0pt % for framebox

\contentsmargin{-4em}
\titlecontents{part}[2.3em]
  {A}
  {B\filbreak C\contentslabel{2.3em}D}
  {E\fbox{\hspace*{2.3em}F\rule{2.3em}{2pt}}}
  {G\titlerule*[1pc]{.}H\contentspage I\nobreak}

\begin{document}

\tableofcontents


\phantompart %
\addtocontents{toc}{%
  \protect\contentsline{part}{%
    \thepart\hspace{1em}\ignorespaces %
      \protect\fbox{ %
      A Short Entry %
      } %
  } %
  { \protect\fbox{ \thepage } }
  { \protect\fbox{ part.\thepart } }% fbox doesn't show!
} %


\phantompart %
\addtocontents{toc}{%
  \protect\contentsline{part}{%
    \thepart\hspace{1em}\ignorespaces %
%     \contentslabel{2pc} %
      \protect\fbox{ %
        \textbf{A longer entry here...} \\ %
        Maybe something more written in this entry here, %
        just to show as an illustration ... %
%       \protect\end{minipage} %
      } %
  } %
  { \protect\fbox{ \thepage } }
  { \protect\fbox{ part.\thepart } }% fbox doesn't show!
} %

\phantompart %
\addtocontents{toc}{%
  \protect\contentsline{part}{%
    \thepart\hspace{1em}\ignorespaces %
      \protect\fbox{ %
      \protect\begin{minipage}{0.5\textwidth} %
        \textbf{Another longer entry here...} \\ %
        Still, some more content entered here; %
        just to show as an illustration ... %
      \protect\end{minipage} %
      } %
  } %
  { \protect\fbox{ \thepage } }
  { \protect\fbox{ part.\thepart } }% fbox doesn't show!
} %



\vspace{0.2\textheight}
Some extra text...


\end{document}

答案1

天哪——这肯定是我遇到过的最复杂的 Latex 问题之一!不过,我想我终于找到了一些线索——尽管我没想到它会如此复杂。无论如何,MWE 的强制性输出(发布在下面)在这里:

一个.png

部分(“节”)编号与小页面内容顶部对齐;页码和前导符与小页面内容底部对齐。

讨论

我甚至不知道从哪里开始,对我来说有太多问题了:)

第一个问题是我选择使用“part”作为分段命令。最初,OP 代码以article文档类开始,其中“part”不用于分段;因此我认为我也可以将其用作自定义部分。从那时起,我转向了类book(如 OP 中一样) - 但实际上“ \part”是定义和使用的!这使得代码的理解变得更加复杂,因为我无法判断某些东西是指“默认”的“ ” \part- 还是指自定义的。

事实证明,\part是经过特殊处理的,仔细查看titlesec/titletoc手册经常会提到这一点:

(titletoc) 此包是 titlesec 包的配套包,它处理目录条目。但是,它是一个独立的包,您可以单独使用它。...
标准部分以非标准方式写入目录条目编号。您可以使用 newparttoc 进行更改,以便 titletoc 或类似的包可以操作条目。(这仅在 \part 已重新定义时才有效。)

但请注意,newparttoc有点令人惊讶的是)选项为titleSEC-不是 titleTOC- 包裹 (这种困惑让我浪费了很多时间进行无用的 grep

有三个类:page 类似于书本的 \part,在单个页面中;top 类似于 \chapter,它开始一个页面并将标题放在顶部;straight 适用于文本中间的标题...
如果您不使用可选参数,则只需更改 name 的类。例如:\titleclass{\part}{straight} 使部分成为 straight 类。

是的 - 但这谈论的是默认值\part;而且由于我已将“部分”重新编程为\addcontentsline,因此这实际上并不适用于我的示例(我认为:)

有两个分段命令会根据其名称执行一些额外操作并忽略类:
• \chapter 记录 \chaptertitlename 中定义的字符串,并将该内容考虑在内。
• \part 不会封装目录条目中的标签,除非您使用 newparttoc 选项。

请注意,这\part并不适用于我的例子,但这仍然是一个重要的问题:“不封装标签“是什么意思?哪个标签?

事实证明:在 中tocloft调用的“节号” ( snum)titletoc被称为目录条目的“标签”。现在,“封装标签”实际上与为什么<numbered-entry-format>OP 中的 ( ) 被忽略有关;来自 手册\titlecontents

• 处于水平模式,将用在条目标题之前。与 \titleformat 一样,最后一个命令可以接受带有标题的参数。
• 如果没有标签,则与上述类似。

好的,所以没有标签 == numberless。但这意味着 OP 中的“零件”没有标签 == 是 numberless;为什么?显然显示了零件编号,并且保留了零件计数器?

要回答这个问题,需要深入了解一下\titlecontents

$ texdef -t latex -p titletoc titlecontents -f
\titlecontents first defined in "titletoc.sty".

\titlecontents:
\long macro:->\@ifstar {\ttl@contents {\z@ }}{\ttl@contents {\@ne }}

# through searching/grepping through `kpsewhich titletoc.sty`:

\titlecontents{ <section> }[ <left> ]{ <above-code> }
              { <numbered-entry-format>  #5 }{ <numberless-entry-format> #6 }
              { <filler-page-format> }[ <below-code> ]
....
\newcommand\titlecontents{%
-> \def\ttl@contents#1#2{%
   -> \def\ttl@contents@i#1#2[#3]#4#5#6#7{%
      -> \ttl@tocentry{#1}{#2}{#3}{#4} {{#5}{#6}} {#7}
      ...
      \def\numberline##1{\ignorespaces}%
      \ifttl@label
        {\leavevmode\strut\@firstoftwo#5{#7}\strut\kern\z@}%
      \else
        {\leavevmode\strut\@secondoftwo#5{#7}\strut\kern\z@}%
      \fi
      {#6}%
      ...
.. the decision ttl@label a bit above:
      ...
      \global\ttl@labelfalse
      \sbox\z@{%  Unused box. It just catch the numberline
        \def\numberline##1{\global\ttl@labeltrue\gdef\thecontentslabel{##1}}%
        #7}%    \ttl@b = current     \ttl@a = previous

首先,这里必须记住,在 Latex 中构建 TOC 是一个两步过程:

  • 第一个 Latex 阶段:\addcontentsline调用被保存到文件“ .toc”中;
    • 在“ .toc”文件中,\contentsline命令被保存
  • 第二次 Latex 传递:读回\contentsline“ ”中的条目.toc,并排版目录

考虑到这一点,上述搜索实际上告诉我们(尽管读起来有点困难) - 宏实际上在“ ”文件中\titlesec“ greps ”查找实际的字符串“ ” ;如果找到,则该条目被声明为“编号”(或带有标签) - 如果没有,则它被声明为没有标签(或无编号)。\numberline.toc

因此 - 因为在 OP 中,我没有\numberline从我的\addcontentsline- 我的所有自定义部分中发出任何东西都被视为“无数”;因此<numbered-entry-format>跳过了 ( );而是<numberless-entry-format>应用了 ( )。

请注意,由于这两个步骤,您必须编译两次才能获得 TOC 排版;并且由于我经常忘记这一点(尤其是在崩溃后),我使用这个命令行来构建我的示例(称为a.tex):

rm a.toc ; pdflatex a.tex && pdflatex a.tex

此外,那些脆弱的、作为 一部分添加的命令\addcontentsline,在写入“ .toc”文件时会被扩展;大多数情况下,这是不受欢迎的,因此\protect必须在特定的地方发出;.toc在第一次发送文本后,必须频繁检查文件内容,以确保没有意外的扩展。

最后要指出的是\titleformat命令:

\titleformat{ 命令 }[ 形状 ]{ 格式 }{ 标签 }{ 间隔 }{ 前代码 }[ 后代码 ] ... 前代码是标题正文前面的代码。最后一个命令可以接受一个参数,即标题文本。但是,使用包选项显式时,必须使用 #1 明确给出标题(见下文)。

这听起来很有趣——因为查看\titlesection,您可以具体更改标签(节号)和页码格式——但没有具体说明“标题”(目录条目的正文)。那里提到的 #1 实际上确实提供了标题——但是,与目录条目的排版无关;当遇到或\titleformat时,它会排版文档中的“第 1 部分。测试”、“第 1 节。测试”文本(\part{Test}\section{Test}也浪费了不少时间去解决这个问题:)

回到对齐

考虑到上述titletoc行为,我们可以回到垂直对齐问题。

这里最重要的一点是“在中线更改小页面垂直对齐方式?”的接受答案使用类似这样的方法在一行上进行顶部-顶部-底部垂直对齐:

\begin{tabular}[b]{lll}
  \begin{minipage}[t]{100pt} \end{minipage} 
  \begin{minipage}[t]{100pt} \end{minipage} 
\end{tabular}
\begin{tabular}[b]{ll}
  \begin{minipage}[t]{100pt} \end{minipage} 
\end{tabular}

此贴然而,对于同一个问题,注意到第一个tabular包装minipages 负责顶部对齐:如果将其分解为三个表格,以便每个小页面都有自己的表格 - 则不可能再次实现顶部-顶部-底部对齐,只需使用和选项[t][b]minipagetabular

这就是问题所在——实际上,为了在目录中采用从上到下的排版方式,我们需要在格式化调用中重建这种tabular/层次关系;但是,至少为“节号”和“页码”格式提供了单独的命令参数——并且将一个粘贴在一个中,另一个粘贴在另一个中似乎不起作用(minipage\titlecontents\titlecontents\begin{environment}\end{environment}认为“ ! Missing } inserted.”;表面上看,这个问题和 的上下对齐问题tocloft也是同样的性质)。

然而,同一篇帖子还指出,可以实现顶部-顶部-底部对齐,也可以使用三个独立的表格(每个小页面一个)——如果所有表格都保持[b]对齐,并\raisebox在第一个表格中使用它来“提升”内容。然而,这同样要求第二个表格中的小页面(预期高度最大的表格)的每个条目的高度都经过测量;因此可以相应地“提升”部分编号。

这意味着我们需要:

  • 放入第二个小页面\savebox
  • 然后和一起\usebox测量\ht\dp
    • 请注意,仅仅\settoheight获取实际高度是不够的;它是\ht+\dp
    • ...这意味着您还需要包含包calc来找到实际高度
  • 确保{ <section> }可以以\titlecontents数字形式访问此高度,因此它可以\raisebox- 即使原则上“章节编号”是在目录中的标题文本之前排版的(所以原则上这个高度“尚不可用”
  • 确保所有这些都能通过文件往返.toc和两次 latex 调用

总而言之,这是一个相当复杂的问题;下面的 MWE 解决方案通过定义三个宏来处理格式:

  • \tctitleformat - 从 调用\addcontentsline;然后调用:
    • \tcboxtitleformat - ,将\protected 代码发送到.toc文件;也是在重新读取和扩展时重新计算高度的代码
    • 它接受一个参数,即目录条目的标题(在\addcontentsline第一遍中可用)
    • 它通过定义一个宏来创建小页面框\tcboxTF,该宏的唯一目的是允许“重新实例化”小页面框没有{ <section> }一个参数——因此它可以从\titlecontents
  • \tclabelformat - 用于目录的章节编号标签部分 - 调用 { <section> }\titlecontents使其更加令人困惑,作为论据\contentslabel[ARG]{2.3em}
    • 这将处理\raisebox;并期望相应的高度已经在全球范围内可用
  • \tcpageformat - 用于目录的页码部分 - 将从 调用{ <filler-page-format> },但没有必要(留作存档

最后一个问题是提到 OP 的“pdfTeX 警告”。基本上,事实证明调用的最后一个参数是\addtocontents

\addtocontents{toc}{%
  % .... ....
  {part.\thepart}% 
} 

... 必须采用以下格式{part.\thepart}- 不允许出现空格或任何其他字符;任何此类字符显然会导致条目编号解析失败,从而不会为该条目留下有效参考。请注意,在下面的 MWE 中,作为示例,{ \protect\fbox{ part.\thepart } }故意保留在该位置 - 因此,在 texing 时,您应该只会在终端输出中看到一个与该条目相关的“pdfTeX 警告”。

好吧,我想这就是全部内容了——不过,如果有更简单的解决方案,我当然很乐意听听:)

MWE 代码

\documentclass{book}

% \def\thepart{\arabic{part}} % no real need for this

\usepackage{calc}
\usepackage{hyperref}
\hypersetup{pdftex, colorlinks=true, linkcolor=black}
\usepackage[explicit,newparttoc]{titlesec}
\usepackage{titletoc}
\usepackage{trace}

% like definition for \phantomsection, but for part
% "Re: documentation for \phantomsection"
% http://newsgroups.derkeiler.com/Archive/Comp/comp.text.tex/2006-01/msg01612.html
\makeatletter
\def\phantompart{%
 \stepcounter{part}%
 \xdef\@currentHref{part.\thepart}%
 \Hy@raisedlink{\hyper@anchorstart{\@currentHref}\hyper@anchorend}%
}
\makeatother

\fboxsep=0pt % for framebox

\documentclass{book}

% \def\thepart{\arabic{part}} % no real need for this

\usepackage{calc}
\usepackage{hyperref}
\hypersetup{pdftex, colorlinks=true, linkcolor=black}
\usepackage[explicit,newparttoc]{titlesec}
\usepackage{titletoc}
\usepackage{trace}

% like definition for \phantomsection, but for part
% "Re: documentation for \phantomsection"
% http://newsgroups.derkeiler.com/Archive/Comp/comp.text.tex/2006-01/msg01612.html
\makeatletter
\def\phantompart{%
 \stepcounter{part}%
 \xdef\@currentHref{part.\thepart}%
 \Hy@raisedlink{\hyper@anchorstart{\@currentHref}\hyper@anchorend}%
}
\makeatother
% note \baselineskip dissapears (is 0) in tabular!
% so save the default \baselineskip in
% another variable:
\typeout{\the\baselineskip} %
\newlength{\oldbaselineskip}
\setlength{\oldbaselineskip}{\baselineskip}

% we must save the title format minipage;
% so we can extract its typeset height
\global\newsavebox\mybox
\global\newlength{\miniheight}

% save long minipage for \tctitleformat (tabular 2)
% into a box, so we can measure its height;
% we must make this into a command;
% since the title text will be passed as an argument;
% re-calc the height here too?
%  must use the package calc, to use + as addition
%  operator in the \setlength{\miniheight}... stanza
% ( \tctitleformat goes into addtocontents! )
\def\tcboxtitleformat#1{
  \protect\gdef\protect\tcboxTF{  % inner gdef, so we can call it
                                  % from titlecontents without an argument
    \protect\begin{lrbox}{\mybox} %
      \protect\begin{minipage}[t]{0.5\textwidth} %
      #1 %
      \protect\end{minipage} %
    \protect\end{lrbox} % ... also recalc:
    \global\protect\settoheight{\miniheight}{\protect\usebox\mybox} %
    \global\protect\setlength{\miniheight}{\ht\mybox+\dp\mybox+1em-1.411\oldbaselineskip} %
  } %
  \protect\tcboxTF{}%             % now that we have inner def,
                                  %   must call it separately to instantiate
  \protect\typeout{----minihg-tocfile--\protect\the\miniheight-\protect\the\mybox} %
}

% \global doesn't help here;
% tocfile seems to kick in first, though;
% but only way to retrieve values, is with
% with inner gdef \tcboxTF called in \titlecontents:
% ----minihg-tocfile  --39.50452pt-27 39.50452pt-27
% ----minihg-tcA      --0.0pt-27      0.0pt-27
% ----minihg-tcAA     --0.0pt-27      39.50452pt-27
% ----minihg-tclabelf --0.0pt-27      39.50452pt-27

\documentclass{book}

% \def\thepart{\arabic{part}} % no real need for this

\usepackage{calc}
\usepackage{hyperref}
\hypersetup{pdftex, colorlinks=true, linkcolor=black}
\usepackage[explicit,newparttoc]{titlesec}
\usepackage{titletoc}
\usepackage{trace}

% like definition for \phantomsection, but for part
% "Re: documentation for \phantomsection"
% http://newsgroups.derkeiler.com/Archive/Comp/comp.text.tex/2006-01/msg01612.html
\makeatletter
\def\phantompart{%
 \stepcounter{part}%
 \xdef\@currentHref{part.\thepart}%
 \Hy@raisedlink{\hyper@anchorstart{\@currentHref}\hyper@anchorend}%
}
\makeatother
% {minipage}[t] inside {tabular} no work here.
% must do shifting with raisebox;
\def\tclabelformat{ %
  %\settoheight{\miniheight}{\usebox\mybox} % nope
  \typeout{----minihg-tclabelf--\the\miniheight-\the\mybox} %
  \fbox{%
    \begin{tabular}[b]{l} %
      \raisebox{-\miniheight}{M}  % works from here ONLY; it does
                                  %   *not* work from anywhere in
                                  %   \titlecontents: {B\filbreak C\... D} !!
      \thecontentslabel %
      \\[0pt] %
    \end{tabular} %
  } %
}

% \tctitleformat goes into addtocontents!
\def\tctitleformat#1{%
  \tcboxtitleformat{#1} \\[0pt] % we let this command expand when written
                                %   to tocfile (its insides are protected);
                                %   it just saves the box contents,
                                %   but doesn't actually use it!
  %\tcboxTF{}                    % tcboxTF not used here
                                %
                                % use - inside the tabular:
  \protect\begin{tabular}[b]{l} %
    \protect\usebox\mybox %     % this is also saved in toc;
                                %   but when contents read back from toc and ran,
                                %   previous command 'expands' the minipage box and
                                %   recalcs the height; and this command
                                %   can just use (typeset) the \mybox...
    \\[0pt] %                   % do NOT forget the linebreak! ( else,
                                %   there will be no [b]ottom alignment of
                                %   tabulars for the \raisebox thing!
    % \protect\begin{minipage}[t]{0.5\textwidth} %
      % #1 %
    % \protect\end{minipage} \\[0pt] %
    % \protect\traceon % no
  \protect\end{tabular} %
}

\def\tcpageformat#1{ %
\fbox{ %
  \protect\begin{tabular}[b]{l} %
    \protect\begin{minipage}[b]{0.3\textwidth} %
      #1 %
    \protect\end{minipage} \\[0pt] %
  \protect\end{tabular} %
}}

\let\tcboxTF\relax  % must do this before \titlecontents is first called;
                    %   if we don't give it a default value;
                    %   \titlecontents will crash at first
                    %   ( ! Undefined control sequence. )
                    %   because -tcA-- may run first without a \tcboxTF run
                    %   ( if a "real" \part was called, not a custom one )
\contentsmargin{-4em}
\titlecontents{part}[2.3em]%
  {%
    A%
    \typeout{----minihg-tcA--\the\miniheight-\the\mybox}%
    \tcboxTF{}%                                 % call again to reinstantiate box,
                                                %   ( and retrieve values )
    % \settoheight{\miniheight}{\usebox\mybox}  % no need - \tcboxTF also recalcs now
    \typeout{----minihg-tcAA--\the\miniheight-\the\mybox}%
  }
  {B\filbreak C\fbox{\contentslabel[\tclabelformat]{2.3em}}D}
  {E\fbox{\hspace*{2.3em}F\rule{2.3em}{2pt}}}
%   {\tcpageformat{G\titlerule*[1pc]{.}H\contentspage I}\nobreak} % box too wide
%   {G\titlerule*[1pc]{.}\tcpageformat{H\contentspage }I\nobreak} % rule lost
%   {G\titlerule*[1pc]{.}H\contentspage\tcpageformat{ }I\nobreak} % rule appears
  {G\titlerule*[1pc]{.} \fbox{H} \contentspage \nobreak I}  % is bottom aligned fine,
                                                            % so no need for \tcpageformat
                                                            % (note: cannot \fbox \titlerule)

\begin{document}

% \traceon
\tableofcontents

% for debugging:
% \section{Whatever section}
% \part{Whatever part}

\phantompart %
\addtocontents{toc}{%
  \protect\contentsline{part}{%
    \thepart\hspace{1em}\ignorespaces %
      \protect\fbox{ %
      A Short Entry %
      } %
  } %
  { \protect\fbox{ \thepage } }
  { \protect\fbox{ part.\thepart } }% fbox doesn't show!
} %


\phantompart %
\addtocontents{toc}{%
  \protect\contentsline{part}{%
    \protect\numberline{\thepart}\ignorespaces %
      \protect\fbox{ %
        \tctitleformat{ %
          \textbf{A longer entry here...} \\ %
          Maybe something more written in this entry here, %
          just to show as an illustration ... %
        } %
      } %
  } %
  { \protect\fbox{ \thepage } }
  {part.\thepart}% { \protect\fbox{ part.\thepart } }% fbox doesn't show!
} %

\phantompart %
\addtocontents{toc}{%
  \protect\contentsline{part}{%
    \protect\numberline{\thepart}\ignorespaces %
      \protect\fbox{ %
        \tctitleformat{ %
          \textbf{Another longer entry here...} \\ %
          Still, some more content entered here; %
          just to show as an illustration ... %
        } %
      } %
  } %
  { \protect\fbox{ \thepage } } %
  {part.\thepart}   % { part.\thepart }% { \protect\fbox{ part.\thepart } }% fbox doesn't show! %
                    %   also: - if just *one* space left before part.\thepart;
                    %   then ->> "pdfTeX warning (dest): name {\040part.III} has been
                    %   referenced but does not exist, replaced by a fixed one"
} %



\vspace{0.2\textheight}
Some extra text...


\end{document}

相关内容