Размещение текста в определенном пространстве в Latex

Размещение текста в определенном пространстве в Latex

Я пытаюсь втиснуть свой текст в определенное пространство, так как это пояснение Graph. Я хотел бы сделать что-то вроде графика ниже:

Разместите текст в определенном пространстве

Можно ли сделать так, чтобы текст вписывался в это пространство? LaTex делает это сам? Нужно ли использовать пакет или команду?

Спасибо.

решение1

ИСПРАВЛЕННЫЙ ОТВЕТ (ПОЛНОСТЬЮ АВТОМАТИЗИРОВАННЫЙ):

В этом пересмотренном ответе мы обращаемся к \constraintext, передавая ему пять аргументов:

#1Ограниченная высота текста

#2ограниченная ширина текста

#3текстовое содержимое для ограничения

#4предположение, большее или равное естественной (немасштабированной) ширине содержимого (выбор слишком большого значения просто приведет к нескольким дополнительным итерациям)

#5положительное приращение длины, которое будет вычитаться из естественной ширины с каждой итерацией в поисках удовлетворения желаемому соотношению сторон.

Как упоминалось, немасштабированный блок \parboxсоздается (в текущем размере шрифта) с использованием естественной ширины (input #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 аспекта, я использовал 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") и придумал это, где мою \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}

введите описание изображения здесь

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}

введите описание изображения здесь

Связанный контент