MWE

MWE

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}

MWE-Ausgabe

Antwort1

Der fehlende vertikale Abstand in der inneren centerUmgebung liegt daran, dass \@itemverwendet wird \addvspace\@topsep, um den gewünschten Abstand einzufügen, wenn vor eine Leerzeile gelassen wird \begin{center}, und \addvspacediesen Abstand nicht hinzufügt, wenn im vertikalen Modus und \if@minipagetrue ist – was innerhalb Ihres der Fall ist mybox. Um diesen Abstand einzufügen, können Sie also \@minipagefalsedie before upperOption 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/autoparskipim tcolorboxHandbuch). 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}

Bildschirmfoto

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

Bildbeschreibung hier eingeben

Hinweis: Ich habe das \@minipagefalseinnerhalb des temporären gesetzt \everypar, um keinen zusätzlichen vertikalen Raum innerhalb der Box zu haben, wenn diese mit einer centerUmgebung 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 centerUmgebung:

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

Bildbeschreibung hier eingeben

verwandte Informationen