我试图将文本放入特定空间,因为这是一个图表解释。我想制作类似下面的图表:
是否可以将文本放入该空间?LaTex 可以自行完成此操作?应该使用包还是命令?
谢谢。
答案1
修改后的答案(全自动):
在这个修订后的答案中,人们呼吁\constraintext
,并向其传递五个参数:
#1
限制文本高度
#2
限制文本宽度
#3
要限制的文本内容
#4
大于或等于内容的自然(未缩放)宽度的猜测(选择太大只会导致一些额外的迭代)
#5
每次迭代都会从自然宽度中减去长度的正增量,以满足所需的纵横比。
如上所述,使用自然宽度(输入)作为框宽度,\parbox
创建一个未缩放的框(在当前字体大小中) 。测试纵横比。如果您选择的框足够大,则纵横比将低于目标值。然后,将未缩放的框缩小给定的量,并重新测试纵横比。它将相对于之前的测试增加。此过程递归重复,直到测试的纵横比等于或超过目标值。#4
#4
#5
此时,可以将框设置为约束高度 ( #1
),\parbox
宽度保持在约束宽度或略低于约束宽度。填充通过匹配的\hfill
s 完成,以使排版宽度等于约束宽度。
我已经在 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 纵横比的结果,我就会使用\scaleto
该scalerel
包中的将框缩放到 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"),并得出了这一点,其中我的\rule
s 可以替换为\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}