Это дополнительный вопрос кУправление отступом и вертикальным пространством в верхней части tcolorbox.
@egreg предоставил хорошее решение исходной проблемы, но есть один побочный эффект, когда определенные среды (вероятно, что-то основанное на trivlist
) появляются в tcolorbox
. Отсутствует интервал над первой средой.
Как мне скорректировать ответ @egreg, чтобы эти среды были правильно разнесены?
МВЭ
\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}
вы получите дополнительное пространство в верхней части вашего ящика, вот так: