我有一个 1 页 +1 行长的目录。我想将其压缩到仅一页。
我知道我可以向页面添加一行(但怎么做呢?)或减小字体大小或行间距,但我更喜欢更通用的解决方案。如果我遇到 1 页 + 2 行的情况,将来我也可以使用这种方法。
以下是我现在得到的结果:
编辑
问题被搁置了。我没有在建议的链接中寻找任何解决方案,我正在寻找一种在一页中修复目录的动态方法。链接中接受的解决方案将章节目录条目之间的垂直空间从 减少到1.0em
。0.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
您可以根据需要调整该值,并在目录中添加更多内容时进一步调整它。
自动化方法
这是我获得自动化解决方案的尝试。
\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 个部分,那么内容就会超出几页。