对于段落首行开始和结尾的一些疑问?

发布于 2021-08-26 16:55:16

对于问题的描述直接卸载的代码块里面

\documentclass[fontset=ubuntu]{book}
\begin{document}
    \hfill middle \hfill tail \hfill\par % 第一行的代码比第二行的代码末尾缩进一部分   1
    \hfill middle \hfill tail \par                                                   %   2
    \hfill middle \hfill tail \hfill \mbox{}\par                                     %   3
    \mbox{} \hfill middle \hfill \mbox{}\par % 两边加上mbox居中                          4
    \hfill middle \hfill  \par % 第四行代码和第五行代码显示结果一样                        5
    \mbox{} \hfill middle \hfill \par                                                %      6                        
    \hfill middle \hfill \mbox{} \par % 右边加上mbox居中                                    7
    \noindent{} \hfill middle \hfill \mbox{}\\ % 去掉首行缩进还是居中                        8
    \hfill middle \hfill tail \\  % 当不是段落首行的时候左边的hfill没有用了                9
    middle
    
    
    
    % 有效行数在右边
    %  第一行和第二行 末尾缩进有点不同 hfill起到的作用不是那么的大 第三行右边加上一个零宽度盒子,就有了填充的效果
    % 第8行 去掉段落首行缩进还是居中,和第7行类似
    % 当不是段落首行的时候hfill作用没了 对比第1行和第9行
    % 所以我想问问每个段落首行开始是有个什么东西(是一个零宽度盒子吗) 还有末尾 为啥让hfill没有正常的作用,只是缩进了一点
    
\end{document}

查看更多

关注者
0
被浏览
1.4k
Saino
Saino 2021-08-27
这家伙很懒,什么也没写!

lua-visual-debug查看盒子的输出如下
image.png

第一行:
宽度为\parindent的空盒子+\hfill粘连+middle<空格>+\hfill+tail<空格>+\parfillskip
第二行:
宽度为\parindent的空盒子+\hfill+middle<空格>+\hfill+tail+\parfillskip
第三行:
宽度为\parindent的空盒子+\hfill+middle<空格>+\hfill+tail<空格>+\hfill+空盒子+\parfillskip
第四行:
宽度为\parindent的空盒子+空盒子+空格+\hfill粘连+middle<空格>+\hfill+空盒子+\parfillskip
第五行:
宽度为\parindent的空盒子+\hfill+middle<空格>+\parfillskip
第六行
宽度为\parindent的空盒子+空盒子+空格+\hfill粘连+middle<空格>+\parfillskip
第七行:
宽度为\parindent的空盒子+\hfill+middle<空格>+\hfill+空格+空盒子+\parfillskip
第八行:
空格+\hfill+middle<空格>+\hfill+空盒子+\hfil
第九行:
middle<空格>+\hfill+tail+\hfil
第十行:
middle+\parfillskip

补充一些细节

  1. 控制序列的单词后的空格直接就不会读入,所以\hfil {}123严格等于\hfil{}123
  2. 段首会插入宽度为\parindent的空盒子,如果有\noindent,则什么也不插入(而不是零宽的空盒子);
  3. LaTeX默认\parfillskip的粘连相当于\hfil,它在有更高级的\hfill存在时会被覆盖;
  4. 因为\par前用户难免会输入空格,如something<Return>\par或者paragraph<Return><Return>paragrah,段落末行的最后一个粘连会被吃掉,所以\hfill\par\hfill无效,要想起作用,可以再加一个粘连如\hfill\ \hfill\hfill,或者空盒子;
  5. \\的意义相当于\unskip\nobreak\hfil\break\unskip会去掉当前列的最后一个粘连,所以第九行末尾没有空格;
  6. TeX引擎并未区分强制断行自动断行,对引擎而言,它做的就是“一行写满了换一行”的自动断行,TeX会在可以断行的地方用一些内部参数来衡量断行的代价,\nobreak\break是一些调整此参数的命令。所以TeX无法区分\\后的粘连是在正常文档流之中还是紧随一个强制断行,干脆就吃掉断行后的所有间距。
1 个回答

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友

手机
浏览

扫码手机浏览