
線を黒い四角形で塗りつぶすコマンドを作成しました。このコマンドは と呼ばれ\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 が述べているように、your は\fullrule
段落の始まりなので、インデントされます。
新しい定義が何を行うか見てみましょう:
\noindent
インデントなしで段落を開始します。すでに段落内にある場合は何も起こりません。\null
\fullrule
行の先頭に飲み込まれないようにする目に見えないボックスをドロップします。ボックスを繰り返す代わりに、
\leaders\hrule
TeX の機能を使用します。つまり、末尾に指定されたスペース (この場合は\hfill
) をルールで埋めます。\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 のソリューションを使用してください。