
Я пытаюсь втиснуть свой текст в определенное пространство, так как это пояснение Graph. Я хотел бы сделать что-то вроде графика ниже:
Можно ли сделать так, чтобы текст вписывался в это пространство? LaTex делает это сам? Нужно ли использовать пакет или команду?
Спасибо.
решение1
ИСПРАВЛЕННЫЙ ОТВЕТ (ПОЛНОСТЬЮ АВТОМАТИЗИРОВАННЫЙ):
В этом пересмотренном ответе мы обращаемся к \constraintext
, передавая ему пять аргументов:
#1
Ограниченная высота текста
#2
ограниченная ширина текста
#3
текстовое содержимое для ограничения
#4
предположение, большее или равное естественной (немасштабированной) ширине содержимого (выбор слишком большого значения просто приведет к нескольким дополнительным итерациям)
#5
положительное приращение длины, которое будет вычитаться из естественной ширины с каждой итерацией в поисках удовлетворения желаемому соотношению сторон.
Как упоминалось, немасштабированный блок \parbox
создается (в текущем размере шрифта) с использованием естественной ширины (input #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 аспекта, я использовал a \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}
ps Я использую V2.0 stackengine, которого у вас, возможно, еще нет. Пока вы не сможете обновиться, и чтобы заставить работать 2-й 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}