
Wie kann ich eine ConTeXt-gerahmte Umgebung erstellen, die dies \ifvmode
zutrifft?
\startframed[...]
\ifvmode
Vertical mode!
\else
Horizontal mode!
\fi
\stopframed
bearbeiten
Ich hatte den Eindruck, dasswenn eine Ausrichtung angegeben wurde, würde \framed eine \vbox erzeugen. Es scheint jedoch eher eine Faux-Vbox zu sein, da ifvmode
es falsch ist und nointerlineskip
nicht zulässig ist. Gibt es eine Kombination von Einstellungen, die den vertikalen Modus garantiert, oder Vorher-/Nachher-Klauseln, die \vbox\bgroup...\egroup
den Inhalt umgehen?
Antwort1
Der \framed
Befehl erstellt horizontal
standardmäßig eine Box, aber wenn Sie eine width
oder height
Einstellung in Kombination mit einer align
Einstellung anwenden, wechseln Sie zu einer vertical
Box.
Der schwierige Teil ist, wie man den vertikalen Modus überprüft, da das Setzen von a width
und align
setting nicht ausreicht. Das Problem besteht darin, dass ConTeXt \strut
am Anfang und Ende des Inhalts ein hinzufügt und das \strut
am Anfang in horizontal
den Modus wechselt. Das Beispiel mit dem \vbox
zeigt, was hier passiert.
\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
Die offensichtliche Lösung, nachdem wir \strut
den Übeltäter kennen, ist, ihn mit der Option zu deaktivieren strut=no
. Anders als erwartet erhalten wir dennoch horizontal
den Modus, da ConTeXt \noindent
am Anfang des Inhalts hinzufügt, wodurch wir den Modus verlassen 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
Um unser Problem endgültig zu lösen, müssen wir die spezielle strut=none
Option verwenden, die eine einzige Option ist \framed
. Im Gegensatz zum vorherigen no
Schlüssel none
fügt die Option nichts am Anfang oder Ende des Inhalts ein, was uns im vertical
Modus hält, wenn wir die Prüfung durchführen und ConTeXt schließlich anzeigtVertikaler Modus!.
\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
Antwort2
A background
macht genau dasselbe wie framed
und gibt true
an \ifvmode
. Ein minimales Beispiel:
\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