
줄 간격을 유지하면서 두 개의 미니페이지를 텍스트 안에 통합하고 싶습니다. 옵션 을 사용하면 \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
컴파일하면 문단을 두 줄로 나누어서 내부 내용을 출력한다 . 매개 \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
알려주 는 것입니다 . \vbox
그건, (height+depth)xwidth
. 그 안에는 \hbox
단락의 두 줄에 해당하는 두 개의 es가 있습니다 . 그 사이에는 \glue
에 해당하는 a가 있습니다 \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
들여쓰기를 억제하고 두 번째 줄은 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
; - A는
\parskip
단락 사이에 삽입되었습니다. 그리고 - 과 을(를 ) 포함하는 다음 사이에 아니오(No)
\baselineskip
가 삽입되었습니다 . 대신에 . 는 의 깊이 와 다음의 높이가 보다 크다는 사실에서 비롯 됩니다 . TeX가 기준선을 분리하려고 시도했다면 중복되었을 것입니다.\vtop
\hbox
Next line
\lineskip
\lineskip
\vtop
\hbox
\baselineskip
\baselineskip
이제 자신의 코드에서 문제를 확인할 수 있을 것입니다. minipage
옵션을 [t]
사용 하면 \vtop
. 따라서 TeX는 하단 라인의 기준선이 다음 라인의 기준선에서 멀어지는 minipage
것을 보장하지 않습니다. \baselineskip
대신에 삽입하는 중인데 \lineskip
공간이 거의 부족합니다.
minipage
를 로 전환하는 것이 해결책이라고 생각할 수도 있지만 [b]
위의 줄과 유사한 상황이 발생하게 됩니다.
해결책
이를 처리하는 일반적인 방법은 의 \strut
마지막 줄에 a를 넣고 \vtop
줄간 건너뛰기를 끄고(즉, \lineskip
접착 금지) a를 \strut
다음 단락의 첫 번째 줄에 넣는 것입니다.
A는 높이 + 깊이가 일반적으로 와 같은 \strut
상자(즉 )를 삽입합니다 . 그러나 귀하의 경우에는 이것이 작동하지 않습니다. 그 이유는 을 변경 하지만 건드리지 않기 때문입니다 .\box\strutbox
\baselineskip
\onehalfspacing
\baselineskip
\box\strutbox
따라서 우리가 해야 할 일은 더 긴 상자를 \vskip
적절한 길이의 로 끝내고 행간 건너뛰기를 끄고 를 사용하는 것입니다 \strut
. 그럼 적당한 길이는 얼마일까요? 글쎄, 우리는 \baselineskip
= (의 높이 \box\strutbox
) + (에서 마지막 상자의 깊이 \vbox
) + (명시적인 \vskip
)를 원합니다.
\skip
임시 레지스터(내가 선택한 0
) 를 \baselineskip
다음 과 같이 설정하여 이를 계산할 수 있습니다 . 수직 목록의 마지막 상자 깊이는 어디에 있습니까(즉, 텍스트의 마지막 줄 \ht\strutbox
) \prevdepth
.\prevdepth
두 가지 마지막 주의사항.
- 이것은 에서는 작동하지 않습니다
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}