ムウェ

ムウェ

これは次の質問へのフォローアップですtcolorbox の上部のインデントと垂直スペースを制御する

trivlist@egreg は、元の問題に対する優れた解決策を提供しましたが、に特定の環境 (おそらく に基づくもの) が表示されると、副作用が 1 つあります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}

MWE出力

答え1

内部center環境で垂直方向のスペースが欠落しているのは、 の前に空白行を残すときに必要なスペースを挿入するために\@itemが使用されており、垂直モードのときはこのスペースが追加されず、 がtrue であるためです。これは の内部に当てはまります。したがって、このスペースを挿入するには、のオプションで を設定できます。\addvspace\@topsep\begin{center}\addvspace\if@minipagemybox\@minipagefalsebefore uppertcolorbox

2 つのボックス間の垂直方向の隙間は、基本的に のデフォルトによるものです/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}

スクリーンショット

本当に取り除きたいならすべてのギャップは、メインの垂直リストに追加される、ここで関心のある 2 つのボックス間のすべての垂直接着を抑制します。これは を使用して実行できます。これは、 を設定する\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一時的に 内に設定しました。ただし、 の先頭で直接設定すると、次のようになります。\everyparcenterbefore 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}

次のように、ボックスの上部に追加のスペースができます。

ここに画像の説明を入力してください

関連情報