了解回忆录中最宽部分标签的宽度

了解回忆录中最宽部分标签的宽度

我正在使用memoirclass 来撰写我的硕士论文,我的大学要求将所有章节标签左对齐。我说的是章节,但实际上我指的是所有级别,如章节、节、子节等等。到目前为止,我已经做到了这一点。

真正的问题是他们要求根据最宽的章节标签对齐所有章节标题。我知道我总是可以猜出这个长度是多少,但我正在寻找一种从 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,它将保存当前类型(即 ,sectionsubsection等等)

(它们将会在下一版本中记录)。

答案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最后结果

我认为唯一缺少的是处理手动更改标签字体大小的情况,然后它应该是完整的。

相关内容