
我怎麼能創造一個這樣的 ConTeXt 框架環境\ifvmode
?
\startframed[...]
\ifvmode
Vertical mode!
\else
Horizontal mode!
\fi
\stopframed
編輯
我的印像是如果指定了對齊 \framed 將產生 \vbox。然而,它似乎更像是一個假vbox,因為它ifvmode
是錯誤的並且nointerlineskip
是不允許的。是否存在保證垂直模式或允許\vbox\bgroup...\egroup
圍繞內容的之前/之後子句的設定組合?
答案1
此\framed
指令預設horizontal
會建立一個框,但當您將width
或height
設定與某個設定結合應用時align
,您會切換到一個vertical
框。
棘手的部分是如何檢查垂直模式,因為設定 awidth
和align
設定是不夠的。問題是 ConTeXt\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