我正在使用memoir
class 来撰写我的硕士论文,我的大学要求将所有章节标签左对齐。我说的是章节,但实际上我指的是所有级别,如章节、节、子节等等。到目前为止,我已经做到了这一点。
真正的问题是他们要求根据最宽的章节标签对齐所有章节标题。我知道我总是可以猜出这个长度是多少,但我正在寻找一种从 latex 中自动获取此值的方法,这样当其他人根据我的源代码撰写论文时会更容易(我可以说是使用 latex 标准化文本的先驱……)。
现在看起来是这样的。我想要一种方法来知道我最宽的标签是标签 2.2.4,这样我就可以告诉 memoir 它的长度。然后,如果我在那里添加一个子小节,新的最宽将是 2.2.4.1,同样,它的长度将自动传递给 memoir。
编辑:由于我的文档内容非常多,我将其拆分,将每个章节放在不同的文件夹中.tex
,并将所有内容放在“主文档”中。另外,我使用的是Ubuntu 13.04 自带的pdflatex
标准。texlive
编辑:以下是基于其中一个答案的 MWE:
文件:main.tex
\documentclass{memoir}
\usepackage[T1]{fontenc}
\setsecnumdepth{subsubsection}
\settocdepth{subsubsection}
\maxsecnumdepth{subsubsection}
\maxtocdepth{subsubsection}
\begin{document}
\frontmatter
\tableofcontents
\mainmatter
\include{chap1}
\include{chap2}
\end{document}
文件:chap1.tex
\chapter{First Chapter}
\section{First Section}
\subsection{Subsection}
\subsection{Subsection}
\subsubsection{Subsubsection}
\subsubsection{Subsubsection}
\section{Second Section}
\subsection{Subsection}
\subsection{Subsection}
\subsubsection{Subsubsection}
\subsubsection{Subsubsection}
文件:chap2.tex
\chapter{Second Chapter}
\section{First Section}
\subsection{Subsection}
\subsection{Subsection}
\subsubsection{Subsubsection}
\subsubsection{Subsubsection}
我希望目录输出如下:
答案1
与 Danie 的回答相关,这里有一个建议,其中将最宽标签的长度写入文件中aux
。因此您可以在文档的开头使用它。
一些说明:
- 如果您更改,
secnumdepth
最宽的标签不会被覆盖。您必须删除辅助文件。 - 您需要运行两次编译。
- 我在最宽的标签上添加了 0.5 厘米的长度,以便在数字和文本之间留出一定的距离。
这里是 mwe:
\RequirePackage{filecontents}
\begin{filecontents}{chap1.tex}
\chapter{First Chapter}
\section{First Section}
\subsection{Subsection}
\subsection{Subsection}
\subsubsection{Subsubsection}
\subsubsection{Subsubsection}
\section{Second Section}
\subsection{Subsection}
\subsection{Subsection}
\subsubsection{Subsubsection}
\subsubsection{Subsubsection}
\end{filecontents}
\begin{filecontents}{chap2.tex}
\chapter{Second Chapter}
\section{First Section}
\subsection{Subsection}
\subsection{Subsection}
\subsubsection{Subsubsection}
\subsubsection{Subsubsection}
\end{filecontents}
\documentclass{memoir}
\usepackage[T1]{fontenc}
\setsecnumdepth{subsubsection}
\settocdepth{subsubsection}
\maxsecnumdepth{subsubsection}
\maxtocdepth{subsubsection}
\makeatletter
\newlength\widesttoclabel
\setlength{\widesttoclabel}{0pt}
%\renewcommand*{\numberlinehook}[1]{%
% \setbox0=\hbox{\@cftn@me\@cftbsnum #1\@cftasnum}%
% \ifdim\wd0>\widesttoclabel%
% \setlength{\global\widesttoclabel}{\the\wd0}%
% \fi%
%}
\renewcommand*{\numberline}[1]{%
\numberlinehook{#1}%
\setbox0=\hbox{\@cftn@me\@cftbsnum #1\@cftasnum}%
\ifdim\wd0>\widesttoclabel%
\global\setlength{\widesttoclabel}{\the\wd0}%
\fi%
\hb@xt@\@tempdima{\@cftn@me\@cftbsnum #1\@cftasnum\hfil}\@cftasnumb}
\AtEndDocument{%
\immediate\write\@mainaux{%
\string\global\string\setlength{\string\widesttoclabel}{\the\widesttoclabel}%
}%
}%
\makeatother
\AtBeginDocument{%
\cftsetindents{chapter}{0em}{\dimexpr\widesttoclabel+.5cm\relax}
\cftsetindents{section}{0em}{\dimexpr\widesttoclabel+.5cm\relax}
\cftsetindents{subsection}{0em}{\dimexpr\widesttoclabel+.5cm\relax}
\cftsetindents{subsubsection}{0em}{\dimexpr\widesttoclabel+.5cm\relax}
}
\begin{document}
\the\widesttoclabel
\frontmatter
\tableofcontents
\mainmatter
\include{chap1}
\include{chap2}
\end{document}
编辑。经过两个编译步骤后,我得到以下结果:
答案2
Marcos 解决方案是前进的方向。但\numberlinehook
实际上旨在用于这种测量。默认情况下,它什么也不做,只是吞噬其参数。我只是从来没有时间记录它。
因此,您只需要进行以下更改\numberline
:
\makeatletter
\renewcommand*{\numberlinehook}[1]{%
\setbox0=\hbox{\@cftn@me\@cftbsnum #1\@cftasnum}%
\ifdim\wd0>\widesttoclabel%
\global\setlength{\widesttoclabel}{\the\wd0}%
\fi%
}
\makeatother
我添加钩子时就考虑到了这一点,但一直没有记录下来。
如果您希望能够分辨出\section
和\subsection
之外\numberline
,那么还有另一个未记录的宏\cftwhatismyname
,它将保存当前类型(即 ,section
,subsection
等等)
(它们将会在下一版本中记录)。
答案3
我想这就是你所需要的吧?如果你需要对齐未编号的章节(例如目录),则需要对回忆录内部进行一些额外的重新定义。
\documentclass{memoir}
\usepackage[T1]{fontenc}
\renewcommand*\cftchapterfont{\bfseries\scshape}
\renewcommand*\cftsectionfont{\normalfont}
\renewcommand*\cftsubsectionfont{\normalfont}
\renewcommand*\cftsubsubsectionfont{\normalfont\itshape}
\renewcommand*\cftchapterdotsep{\cftdotsep}
\newlength\mydimA
\settowidth\mydimA{\cftsubsubsectionfont 2.10.10.10~}% -> widest number
\cftsetindents{chapter} {0em}{\mydimA}
\cftsetindents{section} {0em}{\mydimA}
\cftsetindents{subsection} {0em}{\mydimA}
\cftsetindents{subsubsection}{0em}{\mydimA}
\setsecnumdepth{subsubsection}
\settocdepth{subsubsection}
\maxsecnumdepth{subsubsection}
\maxtocdepth{subsubsection}
\begin{document}
\frontmatter
\tableofcontents
\mainmatter
\chapter{First Chapter}
\section{First Section}
\subsection{Subsection}
\subsection{Subsection}
\subsubsection{Subsubsection}
\subsubsection{Subsubsection}
\section{Second Section}
\subsection{Subsection}
\subsection{Subsection}
\subsubsection{Subsubsection}
\subsubsection{Subsubsection}
\chapter{Second Chapter}
\section{First Section}
\subsection{Subsection}
\subsection{Subsection}
\subsubsection{Subsubsection}
\subsubsection{Subsubsection}
\end{document}
答案4
经过一些“微调”,并基于 Marco Daniel 和 daleif 的回答,使用 Danie Els 的一些内容,并提出这个问题: 使用 include 构建文档时将信息写入 aux 文件 ,我能够想出这个解决方案。我请你阅读已接受的答案,以了解为什么这里的一切都是按照这种方式完成的。
使用 MWE 中的相同两个内容文件,这是新main.tex
文件:
文件:main.tex
\documentclass{memoir}
\usepackage[T1]{fontenc}
% provides \AfterLastShipout command
\usepackage{atveryend}
\setsecnumdepth{subsubsection}
\settocdepth{subsubsection}
\maxsecnumdepth{subsubsection}
\maxtocdepth{subsubsection}
\newlength\wtl
\newlength\widesttoclabel
\setlength{\widesttoclabel}{0pt}
\makeatletter
\renewcommand*{\numberlinehook}[1]{%
\settowidth\wtl{\@cftn@me\@cftbsnum #1\@cftasnum}%
\ifdim\wtl>\widesttoclabel%
\global\widesttoclabel=\the\wtl\relax%
\fi%
}
% See why the use of this in the answer to the other question
\AfterLastShipout{%
\if@filesw
\immediate\write\@mainaux{%
\global\string\widesttoclabel=\the\widesttoclabel\relax
}%
\fi
}
\makeatother
\AtBeginDocument{%
\xdef\thewidesttoclabel{\the\widesttoclabel}%
\cftsetindents{chapter}{0em}{\dimexpr\thewidesttoclabel+.5cm\relax}
\cftsetindents{section}{0em}{\dimexpr\thewidesttoclabel+.5cm\relax}
\cftsetindents{subsection}{0em}{\dimexpr\thewidesttoclabel+.5cm\relax}
\cftsetindents{subsubsection}{0em}{\dimexpr\thewidesttoclabel+.5cm\relax}
}
\begin{document}
\frontmatter
\tableofcontents
\mainmatter
\include{chap1}
\include{chap2}
\end{document}
这是使用以下方法运行两次编译后的结果pdflatex
:
我认为唯一缺少的是处理手动更改标签字体大小的情况,然后它应该是完整的。