解釋

解釋

我想將兩個小頁面整合到文字中,保持行距。使用該\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。在裡面我們可以看到兩個\hboxes 對應到該段落的兩行。在它們之間,有一個\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。我增加\showboxdepth1 以查看下一個內部框。)

\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. 第二個\vbox對應於我們的\vtop
  2. \parskip段落之間插入了A ;和
  3. 在 和包含 的後面之間\baselineskip插入了No。相反,有一個.來自以下事實: 的深度和後續的高度大於。如果 TeX 試圖將它們的基線分開,它們就會重疊。\vtop\hboxNext 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(即最後一行文字)來計算。

最後兩個警告。

  1. 這不起作用minipage,我沒有調查原因。
  2. enumerate通常會在其上方添加空格。這是由minipagewhich 執行所禁止的\@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}

在此輸入影像描述

相關內容