Аномалии и вопрос по правилу заполнения строк

Аномалии и вопрос по правилу заполнения строк

Я создал команду для заполнения строки черным прямоугольником. Она называется \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}

Как и в случае с Lockstep, вы \fullruleначинаете абзац, поэтому у него есть отступ.

Давайте посмотрим, что дает новое определение:

  1. \noindentначинает абзац без отступа; если мы уже находимся внутри абзаца, то ничего не происходит.

  2. \nullсбрасывает невидимый ящик, который \fullruleне даст проглотить себя в начале строки.

  3. Вместо того чтобы повторять блок, мы используем \leaders\hruleфункцию TeX: заполняем по правилу указанное в конце пространство (в данном случае \hfill).

  4. \nullпозволит избежать игнорирования заголовков в конце абзаца (TeX всегда это делает \unskipпри сканировании конца абзаца).

Для пунктов 2 и 4 важно знать, что лидеры рассматриваются так же, как клей, за исключением того, что они заполняют пространство чем-то вместо пустого пространства.

Спецификация \hruleсообщает TeX, что линия должна быть такой же высокой и глубокой, как распорка (с небольшой поправкой, которую вы можете настроить самостоятельно); таким образом, высота и глубина линии будут зависеть от текущего значения baselineskip.

решение2

\leadersв вертикальном режиме ожидайте вертикального склеивания. Поэтому \leaderswith \hfillнельзя использовать в вертикальном режиме. В начале нового абзаца вы находитесь в вертикальном режиме. Поэтому вам сначала нужно выйти из вертикального режима. Вы можете сделать это не только с \leavemodebut \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.

Связанный контент