Im vertikalen Modus gerahmt

Im vertikalen Modus gerahmt

Wie kann ich eine ConTeXt-gerahmte Umgebung erstellen, die dies \ifvmodezutrifft?

\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 ifvmodees falsch ist und nointerlineskipnicht zulässig ist. Gibt es eine Kombination von Einstellungen, die den vertikalen Modus garantiert, oder Vorher-/Nachher-Klauseln, die \vbox\bgroup...\egroupden Inhalt umgehen?

Antwort1

Der \framedBefehl erstellt horizontalstandardmäßig eine Box, aber wenn Sie eine widthoder heightEinstellung in Kombination mit einer alignEinstellung anwenden, wechseln Sie zu einer verticalBox.

Der schwierige Teil ist, wie man den vertikalen Modus überprüft, da das Setzen von a widthund alignsetting nicht ausreicht. Das Problem besteht darin, dass ConTeXt \strutam Anfang und Ende des Inhalts ein hinzufügt und das \strutam Anfang in horizontalden Modus wechselt. Das Beispiel mit dem \vboxzeigt, 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

Bildbeschreibung hier eingeben

Die offensichtliche Lösung, nachdem wir \strutden Übeltäter kennen, ist, ihn mit der Option zu deaktivieren strut=no. Anders als erwartet erhalten wir dennoch horizontalden Modus, da ConTeXt \noindentam 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

Bildbeschreibung hier eingeben

Um unser Problem endgültig zu lösen, müssen wir die spezielle strut=noneOption verwenden, die eine einzige Option ist \framed. Im Gegensatz zum vorherigen noSchlüssel nonefügt die Option nichts am Anfang oder Ende des Inhalts ein, was uns im verticalModus 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

Bildbeschreibung hier eingeben

Antwort2

A backgroundmacht genau dasselbe wie framedund gibt truean \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

Bildbeschreibung hier eingeben

verwandte Informationen