para
(以下摘录)中的设置使用threeparttable
了 David Carlisle 所说的“一组有趣的惩罚和胶水”我必须遗憾地承认,我对此一无所知。有人能像我一样解释一下这里发生了什么吗?一个小孩,或者一只金毛猎犬? :-)
摘录自threeparttable.sty:
\def\TPT@doparanotes{\par
\prevdepth\z@ \TPT@hsize
\TPTnoteSettings
\parindent\z@ \pretolerance 8
\linepenalty 200
\renewcommand\item[1][]{\relax\ifhmode \begingroup
\unskip
\advance\hsize 10em % \hsize is scratch register, based on real hsize
\penalty -45 \hskip\z@\@plus\hsize \penalty-19
\hskip .15\hsize \penalty 9999 \hskip-.15\hsize
\hskip .01\hsize\@plus-\hsize\@minus.01\hsize
\hskip 1em\@plus .3em
\endgroup\fi
\tnote{##1}\,\ignorespaces}%
\let\TPToverlap\relax
\def\endtablenotes{\par}%
}
答案1
从中间开始。
\hskip .15\hsize \penalty 9999 \hskip-.15\hsize
成语 hskip某物,一些惩罚, 跳过减去一些东西相当常见,其历史可以追溯到 TeXBook 中描述的 LaTeX 之前。
这里添加的总空间为零,因此如果没有发生换行,那么它就如同不存在一样。但是,如果在惩罚处发生换行(在此 9999 示例中允许但强烈反对),则在第一行末尾会跳过 .15\hsize(由于这不会拉伸,因此会强制缩短行),然后在惩罚处换行,然后第二个负跳过将被丢弃,因为换行后的所有粘连都会被丢弃。
因此,如果项目之前已经有段落分隔符,则大部分内容将被跳过,但如果没有,并且我们处于水平模式,则
\unskip
删除空格前面的任何粘连\item
(我们要添加这种粘连组合,而不是普通的单词空格)
\penalty -45
负惩罚表示如果可以在前一项之后直接断点,那么这是一个很好的断点。
\hskip 0pt plus \hsize
在 0pt 和全宽之间添加粘连(如果先前的中断已被占用,则会被丢弃)
\penalty-19
仍然是一个不错的突破点,但不如 -45 选项好。
\hskip .15\hsize \penalty 9999 \hskip-.15\hsize
正如所讨论的,这是一个不鼓励但允许的最后选择中断,这将迫使前一行变短
\hskip .01\hsize plus-\hsize minus.01\hsize
如果之前的断裂没有被消除,则添加具有弹性的胶水,-\hsize
以抵消\hsize
之前添加的弹性,同时也允许一点收缩。
\hskip 1em plus .3em
如果没有换行符(否则将被丢弃),则在实际项目前添加 1em 的空格(如果需要,可延伸至 1.3em)作为最小空格
\tnote{##1}\,\ignorespaces
现在,无论这是一个新段落还是刚添加的水平粘贴后面的同一段,都从中添加文本,然后添加\item[]
一个细空格,然后忽略源文件中的空格,然后从后面的实际文本开始\item
。