我如何才能创建一个真实的 ConTeXt 框架环境\ifvmode
?
\startframed[...]
\ifvmode
Vertical mode!
\else
Horizontal mode!
\fi
\stopframed
编辑
我以为如果指定了对齐,则 \framed 将产生 \vbox。但是它看起来更像是一个伪垂直框,因为ifvmode
是错误的,并且是不允许的。是否有保证垂直模式的设置组合或允许围绕内容的nointerlineskip
前后子句?\vbox\bgroup...\egroup
答案1
该\framed
命令horizontal
默认创建一个框,但是当您将width
或height
设置与设置结合应用时align
,则会切换到一个vertical
框。
棘手的部分是如何检查垂直模式,因为设置 awidth
和align
设置是不够的。问题是 ConTeXt\strut
在内容的开始和结束处添加了 a ,并且\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