
行間隔を維持したまま、テキスト内に 2 つのミニページを統合したいと思います。\begin{minipage}[t]
オプションを使用すると、ミニページの上のスペースは正しくなります (緑の円)。 しかし残念ながら、下のスペースは短すぎます (赤い円)。 これを「通常のベースラインスキップ」に調整するにはどうすればよいでしょうか。
MWE:
\documentclass[a4paper,DIV=15,oneside,12pt]{scrartcl}
\usepackage[english]{babel}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{blindtext}
\usepackage{setspace}
\usepackage{enumitem}
\parskip 0pt
\parindent 0pt
\begin{document}
\pagestyle{empty}
\onehalfspacing
\blindtext\par
\begin{minipage}[t]{0.6\textwidth}
\blindtext
\end{minipage}\hfill
%Minipage 2
\begin{minipage}[t]{0.37\textwidth}
%\centering\rule{3cm}{2cm}
\begin{enumerate}[leftmargin=*,label=\alph{*}),itemsep=0pt,partopsep=0pt,topsep=0pt, parsep=0pt]
\item Test 1
\item Test 2
\end{enumerate}
\end{minipage}\par
\blindtext
\end{document}
答え1
問題の説明は非常に複雑です。よろしければ、下の解決策までスキップしてください。
説明
TeX が段落をタイプセットする際の動作は、おおよそ次のようになります。まず、段落を行に分割します (多数のパラメータを持つ複雑なアルゴリズムを使用)。これらの行は水平ボックス (または\hbox
) に配置され、ボックスはメインの垂直リストに配置されます。メインの垂直リストには、ページの作成元となるすべての資料が保持されます。
TeX は、垂直リスト上の連続する水平ボックスが、各ボックスのベースラインが\baselineskip
離れるように間隔を空けようとします。TeX を使用して、これを実際に確認することができます。
ここにプレーンなTeXがあります(tex
またはでコンパイルしてくださいpdftex
)
\showboxdepth=1
\showboxbreadth=10000
\tracingonline=1
\setbox0=\vbox{
First line\hfil\break
Second line
}
\showbox0
\end
\vbox
コンパイルすると、段落が 2 行に分割された内部のコンテンツが出力されます。\boxshow...
パラメータは、TeX がボックスのコンテンツをどのように印刷するかを制御します。出力は次のとおりです。
> \box0=
\vbox(18.94444+0.0)x469.75499
.\hbox(6.94444+0.0)x469.75499, glue set 409.81047fil []
.\penalty 300
.\glue(\baselineskip) 5.05556
.\hbox(6.94444+0.0)x469.75499, glue set 420.31046fil []
最初は少し読みづらいかもしれませんが、これは が高さ 18.94444pt、奥行き 0pt、幅 469.75499pt で\box0
あることを示しています。つまり、 です。その中に、段落の 2 行に対応する 2 つの es があります。その間に、に対応する があります。上のボックスの奥行きとグルーと下のボックスの高さを足した合計は 12pt であり、 であることに注意してください。\vbox
(height+depth)xwidth
\hbox
\glue
\baselineskip
\baselineskip
また、TeX は、重なり合うのを防ぐために、連続するボックスが近づきすぎないようにしています。これを防ぐために、TeX はボックスが近づきすぎた場合にボックス間にスペースを挿入します。正確なアルゴリズムはここでは重要ではありませんが、重要なのは、 を使用してこの動作を無効にできることです\nointerlineskip
。
では、2つのテキストボックスが接近しすぎるのはなぜかと疑問に思うかもしれません。これは、奥行きのあるボックスの場合に起こります。メートル高さのある箱の上にんそのようなメートル+ん> \baselineskip
.
それで、これらすべてはあなたの質問とどう関係があるのでしょうか? TeX には、、、の 3 種類の垂直ボックスがあります。少し\vbox
奇妙なので無視しましょう。\vtop
そして\vcenter
\vcenter
\vbox
\vtop
それらは配置する場所が異なります。基準点—それは、それらのベースラインに対応するポイントです。 A は、\vbox
その参照ポイントをリストの最後のボックスの参照ポイント (つまり、通常はボックス内の段落の最後の行のベースライン) に設定します。対照的に、 a は、\vtop
その参照ポイントをリストの最初のボックスの参照ポイント (つまり、段落の一番上の行のベースライン) に設定します。
これを実際に見てみましょう。
\noindent
\vbox{
\hsize=1in
Top line\hfill\break
Bottom line
}
\vtop{
\hsize=1in
Top line\hfill\break
Bottom line
}
\end
左側のボックスの下の線が右側のボックスの上端の線と揃っていることがわかります。
以前と同じように、これら 2 つのボックスの外観を印刷できます。
左のボックス:
\vbox(18.94444+0.0)x72.26999
.\hbox(6.94444+1.94444)x72.26999, glue set 16.4366fill []
.\penalty 300
.\glue(\baselineskip) 3.11111
.\hbox(6.94444+0.0)x72.26999, glue set 20.18652fil []
右のボックス:
\vbox(6.94444+12.0)x72.26999
.\hbox(6.94444+1.94444)x72.26999, glue set 16.4366fill []
.\penalty 300
.\glue(\baselineskip) 3.11111
.\hbox(6.94444+0.0)x72.26999, glue set 20.18652fil []
主な違いは、これら 2 つのボックス (各リストの一番上の行) の高さと深さにあります。
これは難しい問題につながります。 を使用し\vtop
、ページの次の行が段落からの通常の行である場合はどうなるでしょうか? 見てみましょう。
\parindent=0pt
\leavevmode
\vtop{
\hsize=1in
Top line\hfill\break
g Bottom line
}
Next line
\end
インデントを抑制し、2 行目を a で開始しましたg
。これはベースラインより下になるためです。構築されるボックスを見てみましょう。(すべてを a で囲み\vbox
、\showbox
出力を確認しました。そのため、下に余分な外側の vbox があります。\showboxdepth
次の内側のボックスを確認するために 1 増やしました。)
\vbox(28.83333+0.0)x469.75499
.\vbox(6.94444+13.94444)x72.26999
..\hbox(6.94444+1.94444)x72.26999, glue set 36.4366fill []
..\penalty 300
..\glue(\baselineskip) 3.11111
..\hbox(6.94444+1.94444)x72.26999, glue set 11.85318fil []
.\glue(\parskip) 0.0 plus 1.0
.\glue(\lineskip) 1.0
.\hbox(6.94444+0.0)x469.75499, glue set 429.75491fil
..\hbox(0.0+0.0)x0.0
..\tenrm N
..\tenrm e
..\tenrm x
..\tenrm t
..\glue 3.33333 plus 1.66666 minus 1.11111
..\tenrm l
..\tenrm i
..\tenrm n
..\tenrm e
..\penalty 10000
..\glue(\parfillskip) 0.0 plus 1.0fil
..\glue(\rightskip) 0.0
ここで注目すべき点がいくつかあります:
- 2番目は
\vbox
私たちのに対応します\vtop
。 \parskip
段落間にAが挿入されました。- と、を含む次の
\baselineskip
の間には が挿入されませんでした。代わりに が存在します。 は、 の深さと次の の高さが より大きいという事実に由来しています。TeXがそれらのベースラインを離そうとした場合、それらは重なり合うことになります。\vtop
\hbox
Next line
\lineskip
\lineskip
\vtop
\hbox
\baselineskip
\baselineskip
おそらく、これで自分のコードで問題がわかるでしょう。 をオプションminipage
とともに使用する[t]
と が生成されます。したがって、TeX は の一番下の行のベースラインが次の行のベースラインから離れている\vtop
ことを保証しません。代わりに、 を挿入しますが、これは十分なスペースではありません。minipage
\baselineskip
\lineskip
解決策としてはminipage
を に切り替えることだと考えるかもしれません[b]
が、そうすると上の行と同様の状況になります。
解決
\strut
これに対処する通常の方法は、 の最後の行にを入れ\vtop
、行間スキップをオフにして(つまり、\lineskip
接着を禁止して)、\strut
次の段落の最初の行に を入れることです。
A は、高さ + 奥行きが通常 に等しい\strut
ボックス (つまり ) を挿入します。ただし、この場合はうまくいきません。その理由は、は を変更しますが には影響しないからです。\box\strutbox
\baselineskip
\onehalfspacing
\baselineskip
\box\strutbox
したがって、必要なことは、長いボックスを\vskip
適切な長さの で終了し、行間スキップをオフにして、 を使用することです。では、適切な長さは何でしょうか? つまり、 = ( の高さ) + ( の最後のボックスの深さ) + (明示的な)\strut
となります。\baselineskip
\box\strutbox
\vbox
\vskip
\skip
これを計算するには、一時レジスタ ( を選択) を-0
に設定し、は垂直リストの最後のボックス (つまり、テキストの最後の行) の深さになります。\baselineskip
\ht\strutbox
\prevdepth
\prevdepth
最後に2つの注意事項。
- これは では機能しません
minipage
。理由は調査していません。 enumerate
は、通常、その上にスペースを追加します。これは、minipage
を実行するによって抑制されます\@setminipage
。 がどのように機能するかは理解\@setminipage
できますが、 のオプションを使用するだけでこの動作を防ぐ方法がわかりませんenumitem
。そのため、代わりに、このコードは を実行します\@setminipage
。
完全なコードは次のとおりです。
\documentclass[a4paper,DIV=15,oneside,12pt]{scrartcl}
\usepackage[english]{babel}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{blindtext}
\usepackage{setspace}
\usepackage{enumitem}
\parskip 0pt
\parindent 0pt
\begin{document}
\pagestyle{empty}
\onehalfspacing
\blindtext\par
\noindent
\parbox[t]{0.6\textwidth}{
\blindtext
\skip0=\baselineskip
\advance\skip0 by-\prevdepth
\advance\skip0 by-\ht\strutbox\relax
\vskip\skip0
}\hfill
\parbox[t]{0.37\textwidth}{
\csname @setminipage\endcsname
\begin{enumerate}[leftmargin=*,label=\alph{*}),itemsep=0pt,partopsep=0pt,topsep=0pt, parsep=0pt]
\item Test 1
\item Test 2
\end{enumerate}
}
\par
\nointerlineskip
\strut\blindtext
\end{document}