行詰めルールに関する異常と疑問

行詰めルールに関する異常と疑問

線を黒い四角形で塗りつぶすコマンドを作成しました。このコマンドは と呼ばれ\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. \fullrule10pt ではなく実際のフォント サイズを使用するようにコマンドを書き直し (% 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 が述べているように、your は\fullrule段落の始まりなので、インデントされます。

新しい定義が何を行うか見てみましょう:

  1. \noindentインデントなしで段落を開始します。すでに段落内にある場合は何も起こりません。

  2. \null\fullrule行の先頭に飲み込まれないようにする目に見えないボックスをドロップします。

  3. ボックスを繰り返す代わりに、\leaders\hruleTeX の機能を使用します。つまり、末尾に指定されたスペース (この場合は\hfill) をルールで埋めます。

  4. \null段落の末尾のリーダーが無視されることを回避します (TeX は\unskip段落の末尾をスキャンするときに常に無視します)。

ポイント 2 と 4 については、空白スペースの代わりに何かでスペースを埋める点を除けば、リーダーは接着剤と同じように扱われることを知っておくことが重要です。

仕様\hruleでは、TeX に対して、罫線の高さと深さは支柱と同じになるように指示しています (小さな修正は自分で調整できます)。したがって、罫線の高さと深さは、現在のベースライン スキップに依存します。

答え2

\leaders垂直モードでは、垂直接着が想定されます。したがって\leaders、 は\hfill垂直モードでは使用できません。新しい段落の開始時に垂直モードになります。したがって、最初に垂直モードを終了する必要があります。 これは、 だけでなく、\leavemodeまたは(LaTeX カーネルで空の水平ボックスとして定義されています: )\hspace*などの別の非表示要素を使用して実行できます。\null\hbox{}

\hfill行末の では何も埋められません。これは、TeX が段落末尾の最後の水平スペースを削除するためです。これを回避するには、再び非表示のマテリアルを使用するか、水平スペースをもう 1 つ (\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 のソリューションを使用してください。

関連情報