Enmarcado en modo vertical

Enmarcado en modo vertical

¿Cómo puedo crear un entorno enmarcado en ConTeXt que \ifvmodesea verdadero?

\startframed[...]
    \ifvmode
        Vertical mode!
    \else
        Horizontal mode!
    \fi
\stopframed

editar

Tenía la impresión de quesi se especificara una alineación, \framed produciría un \vbox. Sin embargo, parece más bien un vbox falso ya que ifvmodees falso y nointerlineskipno está permitido. ¿Existe una combinación de configuraciones que garantice el modo vertical o cláusulas antes/después que permitan \vbox\bgroup...\egroupdesplazarse por el contenido?

Respuesta1

El \framedcomando crea un horizontalcuadro de forma predeterminada, pero cuando aplica una configuración widtho heighten combinación con una alignconfiguración, cambia a un verticalcuadro.

La parte complicada es cómo verificar el modo vertical porque configurar a widthy alignno es suficiente. El problema es que ConTeXt agrega un \strutal principio y al final del contenido y al \strutprincipio cambia al horizontalmodo. El ejemplo con \vboxdemuestra lo que sucede aquí.

\startbuffer[modetest]
    \ifvmode
        Vertical mode!
    \else
        Horizontal mode!
    \fi
\stopbuffer

\starttext

\startframed[width=max,align=normal]
    \getbuffer[modetest]
\stopframed

\ruledvbox\bgroup
    \strut\getbuffer[modetest]\removeunwantedspaces\strut
\egroup

\stoptext

ingrese la descripción de la imagen aquí

La solución obvia después de saber \strutquién es el culpable es desactivarlo con la strut=noopción. A diferencia de las expectativas, todavía obtenemos horizontalel modo porque ConTeXt agrega \noindental comienzo del contenido lo que nos saca del verticalmodo.

\startbuffer[modetest]
    \ifvmode
        Vertical mode!
    \else
        Horizontal mode!
    \fi
\stopbuffer

\starttext

\startframed[width=max,align=normal,strut=no]
    \getbuffer[modetest]
\stopframed

\ruledvbox\bgroup
    \noindent\getbuffer[modetest]\removeunwantedspaces
\egroup

\stoptext

ingrese la descripción de la imagen aquí

Para finalmente resolver nuestro problema tenemos que usar la strut=noneopción especial que es una \framedúnica opción. A diferencia de la noclave anterior la noneopción no inserta nada al principio ni al final del contenido lo que nos mantiene en verticalmodo cuando realizamos la verificación y finalmente muestra ConTeXt.¡Modo vertical!.

\startbuffer[modetest]
    \ifvmode
        Vertical mode!
    \else
        Horizontal mode!
    \fi
\stopbuffer

\starttext

\startframed[width=max,align=normal,strut=none]
    \getbuffer[modetest]
\stopframed

\ruledvbox\bgroup
    \getbuffer[modetest]
\egroup

\stoptext

ingrese la descripción de la imagen aquí

Respuesta2

A backgroundhace exactamente lo mismo que framedy le da truea \ifvmode. Un ejemplo mínimo:

\definebackground
[nicenote]
[
framecolor=black,
background=color,
backgroundcolor=yellow,
frame=on, 
rulethickness=2pt,
offset=overlay,
leftoffset=1em,
rightoffset=1em,
width=\textwidth,
setups=framedsetups,
before=\blank,
after=\blank,
]
\starttext
\startnicenote 
\ifvmode
Vertical mode!
\else
Horizontal mode!
\fi
\stopnicenote 
\stoptext

ingrese la descripción de la imagen aquí

información relacionada