\点填充:

\点填充:

在模仿时\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 页关于\unskip2的内容)。这可以使用 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


脚注

  1. \protect这是“受保护”一词的一般意义,与或都无关\protected

  2. 无论模式如何,这些命令的操作方式基本相同,只是它们处理不同类型的列表(水平列表、垂直列表、数学列表):

    \unpenalty如果当前列表的最后一项分别是惩罚类型、紧排类型或粘合类型(可能包括引线),则该项目将从列表中删除\unkern\unskip

相关内容