使文本适合 Latex 中的特定空间

使文本适合 Latex 中的特定空间

我试图将文本放入特定空间,因为这是一个图表解释。我想制作类似下面的图表:

将文本放入特定空间

是否可以将文本放入该空间?LaTex 可以自行完成此操作?应该使用包还是命令?

谢谢。

答案1

修改后的答案(全自动):

在这个修订后的答案中,人们呼吁\constraintext,并向其传递五个参数:

#1限制文本高度

#2限制文本宽度

#3要限制的文本内容

#4大于或等于内容的自然(未缩放)宽度的猜测(选择太大只会导致一些额外的迭代)

#5每次迭代都会从自然宽度中减去长度的正增量,以满足所需的纵横比。

如上所述,使用自然宽度(输入)作为框宽度,\parbox创建一个未缩放的框(在当前字体大小中) 。测试纵横比。如果您选择的框足够大,则纵横比将低于目标值。然后,将未缩放的框缩小给定的量,并重新测试纵横比。它将相对于之前的测试增加。此过程递归重复,直到测试的纵横比等于或超过目标值。#4#4#5

此时,可以将框设置为约束高度 ( #1),\parbox宽度保持在约束宽度或略低于约束宽度。填充通过匹配的\hfills 完成,以使排版宽度等于约束宽度。

我已经在 MWE 中放置了注释,说明需要评论哪些内容才能删除诊断打印。

\documentclass{article}
\usepackage{scalerel}
\usepackage{fp}
\usepackage{lipsum}
\usepackage{stackengine}
\newcount\boxheight
\newcount\boxwidth
\newlength\constrainedwidth
\newsavebox\testbox
\newlength\currentwidth

\newcommand\aspect[1]{%
  \boxheight=\ht#1\relax%
  \boxwidth=\wd#1\relax%
  \FPdiv\testaspect{\the\boxheight}{\the\boxwidth}%
\testaspect\\%                  COMMENT THIS LINE TO REMOVE ASPECT-RATIO PRINTS
}
% TARGET-HEIGHT, TARGET-WIDTH, CONTENT, GUESS>NATURAL-WIDTH, dWIDTH
\newcommand\constraintext[5]{%
  \def\svfboxsep{\the\fboxsep}%
  \setlength\fboxsep{0pt}%
  \setlength\constrainedwidth{#2}%
  \sbox\testbox{\rule{#2}{#1}}%
TARGET ASPECT RATIO\\%          COMMENT THIS LINE TO REMOVE COMMENT
V\\%                            COMMENT THIS LINE TO REMOVE COMMENT
  \aspect{\testbox}%
  \edef\aspectratio{\testaspect}%
  \constrainsize{#1}{\aspectratio}{#3}{#4}{#5}%
  \setlength\fboxsep{\svfboxsep}%
}
\newcommand\constrainsize[5]{%
  \sbox{\testbox}{\fbox{\parbox[b]{#4}{#3}}}%
  \aspect{\testbox}%
  \FPiflt{\testaspect}{#2}%
    \setlength{\currentwidth}{#4}%
    \addtolength{\currentwidth}{-#5}%
    \constrainsize{#1}{#2}{#3}{\currentwidth}{#5}%
  \else
    \setlength\constrainedwidth{#1}%
    \FPdiv\result{1.0}{#2}%
%                               CHANGE \framebox TO \makebox TO REMOVE FRAME
    \framebox[\result\constrainedwidth]{\hfill%
      \scaleto{\parbox[b]{\currentwidth}{#3}}{#1}%
      \hfill%
    }%
  \fi%
}
\parindent 0in
\begin{document}
\constraintext{5in}{2.8in}{\lipsum[1-2]}{3in}{.02in}
\rule[-\fboxsep]{.2ex}{5in}\\
\rule{2.8in}{.2ex}
\clearpage
\constraintext{5in}{2.8in}{\lipsum[3]}{2.25in}{.02in}
\rule[-\fboxsep]{.2ex}{5in}\\
\rule{2.8in}{.2ex}
\end{document}

下面显示了两个结果,输入流大小不同,但最终框都设置为相同大小(5 英寸 x 2.8 英寸)。框旁边和下方设置了规则,以确认框大小的准确性。

显示诊断信息,首先给出目标宽高比,然后给出每次迭代的宽高比。当宽高比突然变化时,表示排版框由于换行而需要一行额外的文本。最终的宽高比越接近目标,约束框所需的水平填充就越少。

在此处输入图片描述

在此处输入图片描述

原始答案(非完全自动化):

这不是完全自动化的,但经过一些迭代,就可以完成工作。假设您想将前两个 Lipsum 段落放入一个 5 英寸高、2 英寸宽的框中。这相当于 2.5 的高/宽纵横比。我首先将这些段落放入一个框架中\parbox,然后(这是迭代)使用我方便的宏来调整框宽度以获得正确的纵横比\aspect(在这个迭代阶段,我花了大约 4 次迭代,可能花了一分钟)。

一旦我实现了 2.5+/-epsilon 纵横比的结果,我就会使用\scaletoscalerel包中的将框缩放到 5 英寸高度。纵横比保证其宽度为 2。我展示了原始的 10pt 排版框 (\x) 及其缩放后的配套框。

\documentclass{article}
\usepackage{scalerel}
\usepackage{fp}
\usepackage{lipsum}
\newcount\boxheight
\newcount\boxwidth
\newcommand\aspect[1]{%
  \boxheight=\ht#1\relax%
  \boxwidth=\wd#1\relax%
  \FPdiv\result{\the\boxheight}{\the\boxwidth}\result%
}
\begin{document}
\newsavebox\x
\sbox{\x}{\fbox{\parbox[b]{2.42in}{\lipsum[1-2]}}}
\aspect{\x}

\usebox{\x}
\scaleto{\usebox{\x}}{5in}    
\end{document}

在此处输入图片描述

至于您的特定示例图像的布局,我重新评估了该纵横比,将其定为 1.75 作为我的目标(导致段落大小为 5" x 20/7"),并得出了这一点,其中我的\rules 可以替换为\includegraphics。当然,我的 5 英寸高度只是一个猜测,但这是可以修改的。

\documentclass{article}
\usepackage{scalerel}
\usepackage{fp}
\usepackage{lipsum}
\usepackage[oldsyntax]{stackengine}
\newcount\boxheight
\newcount\boxwidth
\newcommand\aspect[1]{%
  \boxheight=\ht#1\relax%
  \boxwidth=\wd#1\relax%
  \FPdiv\result{\the\boxheight}{\the\boxwidth}\result%
}
\begin{document}
\newsavebox\x
\sbox{\x}{\fbox{\parbox[b]{2.84in}{\lipsum[1-2]}}}
%\aspect{\x}

\def\hgp{\hspace{.1in}}
\def\plotA{\protect\rule{1.36in}{0.66in}}
\def\plotB{\protect\rule{1.36in}{1.36in}}
\def\plotC{\protect\rule{1.36in}{1.36in}}
\def\plotD{\protect\rule{1.36in}{1.36in}}
\def\plotE{\protect\rule{1.36in}{1.36in}}
\def\plotF{\protect\rule{1.36in}{1.36in}\hgp}
\def\plotG{\protect\rule{1.36in}{1.36in}}

\def\stackalignment{l}
\Sstackgap=.1in
\Shortstack{{\plotA} {\plotB} {\plotC} {\plotD} {\plotE}}\hgp%
\stackon{\plotF \plotG}{\scaleto{\usebox{\x}}{5in}}

\end{document}

在此处输入图片描述

附言:我使用的是 V2.0 stackengine,您可能还没有。在您能够升级之前,为了让第二个 MWE 正常工作,只需删除[oldsyntax]包选项即可。

答案2

\tcolorbox包含库fitting及其命令\tcboxfit。它将其内容放入给定宽度和高度的框内。

接下来是一些例子:

\documentclass{article}
\usepackage[most]{tcolorbox}
\usepackage{lipsum}
\usepackage{lmodern}

\tcbset{colframe=blue!50!black,colback=green!10!white,
boxsep=0pt,top=1mm,bottom=1mm,left=1mm,right=1mm,
nobeforeafter, arc=0pt, outer arc=0pt}

\begin{document}

\lipsum[1]

\noindent\tcboxfit[width=.5\linewidth,height=6cm]{\lipsum[1]}
\hfill
\tcboxfit[width=.45\linewidth, height=4cm]{\lipsum[1]}

\noindent\tcboxfit[width=\linewidth, height=2cm]{\lipsum[1]}

\end{document}

在此处输入图片描述

相关内容