これは次の質問へのフォローアップです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}
答え1
内部center
環境で垂直方向のスペースが欠落しているのは、 の前に空白行を残すときに必要なスペースを挿入するために\@item
が使用されており、垂直モードのときはこのスペースが追加されず、 がtrue であるためです。これは の内部に当てはまります。したがって、このスペースを挿入するには、のオプションで を設定できます。\addvspace\@topsep
\begin{center}
\addvspace
\if@minipage
mybox
\@minipagefalse
before upper
tcolorbox
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
一時的に 内に設定しました。ただし、 の先頭で直接設定すると、次のようになります。\everypar
center
before 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}
次のように、ボックスの上部に追加のスペースができます。