我想改进我的解决方案以实现以下目标。tcolorbox
标题部分突出显示的环境。
感谢这里的精彩答案和出色的tcolorbox
文档。我实现了这个解决方案,但它太老套了,突出显示的部分是我不喜欢的:
- 它有重复的代码(如章节标题),
- 长度是实验性的,我希望它从页面边缘到 2 或 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 first
和overlay 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}
。