
Я создал команду для заполнения строки черным прямоугольником. Она называется \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}
Как и в случае с Lockstep, вы \fullrule
начинаете абзац, поэтому у него есть отступ.
Давайте посмотрим, что дает новое определение:
\noindent
начинает абзац без отступа; если мы уже находимся внутри абзаца, то ничего не происходит.\null
сбрасывает невидимый ящик, который\fullrule
не даст проглотить себя в начале строки.Вместо того чтобы повторять блок, мы используем
\leaders\hrule
функцию TeX: заполняем по правилу указанное в конце пространство (в данном случае\hfill
).\null
позволит избежать игнорирования заголовков в конце абзаца (TeX всегда это делает\unskip
при сканировании конца абзаца).
Для пунктов 2 и 4 важно знать, что лидеры рассматриваются так же, как клей, за исключением того, что они заполняют пространство чем-то вместо пустого пространства.
Спецификация \hrule
сообщает TeX, что линия должна быть такой же высокой и глубокой, как распорка (с небольшой поправкой, которую вы можете настроить самостоятельно); таким образом, высота и глубина линии будут зависеть от текущего значения baselineskip.
решение2
\leaders
в вертикальном режиме ожидайте вертикального склеивания. Поэтому \leaders
with \hfill
нельзя использовать в вертикальном режиме. В начале нового абзаца вы находитесь в вертикальном режиме. Поэтому вам сначала нужно выйти из вертикального режима. Вы можете сделать это не только с \leavemode
but \hspace*
или другим невидимым элементом, например \null
(определенным в ядре LaTeX как пустой горизонтальный ящик: \hbox{}
).
\hfill
в конце строки ничего не заполняет, потому что TeX удаляет последний горизонтальный пробел в конце абзацев. Вы можете избежать этого, используя либо невидимый материал снова, либо еще один горизонтальный пробел (даже \hspace
без звездочки) или \kern0pt
(это то, что было сделано в ядре LaTeX в подобных случаях), например \dotfill
или \hrulefill
.
Для определения высоты и глубины линии можно использовать \ht\strutbox
и \dp\strutbox
.
Вот предложение с адаптированной версией \hrulefill
из ядра LaTeX (добавлены только высота и глубина линейки):
\newcommand{\fullrule}{%
\leavevmode
\leaders\hrule height\ht\strutbox depth\dp\strutbox\hfill\kern0pt}%
Эта версия не удаляет отступ абзаца. Если вы хотите удалить отступ абзаца, используйте решение egreg.