如何使用 titlesec 在章节标题周围放置一个 tcolorbox?

如何使用 titlesec 在章节标题周围放置一个 tcolorbox?

我想重新定义\section以生成类似以下内容:(需要包tcolorbox

\begin{tcolorbox}
  1. \hspace*{\fill} Title of the Section \hspace*{\fill}
\end{tcolorbox}

所需的标题格式 我以为我可以使用该titlesec软件包来实现这一点。我尝试执行以下操作:

\titleformat{\section}[display]% It's not clear to me why, but any other format except [display] breaks!
    {}{}{0em}%
    {\begin{tcolorbox}\thesection.\hspace*{\fill}}% 'before' code.
    [\hspace*{\fill}\end{tcolorbox}]% 'after' code.

编译器接受了这个,但不是我期望的方式。\section{Title of the Section}产生以下内容:标题错误且间距不正确的图片

我知道它titlesec确实提供了带框标题选项,但它不是我想要使用的格式。特别是,我更希望标签也位于框中,并且我希望控制tcolorbox提供给我的框。

我想也许我可以在制度中定义本节标题框的内容titlesec,然后根据我的喜好进行定义\edef\oldsection\section和重新定义\section,但我不清楚如何传递所需的参数\section

TL;DR 我想像第一个例子一样将\section标题放在里面\tcolorbox,但它不起作用。

答案1

您可能希望使用tcolorbox带有explicit选项的加载包,该选项允许您#1在命令定义中将其用作部分标题的占位符\section。此外,我认为block格式更适合这里:

\documentclass{article}
\usepackage{tcolorbox}
\usepackage[explicit]{titlesec}

\titleformat{\section}[block]
    {}{}{0em}
    {\begin{tcolorbox}
        \thesection. \hspace*{\fill} #1 \hspace*{\fill}
    \end{tcolorbox}}

\begin{document}

\section{Title of the Section}

\end{document}

在此处输入图片描述


为了使带星号的命令也能正常工作\section

\documentclass{article}
\usepackage{tcolorbox}
\usepackage[explicit]{titlesec}

\titleformat{\section}[block]
    {}{}{0em}
    {\begin{tcolorbox}
        \thesection. \hspace*{\fill} #1 \hspace*{\fill}
    \end{tcolorbox}}

\titleformat{name=\section,numberless}[block]
    {}{}{0em}
    {\begin{tcolorbox}
        \hspace*{\fill} #1 \hspace*{\fill}
    \end{tcolorbox}}

\begin{document}

\section*{Title of the Section}

\section{Title of the Section}

\section*{Title of the Section}

\end{document}

在此处输入图片描述


正如评论中指出的那样,此解决方案不适用于较长的标题。由于您已经在使用该tcolorbox软件包,因此您可以稍微增强您的框,使其也适用于较长的标题:

\documentclass{article}
\usepackage{tcolorbox}
\tcbuselibrary{skins}
\usepackage[explicit]{titlesec}

\NewTColorBox{tcsectionbox}{ o }{%
  enhanced,
  halign=center,
  left=\IfValueTF{#1}{10mm}{4mm},
  right=4mm,
  top=3mm,
  bottom=3mm,
  boxsep=0mm,
  overlay={
    \IfValueT{#1}{
        \node[anchor=north west, inner xsep=4mm, inner ysep=3mm] 
        at (interior.north west) {#1};
    }
  }
}

\titleformat{\section}[block]
    {}{}{0em}
    {\begin{tcsectionbox}[\thesection.]
        #1
    \end{tcsectionbox}}

\titleformat{name=\section,numberless}[block]
    {}{}{0em}
    {\begin{tcsectionbox}
        #1
    \end{tcsectionbox}}

\begin{document}

\section{A ridiculously long section title that is only used to show that even long titles are working fine}

\section*{A ridiculously long section title that is only used to show that even long titles are working fine}

\section{A short title}

\end{document}

在此处输入图片描述

相关内容