수직 모드로 프레임

수직 모드로 프레임

ConTeXt 프레임 환경을 실제로 만들려면 어떻게 해야 합니까 \ifvmode?

\startframed[...]
    \ifvmode
        Vertical mode!
    \else
        Horizontal mode!
    \fi
\stopframed

편집하다

나는 그런 인상을 받았다.정렬이 지정되면 \framed는 \vbox를 생성합니다.. 그러나 ifvmode그것은 거짓이고 nointerlineskip허용되지 않기 때문에 가짜 vbox에 더 가깝습니다 . 세로 모드를 보장하는 설정 조합이나 \vbox\bgroup...\egroup콘텐츠 주변을 허용하는 이전/이후 절이 있나요?

답변1

\framed명령은 기본적으로 상자를 생성 하지만 또는 설정을 설정과 함께 horizontal적용하면 상자 로 전환됩니다 .widthheightalignvertical

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때문에 여전히 모드를 얻습니다 .\noindentvertical

\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

여기에 이미지 설명을 입력하세요

관련 정보