从名称列表中定义多个 tcolorbox

从名称列表中定义多个 tcolorbox

我最近为模板构建了这个小 tcolorbox:

\documentclass[a4paper, 12pt]{book}
\usepackage{tcolorbox}
\tcbset{framedboxfilled/.style={
        sharp corners,
        fonttitle={\bfseries},
        coltitle=black,
        toprule=1pt, bottomrule=1pt, titlerule=1pt,
        leftrule=0pt, rightrule=0pt,
    }
}
\tcbset{framedboxoutline/.style={%  
        framedboxfilled, colback=white,colbacktitle=white,
    }
}
\def\myboxstyle{framedboxoutline}% To be set by a class option
\newtcolorbox[auto counter,number within=section]{framedbox}[2][]{%
    \myboxstyle, title={#2}, #1
}

\begin{document}
\begin{framedbox}{Title}
    test
\end{framedbox}
\end{document}

现在我想包含一个字符串列表,例如:

\newcommand{\framedboxValues}{
    Example/example, Homework/homework,
}

此列表应包含生成的 tcolorboxes 的所有名称。第一个值用于标题,第二个值用于 LaTeX 命令。我想要存档的是,有某种 for 循环,它获取列表中的值并创建具有上述样式的框。遗憾的是,我不知道如何存档。到目前为止,我的工作产生了这个代码片段,但它实际上不起作用:

\ExplSyntaxOn
\NewDocumentCommand \defframedthms { m }
{ \clist_map_inline:nn {#1} { \defframedthm {##1} } }
\NewDocumentCommand \defframedthm { > { \SplitArgument { 1 } { / } } m }
{
% Create the tcolorboxes

}
\ExplSyntaxOff
\expandafter\defframedthms\expandafter{\framedboxValues}

我尝试了几种方法来创建这些 tcolorbox,但都不起作用。有人能帮我吗?

编辑:

我取得了一些进展,但仍然没有好的解决方案。到目前为止,我有以下几点:

\newcommand\framedthm[3]{
    \newtcolorbox[auto counter,number within=section]{#2}[2][]{%
        \myboxstyle,
        title={#1 \thetcbcounter~##1},
    }
}

\ExplSyntaxOn
\NewDocumentCommand \defframedthms { m }
{ \clist_map_inline:nn {#1} { \defframedthm {##1} } }
\NewDocumentCommand \defframedthm { > { \SplitArgument { 1 } { / } } m }
{ \framedthm #1 { } }
\ExplSyntaxOff

\expandafter\defframedthms\expandafter{\framedboxValues}

剩余的问题:我无法为框添加标题。我无法解析框的个别更改。因此,例如\begin{box}[colback = red]{Title}...包括我目前知道的所有问题(没有标题,颜色仍然是白色)。但\begin{box}[title]...可以工作,但没有 tcolorbox 的单独选项。

答案1

你在寻找类似的东西吗?在这里,我解析参数\framedboxvalues并为列表中的每个项目创建环境。

\documentclass[a4paper, 12pt]{book}
\usepackage{tcolorbox}
\tcbset{framedboxfilled/.style={
        sharp corners,
        fonttitle={\bfseries},
        coltitle=black,
        toprule=1pt, bottomrule=1pt, titlerule=1pt,
        leftrule=0pt, rightrule=0pt,
    }
}
\tcbset{framedboxoutline/.style={%  
        framedboxfilled, colback=white,colbacktitle=white,
    }
}
\def\myboxstyle{framedboxoutline}% To be set by a class option
\newtcolorbox[auto counter,number within=section]{framedbox}[2][]{%
    \myboxstyle, title={#2}, #1
}
\usepackage{listofitems}
\setsepchar[*]{,*/}
\newcommand\makemyenv[2]{%
  \newenvironment{#2}{\begin{framedbox}{#1}}{\end{framedbox}}%
}
\newcommand\framedboxValues[1]{%
  \ignoreemptyitems
  \readlist*\fbvalues{#1}%
  \def\tmp{}%
  \def\zz{\noexpand\zz}%
  \foreachitem\z\in\fbvalues[]{%
    \edef\tmp{\tmp\noexpand\zz
      {\fbvalues[\zcnt,1]}{\fbvalues[\zcnt,2]}
    }%
  }%
  \let\zz\makemyenv
  \tmp
}

\begin{document}
\framedboxValues{
    Example/example, Homework/homework
}
\begin{example}
    test
\end{example}
\begin{homework}
    test
\end{homework}
\end{document}

在此处输入图片描述

相关内容