
조판할 입력 텍스트가 구조화된 템플릿과 별개인 경우 입력이 포함 상자의 높이와 너비를 결정할 수 있습니까?
입력 예시입니다. 대체할 물음표(?)(Lua 또는 TeX).
The width of the parent box is ?
The height of the parent box is ?
여러 가지 가능한 템플릿:
\ruledhbox to 10cm{\vbox to 4cm{ \input input }} % 10cm by 4cm
\ruledvbox to 4cm{\hsize=10cm \input input } % 10cm by 4cm
\framed
[width=10cm,
height=4cm,
align={middle,lohi},
offset=0.5cm]
{ \input input } % 9cm by 3cm
상자가 보관될 때까지 치수는 의미가 없으므로 아마도 여기서부터 시작해야 할 것입니다.
나의 확장은 \aftergroup
+\lastbox
답변:
\typeset{\hbox to50pt{\vbox to40pt{\hbox to30pt{width: \parwd }}}}
{ \let\parht\askparent\let\parwd\askparent\let\pardp\askparent
\setbox0=\hbox to50pt{\vbox to40pt{\hbox to30pt{width: \parwd }}}
\hbox to50pt{\vbox to40pt{\hbox to30pt{width: \parwd }}}
}
{ \let\parht\askparent\let\parwd\askparent\let\pardp\askparent
\setbox0=\hbox to50pt{\vbox to40pt{\hbox to30pt{width: \parwd }}}
\hbox to50pt{\vbox to40pt{\hbox to30pt{width: \askparent }}}
}
{ \let\parht\askparent\let\parwd\askparent\let\pardp\askparent
\setbox0=\hbox to50pt{\vbox to40pt{\hbox to30pt{width: \parwd }}}
\hbox to50pt{\vbox to40pt{\hbox to30pt{width: } \afterafter }}
}
{ \let\parht\askparent\let\parwd\askparent\let\pardp\askparent
\setbox0=\hbox to50pt{\vbox to40pt{\hbox to30pt{width: \parwd }}}
\hbox to50pt{\vbox to40pt{\hbox to30pt{width: }} \after }
}
{ \let\parht\askparent\let\parwd\askparent\let\pardp\askparent
\setbox0=\hbox to50pt{\vbox to40pt{\hbox to30pt{width: \parwd }}}
\hbox to50pt{
\setbox\storelast=\vbox to40pt{\hbox to30pt{width: }}
\xdef\parht{\the\ht\storelast}
\xdef\parwd{\the\wd\storelast}
\xdef\pardp{\the\dp\storelast}
\ifvmode\nointerlineskip\fi\box\storelast}
}
{ \let\parht\askparent\let\parwd\askparent\let\pardp\askparent
\setbox0=\hbox to50pt{\vbox to40pt{\hbox to30pt{width: \parwd }}}
\hbox to50pt{
\setbox\storelast=\vbox to40pt{\hbox to30pt{width: }}
\xdef\parht{\the\ht\storelast}
\xdef\parwd{\the\wd\storelast}
\xdef\pardp{\the\dp\storelast}
\vbox to40pt{\hbox to30pt{width: }}}
}
답변1
텍스트에 을 사용하면 및 명령을 \framed
사용하여 상자의 내용 너비를 얻을 수 있습니다 . 여기서 제한 사항은 또는 설정에 보다 큰 길이가 포함된 경우에만 사용 가능한 값을 얻을 수 있다는 것입니다 .\framedwidth
\framedheight
width
height
0pt
\starttext
\startframed[width=200pt,height=80pt,offset=10pt,rulethickness=0.5pt]
Width: \framedwidth \par
Height: \framedheight
\stopframed
\stoptext
width
및 키 의 값을 얻으려면 및 명령을 height
사용할 수 있습니다 . 여기에서 ConTeXt는 키로 설정된 값을 전달한다는 점을 기억해야 합니다. 즉, 명령을 설정할 때 인수 로 제공됩니다 .\localwidth
\localheight
width=fit
\localwidth
fit
\starttext
\startframed[width=200pt,height=80pt,offset=10pt,rulethickness=0.5pt]
Width: \localwidth \par
Height: \localheight
\stopframed
\stoptext
마지막으로 가능한 값을 프레임의 배경으로 사용할 수 있지만 이전 방법과 달리 와 같은 설정을 사용해도 프레임의 올바른 width
값을 얻을 수 있습니다 .height
width=fit
\defineoverlay
[boxdimensions]
[\vbox\bgroup
\hbox {Width: \overlaywidth}
\hbox{Height: \overlayheight}
\egroup]
\setupframed % don't make global framed settings in a document
[background=boxdimensions]
\starttext
\startframed[width=200pt,height=80pt,offset=10pt,rulethickness=0.5pt]
%
\stopframed
\stoptext
답변2
이 "솔루션"은 확실히 보편적이지 않고 잘 고려되어 있지 않지만 일반 TeX를 사용하는 간단한 경우에는 작동합니다.
\newbox\storelast
\def\after{\setbox\storelast=\lastbox
{\globaldefs=1
\edef\parht{\the\ht\storelast}
\edef\parwd{\the\wd\storelast}
\edef\pardp{\the\dp\storelast}}
\ifvmode\nointerlineskip\fi\box\storelast}
\def\afterafter{\aftergroup\after}
\def\askparent{\aftergroup\afterafter}
\def\typeset#1{\let\parht\askparent\let\parwd\askparent\let\pardp\askparent
{\globaldefs=-1 \setbox0#1}#1}
그런 다음 를 사용하여 템플릿을 조판할 수 있습니다 \typeset{...}
. 입력에서 , 및 를 사용하여 \parwd
각각 \parht
상위 \pardp
상자의 너비, 높이 및 깊이를 얻을 수 있습니다. 의 주장\typeset
상자여야 해\hbox
( , ... 로 시작해야 합니다 \vbox
.)
input.tex
예를 들어 다음을 포함하는 파일이 있습니다.
width \parwd\ height \parht
.
그런 다음 다음 줄
\typeset{\hbox to50pt{\vbox to40pt{\hbox to30pt{\input input }}}}
\typeset{\vbox to50pt{\hbox to40pt{\vbox to30pt{\input input }}}}
인쇄(많은 초과/미만 상자 제외)
width 30.0pt height 40.0pt
width 40.0pt height 30.0pt
바르게. 하지만,
- 나는 이것이 더 복잡한 구조에서 얼마나 잘 작동하는지 전혀 모릅니다.
- 편집하다:주석에서 Henri Menke가 지적했듯이 상자를 두 번 조판하면(뒤에
\setbox0#1
)#1
상자에서 카운터가 증가하는 경우와 같이 예상치 못한 부작용이 발생할 수 있습니다. 를\setbox0#1
사용하여 그룹 내에서 를 평가하여 이 문제를 줄이려고 했지만\globaldefs=-1
, 와 같이 전역 정의에 의존하는 패키지를 사용하면 상자의 크기가 변경되어tikz
잘못된 결과가 나올 수 있습니다. - 명령
\parht
등이 다음과 같다고 가정합니다.그룹 내에서는 사용되지 않음상자에 의해 생성된 것 이외의 것; - 상위 상자가 다음과 같은 경우에만 작동합니다.기본 수직 목록에 없음
\lastbox
외부 수직 모드에서는 비어 있는 상자 크기를 결정하는 데 사용됩니다 .
마지막으로 위의 예를 고려하세요. 하지만 이제 우리는 가장 바깥쪽 상자의 크기에 관심이 있습니다.
\typeset{\hbox to50pt{\vbox to40pt{\hbox to30pt{\input input }}}}
\typeset{\vbox to50pt{\hbox to40pt{\vbox to30pt{\input input }}}}
인쇄할 것이다
width 0.0pt height 0.0pt
width 0.0pt height 0.0pt
가장 바깥쪽 상자가 외부 수직 모드로 설정되어 있기 때문입니다. 이 경우 템플릿을 다음과 같은 다른 상자로 포장해야 합니다.
\typeset{\hbox{\hbox to50pt{\vbox to40pt{\hbox to30pt{}\input input }}}}
\typeset{\hbox{\vbox to50pt{\hbox to40pt{\vbox to30pt{}\input input }}}}
인쇄
width 50.0pt height 40.0pt
width 40.0pt height 50.0pt
예상대로.