我在这里发布了这个问题: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 命令是最好的解决方案。
我暂时不回答这个问题。