關於行填充規則的異常和問題

關於行填充規則的異常和問題

我創建了一個用黑色矩形填滿線條的命令。它的名字叫\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不能在垂直模式下使用。在新段落的開頭,您處於垂直模式。所以你必須先離開垂直模式。您不僅可以使用其他不可見元素(在 LaTeX 核心中定義為空水平框:)\leavemode來執行此操作。\hspace*\null\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的解決方案。

相關內容