에 대한 후속 질문입니다.tcolorbox 상단의 들여쓰기 및 세로 공간 제어.
@egreg는 원래 문제에 대한 훌륭한 솔루션을 제공했지만 특정 환경(아마도 a 기반의 모든 환경 trivlist
) 이 tcolorbox
. 첫 번째 환경 위의 간격이 누락되었습니다.
이러한 환경이 올바른 간격으로 배치되도록 @egreg의 답변을 어떻게 조정합니까?
MWE
\documentclass{article}
\usepackage{tcolorbox}
\tcbset{mybox/.style={colback=white, colframe=blue, left=2mm, right=2mm,
fonttitle=\bfseries}, fontupper=\small,
before upper=\setlength{\parindent}{1em}\everypar{{\setbox0\lastbox}\everypar{}},
}
\newtcolorbox{mybox}[1][]{mybox,#1}
\begin{document}
\begin{mybox}
This line should not be indented.
This line should be indented.
\begin{center}
This line should be centred. The spacing above is wrong.
\end{center}
This line should be indented.
\begin{center}
This line should be centred. The spacing above is right.
\end{center}
This line should be indented.
\end{mybox}
\begin{mybox}
\section{Should not have gap above this heading}
\end{mybox}
\end{document}
답변1
내부 center
환경에서 세로 공간이 누락된 이유는 앞에 빈 줄을 남겨둘 때 원하는 공간을 삽입하기 위해 가 \@item
사용 하고 세로 모드에서는 이 공간을 추가하지 않기 때문입니다 . 이는 사실입니다. 이는 내부 환경의 경우입니다 . 따라서 이 공백을 삽입하려면 의 옵션 에서 설정하면 됩니다 .\addvspace\@topsep
\begin{center}
\addvspace
\if@minipage
mybox
\@minipagefalse
before upper
tcolorbox
두 상자 사이의 수직 간격은 본질적으로 기본값 때문입니다 (매뉴얼 의 /tcb/noparskip
문서 참조 ). 을 설정하면 추가된 항목이 제거됩니다 ./tcb/autoparskip
tcolorbox
before=\par\noindent
\smallskip
\documentclass{article}
\usepackage{tcolorbox}
\makeatletter
\tcbset{mybox/.style={colback=white, colframe=blue, left=2mm, right=2mm,
fonttitle=\bfseries}, fontupper=\small,
before upper={\setlength{\parindent}{1em}%
\everypar{{\setbox0\lastbox}\@minipagefalse\everypar{}}},
before=\par\noindent, after=\par
}
\makeatother
\newtcolorbox{mybox}[1][]{mybox,#1}
\begin{document}
\begin{mybox}
This line should not be indented.
This line should be indented.
\begin{center}
This line should be centered. The spacing above is correct.
\end{center}
This line should be indented.
\begin{center}
This line should be centered. The spacing above is right.
\end{center}
This line should be indented.
\end{mybox}
\begin{mybox}
\section{Should not have gap above this heading}
\end{mybox}
\end{document}
정말로 없애고 싶다면모든 격차, 기본 수직 목록에 추가된 관심 있는 두 상자 사이의 모든 수직 연결을 억제합니다. 다음을 설정했기 \nointerlineskip
때문에 세로 모드에서 올바르게 사용되는 를 사용하여 이 작업을 수행할 수 있습니다 .after=\par
\documentclass{article}
\usepackage{tcolorbox}
\makeatletter
\tcbset{mybox/.style={colback=white, colframe=blue, left=2mm, right=2mm,
fonttitle=\bfseries}, fontupper=\small,
before upper={\setlength{\parindent}{1em}%
\everypar{{\setbox0\lastbox}\@minipagefalse\everypar{}}},
before=\par\noindent, after=\par
}
\makeatother
\newtcolorbox{mybox}[1][]{mybox,#1}
\begin{document}
\begin{mybox}
This line should not be indented.
This line should be indented.
\begin{center}
This line should be centered. The spacing above is correct.
\end{center}
This line should be indented.
\begin{center}
This line should be centered. The spacing above is right.
\end{center}
This line should be indented.
\end{mybox}
\nointerlineskip
\begin{mybox}
\section{Should not have gap above this heading}
\end{mybox}
\end{document}
참고: 환경 으로 시작하는 경우 상자 내부에 추가 수직 공간이 생기지 않도록 \@minipagefalse
내부를 임시 로 설정했습니다 . 하지만 다음과 같이 의 시작 부분에 직접 설정하면 :\everypar
center
before upper
\tcbset{mybox/.style={colback=white, colframe=blue, left=2mm, right=2mm,
fonttitle=\bfseries}, fontupper=\small,
before upper={\@minipagefalse\setlength{\parindent}{1em}%
\everypar{{\setbox0\lastbox}\everypar{}}},
before=\par\noindent, after=\par
}
환경 으로 상자를 시작하십시오 center
.
\begin{mybox}
\begin{center}
This line should be centered. The spacing above is correct.
\end{center}
This line should be indented.
\begin{center}
This line should be centered. The spacing above is correct.
\end{center}
...
\end{mybox}
다음과 같이 상자 상단에 추가 공간이 생깁니다.