异常情况以及有关填行规则的问题

异常情况以及有关填行规则的问题

我创建了一个用黑色矩形填充线条的命令。它叫做\fullrule,您可以在下面的代码中找到它。

关于这个 MWE 我有几个问题:

\documentclass[10pt]{article}
\usepackage[a4paper]{geometry}

\newlength{\mylift}
\setlength{\mylift}{-10pt} % MARK2
\addtolength{\mylift}{-1ex}
\addtolength{\mylift}{\baselineskip}

\newcommand{\fullrule}{%
    {\hspace*{0pt}\leaders\hbox{\rule[\mylift]{1pt}{10pt}}\hfill}% % MARK 1
    \hspace*{0pt}}

\begin{document}
aaa

\fullrule

aaa\fullrule{}\\
\fullrule{}\\
\fullrule{}

\fullrule

aaa\fullrule{}aaa

\fullrule{}\\
\fullrule{}aaa\\
\fullrule
\end{document}

它产生的结果是:

完整规则

  1. 为什么我的文档的第一行缩进?(好吧,这是最小的问题。)
  2. 我必须在“整个部分”\hspace*{0pt}之前和之后添加,才能使其与之前没有前导字符的行一起工作。 为什么? (我想了解这一点,因为花了很长时间才弄清楚。)\leaders\leaders\fullrule
  3. 有没有办法重写\fullrule命令以使用实际字体大小而不是 10pt(参见% MARK 1上面的代码),并使用实际字体大小计算规则的提升(参见% MARK 2上面的代码)。

谢谢!

答案1

\newcommand{\fullrule}{%
  \noindent\null\leaders\hrule height \dimexpr\ht\strutbox-\fboxrule\relax
                          depth  \dimexpr\dp\strutbox-\fboxrule\relax\hfill
  \null}

正如步调一致的评论,您\fullrule开始了一个段落,因此它会缩进。

让我们看看新定义的作用:

  1. \noindent开始一个段落而不缩进;如果我们已经在一个段落内,它什么也不做。

  2. \null删除一个不可见的框,这将导致\fullrule在行首不会被吞噬。

  3. 我们不重复一个框,而是使用\leaders\hruleTeX 的特性:用规则填充末尾指定的空间(在本例中\hfill)。

  4. \null将避免忽略段落末尾的引线(TeX\unskip在扫描段落末尾时总是这样做)。

对于第 2 点和第 4 点,重要的是要知道领导者与胶水的处理方式相同,除了用某些东西而不是空白空间填充空间之外。

规范\hrule告诉 TeX,规则应该像支柱一样高和深(带有小幅修正,您可以自行调整);因此规则的高度和深度将取决于当前的基线跳跃。

答案2

\leaders在垂直模式下需要垂直粘连。因此,在垂直模式下不能使用\leaderswith \hfill。在新段落的开头,您处于垂直模式。因此,您必须先退出垂直模式。您不仅可以使用,\leavemode还可以使用\hspace*另一个不可见元素\null(在 LaTeX 内核中定义为空水平框:)\hbox{}

\hfill在行尾不会填充任何内容,因为 TeX 会删除段落末尾的最后一个水平空格。您可以再次使用不可见材料或一个水平空格(即使\hspace没有星号)或\kern0pt(在类似情况下,LaTeX 内核就是这么做的)来避免这种情况,例如\dotfill\hrulefill

要检测线的高度和深度,您可以使用\ht\strutbox\dp\strutbox

这里有一个来自 LaTeX 内核的改编版本的建议\hrulefill(仅添加了规则的高度和深度):

\newcommand{\fullrule}{%
  \leavevmode
  \leaders\hrule height\ht\strutbox depth\dp\strutbox\hfill\kern0pt}%

此版本不会删除段落缩进。如果要删除段落缩进,请使用 egreg 的解决方案。

相关内容