
我創建了一個用黑色矩形填滿線條的命令。它的名字叫\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
不能在垂直模式下使用。在新段落的開頭,您處於垂直模式。所以你必須先離開垂直模式。您不僅可以使用其他不可見元素(在 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的解決方案。