编辑

编辑

假设我们有以下代码:

\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您会看到只有第一个单词消失了,其余的单词进入下一行,因为现在您有一个允许换行的空间。

同样,如果您更改300cm0cm,您会看到 是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吞噬了任何后续的粘连,包括单词之间的空格。毕竟,单词之间的空格只是粘连。但我对此并不确定。

相关内容