更简单的方法

更简单的方法

我有一种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-labeledred-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}

在此处输入图片描述

相关内容