
Como posso criar um ambiente emoldurado ConTeXt que \ifvmode
seja verdadeiro?
\startframed[...]
\ifvmode
Vertical mode!
\else
Horizontal mode!
\fi
\stopframed
editar
Fiquei com a impressão de quese um alinhamento fosse especificado, \framed produziria um \vbox. No entanto, parece mais um vbox falso, pois ifvmode
é falso e nointerlineskip
não é permitido. Existe uma combinação de configurações que garanta o modo vertical ou cláusulas antes/depois que permitam \vbox\bgroup...\egroup
contornar o conteúdo?
Responder1
O \framed
comando cria uma horizontal
caixa por padrão, mas quando você aplica uma configuração width
ou height
em combinação com uma align
configuração, você alterna para uma vertical
caixa.
A parte complicada é como verificar o modo vertical porque definir ae width
não align
é suficiente. O problema é que o ConTeXt adiciona um \strut
no início e no final do conteúdo e o \strut
no início muda para horizontal
o modo. O exemplo com \vbox
demonstra o que acontece aqui.
\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
A solução óbvia, depois de sabermos \strut
o culpado, é desativá-lo com a strut=no
opção. Ao contrário das expectativas, ainda obtemos horizontal
o modo porque o ConTeXt adiciona \noindent
no início o conteúdo que nos tira do 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 o nosso problema temos que usar a strut=none
opção especial que é a \framed
única opção. Ao contrário da no
chave anterior a none
opção não insere nada no início ou no final do conteúdo o que nos mantém no vertical
modo quando realizamos a verificação e o ConTeXt finalmente mostraModo 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
Responder2
A background
faz exatamente o mesmo que framed
e dá true
para \ifvmode
. Um exemplo 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