
23장 "출력 루틴"에는 다음과 같은 경고가 있습니다.
작업 시작 시나 TeX 메모리에서 모든 페이지를 꺼낸 후를 제외하고는 \hsize 및 \vsize를 사용하지 않는 것이 가장 좋습니다.
하지만TeXbook\hsize
자체적으로 변경된 몇 가지 예가 있습니다 .
1) story.tex를 사용한 연습에서는 \hsize가 하나의 tex 작업에서 여러 번 설정됩니다.
\hsize=4in \input story
\hsize=3in \input story
...
내 생각에 이 사건은 "합법적"인 것 같습니다. 왜냐하면 \eject
story.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
물론 이 설정은 \hsize
TeX 그룹화를 존중합니다(전역 설정을 수행할 만큼 교묘하지 않은 경우). 그러니 우리가 노력한다면
{\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