В рамке в вертикальном режиме

В рамке в вертикальном режиме

Как мне создать среду ConTeXt, которая соответствует \ifvmodeдействительности?

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

редактировать

У меня сложилось впечатление, чтоесли было указано выравнивание, \framed создаст \vbox. Однако это больше похоже на faux-vbox, поскольку ifvmodeложно и nointerlineskipне допускается. Есть ли комбинация настроек, которая гарантирует вертикальный режим или условия до/после, которые позволяют \vbox\bgroup...\egroupвокруг контента?

решение1

По умолчанию команда \framedсоздает horizontalящик, но при применении параметра widthили heightв сочетании с alignпараметром происходит переключение на verticalящик.

Сложность в том, как проверить вертикальный режим, потому что установки a widthи alignустановки недостаточно. Проблема в том, что ConTeXt добавляет a \strutв начале и конце контента, а \strutв начале переключается на horizontalрежим. Пример с \vboxдемонстрирует, что здесь происходит.

\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

введите описание изображения здесь

Очевидное решение после того, как мы узнаем \strutвиновника, — отключить его с помощью опции strut=no. В отличие от ожиданий мы все равно получаем horizontalрежим, потому что ConTeXt добавляет \noindentв начале контента, что выводит нас из verticalрежима.

\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

введите описание изображения здесь

Чтобы окончательно решить нашу проблему, нам нужно использовать специальную strut=noneопцию, которая является \framedединственной. В отличие от предыдущей noклавиши эта noneопция ничего не вставляет в начало или конец контента, что удерживает нас в verticalрежиме, когда мы выполняем проверку, и ConTeXt наконец показываетВертикальный режим!.

\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

введите описание изображения здесь

решение2

A backgroundделает то же самое, что framedи даёт true. \ifvmodeМинимальный пример:

\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

введите описание изображения здесь

Связанный контент