我最近为模板构建了这个小 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}