在 tcolorbox 环境中部分突出显示标题

在 tcolorbox 环境中部分突出显示标题

我想改进我的解决方案以实现以下目标。tcolorbox标题部分突出显示的环境。 目标

感谢这里的精彩答案和出色的tcolorbox文档。我实现了这个解决方案,但它太老套了,突出显示的部分是我不喜欢的:

  1. 它有重复的代码(如章节标题),
  2. 长度是实验性的,我希望它从页面边缘到 2 或 3 个字母的长度。
  3. \vphantom如果突出显示与标题有某种联系,则似乎没有必要使用。
\usepackage[a4paper, bottom=1cm, top=1cm, right = 0.5cm, left = 0.5cm]{geometry}
\usepackage[skins,breakable]{tcolorbox}

\newcommand{\sectionTitle}[1]{
% begin bad highlighting code
  \node[inner sep=5pt,text width=0.21\textwidth,
      align=none, rectangle, fill=yellow,
      below right, font=\LARGE]
      at ([xshift=-0.5\textwidth]frame.north west)
  {%
    \vphantom{THI}
  };
% end bad highlighting code
  \node[inner sep=5pt,outer sep=0pt,text width=0.25\textwidth,
      align=none,
      below right, font=\LARGE]
      at ([xshift=-0.3\textwidth]frame.north west) (SECTIONTITLE)
  {%
    #1
  };
}
\newtcolorbox{mycustombox}[1]{
  blanker,
  width=0.6\textwidth,enlarge left by=0.3\textwidth,
  before skip=6pt,
  breakable,
  overlay unbroken and first={%
    \sectionTitle{#1}
},
  overlay unbroken and last={%
    \sectionTitle{#1}
  }
}
\begin{document}
\begin{mycustombox}{My Section Title}
  Content of this section
\end{mycustombox}
\end{document}

答案1

我认为您原来的方法中没有太多黑客或冗余代码。另外,我不太明白您想要实现什么,所以我不确定这是否更适合您的需求。

我做了如下更改:

  • 黄色背景xshift现在精确地移动到页面左边框。
  • 如果要使用固定宽度,黄色节点的内容无关紧要,因此我将其更改为\strut。如果宽度取决于标题的文本,请参阅下面的替代解决方案。
  • 我使用anchor选项来放置节点并删除了所有不必要的选项。
  • 我合并了选项overlay unbroken and firstoverlay unbroken and last只是overlay因为这本质上是相同的。

完整代码:

\documentclass{article}
\usepackage[a4paper, bottom=1cm, top=1cm, right=0.5cm, left=0.5cm]{geometry}
\usepackage[skins, breakable]{tcolorbox}

\newcommand{\sectionTitle}[1]{
  \node[inner sep=5pt, anchor=north west, font=\LARGE, 
    text depth=0pt, fill=yellow, text width=1.5cm]
    at ([xshift={-0.3\textwidth-\evensidemargin-1in}]frame.north west) {\strut};
  \node[inner sep=5pt, anchor=north west, font=\LARGE]
    at ([xshift={-0.3\textwidth}]frame.north west) {#1};
}
\newtcolorbox{mycustombox}[1]{
  blanker,
  width=0.6\textwidth,
  enlarge left by=0.3\textwidth,
  before skip=6pt,
  breakable,
  overlay={
    \sectionTitle{#1}
  },
}

\begin{document}

\begin{mycustombox}{My Section Title}
  Content of this section
\end{mycustombox}

\end{document}

在此处输入图片描述


如果您希望黄色突出显示恰好在章节标题的第三个字符之后结束,您可以执行以下操作:

\documentclass{article}
\usepackage[a4paper, bottom=1cm, top=1cm, right=0.5cm, left=0.5cm]{geometry}
\usepackage[skins, breakable]{tcolorbox}

\ExplSyntaxOn
\NewDocumentCommand { \getfirstletters } { m m } {
    \str_use:N \str_range:Nnn { #1 } { 1 } { #2 } 
}
\ExplSyntaxOff

\newcommand{\sectionTitle}[1]{
  \node[inner sep=5pt, anchor=north west, font=\LARGE, 
    text depth=0.5ex, fill=yellow, 
    execute at begin node=\hspace*{\dimexpr\evensidemargin+1in-5pt\relax}]
    at ([xshift={-0.3\textwidth-\evensidemargin-1in}]frame.north west) {\phantom{\getfirstletters{#1}{3}}};
  \node[inner sep=5pt, anchor=north west, font=\LARGE]
    at ([xshift={-0.3\textwidth}]frame.north west) {#1};
}
\newtcolorbox{mycustombox}[1]{
  blanker,
  width=0.6\textwidth,
  enlarge left by=0.3\textwidth,
  before skip=6pt,
  breakable,
  overlay={
    \sectionTitle{#1}
  },
}

\begin{document}

\begin{mycustombox}{My Section Title}
  Content of this section
\end{mycustombox}

\bigskip

\begin{mycustombox}{WWWW}
  Content of this section
\end{mycustombox}

\end{document}

在此处输入图片描述

我创建了一个小辅助宏,它允许您获取字符串的前三个(或任何其他数量的)字母。要获取“Hello”的前三个字母,请使用\getfirstletters{Hello}{3}

相关内容