Hacer que el texto encaje en un espacio específico en Latex

Hacer que el texto encaje en un espacio específico en Latex

Estoy intentando encajar mi texto en un espacio específico, ya que es una explicación gráfica. Me gustaría hacer algo como el siguiente gráfico:

Ajustar texto en un espacio específico

¿Es posible hacer que el texto quepa en ese espacio? ¿LaTex lo hace solo? ¿Se debe utilizar un paquete o un comando?

Gracias.

Respuesta1

RESPUESTA REVISADA (TOTALMENTE AUTOMATIZADA):

En esta respuesta revisada, se invoca \constraintexty se le pasan cinco argumentos:

#1La altura del texto restringida

#2el ancho de texto restringido

#3el contenido del texto a restringir

#4una estimación mayor o igual al ancho natural (sin escalar) del contenido (elegir demasiado grande solo causará algunas iteraciones adicionales)

#5el incremento positivo de longitud que se restará del ancho natural con cada iteración, en busca de satisfacer la relación de aspecto deseada.

Como se mencionó, \parboxse crea un sin escala (en el tamaño de fuente actual) usando el ancho natural (entrada #4) como ancho del cuadro. Se prueba la relación de aspecto. Si ha seleccionado #4lo suficientemente grande, la relación de aspecto estará por debajo del valor objetivo. Luego, el cuadro sin escala se estrecha en la cantidad indicada en #5y se vuelve a probar la relación de aspecto. Será creciente en relación con la prueba anterior. Este proceso se repite recursivamente hasta que la relación de aspecto probada iguale o supere el valor objetivo.

En ese punto, el cuadro puede establecerse en la altura restringida ( #1), con el \parboxancho restante en el ancho restringido o ligeramente por debajo. El relleno se logra con \hfills coincidentes para hacer que el ancho tipográfico sea igual al ancho restringido.

He colocado notas en el MWE sobre qué comentar para eliminar la impresión de diagnóstico.

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

A continuación se muestran dos resultados, con flujos de entrada de diferentes tamaños, pero ambos configurados en el cuadro final del mismo tamaño (5 x 2,8 pulgadas). Se establecen reglas al lado y debajo de las cajas para confirmar la precisión de los tamaños de las cajas.

Se muestran los diagnósticos, dando primero la relación de aspecto objetivo y luego la relación de aspecto con cada iteración. Cuando la relación de aspecto cambia repentinamente, indica que el cuadro tipográfico requirió una línea de texto adicional debido al ajuste. Cuanto más cerca esté la relación de aspecto final del objetivo, menos relleno horizontal se requerirá para restringir el cuadro.

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

RESPUESTA ORIGINAL (NO TOTALMENTE AUTOMATIZADA):

Esto no está completamente automatizado, pero con una pequeña iteración, hace el trabajo. Supongamos que desea colocar los dos primeros párrafos de Lipsum en un cuadro de 5 pulgadas de alto por 2 pulgadas de ancho. Eso equivale a una relación de aspecto alto/ancho de 2,5. Comencé colocando esos párrafos en un marco \parboxy (aquí está la iteración) jugando con el ancho del cuadro para lograr la relación de aspecto correcta, usando mi práctica \aspectmacro (me tomó alrededor de 4 iteraciones y tal vez un minuto para esta fase iterativa).

Una vez que logré un resultado de aspecto de 2,5+/-épsilon, utilicé un elemento \scaletodel scalerelpaquete para escalar la caja a una altura de 5 pulgadas. La relación de aspecto garantiza que tendrá un ancho de 2. Muestro el cuadro tipográfico original de 10 puntos (\x) y su complemento escalado.

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

ingrese la descripción de la imagen aquí

Y en cuanto al diseño de su imagen de muestra particular, reevalué esa relación de aspecto a 1,75 como mi objetivo (lo que resultó en un tamaño de párrafo de 5" x 20/7"), y se me ocurrió esto, donde \rulese pueden reemplazar mis s con \includegraphics. Por supuesto, mi altura de 5 pulgadas es sólo una suposición, pero se puede modificar.

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

ingrese la descripción de la imagen aquí

PD: Estoy usando stackengine V2.0, que quizás aún no tengas. Hasta que pueda actualizar y para que el segundo MWE funcione, simplemente elimine la [oldsyntax]opción del paquete.

Respuesta2

\tcolorboxincluye biblioteca fittingcon su comando \tcboxfit. Cabe su contenido dentro de una caja de ancho y alto determinados.

A continuación algunos ejemplos:

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

ingrese la descripción de la imagen aquí

información relacionada