MWE

MWE

Esta es una pregunta de seguimiento paraControlar la sangría y el espacio vertical en la parte superior de un tcolorbox.

@egreg proporcionó una buena solución al problema original, pero hay un efecto secundario cuando ciertos entornos (probablemente cualquier cosa basada en a trivlist) aparecen en el archivo tcolorbox. Falta el espacio sobre el primer entorno.

¿Cómo puedo ajustar la respuesta de @egreg para que estos entornos estén espaciados correctamente?

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}

Salida MWE

Respuesta1

El espacio vertical que falta en el centerentorno interno se debe a que \@itemse usa \addvspace\@topseppara insertar el espacio que desea tener al dejar una línea en blanco antes \begin{center}, y \addvspaceno agrega este espacio cuando está en modo vertical y \if@minipagees verdadero, que es el caso dentro de su mybox. Entonces, para insertar este espacio, puede configurar \@minipagefalsela before upperopción de su archivo tcolorbox.

El espacio vertical entre las dos cajas se debe esencialmente al valor predeterminado /tcb/noparskip(consulte la documentación /tcb/autoparskipen el tcolorboxmanual). Si configura before=\par\noindent, elimina lo agregado \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}

Captura de pantalla

Si realmente quieres deshacerte detoda la brecha, suprima todo pegamento vertical entre los dos cuadros de interés aquí que se adjuntan a la lista vertical principal. Puedes hacer esto usando \nointerlineskip, que se usa correctamente en modo vertical debido a lo que after=\parconfiguramos:

\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}

ingrese la descripción de la imagen aquí

Nota: Configuré el \@minipagefalseinterior temporal \everyparpara no tener espacio vertical adicional dentro de la caja si comienza con un centerentorno. Pero si lo configura directamente al principio de before upper, así:

\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
}

y comienza tu caja con un centerentorno:

\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}

Obtendrás el espacio adicional en la parte superior de tu cuadro, así:

ingrese la descripción de la imagen aquí

información relacionada