我接手编辑了一本有些过时的内部手册,并决定尝试etoc
一下,而不是以前使用的minitoc
。我使用的是标准 LaTeX 图书类和常规目录,其中只有章节和每个章节到子小节的迷你目录。现在我想复制旧的外观,配置如下:
\documentclass[10pt, a5paper]{book}
% ... other packages and configurations
\usepackage{parskip}
\usepackage[tight]{minitoc}
\setcounter{tocdepth}{0}
\dominitoc
\mtcsetfont{minitoc}{section}{\normalsize\bfseries}
\mtcsetfont{minitoc}{subsection}{\normalsize\rmfamily}
\mtcsetfont{minitoc}{subsubsection}{\normalsize\rmfamily}
\mtcsetdepth{minitoc}{3}
\mtcsettitle{minitoc}{Inhaltsverzeichnis} % different from \contentsname
\renewcommand{\mtcindent}{0pt}
\begin{document}
% ... titlepage
\tableofcontents
\chapter{Dummy Chapter}\newpage\minitoc\mtcskip
\section{Dummy Section}
\subsection{Dummy Subsection}
% ... more chapters
\end{document}
下一步,受到https://tex.stackexchange.com/a/114480/3388
\documentclass[10pt, a5paper]{book}
% ... other packages and configurations
\usepackage{parskip}
\usepackage[titles]{tocloft}
\usepackage{etoc}
\etocchecksemptiness
\etocsettocdepth{subsubsection}
\renewcommand\cftsecfont{\normalfont\bfseries}
\renewcommand\cftsecpagefont{\normalfont\bfseries}
\begin{document}
% ... titlepage
\etocsetnexttocdepth{chapter}
\tableofcontents
\etocarticlestylenomarks
\chapter{Dummy Chapter}\newpage\localtableofcontents
\section{Dummy Section}
\subsection{Dummy Subsection}
% ... more chapters
\end{document}
这样,我就不用为本地目录设置自定义标题,标题和本地目录下方也没有水平线,而且由于\section*{\contentsname}
使用了垂直空间,因此标题周围有变化的空间。我想到最好的办法是:
\newcommand*\localtocname{Inhaltsverzeichnis} % to separate markup and content
\renewcommand*\etocarticlestylenomarks{%
\etocsettocstyle{%
\large\bfseries\localtocname\\[-0.5\baselineskip]\normalsize\normalfont%
\rule{\linewidth}{\arrayrulewidth}%
}{%
\rule[0.5\baselineskip]{\linewidth}{\arrayrulewidth}%
}%
}
我对垂直空间一无所知,只能求助于货物崇拜编程来处理\topskip
诸如此类的事情,但基本上我希望从文本区域顶部到标题以及从标题到水平规则有固定的垂直空间。本地目录底部规则后的垂直空间取决于\section
后面是否有一段文本或命令,不过一致的最小空间会很好(除非有排版/设计原因反对它)。
答案1
这是一个模拟。我采用了您原来的 minitoc 示例,然后\tracingmacros1
我去minitoc.sty
查找并复制了合适的宏。
然而,一开始我以为自己在扔东西,但后来我变得更加忠实。
如果我从头开始,我不会使用这种编码。
只有您完全理解后才能判断是否忠实于原文。特别是,我不确定我是否拥有与垂直间距相关的所有内容。(如果我有时间更仔细地检查原始日志,我可能会稍后进行编辑)。
编辑:确实,我忘记了\mtcskip
您的原始代码中哪个有意义{\parskip =\z@ \addvspace {\mtcskipamount }}
,并且看起来\mtcskipamount
是\bigskipamount
,但它的值在序言中。因此,应该将其添加到此处的第二个参数的末尾\etocsettocstyle
。
我说过我会吗永远不能以这种方式编码吗?
\documentclass[10pt, a5paper]{book}
% ... other packages and configurations
\usepackage{parskip}
\usepackage[titles]{tocloft}
\usepackage{etoc}
\etocchecksemptiness
\etocsettocdepth{subsubsection}
\renewcommand\cftsecfont{\normalfont\bfseries}
\renewcommand\cftsecpagefont{\normalfont\bfseries}
\makeatletter
\newcommand*\localtocname{Inhaltsverzeichnis}
% minitoc emulation, macros copied from minitoc.sty
\newcommand*\mtifont{\large \rmfamily \upshape \bfseries }
\newcommand*\mtcfont{\small \rmfamily \upshape \mdseries }
\newlength\mtcindent % 0pt
\newcommand*\mtc@zrule{\rule[\z@]{\z@}{\z@}}
\newcommand*\mtc@BBR{\unpenalty\nopagebreak[4]}
\newbox\mtc@strutbox
\setbox\mtc@strutbox=\hbox{\rule[1.8ex]{\z@}{2.5ex}}
\newcommand*\mtc@strut{\relax\ifmmode\copy\mtc@strutbox
\else\unhcopy\mtc@strutbox\fi}
\newcommand*\mtc@bottom@rule{%
\ifx\mtc@rule\relax\relax\else
\vskip -2.5ex
\rule[2.4\p@]{\columnwidth}{.4\p@}\vspace*{2.6\p@}\fi}
\newcommand*\mtc@verse[1]{\let\\=\@centercr
\list{}{%
\itemsep=\z@ \itemindent=\z@ \partopsep=\z@
\listparindent=\itemindent \topsep=1ex
%\iftightmtc
\parsep=\z@
%\fi
%\ifktightmtc \parskip=\z@ \fi
\leftmargin=\mtcindent \rightmargin=\leftmargin
\addtolength{\leftmargin}{+#1}%
\addtolength{\rightmargin}{-#1}%
}%
\item[]}
% I condensed a few macros in this one
\newcommand\do@mtitc[1]{\null \leavevmode \mtc@strut #1\hfill \null}
\newcommand\etocminitocstyle{%
\etocsettocstyle
{%
\begin{samepage}%
\raggedright
\parskip=\z@
\reset@font\mtcfont
\parindent=\z@
\nopagebreak[4]%
\kern-0.8\baselineskip
\nopagebreak[4]%
\par\noindent
\begin{tabular}{@{}p{\columnwidth}@{}}
\reset@font\mtifont\do@mtitc{\localtocname}\\\hline
\end{tabular}%
\nopagebreak[4]%
\null\leavevmode\mtc@zrule\\\mtc@BBR
\leftmargin\mtcindent
\rightmargin\mtcindent
\itemindent=\z@
\labelwidth=\z@
\labelsep=\z@
\listparindent=\z@
\begin{mtc@verse}{0pt}%
\leavevmode\\\mtc@BBR
\vskip -.5\baselineskip
\begingroup
}
{%
\vspace{-1ex}\vspace{-\baselineskip}%
\leavevmode\mtc@strut
\global\@nobreakfalse
\endgroup
\end{mtc@verse}%
\kern -.5\baselineskip \kern .5ex % was \kernafterminitoc
\nopagebreak[4]%
\mtc@bottom@rule\null\leavevmode\\%
\vskip-1.0\baselineskip
\mtc@zrule\end{samepage}%
\par\pagebreak[1]\vspace*{-1ex}%
}%
}
\begin{document}
% ... titlepage
\etocsetnexttocdepth{chapter}
\tableofcontents
\etocminitocstyle
\chapter{Dummy Chapter}\newpage\localtableofcontents
\section{Dummy Section}
\subsection{Dummy Subsection}
% ... more chapters
\end{document}
我觉得我弄错了尺寸Inhaltsverzeichnis
,但这是 minitoc 和你的 MWE 的结果。它与你发布的图片不一样。
好的,现在只需使用它\etocsettocstyle
来处理标题和规则。这里不尝试模仿任何东西。
此代码不会影响目录内容的呈现,就像文档类所设置的一样。
\documentclass[10pt, a5paper]{book}
% ... other packages and configurations
\usepackage{parskip}
\usepackage[titles]{tocloft}
\usepackage{etoc}
\etocchecksemptiness
\etocsettocdepth{subsubsection}
\renewcommand\cftsecfont{\normalfont\bfseries}
\renewcommand\cftsecpagefont{\normalfont\bfseries}
\makeatletter
\newcommand*\localtocname{Inhaltsverzeichnis}
\newcommand*\etocmylocaltocglobalstyle {%
\etocsettocstyle {%
\newpage
\if@twocolumn \@restonecoltrue \onecolumn \else \@restonecolfalse \fi
\small
\parskip\z@skip
\parindent \z@
{\topskip3cm % <<<<---- customize
\normalfont\bfseries
\noindent\localtocname
\par
\vskip-.5\baselineskip
\leavevmode\leaders\hrule\@height\p@\hfill\kern\z@\par
}%
}{%
\nobreak\vskip-.5\baselineskip
\leavevmode\leaders\hrule\@height\p@\hfill\kern\z@\par
\bigskip % <<<<---- customize
\if@restonecol \twocolumn \fi
}%
}
\makeatother
\begin{document}
% ... titlepage
\etocsetnexttocdepth{chapter}
\tableofcontents
\etocmylocaltocglobalstyle
\chapter{Dummy Chapter}
\localtableofcontents
\section{Dummy Section}
\subsection{Dummy Subsection}
% ... more chapters
\end{document}
在这里产生:
为了演示,垂直空间可能太大。
关于双栏和单栏的内容只是从标准书中复制过来的\tableofcontents
。据我所知,当切换回双栏时会生成一个新页面,这不太美观……