减少不同 tcolorbox 宏的源代码

减少不同 tcolorbox 宏的源代码

在我的书中,我有很多 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\iroundtcolorbox

\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·塞格莱特斯在他的回答中表明使用\expandafters 也可能在这里起作用(我没有测试过),但我认为(正如他自己在回答中提到的那样)其他方法(比如我在这里提出的方法)可能更安全。

在此处输入图片描述

另一种选择是使用样式,例如:

\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 没有提供足够的信息来决定这是否真的有必要。

相关内容