![更简单的方法](https://linux22.com/image/411474/%E6%9B%B4%E7%AE%80%E5%8D%95%E7%9A%84%E6%96%B9%E6%B3%95.png)
我有一种tcolorbox
样式,希望在我的几个框中使用,但我希望能够自定义每个框使用的配色方案,而无需创建新的样式。例如,这就是我现在拥有的:
\usepackage{tcolorbox}
\tcbset{blue-labeled/.style={
colframe=blue,
colback=blue!20,
boxed title style={
colback=blue,
outer arc=0pt,
arc=0pt,
top=3pt,
bottom=3pt,
},
}
}
\newtcolorbox{theorem}{
blue-labeled,
title=Theorem:,
}
但是,如果我想添加另一个具有绿色背景的框:
\tcbset{blue-labeled/.style={
colframe=green,
colback=green!20,
boxed title style={
colback=green,
outer arc=0pt,
arc=0pt,
top=3pt,
bottom=3pt,
},
}
}
\newtcolorbox{idea}{
green-labeled,
title=Idea:,
}
我需要制作另一种绿色的风格,但对我来说,这感觉非常多余。
在别人提出建议之前,我不是想要简单地将配色方案移到我的tcolorbox
定义中,并将颜色作为参数。这是针对我正在开展的一个大型项目,其中有许多类型的框,它们都依赖于相同的总体布局,但其他定义却大不相同。我还希望它足够灵活,这样我就可以快速尝试不同的颜色,而无需编辑大量行。
现在,唯一允许灵活性的解决方案(但代码变得更加冗余)是,如果我有几种样式定义blue-labeled
,例如green-labeled
,red-labeled
然后要更改配色方案,我只需要修改一个单词。
有什么快捷方法可以实现这一目标?
答案1
欢迎来到 TeX.SE。
更简单的方法
样式tcolorbox
,或者更一般地说,pgfkeys
样式,带有参数。您可以在这里充分利用这一点。
\documentclass{article}
\usepackage[skins]{tcolorbox}
\tcbset{
my box/.style={
enhanced,
colframe=#1,
colback=#1!20,
attach boxed title to top left={xshift=0.2cm, yshift=-0.2cm},
boxed title style={
colback=#1,
outer arc=0pt,
arc=0pt,
top=3pt,
bottom=3pt,
},
},
}
\newtcolorbox{theorem}[1][]{
my box=blue,
title=Theorem,
#1,
}
\newtcolorbox{idea}[1][]{
my box=green,
title=Idea,
#1,
}
\begin{document}
\begin{theorem}
This is blue.
\end{theorem}
\begin{idea}
This is green.
\end{idea}
\end{document}
更灵活的方式
您可以将参数解释为定义其他样式的样式。在本例中,这允许我们定义两个关键字参数,一个用于主框的样式选项 ( main
),另一个用于框标题 ( title
)。例如,以下示例中的第一个框类型使用此参数:
my box={
main={colframe=blue!40, colback=blue!20},
title={colback=blue!60!black},
},
我还定义了一个append main
(resp. append title
)样式,以防你想要添加到main style
(分别title style
)而不是覆盖它。完整代码:
\documentclass{article}
\usepackage[skins]{tcolorbox}
\tcbset{
% Defaults
my box/main style/.style={},
my box/title style/.style={},
% Use the 'append' variants if you want to add to the defaults instead of
% overriding them.
my box/main/.style={/tcb/my box/main style/.style={#1}},
my box/title/.style={/tcb/my box/title style/.style={#1}},
my box/append main/.style={/tcb/my box/main style/.append style={#1}},
my box/append title/.style={/tcb/my box/title style/.append style={#1}},
%
my box/.style={
my box/.cd, #1,
/tcb/.cd,
enhanced,
my box/main style,
attach boxed title to top left={xshift=0.2cm, yshift=-0.2cm},
boxed title style={
outer arc=0pt,
arc=0pt,
top=3pt,
bottom=3pt,
my box/title style,
},
},
}
\newtcolorbox{theorem}[1][]{
my box={
main={colframe=blue!40, colback=blue!20},
title={colback=blue!60!black},
},
title=Theorem,
#1,
}
\newtcolorbox{idea}[1][]{
my box={
main={colframe=orange, colback=green!40!cyan},
title={colback=blue!60, colframe=gray},
},
title=Idea,
#1,
}
\begin{document}
\begin{theorem}
This is blue.
\end{theorem}
\begin{idea}
This has various colors.
\end{idea}
\end{document}