\hsize를 변경할 수 있는 곳은 어디인가요?

\hsize를 변경할 수 있는 곳은 어디인가요?

23장 "출력 루틴"에는 다음과 같은 경고가 있습니다.

작업 시작 시나 TeX 메모리에서 모든 페이지를 꺼낸 후를 제외하고는 \hsize 및 \vsize를 사용하지 않는 것이 가장 좋습니다.

하지만TeXbook\hsize자체적으로 변경된 몇 가지 예가 있습니다 .

1) story.tex를 사용한 연습에서는 \hsize가 하나의 tex 작업에서 여러 번 설정됩니다.

\hsize=4in \input story
\hsize=3in \input story
...

내 생각에 이 사건은 "합법적"인 것 같습니다. 왜냐하면 \ejectstory.tex의 마지막 부분에서 호출되기 때문입니다.

몇 가지 추가 예:

2) 115페이지는 \hsize내부에 설정되어 있습니다 \topinsert.

3) 223페이지는 \hsize내부에 설정되어 있습니다 \vbox.

어떤 맥락에서 수정하는 것이 "합법적"입니까?\hsize 이며 이 경고가 있는 이유는 무엇입니까?TeXbook? \hsize"나쁜" 위치를 바꾸면 무엇이 잘못될 수 있는지 보여주는 예가 있습니까 ?

답변1

무엇인가요 \hsize?

기본 매개변수 는 TeX가 단락을 행으로 분할하는 데 사용하는 길이입니다( 와 및 에서 오는 단락 모양 명령 \hsize도 고려합니다 .\leftskip\rightskip\hangindent\hangafter

단락이 여러 줄로 분할되면 TeX는 \hsize현재 수직 목록에 너비의 수평 상자 스택을 제공합니다. 너비는 \hangindent와 가 \hangafter사용되는 경우 달라지며 각 줄의 실제 너비를 반영합니다.

가 사용 되면 각 라인마다 \parshape다르게 지정되는 것과 같습니다 .\hsize

코드를 고려해보세요

\input plipsum

\hsize=300pt

\showboxbreadth=1000 \showboxdepth=0 

\lipsum{1}

\showlists

\hsize=200pt

\lipsum{2}

\showlists

\bye

첫 번째 \showlists명령 출력

### vertical mode entered at line 0
### current page:
\glue(\topskip) 3.05556
\hbox(6.94444+1.94444)x300.0, glue set - 0.62798 []
\penalty 150
\glue(\baselineskip) 3.11111
\hbox(6.94444+1.94444)x300.0, glue set 0.38911 []
\glue(\baselineskip) 3.11111
\hbox(6.94444+1.94444)x300.0, glue set - 0.17653 []
\glue(\baselineskip) 3.11111
\hbox(6.94444+1.94444)x300.0, glue set 0.24695 []
\glue(\baselineskip) 3.11111
\hbox(6.94444+1.94444)x300.0, glue set 0.36536 []
\penalty 150
\glue(\baselineskip) 3.11111
\hbox(6.94444+1.94444)x300.0, glue set 227.0554fil []
total height 70.0
 goal height 643.20255
prevdepth 1.94444, prevgraf 6 lines

따라서 너비가 300pt인 6개의 상자에 해당하는 6개의 줄로 구성된 단락이 표시됩니다.

두 번째 \showlists명령어 출력

### vertical mode entered at line 0
### current page:
\glue(\topskip) 3.05556
\hbox(6.94444+1.94444)x300.0, glue set - 0.62798 []
\penalty 150
\glue(\baselineskip) 3.11111
\hbox(6.94444+1.94444)x300.0, glue set 0.38911 []
\glue(\baselineskip) 3.11111
\hbox(6.94444+1.94444)x300.0, glue set - 0.17653 []
\glue(\baselineskip) 3.11111
\hbox(6.94444+1.94444)x300.0, glue set 0.24695 []
\glue(\baselineskip) 3.11111
\hbox(6.94444+1.94444)x300.0, glue set 0.36536 []
\penalty 150
\glue(\baselineskip) 3.11111
\hbox(6.94444+1.94444)x300.0, glue set 227.0554fil []
\glue(\parskip) 0.0 plus 1.0
\glue(\baselineskip) 3.11111
\hbox(6.94444+1.94444)x200.0, glue set 0.68265 []
\penalty 250
\glue(\baselineskip) 3.11111
\hbox(6.94444+1.94444)x200.0, glue set - 0.56822 []
\glue(\baselineskip) 3.11111
\hbox(6.94444+1.94444)x200.0, glue set 0.02776 []
\glue(\baselineskip) 3.11111
\hbox(6.94444+1.94444)x200.0, glue set 0.76903 []
\glue(\baselineskip) 3.11111
\hbox(6.94444+1.94444)x200.0, glue set 1.07141 []
\glue(\baselineskip) 3.11111
\hbox(6.94444+1.94444)x200.0, glue set 0.93843 []
\penalty 100
\glue(\baselineskip) 3.11111
\hbox(6.94444+0.0)x200.0, glue set 0.1729 []
\penalty 100
\glue(\baselineskip) 5.05556
\hbox(6.94444+1.94444)x200.0, glue set 0.93886 []
\penalty 250
\glue(\baselineskip) 5.75002
\hbox(4.30554+0.0)x200.0, glue set 179.41664fil []
total height 178.0 plus 1.0
 goal height 643.20255
prevdepth 0.0, prevgraf 9 lines

처음 6줄이 있습니다. \parskip두 번째 단락이 시작되는 위치를 확인하려면 를 찾으세요. 우리는 9개의 라인을 가지고 있으며, 모두 너비가 200pt입니다.

변경하는 것이 합법적인 곳은 어디입니까 \hsize?

어딘가에. \parshape사용되지 않는 한 , TeX는 문단을 줄로 나누기 위해 스캔되었을 \hsize때 현재 값을 사용합니다.\par

물론 이 설정은 \hsizeTeX 그룹화를 존중합니다(전역 설정을 수행할 만큼 교묘하지 않은 경우). 그러니 우리가 노력한다면

{\hsize=1pt \nopar\lipsum{1}}\par

will에 대한 변경 사항이 발견 \hsize되면 잊어버리기 때문에 우리는 이전과 정확히 동일하게 됩니다. 단락을 작성할 때 \par두 개의 고유한 값을 가질 수 없다는 점에 유의하십시오 ( 물론 barring ).\hsize\parshape

\hsize페이지 모양에 영향을 미치 나요 ?

TeX의 설계에 의한 것이 아닙니다. 그러나 출력 루틴은 머리글과 바닥글 설정을 위한 표준을 사용할 수 있으며 아마도 사용할 것입니다 \hsize. 예를 들어, \plainoutput그런가요 \makeheadline?

\line{\vbox to 8.5pt{}\the\headline}

그리고 \line입니다 \hbox to \hsize.

따라서 이것이 Knuth 경고의 주요 의미입니다. \hsize페이지 중간에 내용을 변경하면 출력 루틴이 실행되는 시점에 따라 예상치 못한 결과가 나타날 수 있습니다.

보조 수직 목록에서 작업할 때 페이지 빌더를 실행하면 출력 루틴이 호출되지 않으므로 \hsize내부를 변경하는 것은 항상 안전합니다.\vbox

관련 정보