21

I have a GrayBox environment defined as follows.

It is used \begin{GrayBox}...\end{GrayBox} or \begin{GrayBox}[\textwidth]...\end{GrayBox}, that is, it can pass optional parameter to the environment.

I guess #1 is the setup for default value, and #2 is for setup for the value given.

Question

How is #2 possible? I mean, is it LaTeX's rule that if #1 is not given, the default value in [] is used instead? Is there any reference about this? Is the same technique can be applied to \newcommand?

\newlength{\RoundedBoxWidth}
\newsavebox{\GrayRoundedBox}
\newenvironment{GrayBox}[1][\dimexpr\textwidth-4.5ex]% **** #1
   {\setlength{\RoundedBoxWidth}{\dimexpr#1} **** #2
    \begin{lrbox}{\GrayRoundedBox}
       \begin{minipage}{\RoundedBoxWidth}}%
   {   \end{minipage}
    \end{lrbox}
    \begin{center}
    \begin{tikzpicture}%
       \draw node[draw=black,fill=black!10,rounded corners,%
             inner sep=2ex,text width=\RoundedBoxWidth]%
             {\usebox{\GrayRoundedBox}};
    \end{tikzpicture}
    \end{center}}
3
  • Why is there a ??? in the question, BTW? Was it intentional or some Unicode char that got corrupted? Commented Aug 4, 2010 at 4:24
  • @ShreevatsaR : Just a mark to ask some question.
    – prosseek
    Commented Aug 4, 2010 at 4:30
  • BTW: you might want to add a \relax after the expression evaluated by \dimexpr just to be on the safe side, even if it's not strictly necessary here.
    – cgnieder
    Commented Dec 24, 2012 at 11:13

1 Answer 1

34

It is LaTeX's rule that if the optional argument is not present, then #1 takes on the default value. That is,

\documentclass{article}
\newenvironment{hello}[1][world]{\noindent Hello #1, }{Bye now!\\}
\begin{document}
  \begin{hello}
    nice to meet you.
  \end{hello}
  \begin{hello}[Bob]
    glad you could make it.
  \end{hello}
\end{document}

will produce

Hello world, nice to meet you. Bye now!
Hello Bob, glad you could make it. Bye now!

as its output. The same is true for commands defined with optional parameters, as in

\documentclass{article}
\newcommand{\hi}[1][world!]{\noindent Hello #1}
\begin{document}
  \hi \\
  \hi[Bob]
\end{document}

which results in the output

Hello world!
Hello Bob

3
  • Your example mixes environments and commands! Whilst environments are just fancy commands, would it be okay to edit it (either you or I) in to two examples: one an environment (with \begin{hello} ... \end{hello} and one a command? Commented Aug 4, 2010 at 7:48
  • Oh wow, can't believe I did that! Thanks for pointing it out Andrew, hopefully this version is a little more suitable. Commented Aug 4, 2010 at 17:43
  • Yup, looks fine now. Commented Aug 4, 2010 at 17:48

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .