설명

설명

줄 간격을 유지하면서 두 개의 미니페이지를 텍스트 안에 통합하고 싶습니다. 옵션 을 사용하면 \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

여기에는 몇 가지 참고 사항이 있습니다.

  1. 두 번째는 \vbox우리의 \vtop;
  2. A는 \parskip단락 사이에 삽입되었습니다. 그리고
  3. 과 을(를 ) 포함하는 다음 사이에 아니오(No) \baselineskip가 삽입되었습니다 . 대신에 . 는 의 깊이 와 다음의 높이가 보다 크다는 사실에서 비롯 됩니다 . TeX가 기준선을 분리하려고 시도했다면 중복되었을 것입니다.\vtop\hboxNext 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

두 가지 마지막 주의사항.

  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}

여기에 이미지 설명을 입력하세요

관련 정보