cftpartnumwidth - TOC 没有响应更改

cftpartnumwidth - TOC 没有响应更改

我在这里发布了这个问题:http://www.latex-community.org/forum/viewtopic.php?f=47&t=11499&sid=ff51ce4bc05d87957773d360d33ffa91但没有人回答,所以我在这里发布了我的问题;]

我正在使用 miktex 2.9。使用 pdflatex 进行编译。

我想增加文章类中部分条目的目录中的数字宽度,以使部分标题对齐到一行。

最小的例子:

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[english]{babel}

\usepackage{tocloft}
\setlength{\cftpartnumwidth}{4em}
\cftsetindents{part}{0em}{4em}

\begin{document}
\tableofcontents
\part{Part1}
\part{Part2}
\part{Part3}
\part{Part4}
\part{Part5}
\part{Part6}
\end{document}

似乎都不起作用:

\setlength{\cftpartnumwidth}{4em}
\cftsetindents{part}{0em}{4em}

我可以轻松修改部分、子部分等的数量宽度。更改会反映在目录中。

阅读 tocloft 文档时,其中指出:

对于某个部分,没有明确的数字宽度;而是在数字和标题文本之间留出 1em 的间隙。

\renewcommand*{\l@part}[2]然而,在阅读 tocloft.sty 时,我发现和的定义之间没有区别\renewcommand*{\l@section}[2]。对 tocloft.sty 中有关 partnumwidth 的所有修改均无法实现。

有什么想法吗?我将非常感激您的帮助!

答案1

唯一想到的是一个临时解决方案,必然会产生不良影响,即重新定义零件号显示命令 \thepart以强制其固定宽度。(当然,这也会影响实际的零件标题及其交叉引用等。)对于左对齐:

\renewcommand{\thepart}{\hbox to 4em{\Roman{part}}}

右边:

\renewcommand{\thepart}{\hbox to 4em{\hfil\Roman{part}}}

我很惊讶你在文章中使用了部分划分,但是...你确定不想使用部分划分吗?这会给你带来更多的灵活性。

答案2

解决方案 1(最佳) 这是我使用 frabjous 建议使用 tocloft 和 titlesec 做出的解决方案。有一种使用 let 命令和 titlesec 包来管理标题的技巧。

\documentclass{article}
\usepackage[utf8]{inputenc} 
\usepackage[T1]{fontenc} 
\usepackage[english]{babel} 

\usepackage{tocloft}
\usepackage[explicit]{titlesec}
\let\theRpart\thepart
\renewcommand{\thepart}{\hbox to 4em{\Roman{part}}}

\newcommand{\partfont}{                    \fontsize{30pt}{36pt}   \bfseries  \selectfont }
    \titleformat{\part}[display]                    
      { \partfont }
      {  \ \vspace{35pt} \\ \filleft \partname \ \theRpart}                         
      {15pt}
      { \filleft #1}        
      [\vspace{100pt}]
\begin{document} 
\tableofcontents

\part{Part1} 
This is a part
\newpage
\part{Part2}
This is a part
 \newpage
\part{Part3}
This is a part
 \newpage
\part{Part4}
This is a part
 \newpage
\part{Part5} 
This is a part
\newpage
\part{Part6} 
This is a part
\newpage
\end{document}

解决方案 2(失败) 上面的解决方案是一种 hack。如果能用 titletoc 包来实现它就太好了,但我确实认为 titletoc 就像 tocloft 一样,在 article 类中存在问题。只是一个一般的、不完善的例子:

\documentclass{article}
\usepackage[utf8]{inputenc} 
\usepackage[T1]{fontenc} 
\usepackage[english]{babel} 

\usepackage{tocloft}
\usepackage[explicit]{titlesec}
\usepackage{titletoc}
\let\theRpart\thepart
%\renewcommand{\thepart}{\hbox to 4em{\Roman{part}}}

\newcommand{\partfont}{                    \fontsize{30pt}{36pt}   \bfseries  \selectfont }
    \titleformat{\part}[display]                    
      { \partfont }
      {  \ \vspace{35pt} \\ \filleft \partname \ \theRpart}                         
      {15pt}
      { \filleft #1}        
      [\vspace{100pt}] 
\titlecontents{section}[1.5em]{\vspace{40pt}}{ \contentslabel{2.3em}  }{   }{after  }[]
\titlecontents{part}[1.5em]{\vspace{40pt}}{ \contentslabel{2.3em}  }{   }{after  }[]            
\begin{document} 



\tableofcontents

\part{Part1}  
This is a part
\section{ASDF} 
\newpage  
\part{Part2}
This is a part
 \newpage
\part{Part3}
This is a part
 \newpage
\part{Part4}
This is a part
 \newpage
\part{Part5} 
This is a part
\newpage
\part{Part6} 
This is a part
\newpage
\end{document}

因此,我认为使用 frabjous 建议创建的 hack 是唯一已知的有效方法。

解决方案 3(失败) 我也在尝试:

\let\oldthepart\thepart
\renewcommand{\thepart}{...} %modified
\tableofcontents
\renewcommand{\thepart}{\oldthepart} %back to normal 

但它惨遭失败;]

解决方案 4(成功) 然而,如果没有时间读取 titlesec 包,则可以在第一次运行 latex 时使用命令更改 hbox,并在最后一次运行(附加 TOC 时)时不更新 \thepart 命令。

概括 然而,我认为带有 titlesec 包的 let 命令是最好的解决方案。

我暂时不回答这个问题。

相关内容