
我想將兩個小頁面整合到文字中,保持行距。使用該\begin{minipage}[t]
選項,迷你頁上方的空間是正確的(綠色圓圈)。但不幸的是,下面的空間太短了(紅色圓圈)。如何將其調整為“正常基線跳躍”?
微量元素:
\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
編譯時,它會列印出該段落被分成兩行的內部內容。這些\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 []
乍一看,這可能有點複雜,但它告訴我們的是,\box0
高度\vbox
為 18.94444pt,深度為 0pt,寬度為 469.75499pt。那是,(height+depth)xwidth
。在裡面我們可以看到兩個\hbox
es 對應到該段落的兩行。在它們之間,有一個\glue
對應於\baselineskip
。請注意,頂部框的深度加上膠水加上底部框的高度為 12pt,即\baselineskip
。
現在 TeX 也不希望連續的框靠近在一起以防止它們重疊。為了防止這種情況,當盒子太靠近時,TeX 會在它們之間插入一些空格。確切的演算法在這裡並不重要,但關鍵是我們可以透過使用來停用此行為\nointerlineskip
。
現在您可能想知道兩個文字方塊怎麼會靠得太近。如果你有一個有深度的盒子,就會發生這種情況米在有高度的盒子頂部n這樣米+n> \baselineskip
.
那麼這一切與你的問題有什麼關係呢?嗯,TeX 有三種類型的垂直框:\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
您可以看到左側框的底線如何與右側框的頂線對齊。
我們可以像以前一樣列印這兩個盒子的樣子。
左邊的方框:
\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 []
主要區別在於這兩個盒子的高度和深度(每個列表的頂行)。
這導致了一個棘手的問題。如果我們使用 a\vtop
並且頁面上的下一行只是段落中的普通行,會發生什麼?讓我們來看看。
\parindent=0pt
\leavevmode
\vtop{
\hsize=1in
Top line\hfill\break
g Bottom line
}
Next line
\end
我抑制了縮排並以 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
這裡有幾點要注意:
- 第二個
\vbox
對應於我們的\vtop
; \parskip
段落之間插入了A ;和- 在 和包含 的後面之間
\baselineskip
插入了No。相反,有一個.來自以下事實: 的深度和後續的高度大於。如果 TeX 試圖將它們的基線分開,它們就會重疊。\vtop
\hbox
Next line
\lineskip
\lineskip
\vtop
\hbox
\baselineskip
\baselineskip
也許現在您可以透過自己的程式碼看到問題。與選項minipage
一起[t]
產生一個\vtop
.因此 TeX 不能確保下面一行的基線minipage
遠離\baselineskip
下一行的基線。相反,它插入的\lineskip
空間幾乎不夠。
您可能認為解決方案是將 切換為minipage
,[b]
但隨後您將遇到與上面的行類似的情況。
解決方案
處理這個問題的正常方法是\strut
在最後一行放置一個\vtop
,關閉行間跳過(即抑制黏合),並在下一段的第一行\lineskip
放置一個。\strut
A\strut
插入一個盒子(即\box\strutbox
),其高度 + 深度通常等於\baselineskip
。但是,這對於您的情況不起作用。原因是\onehalfspacing
改變了\baselineskip
但沒有觸及\box\strutbox
。
所以我們需要做的是用\vskip
適當長度的 a 結束較長的框,關閉行間跳過,然後使用\strut
.那麼什麼長度才合適呢?好吧,我們想要\baselineskip
= ( 的高度\box\strutbox
) + ( 中最後一個框的深度\vbox
) + (我們的顯式\vskip
)。
我們可以透過將臨時\skip
暫存器(我選擇的0
)設為\baselineskip
- \ht\strutbox
-垂直列表上最後一個框的\prevdepth
深度\prevdepth
(即最後一行文字)來計算。
最後兩個警告。
- 這不起作用
minipage
,我沒有調查原因。 enumerate
通常會在其上方添加空格。這是由minipage
which 執行所禁止的\@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}