説明

説明

行間隔を維持したまま、テキスト内に 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

ここで注目すべき点がいくつかあります:

  1. 2番目は\vbox私たちのに対応します\vtop
  2. \parskip段落間にAが挿入されました。
  3. と、を含む次の\baselineskipの間には が挿入されませんでした。代わりに が存在します。 は、 の深さと次の の高さが より大きいという事実に由来しています。TeXがそれらのベースラインを離そうとした場合、それらは重なり合うことになります。\vtop\hboxNext 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つの注意事項。

  1. これは では機能しませんminipage。理由は調査していません。
  2. 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}

ここに画像の説明を入力してください

関連情報