
En los casos en que el texto de entrada que se va a componer está separado de la plantilla estructurada, ¿puede la entrada determinar la altura y el ancho del cuadro que lo contiene?
Una entrada de ejemplo. Signos de interrogación (?) que se sustituirán (Lua o TeX).
The width of the parent box is ?
The height of the parent box is ?
Varias plantillas posibles:
\ruledhbox to 10cm{\vbox to 4cm{ \input input }} % 10cm by 4cm
\ruledvbox to 4cm{\hsize=10cm \input input } % 10cm by 4cm
\framed
[width=10cm,
height=4cm,
align={middle,lohi},
offset=0.5cm]
{ \input input } % 9cm by 3cm
Las dimensiones no tienen sentido hasta que se almacena la caja, por lo que probablemente ese sea el lugar para comenzar.
Mi expansión del \aftergroup
+\lastbox
respuesta:
\typeset{\hbox to50pt{\vbox to40pt{\hbox to30pt{width: \parwd }}}}
{ \let\parht\askparent\let\parwd\askparent\let\pardp\askparent
\setbox0=\hbox to50pt{\vbox to40pt{\hbox to30pt{width: \parwd }}}
\hbox to50pt{\vbox to40pt{\hbox to30pt{width: \parwd }}}
}
{ \let\parht\askparent\let\parwd\askparent\let\pardp\askparent
\setbox0=\hbox to50pt{\vbox to40pt{\hbox to30pt{width: \parwd }}}
\hbox to50pt{\vbox to40pt{\hbox to30pt{width: \askparent }}}
}
{ \let\parht\askparent\let\parwd\askparent\let\pardp\askparent
\setbox0=\hbox to50pt{\vbox to40pt{\hbox to30pt{width: \parwd }}}
\hbox to50pt{\vbox to40pt{\hbox to30pt{width: } \afterafter }}
}
{ \let\parht\askparent\let\parwd\askparent\let\pardp\askparent
\setbox0=\hbox to50pt{\vbox to40pt{\hbox to30pt{width: \parwd }}}
\hbox to50pt{\vbox to40pt{\hbox to30pt{width: }} \after }
}
{ \let\parht\askparent\let\parwd\askparent\let\pardp\askparent
\setbox0=\hbox to50pt{\vbox to40pt{\hbox to30pt{width: \parwd }}}
\hbox to50pt{
\setbox\storelast=\vbox to40pt{\hbox to30pt{width: }}
\xdef\parht{\the\ht\storelast}
\xdef\parwd{\the\wd\storelast}
\xdef\pardp{\the\dp\storelast}
\ifvmode\nointerlineskip\fi\box\storelast}
}
{ \let\parht\askparent\let\parwd\askparent\let\pardp\askparent
\setbox0=\hbox to50pt{\vbox to40pt{\hbox to30pt{width: \parwd }}}
\hbox to50pt{
\setbox\storelast=\vbox to40pt{\hbox to30pt{width: }}
\xdef\parht{\the\ht\storelast}
\xdef\parwd{\the\wd\storelast}
\xdef\pardp{\the\dp\storelast}
\vbox to40pt{\hbox to30pt{width: }}}
}
Respuesta1
Cuando lo usa \framed
para sus textos, puede obtener el ancho del contenido en el cuadro con los comandos \framedwidth
y \framedheight
. Una restricción aquí es que solo obtiene valor utilizable cuando la configuración width
o height
contiene una longitud mayor que 0pt
.
\starttext
\startframed[width=200pt,height=80pt,offset=10pt,rulethickness=0.5pt]
Width: \framedwidth \par
Height: \framedheight
\stopframed
\stoptext
Para obtener los valores de las teclas width
y, height
puede utilizar los comandos \localwidth
y \localheight
. Aquí debes tener en cuenta que ConTeXt entrega cualquier valor establecido con la clave, es decir, cuando configuras width=fit
los \localwidth
comandos te da fit
como argumento.
\starttext
\startframed[width=200pt,height=80pt,offset=10pt,rulethickness=0.5pt]
Width: \localwidth \par
Height: \localheight
\stopframed
\stoptext
El último valor posible se puede utilizar para el fondo de un marco, pero a diferencia de los métodos anteriores, obtienes el width
valor correcto height
del marco incluso con configuraciones como width=fit
.
\defineoverlay
[boxdimensions]
[\vbox\bgroup
\hbox {Width: \overlaywidth}
\hbox{Height: \overlayheight}
\egroup]
\setupframed % don't make global framed settings in a document
[background=boxdimensions]
\starttext
\startframed[width=200pt,height=80pt,offset=10pt,rulethickness=0.5pt]
%
\stopframed
\stoptext
Respuesta2
Esta "solución" seguramente no es universal ni está bien pensada, pero me funciona en casos simples, con TeX simple:
\newbox\storelast
\def\after{\setbox\storelast=\lastbox
{\globaldefs=1
\edef\parht{\the\ht\storelast}
\edef\parwd{\the\wd\storelast}
\edef\pardp{\the\dp\storelast}}
\ifvmode\nointerlineskip\fi\box\storelast}
\def\afterafter{\aftergroup\after}
\def\askparent{\aftergroup\afterafter}
\def\typeset#1{\let\parht\askparent\let\parwd\askparent\let\pardp\askparent
{\globaldefs=-1 \setbox0#1}#1}
Luego, puedes componer la plantilla con \typeset{...}
. En la entrada, puede usar y \parwd
para obtener el ancho, alto y profundidad del cuadro principal, respectivamente. El argumento de\parht
\pardp
\typeset
tiene que ser una caja(tiene que empezar por \hbox
, \vbox
...).
Por ejemplo, tengo un archivo llamado input.tex
que contiene
width \parwd\ height \parht
.
Entonces, las siguientes líneas
\typeset{\hbox to50pt{\vbox to40pt{\hbox to30pt{\input input }}}}
\typeset{\vbox to50pt{\hbox to40pt{\vbox to30pt{\input input }}}}
imprimir (aparte de muchas casillas llenas o insuficientes)
width 30.0pt height 40.0pt
width 40.0pt height 30.0pt
correctamente. Sin embargo,
- No tengo idea de qué tan bien se comporta esto para construcciones más complejas;
- Editar:Como señaló Henri Menke en los comentarios, escribir el cuadro dos veces (
\setbox0#1
seguido de#1
) puede provocar efectos secundarios inesperados, por ejemplo, si aumentan los contadores en el cuadro. Intenté reducir ese problema evaluando el\setbox0#1
en un grupo con\globaldefs=-1
, pero esto podría cambiar las dimensiones de la caja si se utilizan paquetes que dependen de definiciones globales, comotikz
, lo que produce resultados incorrectos; - se supone que los comandos
\parht
, etc. sonno utilizado dentro de un grupodistintos de los creados por las cajas; - sólo funcionará si el cuadro principal estáno en la lista vertical principalya que utiliza
\lastbox
para determinar las dimensiones de la caja, que está vacía en modo vertical externo.
Para el último punto, considere el ejemplo anterior, pero ahora nos interesan las dimensiones de la caja más externa:
\typeset{\hbox to50pt{\vbox to40pt{\hbox to30pt{\input input }}}}
\typeset{\vbox to50pt{\hbox to40pt{\vbox to30pt{\input input }}}}
imprimiría
width 0.0pt height 0.0pt
width 0.0pt height 0.0pt
porque el cuadro más externo está configurado en modo vertical externo. En este caso, tendrías que envolver tu plantilla con otro cuadro, como
\typeset{\hbox{\hbox to50pt{\vbox to40pt{\hbox to30pt{}\input input }}}}
\typeset{\hbox{\vbox to50pt{\hbox to40pt{\vbox to30pt{}\input input }}}}
impresión
width 50.0pt height 40.0pt
width 40.0pt height 50.0pt
como se esperaba.