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}
Respuesta1
El espacio vertical que falta en el center
entorno interno se debe a que \@item
se usa \addvspace\@topsep
para insertar el espacio que desea tener al dejar una línea en blanco antes \begin{center}
, y \addvspace
no agrega este espacio cuando está en modo vertical y \if@minipage
es verdadero, que es el caso dentro de su mybox
. Entonces, para insertar este espacio, puede configurar \@minipagefalse
la before upper
opció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/autoparskip
en el tcolorbox
manual). 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}
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=\par
configuramos:
\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}
Nota: Configuré el \@minipagefalse
interior temporal \everypar
para no tener espacio vertical adicional dentro de la caja si comienza con un center
entorno. 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 center
entorno:
\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í: