在受限区域中调整文本并使其居中(两者!)

在受限区域中调整文本并使其居中(两者!)

有没有办法让文本大小和对齐方式自动“最佳适应”页面?这样,页面上的大量文本将限制为小字体,而少量文本可以使用大字体并正确居中?

我发现在一页上容纳大量文本的最佳方式是:

\begin{minipage}{width}
...
\end{minipage}
\newpage

...但是当文本量较少时,字体仍然很小,并且笨拙地排列在页面顶部,而我希望它垂直和水平居中。我尝试过\vfillminipage但没有什么区别。

对于较少量的文本,我成功了:

\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}

如果您想了解它如何决定要使用的字体大小,可以取消注释\messages。它不会努力限制水平尺寸,因此如果您没有给它足够的文本,您将超出页面的右侧。(尝试\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}

在此处输入图片描述

相关内容