压缩目录,无需对垂直空间或字体进行硬编码

压缩目录,无需对垂直空间或字体进行硬编码

我有一个 1 页 +1 行长的目录。我想将其压缩到仅一页。

我知道我可以向页面添加一行(但怎么做呢?)或减小字体大小或行间距,但我更喜欢更通用的解决方案。如果我遇到 1 页 + 2 行的情况,将来我也可以使用这种方法。

以下是我现在得到的结果:

在此处输入图片描述


编辑

问题被搁置了。我没有在建议的链接中寻找任何解决方案,我正在寻找一种在一页中修复目录的动态方法。链接中接受的解决方案将章节目录条目之间的垂直空间从 减少到1.0em0.8em而且它适用于一行。我正在寻找一种在一页中调整目录的通用方法,这种方法可行。没有硬编码垂直空间;也就是说,让 TeX 计算需要收缩的必要空间,以使内容与顶部和底部边距齐平。

答案1

手动方法

有很多方法可以做这样的事情......

无论如何,在你的情况下,我认为spacing使用setspace包是最好的解决方案。

梅威瑟:

\documentclass{article}
\usepackage{setspace}

\begin{document}

\begin{spacing}{0.85}
\tableofcontents
\end{spacing}

\clearpage

\section{test}
Some Text
\section{test}
Some Text
\section{test}
Some Text
\section{test}
Some Text
\section{test}
Some Text
\section{test}
Some Text
\section{test}
Some Text
\section{test}
Some Text
\section{test}
Some Text
\section{test}
Some Text
\section{test}
Some Text
\section{test}
Some Text
\section{test}
Some Text
\section{test}
Some Text
\section{test}
Some Text
\section{test}
Some Text
\section{test}
Some Text
\section{test}
Some Text
\section{test}
Some Text
\section{test}
Some Text
\section{test}
Some Text
\section{test}
Some Text
\section{test}
Some Text
\section{test}
Some Text
\section{test}
Some Text
\section{test}
Some Text

\end{document} 

结果(整个目录在同一页中):

在此处输入图片描述

0.85您可以根据需要调整该值,并在目录中添加更多内容时进一步调整它。


自动化方法

这是我获得自动化解决方案的尝试。

我们将利用calcfp进行计算。

\tableofcontents首先我们通过命令\totalheightof(包)计算出的高度calc

\newlength{\mylength}
\setlength{\mylength}{\totalheightof{\parbox{\linewidth}{%
{\expandafter\def\csname @starttoc\endcsname#1{\InputIfFileExists{\jobname.#1}{}{}}\tableofcontents}%
}}}

线路

{\expandafter\def\csname @starttoc\endcsname#1{\InputIfFileExists{\jobname.#1}

否则目录将不会被打印(见这个答案(大卫·卡莱尔)

现在我们进行一些计算来获得传递给环境的正确比例spacing\makeatletter ... \makeatother是必要的):

\FPdiv\mycalca{\strip@pt\textheight}{\strip@pt\mylength}
\FPsub\mycalcb{1}{\mycalca}
\FPmul\mycalcc{\mycalcb}{1.73}
\FPsub\mycalcd{1}{\mycalcc}

此时我们检查 ToC 的高度是否大于页面中文本的高度:如果是,那么比率就是我们刚刚计算的比率,否则为 1:

\ifnum\mylength>\textheight
  \let\myratio\mycalcd
\else
  \FPset\myratio{1}
\fi

这是一个完整的 MWE:

\documentclass{article}
\usepackage{setspace}
\usepackage{calc}
\usepackage{fp}

\makeatletter

\newlength{\mylength}
\setlength{\mylength}{\totalheightof{\parbox{\linewidth}{%
{\expandafter\def\csname @starttoc\endcsname#1{\InputIfFileExists{\jobname.#1}{}{}}\tableofcontents}%
}}}

\FPdiv\mycalca{\strip@pt\textheight}{\strip@pt\mylength}
\FPsub\mycalcb{1}{\mycalca}
\FPmul\mycalcc{\mycalcb}{1.73}
\FPsub\mycalcd{1}{\mycalcc}

\ifnum\mylength>\textheight
  \let\myratio\mycalcd
\else
  \FPset\myratio{1}
\fi

\makeatother


\begin{document}

\begin{spacing}{\myratio}
\tableofcontents
\end{spacing}

\clearpage

\section{test}
Some Text
\section{test}
Some Text
\section{test}
Some Text
\section{test}
Some Text
\section{test}
Some Text
\section{test}
Some Text
\section{test}
Some Text
\section{test}
Some Text
\section{test}
Some Text
\section{test}
Some Text
\section{test}
Some Text
\section{test}
Some Text
\section{test}
Some Text
\section{test}
Some Text
\section{test}
Some Text
\section{test}
Some Text
\section{test}
Some Text
\section{test}
Some Text
\section{test}
Some Text
\section{test}
Some Text
\section{test}
Some Text
\section{test}
Some Text
\section{test}
Some Text
\section{test}
Some Text
\section{test}
Some Text
\section{test}
Some Text
\section{test}
Some Text
\section{test}
Some Text
\section{test}
Some Text
\section{test}
Some Text
\section{test}
Some Text

\end{document} 

请注意,该算法最多可以插入超过文本高度的 7 行。无法超过...

在此处输入图片描述

答案2

通过在基线跳过处添加一些收缩粘连,以下内容将为您提供一页上的 44 行内容。标准是 24,示例是 30,但取消注释最后一行即可看到 44。

示例输出

\documentclass{article}

\begin{document}

{\setlength{\baselineskip}{\dimexpr\baselineskip minus 10pt}
\tableofcontents}

\newpage
\newcommand{\tsec}{\section{Test}Some text.\par}
\newcommand{\tsecs}{\tsec\tsec\tsec\tsec\tsec}
\newcommand{\tsess}{\tsecs\tsecs\tsecs}

\tsess\tsess
%Uncomment to get 44 sections
%\tsecs\tsecs\tsec\tsec\tsec\tsec
\end{document}

我按照您的假设工作,认为标题很短。如果您有超过 44 个部分,那么内容就会超出几页。

答案3

这可能不是你想要的(你可能想更改行距或者减小字体,例如),但您是否考虑过为标题换行到两行的章节/部分等提供简短的标题。例如:

\section[short title]{This is a rather long and descriptive title, which may well wrap onto multiple lines (of course it may not, but that's up to you)}

相关内容