Enquadrado no modo vertical

Enquadrado no modo vertical

Como posso criar um ambiente emoldurado ConTeXt que \ifvmodeseja 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 nointerlineskipnão é permitido. Existe uma combinação de configurações que garanta o modo vertical ou cláusulas antes/depois que permitam \vbox\bgroup...\egroupcontornar o conteúdo?

Responder1

O \framedcomando cria uma horizontalcaixa por padrão, mas quando você aplica uma configuração widthou heightem combinação com uma alignconfiguração, você alterna para uma verticalcaixa.

A parte complicada é como verificar o modo vertical porque definir ae widthnão aligné suficiente. O problema é que o ConTeXt adiciona um \strutno início e no final do conteúdo e o \strutno início muda para horizontalo modo. O exemplo com \vboxdemonstra 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

insira a descrição da imagem aqui

A solução óbvia, depois de sabermos \struto culpado, é desativá-lo com a strut=noopção. Ao contrário das expectativas, ainda obtemos horizontalo modo porque o ConTeXt adiciona \noindentno início o conteúdo que nos tira do 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

insira a descrição da imagem aqui

Para finalmente resolver o nosso problema temos que usar a strut=noneopção especial que é a \framedúnica opção. Ao contrário da nochave anterior a noneopção não insere nada no início ou no final do conteúdo o que nos mantém no verticalmodo 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

insira a descrição da imagem aqui

Responder2

A backgroundfaz exatamente o mesmo que framede dá truepara \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

insira a descrição da imagem aqui

informação relacionada