我创建了一个用黑色矩形填充线条的命令。它叫做\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}
它产生的结果是:
- 为什么我的文档的第一行缩进?(好吧,这是最小的问题。)
- 我必须在“整个部分”
\hspace*{0pt}
之前和之后添加,才能使其与之前没有前导字符的行一起工作。 为什么? (我想了解这一点,因为花了很长时间才弄清楚。)\leaders
\leaders
\fullrule
- 有没有办法重写
\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
开始了一个段落,因此它会缩进。
让我们看看新定义的作用:
\noindent
开始一个段落而不缩进;如果我们已经在一个段落内,它什么也不做。\null
删除一个不可见的框,这将导致\fullrule
在行首不会被吞噬。我们不重复一个框,而是使用
\leaders\hrule
TeX 的特性:用规则填充末尾指定的空间(在本例中\hfill
)。\null
将避免忽略段落末尾的引线(TeX\unskip
在扫描段落末尾时总是这样做)。
对于第 2 点和第 4 点,重要的是要知道领导者与胶水的处理方式相同,除了用某些东西而不是空白空间填充空间之外。
规范\hrule
告诉 TeX,规则应该像支柱一样高和深(带有小幅修正,您可以自行调整);因此规则的高度和深度将取决于当前的基线跳跃。
答案2
\leaders
在垂直模式下需要垂直粘连。因此,在垂直模式下不能使用\leaders
with \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 的解决方案。