상위 상자의 높이/너비 가져오기

상위 상자의 높이/너비 가져오기

조판할 입력 텍스트가 구조화된 템플릿과 별개인 경우 입력이 포함 상자의 높이와 너비를 결정할 수 있습니까?

입력 예시입니다. 대체할 물음표(?)(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\framedheightwidthheight0pt

\starttext

\startframed[width=200pt,height=80pt,offset=10pt,rulethickness=0.5pt]
     Width: \framedwidth \par
    Height: \framedheight
\stopframed

\stoptext

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

width및 키 의 값을 얻으려면 및 명령을 height사용할 수 있습니다 . 여기에서 ConTeXt는 키로 설정된 값을 전달한다는 점을 기억해야 합니다. 즉, 명령을 설정할 때 인수 로 제공됩니다 .\localwidth\localheightwidth=fit\localwidthfit

\starttext

\startframed[width=200pt,height=80pt,offset=10pt,rulethickness=0.5pt]
     Width: \localwidth \par
    Height: \localheight
\stopframed

\stoptext

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

마지막으로 가능한 값을 프레임의 배경으로 사용할 수 있지만 이전 방법과 달리 와 같은 설정을 사용해도 프레임의 올바른 width값을 얻을 수 있습니다 .heightwidth=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

예상대로.

관련 정보