
¿Cómo puedo crear un entorno enmarcado en ConTeXt que \ifvmode
sea 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 ifvmode
es falso y nointerlineskip
no está permitido. ¿Existe una combinación de configuraciones que garantice el modo vertical o cláusulas antes/después que permitan \vbox\bgroup...\egroup
desplazarse por el contenido?
Respuesta1
El \framed
comando crea un horizontal
cuadro de forma predeterminada, pero cuando aplica una configuración width
o height
en combinación con una align
configuración, cambia a un vertical
cuadro.
La parte complicada es cómo verificar el modo vertical porque configurar a width
y align
no es suficiente. El problema es que ConTeXt agrega un \strut
al principio y al final del contenido y al \strut
principio cambia al horizontal
modo. El ejemplo con \vbox
demuestra 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
La solución obvia después de saber \strut
quién es el culpable es desactivarlo con la strut=no
opción. A diferencia de las expectativas, todavía obtenemos horizontal
el modo porque ConTeXt agrega \noindent
al comienzo del contenido lo que nos saca del vertical
modo.
\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
Para finalmente resolver nuestro problema tenemos que usar la strut=none
opción especial que es una \framed
única opción. A diferencia de la no
clave anterior la none
opción no inserta nada al principio ni al final del contenido lo que nos mantiene en vertical
modo 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
Respuesta2
A background
hace exactamente lo mismo que framed
y le da true
a \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