如何在 tcolorbox 中拥有两个可选参数?

如何在 tcolorbox 中拥有两个可选参数?

我写了一个红色的课程摘要框。此框包含下列答案. 它使用\NewTColorBoxxparse (我不太明白)

我希望能够将这种颜色作为一个参数,以便我可以生成几种颜色的摘要。

此框已有一个可选参数:学年。

  • 如何添加第二个可选参数:颜色?

  • 是否可以确保两个可选参数各自具有默认值,以便能够提供:

    • 或者两个参数?
    • 是其中之一吗?
    • 还是没有?

博伊特 第 1 页

博伊特 第 2 页

\documentclass{article}
\usepackage{lipsum}
\usepackage{xfrac}
\usepackage[most]{tcolorbox}

\NewDocumentCommand{\currentschoolyear}{+o}{%
  \IfValueTF{#1}{%
    \sfrac{#1}{\the\numexpr#1+1}
  }{%
    \ifnum\month<9%
    \sfrac{\the\numexpr\year-1}{\the\year}%
    \else
    \sfrac{\the\year}{\the\numexpr\year+1}%
    \fi
  }%
}

%\month=7
%\day=31

%%%%%%%%%%%%%%%%%%%%%%%%%%%
% boîte resumé

\def\couleurresume{red}%

%% style du titre « résumé du cours »
%\tcbset{titreresume/.style={
%    boxed title style={
%        colframe=#2!50,%
%        colback=#2!10,%
%        coltext=blue,%
%    leftrule=1.5mm,rightrule=1.5mm,toprule=1.5pt,bottom=0pt,boxsep=1pt}}
%}
%
%% style des soustitres des résumés
%\tcbset{soustitre/.style={
%    subtitle style={%
%    colback=#2!7,%
%    colframe=#2!50,%
%    boxsep=1mm,
%    fontupper={\sffamily\bfseries\large\selectfont\color{#2!63!black}}}}
%}

% boîte créant la boîte résumé
\NewTColorBox[auto counter]{resume}{+o+O{red}+m}{%
    minipage boxed title*=-106mm,
    attach boxed title to top center={yshift=-3mm,xshift=-\linewidth/5},
    enhanced,
    nobeforeafter,
    lower separated=false,
    IfValueTF={#1}{%
      before upper={\textcolor{#2!63!black}{\currentschoolyear[#1] \hfill{#3}\hfill\thetcbcounter/\ref{nombre-de-resume}}},
    }{%
      before upper={\textcolor{#2!63!black}{\currentschoolyear \hfill{#3}\hfill\thetcbcounter/\ref{nombre-de-resume}}},
    },
    colframe=#2!50,%
    colback=white,%
    coltitle=#2!63!black,%
    leftrule=3mm,rightrule=3mm,
    toprule=2pt,bottomrule=2pt,
    left=3pt,right=0pt,top=3mm,
    fonttitle=\sffamily\bfseries\large,
%    titreresume,
    boxed title style={
        colframe=#2!50,%
        colback=#2!10,%
        coltext=blue,%
    leftrule=1.5mm,rightrule=1.5mm,toprule=1.5pt,bottom=0pt,boxsep=1pt},
%    soustitre,
    subtitle style={%
    colback=#2!7,%
    colframe=#2!50,%
    boxsep=1mm,
    fontupper={\sffamily\bfseries\large\selectfont\color{#2!63!black}}},
    title={\normalsize Résumé}
}

\usepackage{atveryend}
\makeatletter
\AfterLastShipout{%
  \immediate\write\@auxout
  {\string\newlabel{nombre-de-resume}{{\thetcb@cnt@resume}{}}}%
}
\makeatother
\begin{document}

\begin{resume}[2017]{chapitre 1}
\tcbsubtitle{Définition}

\lipsum[1]
\end{resume}

\newpage

\begin{resume}[2018,blue]{chapitre 1}

\tcbsubtitle{Propriétés}
\lipsum[2]
\end{resume}

%\show\tcbcounter
\end{document}

答案1

OP 自我回答的一个细微变化,将第二个可选参数移至参数列表的末尾,即它将成为第三个参数,并将o第一个参数的 - 类型转换为O

的语法\foo[A][B]{...}设计不好,难以处理TeX/LaTeX,因为它无法决定什么

\foo[A]{}

应该是。A第一个可选参数还是第二个可选参数?这不清楚。

-类型o说明符xparse提供了一种方法来决定是否省略第一个或第二个可选参数,但遗憾的是,它不允许使用默认参数。

\foo[A]{...}[B]但是是可以清晰识别的,并且TeX可以区分#1A在这里)和#3(存在B),因此 \foo[A]{...} and\foo{...}[B]` 是定义明确的

\documentclass{article}
\usepackage{lipsum}
\usepackage{xfrac}
\usepackage[most]{tcolorbox}


\NewDocumentCommand{\currentschoolyear}{+O{\the\year}}{%
  \ifnum#1=\the\year%
  \ifnum\month<9%
  \sfrac{\the\numexpr#1-1}{#1}%     #1=2018 --> 2017/2018
  \else
  \sfrac{#1}{\the\numexpr#1+1}%      #1=2018 --> 2018/2019
  \fi
  \else
  \sfrac{#1}{\the\numexpr#1+1}%      
  \fi
}


% For checking reasons only...
%\year=2017
%\month=6

%%%%%%%%%%%%%%%%%%%%%%%%%%%
% boîte resumé

\def\couleurresume{red}%

%% style du titre « résumé du cours »
%\tcbset{titreresume/.style={
%    boxed title style={
%        colframe=#2!50,%
%        colback=#2!10,%
%        coltext=blue,%
%    leftrule=1.5mm,rightrule=1.5mm,toprule=1.5pt,bottom=0pt,boxsep=1pt}}
%}
%
%% style des soustitres des résumés
%\tcbset{soustitre/.style={
%    subtitle style={%
%    colback=#2!7,%
%    colframe=#2!50,%
%    boxsep=1mm,
%    fontupper={\sffamily\bfseries\large\selectfont\color{#2!63!black}}}}
%}

% boîte créant la boîte résumé
\NewTColorBox[auto counter]{resume}{+O{\the\year}+m+O{red}}{%
    minipage boxed title*=-106mm,
    attach boxed title to top center={yshift=-3mm,xshift=-\linewidth/5},
    enhanced,
    nobeforeafter,
    lower separated=false,
%    IfValueTF={#1}{%
    before upper={\textcolor{#3!63!black}{\currentschoolyear[#1] \hfill{#2}\hfill\thetcbcounter/\ref{nombre-de-resume}}},
    % }{%
    %   before upper={\textcolor{#2!63!black}{\currentschoolyear \hfill{#2}\hfill\thetcbcounter/\ref{nombre-de-resume}}},
    % },
    colframe=#3!50,%
    colback=white,%
    coltitle=#3!63!black,%
    leftrule=3mm,rightrule=3mm,
    toprule=2pt,bottomrule=2pt,
    left=3pt,right=0pt,top=3mm,
    fonttitle=\sffamily\bfseries\large,
%    titreresume,
    boxed title style={
        colframe=#3!50,%
        colback=#3!10,%
        coltext=blue,%
    leftrule=1.5mm,rightrule=1.5mm,toprule=1.5pt,bottom=0pt,boxsep=1pt},
%    soustitre,
    subtitle style={%
    colback=#3!7,%
    colframe=#3!50,%
    boxsep=1mm,
    fontupper={\sffamily\bfseries\large\selectfont\color{#3!63!black}}},
    title={\normalsize Résumé}
}

\usepackage{atveryend}
\makeatletter
\AfterLastShipout{%
  \immediate\write\@auxout
  {\string\newlabel{nombre-de-resume}{{\thetcb@cnt@resume}{}}}%
}
\makeatother
\begin{document}

% No optional arguments -> defaults to current year and red
\begin{resume}{chapitre 1}
  \tcbsubtitle{Définition}
  \lipsum[1]
\end{resume}


% both optional arguments -> 2016/2017 and blue
\begin{resume}[2016]{chapitre 1}[blue]
\tcbsubtitle{Définition}

\lipsum[1]
\end{resume}


\newpage

% Only the first optional argument -> 2020 and red
\begin{resume}[2020]{chapitre 1}

\tcbsubtitle{Propriétés}
\lipsum[2]
\end{resume}

% Only the second optional argument  -> current year and green
\begin{resume}{chapitre 1}[green]

\tcbsubtitle{Propriétés}
\lipsum[2]
\end{resume}




%\show\tcbcounter
\end{document}

在此处输入图片描述 在此处输入图片描述

答案2

我刚刚发现,只需将每个可选参数放在方括号中。

\begin{resume}[2018][blue]{chapitre 1}

我还没有设法确保我可以通过仅指示颜色来调用此框(未注明学年)

代码:

\documentclass{article}
\usepackage{lipsum}
\usepackage{xfrac}
\usepackage[most]{tcolorbox}

\NewDocumentCommand{\currentschoolyear}{+o}{%
  \IfValueTF{#1}{%
    \sfrac{#1}{\the\numexpr#1+1}
  }{%
    \ifnum\month<9%
    \sfrac{\the\numexpr\year-1}{\the\year}%
    \else
    \sfrac{\the\year}{\the\numexpr\year+1}%
    \fi
  }%
}

%\month=7
%\day=31

%%%%%%%%%%%%%%%%%%%%%%%%%%%
% boîte resumé

\def\couleurresume{red}%

%% style du titre « résumé du cours »
%\tcbset{titreresume/.style={
%    boxed title style={
%        colframe=#2!50,%
%        colback=#2!10,%
%        coltext=blue,%
%    leftrule=1.5mm,rightrule=1.5mm,toprule=1.5pt,bottom=0pt,boxsep=1pt}}
%}
%
%% style des soustitres des résumés
%\tcbset{soustitre/.style={
%    subtitle style={%
%    colback=#2!7,%
%    colframe=#2!50,%
%    boxsep=1mm,
%    fontupper={\sffamily\bfseries\large\selectfont\color{#2!63!black}}}}
%}

% boîte créant la boîte résumé
\NewTColorBox[auto counter]{resume}{+o+O{red}+m}{%
    minipage boxed title*=-106mm,
    attach boxed title to top center={yshift=-3mm,xshift=-\linewidth/5},
    enhanced,
    nobeforeafter,
    lower separated=false,
    IfValueTF={#1}{%
      before upper={\textcolor{#2!63!black}{\currentschoolyear[#1] \hfill{#3}\hfill\thetcbcounter/\ref{nombre-de-resume}}},
    }{%
      before upper={\textcolor{#2!63!black}{\currentschoolyear \hfill{#3}\hfill\thetcbcounter/\ref{nombre-de-resume}}},
    },
    colframe=#2!50,%
    colback=white,%
    coltitle=#2!63!black,%
    leftrule=3mm,rightrule=3mm,
    toprule=2pt,bottomrule=2pt,
    left=3pt,right=0pt,top=3mm,
    fonttitle=\sffamily\bfseries\large,
%    titreresume,
    boxed title style={
        colframe=#2!50,%
        colback=#2!10,%
        coltext=blue,%
    leftrule=1.5mm,rightrule=1.5mm,toprule=1.5pt,bottom=0pt,boxsep=1pt},
%    soustitre,
    subtitle style={%
    colback=#2!7,%
    colframe=#2!50,%
    boxsep=1mm,
    fontupper={\sffamily\bfseries\large\selectfont\color{#2!63!black}}},
    title={\normalsize Résumé}
}

\usepackage{atveryend}
\makeatletter
\AfterLastShipout{%
  \immediate\write\@auxout
  {\string\newlabel{nombre-de-resume}{{\thetcb@cnt@resume}{}}}%
}
\makeatother
\begin{document}

\begin{resume}[2017]{chapitre 1}
\tcbsubtitle{Définition}

\lipsum[1]
\end{resume}

\newpage

\begin{resume}[2018][blue]{chapitre 1}

\tcbsubtitle{Propriétés}
\lipsum[2]
\end{resume}

%\show\tcbcounter
\end{document}

默认红盒子

蓝色之船

答案3

那么对两个可选参数使用不同的分隔符怎么样?例如:

\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{xparse}
\NewDocumentCommand\Test{D(){red}O{2018}+m}{%
    Color: #1; Year: #2; mandatory: #3\par
}
\begin{document}
\Test{only mandatory}
\Test(blue){with color}
\Test[2020]{with year}
\Test(green)[1999]{with everything}
\end{document}

这种方法很有效,而且在我看来,甚至更容易记住。

在此处输入图片描述

您可以将其与Christian Hupfer 的回答获取当前学年(将O此处的改为o)。

您还可以添加第三个可选参数,例如,用尖括号将以逗号分隔的字符串添加到选项中tcolorbox

应用于您的 nsMWE:

\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{lipsum}
\usepackage{xfrac}
\usepackage[most]{tcolorbox}


\NewDocumentCommand{\currentschoolyear}{+O{\the\year}}{%
  \ifnum\month<9%
  \sfrac{\the\numexpr#1-1}{#1}%     #1=2018 --> 2017/2018
  \else
  \sfrac{#1}{\the\numexpr#1+1}%      #1=2018 --> 2018/2019
  \fi
}

\NewTColorBox[auto counter]{resume}{D<>{}D(){red}O{\the\year}+m}{%
    minipage boxed title*=-106mm,
    attach boxed title to top center={yshift=-3mm,xshift=-\linewidth/5},
    enhanced,
    nobeforeafter,
    lower separated=false,
    before upper={\textcolor{#2!63!black}{\currentschoolyear[#3] \hfill{#4}\hfill\thetcbcounter/\ref{nombre-de-resume}}},
    colframe=#2!50,%
    colback=white,%
    coltitle=#2!63!black,%
    leftrule=3mm,rightrule=3mm,
    toprule=2pt,bottomrule=2pt,
    left=3pt,right=0pt,top=3mm,
    fonttitle=\sffamily\bfseries\large,
%    titreresume,
    boxed title style={
        colframe=#2!50,%
        colback=#2!10,%
        coltext=blue,%
    leftrule=1.5mm,rightrule=1.5mm,toprule=1.5pt,bottom=0pt,boxsep=1pt},
%    soustitre,
    subtitle style={%
    colback=#2!7,%
    colframe=#2!50,%
    boxsep=1mm,
    fontupper={\sffamily\bfseries\large\selectfont\color{#2!63!black}}},
    title={\normalsize Résumé}, 
    #1
}

\usepackage{atveryend}
\makeatletter
\AfterLastShipout{%
  \immediate\write\@auxout
  {\string\newlabel{nombre-de-resume}{{\thetcb@cnt@resume}{}}}%
}
\makeatother
\begin{document}

% No optional arguments -> defaults to current year and red
\begin{resume}{chapitre 1}
  \tcbsubtitle{Définition}
  \lipsum[1]
\end{resume}


% both optional arguments -> 2021 and blue
\begin{resume}(blue)[2021]{chapitre 1}
\tcbsubtitle{Définition}

\lipsum[1]
\end{resume}


\newpage

% Only the first optional argument -> 2020 and red
\begin{resume}[2020]{chapitre 1}

\tcbsubtitle{Propriétés}
\lipsum[2]
\end{resume}

% Only the second optional argument  -> current year and green
\begin{resume}(green){chapitre 1}

\tcbsubtitle{Propriétés}
\lipsum[2]
\end{resume}

%  New optional argument - add whatever to the options to the tcolorbox 
\begin{resume}<colback=red, toprule=1cm>(green){chapitre 1}

\tcbsubtitle{Propriétés}
\lipsum[2]
\end{resume}



%\show\tcbcounter
\end{document}

第1页 第2页

答案4

我已经修改了简历定义,因此它包含一个参数,即 OP 命名\couleurresume的我在需要时\def\couleurrsume{red}使用的参数。\def\couleurresume{blue}

\documentclass{article}
\usepackage{lipsum}
\usepackage{xfrac}
\usepackage[most]{tcolorbox}

\NewDocumentCommand{\currentschoolyear}{+o}{%
  \IfValueTF{#1}{%
    \sfrac{#1}{\the\numexpr#1+1}
  }{%
    \ifnum\month<9%
    \sfrac{\the\numexpr\year-1}{\the\year}%
    \else
    \sfrac{\the\year}{\the\numexpr\year+1}%
    \fi
  }%
}

%\month=7
%\day=31

%%%%%%%%%%%%%%%%%%%%%%%%%%%
% boîte resumé


%% style du titre « résumé du cours »
%\tcbset{titreresume/.style={
%    boxed title style={
%        colframe=#2!50,%
%        colback=#2!10,%
%        coltext=blue,%
%    leftrule=1.5mm,rightrule=1.5mm,toprule=1.5pt,bottom=0pt,boxsep=1pt}}
%}
%
%% style des soustitres des résumés
%\tcbset{soustitre/.style={
%    subtitle style={%
%    colback=#2!7,%
%    colframe=#2!50,%
%    boxsep=1mm,
%    fontupper={\sffamily\bfseries\large\selectfont\color{#2!63!black}}}}
%}

% boîte créant la boîte résumé
\NewTColorBox[auto counter]{resume}{+o+O{\couleurresume}+m}{% %<--- modified
    minipage boxed title*=-106mm,
    attach boxed title to top center={yshift=-3mm,xshift=-\linewidth/5},
    enhanced,
    nobeforeafter,
    lower separated=false,
    IfValueTF={#1}{%
      before upper={\textcolor{#2!63!black}{\currentschoolyear[#1] \hfill{#3}\hfill\thetcbcounter/\ref{nombre-de-resume}}},
    }{%
      before upper={\textcolor{#2!63!black}{\currentschoolyear \hfill{#2}\hfill\thetcbcounter/\ref{nombre-de-resume}}},
    },
    colframe=#2!50,%
    colback=white,%
    coltitle=#2!63!black,%
    leftrule=3mm,rightrule=3mm,
    toprule=2pt,bottomrule=2pt,
    left=3pt,right=0pt,top=3mm,
    fonttitle=\sffamily\bfseries\large,
%    titreresume,
    boxed title style={
        colframe=#2!50,%
        colback=#2!10,%
        coltext=blue,%
    leftrule=1.5mm,rightrule=1.5mm,toprule=1.5pt,bottom=0pt,boxsep=1pt},
%    soustitre,
    subtitle style={%
    colback=#2!7,%
    colframe=#2!50,%
    boxsep=1mm,
    fontupper={\sffamily\bfseries\large\selectfont\color{#2!63!black}}},
    title={\normalsize Résumé}
}

\usepackage{atveryend}
\makeatletter
\AfterLastShipout{%
  \immediate\write\@auxout
  {\string\newlabel{nombre-de-resume}{{\thetcb@cnt@resume}{}}}%
}
\makeatother
\begin{document}
\def\couleurresume{red}%
\begin{resume}[2017]{chapitre 1}
\tcbsubtitle{Définition}

\lipsum[1]
\end{resume}

\def\couleurresume{blue}%
\begin{resume}[2018]{chapitre 1}

\tcbsubtitle{Propriétés}
\lipsum[2]
\end{resume}

%\show\tcbcounter
\end{document}

在此处输入图片描述

相关内容