МВЭ

МВЭ

Это дополнительный вопрос кУправление отступом и вертикальным пространством в верхней части 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}

вы получите дополнительное пространство в верхней части вашего ящика, вот так:

введите описание изображения здесь

Связанный контент