为可选参数提供默认值

为可选参数提供默认值

所以我有这个:

\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和一些ifs 的解决方案:

\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

以下示例定义了两个键 -borderfill,可以按任意顺序指定。键的使用提供了设置内容和颜色的上下文参考。

在此处输入图片描述

\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}

相关内容