
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:
¿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 \constraintext
y se le pasan cinco argumentos:
#1
La altura del texto restringida
#2
el ancho de texto restringido
#3
el contenido del texto a restringir
#4
una estimación mayor o igual al ancho natural (sin escalar) del contenido (elegir demasiado grande solo causará algunas iteraciones adicionales)
#5
el 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ó, \parbox
se 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 #4
lo 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 #5
y 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 \parbox
ancho restante en el ancho restringido o ligeramente por debajo. El relleno se logra con \hfill
s 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.
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 \parbox
y (aquí está la iteración) jugando con el ancho del cuadro para lograr la relación de aspecto correcta, usando mi práctica \aspect
macro (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 \scaleto
del scalerel
paquete 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}
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 \rule
se 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}
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
\tcolorbox
incluye biblioteca fitting
con 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}