
Как мне создать среду 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