Obtener altura/ancho del cuadro principal

Obtener altura/ancho del cuadro principal

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 \framedpara sus textos, puede obtener el ancho del contenido en el cuadro con los comandos \framedwidthy \framedheight. Una restricción aquí es que solo obtiene valor utilizable cuando la configuración widtho heightcontiene una longitud mayor que 0pt.

\starttext

\startframed[width=200pt,height=80pt,offset=10pt,rulethickness=0.5pt]
     Width: \framedwidth \par
    Height: \framedheight
\stopframed

\stoptext

ingrese la descripción de la imagen aquí

Para obtener los valores de las teclas widthy, heightpuede utilizar los comandos \localwidthy \localheight. Aquí debes tener en cuenta que ConTeXt entrega cualquier valor establecido con la clave, es decir, cuando configuras width=fitlos \localwidthcomandos te da fitcomo argumento.

\starttext

\startframed[width=200pt,height=80pt,offset=10pt,rulethickness=0.5pt]
     Width: \localwidth \par
    Height: \localheight
\stopframed

\stoptext

ingrese la descripción de la imagen aquí

El último valor posible se puede utilizar para el fondo de un marco, pero a diferencia de los métodos anteriores, obtienes el widthvalor correcto heightdel 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

ingrese la descripción de la imagen aquí

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 \parwdpara 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.texque 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#1seguido de #1) puede provocar efectos secundarios inesperados, por ejemplo, si aumentan los contadores en el cuadro. Intenté reducir ese problema evaluando el \setbox0#1en un grupo con \globaldefs=-1, pero esto podría cambiar las dimensiones de la caja si se utilizan paquetes que dependen de definiciones globales, como tikz, 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 \lastboxpara 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.

información relacionada