itemize 中的 Tcolorboxes:第一个项目中的额外垂直间距

itemize 中的 Tcolorboxes:第一个项目中的额外垂直间距

考虑遵循 MWE:

\documentclass{article}
\usepackage[most]{tcolorbox}
\definecolor{block-gray}{gray}{0.95}
\newtcolorbox{zitat}[2][]{%
    breakable, % IMPORTANT
    colback=block-gray,
    boxrule=0pt,
    arc=0pt,
    boxsep=0pt,
    enhanced jigsaw,
    borderline west={4pt}{0pt}{gray},
    title={#2\par},
    colbacktitle={block-gray},
    coltitle={black},
    fonttitle={\large\bfseries},
    attach title to upper={},
    box align=top,
    #1,
}
\begin{document}
\section*{Quotes} % commenting removes difference
\begin{itemize}
  \item \begin{zitat}{Quote 1}
    Space: the final frontier.
  \end{zitat}
  \item \begin{zitat}{Quote 2}
    A long time ago in a galaxy far, far away\ldots
  \end{zitat}
  \item \begin{zitat}{Quote 2}
    A long time ago in a galaxy far, far away\ldots
  \end{zitat}
\end{itemize}
\end{document}

产生以下输出

在此处输入图片描述

如您所见,与后两个项目相比,第一个项目中的 tcolorbox 之前有更多的垂直空间。

当我删除部分命令时,它就消失了。

我该怎么做才能修复此问题而无需手动调整?

(OSX El Capitan 上的 TexLive 2016,tcolorbox 2016/11/18 版本 3.96)

更新

看来该选项breakable是负责任的。有一个相关选项vfill before first

/tcb/vfill before first=true|false在第一个部分框的开头插入\vfill以将此部分框移动到当前页面的末尾。这可以用作 的替代方法,以/tcb/height fixed for=first获得对齐的列或页面。\vfill如果框实际上没有损坏,则不会插入。

但是,删除breakable并插入\vfill不会重现此问题。我猜的作者tcolorbox可能知道发生了什么。

我报告给https://github.com/TFS/tcolorbox/issues

答案1

tcolorbox特别注意在标题后插入正确的间距。如果 应该tcolorbox是可拆分的,这尤其棘手,因为可拆分框总是以新段落开头。将这种组合放入列表环境中似乎itemize对算法来说太多了。

目前,我不知道如何自动处理这个问题而不冒破坏其他机制的风险。

但是,至少有两种方法可以避免这种情况。

方法一:

在章节标题后添加\@nobreakfalse。这将关闭对标题的特殊处理,否则会产生不良影响。

\documentclass{article}
\usepackage[most]{tcolorbox}
\definecolor{block-gray}{gray}{0.95}
\newtcolorbox{zitat}[2][]{%
    breakable, % IMPORTANT
    colback=block-gray,
    boxrule=0pt,
    arc=0pt,
    boxsep=0pt,
    enhanced jigsaw,
    borderline west={4pt}{0pt}{gray},
    title={#2\par},
    colbacktitle={block-gray},
    coltitle={black},
    fonttitle={\large\bfseries},
    attach title to upper={},
    box align=top,
    #1,
}
\begin{document}
\section*{Quotes} 
\makeatletter\@nobreakfalse\makeatother%
\begin{itemize}
  \item \begin{zitat}{Quote 1}
    Space: the final frontier.
  \end{zitat}
  \item \begin{zitat}{Quote 2}
    A long time ago in a galaxy far, far away\ldots
  \end{zitat}
  \item \begin{zitat}{Quote 2}
    A long time ago in a galaxy far, far away\ldots
  \end{zitat}
\end{itemize}
\end{document}

方法二:

在标题后ignore nobreak向第一个环境添加一个选项。或者,可以将其添加到环境的常规选项列表中。zitat

\documentclass{article}
\usepackage[most]{tcolorbox}
\definecolor{block-gray}{gray}{0.95}
\newtcolorbox{zitat}[2][]{%
    breakable, % IMPORTANT
    colback=block-gray,
    boxrule=0pt,
    arc=0pt,
    boxsep=0pt,
    enhanced jigsaw,
    borderline west={4pt}{0pt}{gray},
    title={#2\par},
    colbacktitle={block-gray},
    coltitle={black},
    fonttitle={\large\bfseries},
    attach title to upper={},
    box align=top,
    %  ignore nobreak,  %<---- could also be added here
    #1,
}
\begin{document}
\section*{Quotes} 
\begin{itemize}
  \item \begin{zitat}[ignore nobreak]{Quote 1}      
    Space: the final frontier.
  \end{zitat}
  \item \begin{zitat}{Quote 2}
    A long time ago in a galaxy far, far away\ldots
  \end{zitat}
  \item \begin{zitat}{Quote 2}
    A long time ago in a galaxy far, far away\ldots
  \end{zitat}
\end{itemize}
\end{document}

两种方法都应该能得到期望的结果。

相关内容