我写了一个红色的课程摘要框。此框包含下列答案. 它使用\NewTColorBox
和xparse
(我不太明白)。
我希望能够将这种颜色作为一个参数,以便我可以生成几种颜色的摘要。
此框已有一个可选参数:学年。
如何添加第二个可选参数:颜色?
是否可以确保两个可选参数各自具有默认值,以便能够提供:
- 或者两个参数?
- 是其中之一吗?
- 还是没有?
\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
可以区分#1
(A
在这里)和#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}
答案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}