假设我们有以下代码:
\def\tp#1#2{#1\hskip 300cm minus 300cm\hbox{#2}}
\tp{Hello}{World it is}
和
\def\tp#1#2{#1\hskip 300cm \hbox{#2}}
\tp{Hello}{World it is}
第一个给我们而在第二个中,盒子World it is
已经脱离了板子。我的问题是:
为什么在上述两种情况下 TeX 都不会将段落拆分为两行而不是一行?例如,在第一种情况下,我自然而然地认为 TeX 会将部分拆分 World it is
为第二行,因为粘合的正常宽度比页面宽度大得多。我知道在第一种情况下粘合具有缩小功能,这给这个问题增加了麻烦;所以在第二种情况下,我删除了此功能,令我惊讶的是,文本的第二部分从板上掉了下来,而不是从新行开始。为什么?
编辑 值得注意的是:
\def\tp#1#2{#1\hskip 400cm minus 400cm\penalty 1\hbox{#2}}
\tp{Hi}{World it is}
\def\tp#1#2{#1\hskip 400cm minus 400cm\penalty 10\hbox{#2}}
\tp{Hi}{World it is}
第一组将第二部分移至新行,而第二组将所有内容放在一行中。
答案1
例如,在第一种情况下,我自然而然地认为 TeX 会破坏 World it is 部分到第二行,因为粘合的正常宽度比页面宽度大得多。
由于胶水没有拉伸或收缩成分,300厘米不是“正常宽度”,而是它的固定宽度。
唯一的突破点
#1\hskip 300cm \hbox{#2}
在跳过之前(因为#1
是牢不可破的Hello
,而且无论如何段落的第一个单词不会中断)。
如果它在这里中断,那么下一行开头的粘合将被丢弃,因此第一行将只有一个缩进框,Hello
并且\rightskip
粘合(为 0pt)会严重不足,所以这不是一个可行的断点。
在没有断点的版本中minus 300cm
需要采取一切措施,因为它可以缩小到一行。
答案2
水平跳过会坚持到下一个内容,因为 TeX 无法在此处换行。跳过后没有空格,因为此处的任何空格都会被处理所消耗。
如果您取出#2
,\hbox
您会看到只有第一个单词消失了,其余的单词进入下一行,因为现在您有一个允许换行的空间。
同样,如果您更改300cm
为0cm
,您会看到 是HelloWorld ...
排版的,而不是Hello World ...
。
\def\tp#1#2{#1\hskip 300cm minus 300cm\hbox{#2}}
\tp{Hello}{World it is}
\def\tp#1#2{#1\hskip 300cm \hbox{#2}}
\tp{Hello}{World it is}
\def\tp#1#2{#1\hskip 300cm #2}
\tp{Hello}{World it is}
\def\tp#1#2{#1\hskip 0cm \hbox{#2}}
\tp{Hello}{World it is}
\bye
编辑
如果你添加类似的内容\showlists
并稍微调整文本
\def\tp#1#2{#1\hskip 300cm minus 300cm\hbox{#2}}
\showlists
\tp{Hi}{World it is}
\def\tp#1#2{#1\hskip 300cm \hbox{#2}}
\showlists
\tp{He}{World it is}
\def\tp#1#2{#1\hskip 0cm \hbox{#2}}
\showlists
\tp{Ho}{World it is}
\showlists
\bye
\showlists
[如果您不想停止编译,我不确定您是否需要继续说。]
你可以更好地了解发生了什么:
### vertical mode entered at line 0
prevdepth ignored
! OK.
l.8 \showlists
?
### vertical mode entered at line 0
### current page:
\glue(\topskip) 3.05556
\hbox(6.94444+0.0)x469.75499, glue set - 0.954
.\hbox(0.0+0.0)x20.0
.\tenrm H
.\tenrm i
.\glue 8535.82677 minus 8535.82677
.\hbox(6.94444+0.0)x46.75008
..\tenrm W
..\kern-0.83334
..\tenrm o
..\tenrm r
..\tenrm l
..etc.
.etc.
total height 10.0
goal height 643.20255
prevdepth 0.0, prevgraf 1 line
! OK.
l.12 \showlists
?
Overfull \hbox (8144.76631pt too wide) in paragraph at lines 13--14
[]\tenrm He [] |
\hbox(6.94444+0.0)x469.75499
.\hbox(0.0+0.0)x20.0
.\tenrm H
.\tenrm e
.\glue 8535.82677
.\hbox(6.94444+0.0)x46.75008
..\tenrm W
..\kern-0.83334
..\tenrm o
..\tenrm r
..\tenrm l
..etc.
.etc.
### vertical mode entered at line 0
### current page:
\glue(\topskip) 3.05556
\hbox(6.94444+0.0)x469.75499, glue set - 0.954
.\hbox(0.0+0.0)x20.0
.\tenrm H
.\tenrm i
.\glue 8535.82677 minus 8535.82677
.\hbox(6.94444+0.0)x46.75008
..\tenrm W
..\kern-0.83334
..\tenrm o
..\tenrm r
..\tenrm l
..etc.
.etc.
\glue(\parskip) 0.0 plus 1.0
\glue(\baselineskip) 5.05556
\hbox(6.94444+0.0)x469.75499
.\hbox(0.0+0.0)x20.0
.\tenrm H
.\tenrm e
.\glue 8535.82677
.\hbox(6.94444+0.0)x46.75008
..\tenrm W
..\kern-0.83334
..\tenrm o
..\tenrm r
..\tenrm l
..etc.
.etc.
total height 22.0 plus 1.0
goal height 643.20255
prevdepth 0.0, prevgraf 1 line
! OK.
l.16 \showlists
对于最后一种情况(我通过删除其他情况将其隔离出来),我得到
### horizontal mode entered at line 8
\hbox(0.0+0.0)x20.0
\tenrm H
\tenrm o
\glue 0.0
\hbox(6.94444+0.0)x46.75008
.\tenrm W
.\kern-0.83334
.\tenrm o
.\tenrm r
.\tenrm l
.etc.
etc.
spacefactor 1000
### vertical mode entered at line 0
prevdepth ignored
我认为它不被视为HoWorld
一个单一的世界。它\hskip
吞噬了任何后续的粘连,包括单词之间的空格。毕竟,单词之间的空格只是粘连。但我对此并不确定。