Dies ist eine Folgefrage zuSteuern des Einzugs und des vertikalen Abstands oben in einer Farbbox.
@egreg hat eine nette Lösung für das ursprüngliche Problem bereitgestellt, es gibt jedoch einen Nebeneffekt, wenn bestimmte Umgebungen (wahrscheinlich alles, was auf einem basiert trivlist
) im erscheinen tcolorbox
. Der Abstand über der ersten Umgebung fehlt.
Wie kann ich die Antwort von @egreg anpassen, sodass diese Umgebungen richtig verteilt sind?
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}
Antwort1
Der fehlende vertikale Abstand in der inneren center
Umgebung liegt daran, dass \@item
verwendet wird \addvspace\@topsep
, um den gewünschten Abstand einzufügen, wenn vor eine Leerzeile gelassen wird \begin{center}
, und \addvspace
diesen Abstand nicht hinzufügt, wenn im vertikalen Modus und \if@minipage
true ist – was innerhalb Ihres der Fall ist mybox
. Um diesen Abstand einzufügen, können Sie also \@minipagefalse
die before upper
Option Ihres festlegen tcolorbox
.
Der vertikale Abstand zwischen den beiden Feldern ist im Wesentlichen auf die Vorgabe für zurückzuführen /tcb/noparskip
(siehe Dokumentation von /tcb/autoparskip
im tcolorbox
Handbuch). Wenn Sie setzen before=\par\noindent
, entfernen Sie das hinzugefügte \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}
Wenn Sie wirklich loswerden wollendie ganze Lücke, unterdrücken Sie alle vertikalen Verbindungen zwischen den beiden hier interessierenden Boxen, die an die vertikale Hauptliste angehängt werden. Sie können dies mit tun \nointerlineskip
, das im vertikalen Modus aufgrund des after=\par
von uns festgelegten korrekt verwendet wird:
\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}
Hinweis: Ich habe das \@minipagefalse
innerhalb des temporären gesetzt \everypar
, um keinen zusätzlichen vertikalen Raum innerhalb der Box zu haben, wenn diese mit einer center
Umgebung beginnt. Aber wenn Sie es direkt am Anfang von setzen before upper
, so wie hier:
\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
}
und starten Sie Ihre Box mit einer center
Umgebung:
\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}
Sie erhalten den zusätzlichen Platz oben in Ihrer Box wie folgt: