所以我有这个:
\newcommand{\boxx}[2]{
\colorbox{white}{\begin{varwidth}{\textwidth}
% Heading
\colorbox{green!30}{#1}\\
% Content
\fcolorbox{green}{yellow}{\begin{varwidth}{\textwidth}
#2
\end{varwidth}}
\end{varwidth}}
}
它的使用方式如下:
\boxx{Heading}{Some \\ fancy \\ content}
我想为我的 fcolorboy 的边框颜色和背景颜色创建第三和第四个参数。
这样我就可以做到例如:
\boxx{Heading}{Some \\ fancy \\ content}{green}
\boxx{Heading}{Some \\ fancy \\ content}{}{yellow}
\boxx{Heading}{Some \\ fancy \\ content}{blue}{red}
基本上:
\newcommand{\boxx}[4]{
% Do something to set #3, #4 a default value
\colorbox{white}{\begin{varwidth}{\textwidth}
% Heading
\colorbox{green!30}{#1}\\
% Content
\fcolorbox{#3}{#4}{\begin{varwidth}{\textwidth}
#2
\end{varwidth}}
\end{varwidth}}
}
答案1
类似于使用pgffor
和一些if
s 的解决方案:
\documentclass{article}
\usepackage{varwidth}
\usepackage{xcolor}
\usepackage{pgffor}
\newcommand{\boxx}[3][red,brown]{
\global\expandafter\let\csname mycol 0\endcsname\undefined
\global\expandafter\let\csname mycol 1\endcsname\undefined
\foreach \col[count=\i from 0] in {#1}{\global\expandafter\let\csname mycol \i\endcsname\col}
\xdef\myfirst{red}
\xdef\mysecond{brown}
\ifcsname mycol 0\endcsname\xdef\myfirst{\csname mycol 0\endcsname}\fi
\ifcsname mycol 1\endcsname\xdef\mysecond{\csname mycol 1\endcsname}\fi
% Do something to set #3, #4 a default value
\colorbox{white}{\begin{varwidth}{\textwidth}
% Heading
\colorbox{green!30}{#2}\\
% Content
\fcolorbox{\myfirst}{\mysecond}{\begin{varwidth}{\textwidth}
#3
\end{varwidth}}
\end{varwidth}}
}
\begin{document}
\boxx[green]{Heading}{Some \\ fancy \\ content}
\boxx[blue,red]{Heading}{Some \\ fancy \\ content}
\boxx[yellow,gray]{Heading}{Some \\ fancy \\ content}
\end{document}
输出:
答案2
以下示例定义了两个键 -border
和fill
,可以按任意顺序指定。键的使用提供了设置内容和颜色的上下文参考。
\documentclass{article}
\usepackage{varwidth,xcolor,xkeyval}
\makeatletter
\define@cmdkey{boxx}[boxx@]{border}{}
\define@cmdkey{boxx}[boxx@]{fill}{}
% \boxx[<options>]{<heading>}{<content>}
\newcommand{\boxx}[3][]{
\setkeys{boxx}{
border = yellow, fill = brown, % default settings
#1} % local changes to default
\noindent
\colorbox{white}{\begin{varwidth}{\textwidth}
% Heading
\colorbox{green!30}{#2} \\
% Content
\fcolorbox{\boxx@border}{\boxx@fill}{\begin{varwidth}{\textwidth}
#3
\end{varwidth}}%
\end{varwidth}}
}
\makeatother
\begin{document}
\boxx[border = green]{Heading}{Some \\ fancy \\ content}
\boxx[border = blue, fill = red]{Heading}{Some \\ fancy \\ content}
\boxx[fill = gray, border = yellow]{Heading}{Some \\ fancy \\ content}
\end{document}
在将其更改为使用可选参数指定的任何内容之前,会先设置默认值(border = yellow
和) 。fill = brown
\boxx[<options>]{<heading>}{<content>}
答案3
通过这种方法,可以省略第二个或第一个可选参数。
\documentclass{article}
\usepackage{varwidth}
\usepackage{xcolor}
\usepackage{pgffor}
\usepackage{xstring}
\newcommand{\boxx}[3][]{
\StrCut{#1}{,}{\myfirst}{\mysecond}
\IfEq{\myfirst}{}{\def\myfirst{red}}{} % first default
\IfEq{\mysecond}{}{\def\mysecond{brown}}{} % second default
\colorbox{white}{\begin{varwidth}{\textwidth}
% Heading
\colorbox{green!30}{#2}\\
% Content
\fcolorbox{\myfirst}{\mysecond}{\begin{varwidth}{\textwidth}
#3
\end{varwidth}}
\end{varwidth}}
}
\begin{document}
\boxx[]{Heading}{Some \\ fancy \\ content}
\boxx[green]{Heading}{Some \\ fancy \\ content}
\boxx[,green]{Heading}{Some \\ fancy \\ content}
\boxx[blue,red]{Heading}{Some \\ fancy \\ content}
\boxx[yellow,gray]{Heading}{Some \\ fancy \\ content}
\end{document}