在我的书中,我有很多 tcolorbox 可以使用。它们略有不同,因此我添加了一个宏,根据参数决定绘制哪个 tcolorbox。显然,这会产生大量源代码(每个 tcolorbox 一个命令)。
因此我尝试减少它,但效果并不理想。
\documentclass{article}
\usepackage[many]{tcolorbox}
\usepackage{calc}
\usetikzlibrary{calc}
\definecolor{mp}{RGB}{240,240,240} % Farbe für + -
\newlength{\bs}\setlength{\bs}{30pt} % Basislänge
\newlength{\ns}
\newcommand{\iround}{
interior titled code={
\fill[mp,rounded corners=15pt]
([xshift=-1pt,yshift=-10pt]interior.west)
rectangle
([xshift=\ns,yshift=3pt]title.north west);
\draw[rounded corners=15pt,color=mp, line width=1pt,fill=white]
(frame.south west) --
(title.south west) --
(title.south east) --
(frame.south east) -- cycle;}
}
\newcommand{\ibs}[3]{\scantokens{%
\setlength{\ns}{\widthof{#1}+\bs}
\begin{tcolorbox}[
arc=15pt,
outer arc=15pt,
title=#1,
coltitle=black,
enhanced,
freelance,
frame code={},
\iround
]
\raggedright #2
\end{tcolorbox}}}
\begin{document}
\ibs{title}{A}{B}
\end{document}
答案1
如果您仅保留的定义中的\fill
和部分,并将内部标题代码移动到 的参数,您的代码就可以工作:\draw
\iround
tcolorbox
\documentclass{article}
\usepackage[many]{tcolorbox}
\usepackage{calc}
\usetikzlibrary{calc}
\definecolor{mp}{RGB}{240,240,240} % Farbe für + -
\newlength{\bs}\setlength{\bs}{30pt} % Basislänge
\newlength{\ns}
\newcommand{\iround}{
\fill[mp,rounded corners=15pt]
([xshift=-1pt,yshift=-10pt]interior.west)
rectangle
([xshift=\ns,yshift=3pt]title.north west);
\draw[rounded corners=15pt,color=mp, line width=1pt,fill=white]
(frame.south west) --
(title.south west) --
(title.south east) --
(frame.south east) -- cycle;
}
\newcommand{\ibs}[3]{\scantokens{% I am not sure why \cantokens was used here
\setlength{\ns}{\widthof{#1}+\bs}
\begin{tcolorbox}[
arc=15pt,
outer arc=15pt,
title=#1,
coltitle=black,
enhanced,
freelance,
frame code={},
interior titled code=\iround
]
\raggedright #2
\end{tcolorbox}}}
\begin{document}
\ibs{title}{A}{B}
\end{document}
原因是存在扩展问题,类似于使用字符串列出 tikz-cd 箭头的参数;史蒂文·B·塞格莱特斯在他的回答中表明使用\expandafter
s 也可能在这里起作用(我没有测试过),但我认为(正如他自己在回答中提到的那样)其他方法(比如我在这里提出的方法)可能更安全。
另一种选择是使用样式,例如:
\tcbset{
iround/.style={
interior titled code={
\fill[mp,rounded corners=15pt]
([xshift=-1pt,yshift=-10pt]interior.west)
rectangle
([xshift=\ns,yshift=3pt]title.north west);
\draw[rounded corners=15pt,color=mp, line width=1pt,fill=white]
(frame.south west) --
(title.south west) --
(title.south east) --
(frame.south east) -- cycle;}
}
}
然后使用这种风格tcolorbox
:
\documentclass{article}
\usepackage[many]{tcolorbox}
\usepackage{calc}
\usetikzlibrary{calc}
\definecolor{mp}{RGB}{240,240,240} % Farbe für + -
\newlength{\bs}\setlength{\bs}{30pt} % Basislänge
\newlength{\ns}
\tcbset{
iround/.style={
interior titled code={
\fill[mp,rounded corners=15pt]
([xshift=-1pt,yshift=-10pt]interior.west)
rectangle
([xshift=\ns,yshift=3pt]title.north west);
\draw[rounded corners=15pt,color=mp, line width=1pt,fill=white]
(frame.south west) --
(title.south west) --
(title.south east) --
(frame.south east) -- cycle;}
}
}
\newcommand{\ibs}[3]{\scantokens{% I am not sure why \cantokens was used here
\setlength{\ns}{\widthof{#1}+\bs}
\begin{tcolorbox}[
arc=15pt,
outer arc=15pt,
title=#1,
coltitle=black,
enhanced,
freelance,
frame code={},
iround
]
\raggedright #2
\end{tcolorbox}}}
\begin{document}
\ibs{title}{A}{B}
\end{document}
使用哪种方法将取决于实际意图;不幸的是,这个问题没有包含足够的实际用例信息来决定哪一个是最佳选择。
另一件引起我注意的事情是使用\scantokens
;再次出现的问题是,发布的 MWE 没有提供足够的信息来决定这是否真的有必要。