
ConTeXt 프레임 환경을 실제로 만들려면 어떻게 해야 합니까 \ifvmode
?
\startframed[...]
\ifvmode
Vertical mode!
\else
Horizontal mode!
\fi
\stopframed
편집하다
나는 그런 인상을 받았다.정렬이 지정되면 \framed는 \vbox를 생성합니다.. 그러나 ifvmode
그것은 거짓이고 nointerlineskip
허용되지 않기 때문에 가짜 vbox에 더 가깝습니다 . 세로 모드를 보장하는 설정 조합이나 \vbox\bgroup...\egroup
콘텐츠 주변을 허용하는 이전/이후 절이 있나요?
답변1
이 \framed
명령은 기본적으로 상자를 생성 하지만 또는 설정을 설정과 함께 horizontal
적용하면 상자 로 전환됩니다 .width
height
align
vertical
width
까다로운 부분은 a 및 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
옵션을 사용하여 이를 비활성화하는 것입니다. 기대와 달리 ConTeXt는 콘텐츠 시작 부분에 추가하여 모드에서 벗어나게 하기 horizontal
때문에 여전히 모드를 얻습니다 .\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