有没有办法让文本大小和对齐方式自动“最佳适应”页面?这样,页面上的大量文本将限制为小字体,而少量文本可以使用大字体并正确居中?
我发现在一页上容纳大量文本的最佳方式是:
\begin{minipage}{width}
...
\end{minipage}
\newpage
...但是当文本量较少时,字体仍然很小,并且笨拙地排列在页面顶部,而我希望它垂直和水平居中。我尝试过\vfill
,minipage
但没有什么区别。
对于较少量的文本,我成功了:
\mbox{}
\vfill
\begin{center}
....
\end{center}
\vfill
\newpage
这使得文本完美居中,但我无法用它将大块文本限制在一页上。我尝试合并minipage
和\mbox
,但minipage
覆盖了\vfill
间距,并且对于少量文本,对齐再次被搞砸了。
答案1
好吧,TeX 的设计其实并没有考虑到这一点。不过,这还是可以做到的(某种程度上)。
\documentclass{article}
\usepackage{lmodern}
\newdimen\fontdim
\newdimen\upperfontdim
\newdimen\lowerfontdim
\newif\ifmoreiterations
\fontdim12pt
\makeatletter
\def\buildbox{%
\setbox0\vbox{\fontsize{\fontdim}{1.2\fontdim}%
\selectfont
\centering
\stuff}%
\dimen@\ht0
\advance\dimen@\dp0
%\message{Total height: \the\dimen@^^J}
}
\newcommand\fillthepage[1]{%
\protected@edef\stuff{#1}%
\buildbox
% Compute upper and lower bounds
\ifdim\dimen@>\textheight
\loop
\fontdim.5\fontdim
\buildbox
\ifdim\dimen@>\textheight
\repeat
\lowerfontdim\fontdim
\upperfontdim2\fontdim
\fontdim1.5\fontdim
\else
\loop
\fontdim2\fontdim
\buildbox
\ifdim\dimen@<\textheight
\repeat
\upperfontdim\fontdim
\lowerfontdim.5\fontdim
\fontdim.75\fontdim
\fi
% Now try to find the optimum size
\loop
%\message{Bounds: \the\lowerfontdim\space
% \the\fontdim\space \the\upperfontdim^^J}
\buildbox
\ifdim\dimen@>\textheight
\moreiterationstrue
\upperfontdim\fontdim
\advance\fontdim\lowerfontdim
\fontdim.5\fontdim
\else
\advance\dimen@-\textheight
\ifdim\dimen@<10pt
\lowerfontdim\fontdim
\advance\fontdim\upperfontdim
\fontdim.5\fontdim
\dimen@\upperfontdim
\advance\dimen@-\lowerfontdim
\ifdim\dimen@<.2pt
\moreiterationsfalse
\else
\moreiterationstrue
\fi
\else
\moreiterationsfalse
\fi
\fi
\ifmoreiterations
\repeat
% build the page
\newpage
\null
\vfill
\box0
\vfill
}
\makeatother
\usepackage{lipsum}
\begin{document}
\fillthepage{\lipsum}
\fillthepage{\lipsum[1]}
\fillthepage{Very little}
\end{document}
如果您想了解它如何决定要使用的字体大小,可以取消注释\message
s。它不会努力限制水平尺寸,因此如果您没有给它足够的文本,您将超出页面的右侧。(尝试\fillthepage{X}
一个例子。)
使用矢量字体非常重要,否则它会在两种字体大小之间来回切换,发出警告,并且可能永远不会收敛。这就是我拥有的原因\usepackage{lmodern}
。
我确信在很多情况下这种方法不起作用,但写起来还是挺有趣的。
编辑:也许那\protected@edef
应该只是一个\def
。我原本以为扩大它会更好,但现在我不太确定
答案2
我不太清楚你到底想做什么。但是“但 minipage 覆盖了 vfill 间距”听起来好像你把 \vfill 放在了 minipage 里面。这只有在你给 minipage 指定了特定高度(可以使用可选参数)时才有意义。如果你想移动 minipage 本身,则 \vfill 必须放在外面。
您可以使用 varwidth 来获取一个根据内容调整宽度的迷你页面。您可以使用 \resizebox 将迷你页面缩放到给定的宽度。
顺便说一句:水平居中通常是一个明确的概念:字符、框和单词只有一个宽度,并且要使用的参考点很明确。当你想垂直居中时,情况就不同了。字符和框有高度和深度。你是想将“A”沿基线居中,还是沿字符中间某条线居中?如果删除上一个示例中的 [b],你就会发现问题。
\documentclass{article}
\usepackage{varwidth,lipsum,graphics}
\begin{document}
\vspace*{\fill}
{\centering
\begin{minipage}{0.5\textwidth}
\lipsum[1]
\end{minipage}
\par}
\vfill
\newpage
\vspace*{\fill}
{\centering
\begin{varwidth}{0.5\textwidth}
abc
\end{varwidth}
\par}
\vfill
\newpage
\vspace*{\fill}
{\centering
\begin{minipage}{0.5\textwidth}
\centering abc\\cdeaddff
\end{minipage}
\par}
\vfill
\newpage
\vspace*{\fill}
{\centering
\resizebox{\textwidth}{!}{%
.\begin{varwidth}[b]{0.5\textwidth}
abc
\end{varwidth}}
\par}
\vfill
\end{document}
答案3
fitting
库 fromtcolorbox
允许将给定的文本调整为某个宽度和高度。默认字体大小永远不会放大,但您可以从大字体大小 ( fit basedim
) 开始,然后字体大小会逐渐减小,直到所有文本都适合所需的框。
\documentclass{article}
\usepackage{lmodern}
\usepackage[most]{tcolorbox}
\usepackage{lipsum}
\tcbset{valign=center, halign=center}
\begin{document}
\begin{tcolorbox}[fit to height=.4\textheight, fit basedim=50pt]
\lipsum[1]
\end{tcolorbox}
\begin{tcolorbox}[fit to height=.4\textheight, fit basedim=50pt]
\lipsum[1-5]
\end{tcolorbox}
\end{document}