Saltar al contenido

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

Posterior a observar en diferentes repositorios y sitios webs al terminar hemos descubierto la solución que te mostraremos pronto.

Solución:

RESPUESTA REVISADA (TOTALMENTE AUTOMATIZADA):

En esta respuesta revisada, uno invoca constraintext, pasándole cinco argumentos:

#1 La altura del texto restringido

#2 el ancho del texto restringido

#3 el contenido del texto para restringir

#4 una suposición mayor o igual al ancho natural (sin escala) del contenido (seleccionar 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ó, un sin escalar parbox se crea (en el tamaño de fuente actual) utilizando el ancho natural (entrada #4) como el ancho de la caja. 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, la caja sin escala se hace más estrecha en una cantidad dada en #5 y se vuelve a probar la relación de aspecto. Aumentará en relación con la prueba anterior. Este proceso se repite de forma recursiva hasta que la relación de aspecto probada iguala o supera el valor objetivo.

En ese punto, la caja se puede establecer en la altura restringida (#1), con el parbox ancho restante en o ligeramente por debajo del ancho restringido. El acolchado se logra con emparejados hfills para hacer que el ancho de la composición sea igual al ancho restringido.

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

documentclassarticle
usepackagescalerel
usepackagefp
usepackagelipsum
usepackagestackengine
newcountboxheight
newcountboxwidth
newlengthconstrainedwidth
newsaveboxtestbox
newlengthcurrentwidth

newcommandaspect[1]%
  boxheight=ht#1relax%
  boxwidth=wd#1relax%
  FPdivtestaspecttheboxheighttheboxwidth%
testaspect\%                  COMMENT THIS LINE TO REMOVE ASPECT-RATIO PRINTS

% TARGET-HEIGHT, TARGET-WIDTH, CONTENT, GUESS>NATURAL-WIDTH, dWIDTH
newcommandconstraintext[5]%
  defsvfboxsepthefboxsep%
  setlengthfboxsep0pt%
  setlengthconstrainedwidth#2%
  sboxtestboxrule#2#1%
TARGET ASPECT RATIO\%          COMMENT THIS LINE TO REMOVE COMMENT
V\%                            COMMENT THIS LINE TO REMOVE COMMENT
  aspecttestbox%
  edefaspectratiotestaspect%
  constrainsize#1aspectratio#3#4#5%
  setlengthfboxsepsvfboxsep%

newcommandconstrainsize[5]%
  sboxtestboxfboxparbox[b]#4#3%
  aspecttestbox%
  FPiflttestaspect#2%
    setlengthcurrentwidth#4%
    addtolengthcurrentwidth-#5%
    constrainsize#1#2#3currentwidth#5%
  else
    setlengthconstrainedwidth#1%
    FPdivresult1.0#2%
%                               CHANGE framebox TO makebox TO REMOVE FRAME
    framebox[resultconstrainedwidth]hfill%
      scaletoparbox[b]currentwidth#3#1%
      hfill%
    %
  fi%

parindent 0in
begindocument
constraintext5in2.8inlipsum[1-2]3in.02in
rule[-fboxsep].2ex5in\
rule2.8in.2ex
clearpage
constraintext5in2.8inlipsum[3]2.25in.02in
rule[-fboxsep].2ex5in\
rule2.8in.2ex
enddocument

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

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

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

RESPUESTA ORIGINAL (NO COMPLETAMENTE AUTOMATIZADA):

Esto no es completamente automatizado, pero con un poco de iteración, se hace el trabajo. Supongamos que desea poner los dos primeros párrafos de la suma de labios en un cuadro de 5 pulgadas de alto por 2 pulgadas de ancho. Eso resulta en una relación de aspecto alto / ancho de 2.5. Empecé colocando esos párrafos en un marco parbox y (aquí está la iteración) jugando con el ancho de la caja para lograr la relación de aspecto correcta, usando mi mano aspect macro (me tomó alrededor de 4 iteraciones y tal vez un minuto para esta fase iterativa).

Una vez que logré un resultado de 2.5 +/- aspecto épsilon, usé un scaleto desde el scalerel paquete para escalar la caja a una altura de 5 pulgadas. La relación de aspecto garantiza que tenga un ancho de 2. Muestro el cuadro tipográfico original de 10 puntos ( x) y su compañero escalado.

documentclassarticle
usepackagescalerel
usepackagefp
usepackagelipsum
newcountboxheight
newcountboxwidth
newcommandaspect[1]%
  boxheight=ht#1relax%
  boxwidth=wd#1relax%
  FPdivresulttheboxheighttheboxwidthresult%

begindocument
newsaveboxx
sboxxfboxparbox[b]2.42inlipsum[1-2]
aspectx

useboxx
scaletouseboxx5in    
enddocument

ingrese la descripción de la imagen aquí

Y en cuanto al diseño de su imagen de muestra en 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 mi rules se puede reemplazar con includegraphics. Por supuesto, mi altura de 5 pulgadas es solo una suposición, pero eso es modificable.

documentclassarticle
usepackagescalerel
usepackagefp
usepackagelipsum
usepackage[oldsyntax]stackengine
newcountboxheight
newcountboxwidth
newcommandaspect[1]%
  boxheight=ht#1relax%
  boxwidth=wd#1relax%
  FPdivresulttheboxheighttheboxwidthresult%

begindocument
newsaveboxx
sboxxfboxparbox[b]2.84inlipsum[1-2]
%aspectx

defhgphspace.1in
defplotAprotectrule1.36in0.66in
defplotBprotectrule1.36in1.36in
defplotCprotectrule1.36in1.36in
defplotDprotectrule1.36in1.36in
defplotEprotectrule1.36in1.36in
defplotFprotectrule1.36in1.36inhgp
defplotGprotectrule1.36in1.36in

defstackalignmentl
Sstackgap=.1in
ShortstackplotA plotB plotC plotD plotEhgp%
stackonplotF plotGscaletouseboxx5in

enddocument

ingrese la descripción de la imagen aquí

ps Estoy usando stackengine V2.0, que es posible que aún no tenga. Hasta que pueda actualizar y para que funcione el segundo MWE, simplemente elimine el [oldsyntax] opción de paquete.

tcolorbox incluye biblioteca fitting con su mando tcboxfit. Encaja su contenido dentro de una caja de ancho y alto determinados.

A continuación algunos ejemplos:

documentclassarticle
usepackage[most]tcolorbox
usepackagelipsum
usepackagelmodern

tcbsetcolframe=blue!50!black,colback=green!10!white,
boxsep=0pt,top=1mm,bottom=1mm,left=1mm,right=1mm,
nobeforeafter, arc=0pt, outer arc=0pt

begindocument

lipsum[1]

noindenttcboxfit[width=.5linewidth,height=6cm]lipsum[1]
hfill
tcboxfit[width=.45linewidth, height=4cm]lipsum[1]

noindenttcboxfit[width=linewidth, height=2cm]lipsum[1]

enddocument

ingrese la descripción de la imagen aquí

Finalizando este artículo puedes encontrar las explicaciones de otros administradores, tú asimismo puedes dejar el tuyo si te apetece.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : / /

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *