在模仿时\dotfill
,我遇到了\kern\z@
。为什么我要将(或我的版本)末尾的零点去掉\dotfill
?为什么这是明智的?这样做有什么实际原因?
\点填充:
代码
\documentclass{article}
\usepackage{fontspec} % xelatex
\makeatletter
\def\plusfill{\leavevmode\cleaders\hbox to 1em{\hss+\hss}\hfill\kern\z@}
\def\title#1{\noindent\plusfill#1\plusfill}
\makeatother
\begin{document}
\title{Test}
\meaning\dotfill
\end{document}
通用的\charfill
把这个放在问题中留作纪念。这是一个通用的字符填充命令。它具有使用任何字符的能力。可以通过检测底部字符来改进,如下所示:. _
。自动(动态)将垂直居中应用于底部字符(根据大写字母 A 的中间)
\def\charfill#1{\leavevmode\leaders\hbox to 1em{\hss\raisebox{\dimexpr-\height+\fontcharht\font`A}{#1}\hss}\hfill\kern\z@}
有关的
答案1
TeX/LaTeX 中有些地方的水平粘连会被删除,例如:
- 在段落末尾,结尾空格被删除
\unskip
。 - 表格单元格被
\ignorespaces
和包围,\unskip
以删除前导空格和尾随空格。
但是,\unskip
并不特定于空格,它会删除空格所含的粘性。
\hfill
是另一种粘性,它也会被删除。\kern
末尾的附加部分会阻止在和\unskip
之前看到粘性。\kern
\dotfill
答案2
如果你调用texdoc source2e
(查看 LaTeX 内核的源代码列表),并搜索\dotfill
,它说:
LaTeX 更改:
\kern\z@
添加到和的末尾\hrulefill
,\dotfill
使它们在“表格”和“数组”环境中工作。(更改于 1987 年 7 月 24 日进行)。
答案3
我厚颜无耻地借用了这个答案的开头Heiko Oberdiek 的回答,修复一些细节,根据我的口味调整措辞,并补充代码示例(如果我在编辑 Heiko 的答案时添加太多内容,我的编辑可能会被拒绝)。如果 Heiko 想将我的答案合并到他的答案中,我没问题,我会删除这个。
TeX 中有些地方会自动删除水平粘连(通常由输入中的空格引起)。例如:
- 在段落末尾,总会有一个隐式
\unskip
命令,如果该项目是粘合类型,则从当前水平列表中删除该项目。 - 表格单元格隐式地被
\ignorespaces
和\unskip
命令包围,以取消前导和尾随空格的效果。
请注意\unskip
并不特定于空格:它可以删除任何类型的胶水,无论它是由空格还是更复杂的命令提供的。\hfill
是另一种胶水,引线也是如此;因此,两者都可以通过 删除。 定义末尾的\unskip
附加项可防止潜在用户看到 之前的最后一个胶水项,因此点不会被删除。\kern
\dotfill
\unskip
\kern
\unskip
注意:在这种情况下,通过这种方式从1中“保护”的粘合项不是\hfill
,而是产生领导者的粘合项:准确地说,是为当前水平列表做出贡献的粘合项\cleaders \hb@xt@ .44em{\hss.\hss}\hfill
(参见 TeXbook 第 280 页关于\unskip
2的内容)。这可以使用 TeX 的自省功能进行验证。以下文档:
\documentclass{article}
\makeatletter
\newcommand*{\myTest}{%
\leavevmode \cleaders \hb@xt@ .44em{\hss.\hss}\hfill \kern\z@\unskip
\showboxbreadth=10\showboxdepth=2\showlists
}
\makeatother
\begin{document}
\myTest
\end{document}
在日志文件中显示此内容(其中包括):
### horizontal mode entered at line 11
\hbox(0.0+0.0)x15.0
\cleaders 0.0 plus 1.0fill
.\hbox(1.05554+0.0)x4.40002, glue set 0.81113fil
..\glue 0.0 plus 1.0fil minus 1.0fil
..\OT1/cmr/m/n/10 .
..\glue 0.0 plus 1.0fil minus 1.0fil
\kern 0.0
spacefactor 1000
### vertical mode entered at line 0
而没有的相同示例\kern\z@
给出了这样的结果:
### horizontal mode entered at line 11
\hbox(0.0+0.0)x15.0
spacefactor 1000
### vertical mode entered at line 0
(如果我们使用它,就会抑制\hbox(0.0+0.0)x15.0
缩进框)。\noindent
脚注
\protect
这是“受保护”一词的一般意义,与或都无关\protected
。无论模式如何,这些命令的操作方式基本相同,只是它们处理不同类型的列表(水平列表、垂直列表、数学列表):
\unpenalty
如果当前列表的最后一项分别是惩罚类型、紧排类型或粘合类型(可能包括引线),则该项目将从列表中删除\unkern
。\unskip