# Environment - strange behaviour

I have this document:

\documentclass{article}

\newcounter{example}[section]
\newenvironment{example}[1][]{\refstepcounter{example}\par\medskip
\noindent \textbf{Example~\theexample. #1} \rmfamily}{\medskip}

\begin{document}

\begin{example}
Test
\end{example}

\end{document}


The output looks like this:

However, if I remove [] (appearing after [1]) in the definition of the enviroment, I'll get

Can anyone explain to me why this is happening and what those braces [] after [1] actually do, please?

• The \newenvironment{example}[1][]{}{} means optional argument, enclosed in [ ], i.e. \begin{example}[foo]...\end{foo} , if you remove [] from the definition, [1] means that the environment expects an argument, it grabs the first token it gets, i.e. the T from Test: \begin{example} Test\end{example}. You should read some introduction about macro and/or environments and their arguments with {} and [] ;-) – user31729 Jul 20 '17 at 20:45
• Just a comment aside: why don't you use a theorem-like structure? – Bernard Jul 20 '17 at 20:45
• @ChristianHupfer I have read this. And it's still confusing. For example, their "boxed" enviroment doesn't have [] after [1] and it seems it's working well. – Patrik Bak Jul 20 '17 at 21:06
• @PatrikBak: The linked example does have multiple versions of boxed environments. The first boxed does not have a [1] at all -- it does not expect an argument, the second example is defined with [1] and uses Title of the Box as argument, which is centered outside the box frame. Your code usage above should read like this: \begin{example}[My nice example] Test \end{example}, if you persist on the [1][] usage and it should read \begin{example}{My nice example} Test\end{example} in the [1] case. I doubt that you want Test to be the title of your example environment – user31729 Jul 20 '17 at 21:09

There's nothing strange about the environment definition really -- the strangeness is the consequence of disregarding LaTeX macro/environment call syntax.

Using standard LaTeX macros like \newenvironment there are basically four ways of defining the example environment:

• Use no argument at all, i.e. \newenvironment{foo}{start code}{end code}
• Use a mandatory argument, that must be enclosed with a {} pair:

\newenvironment{foobar}[1]{start code}{end code}

• Use at least one optional argument in definition and decide on environment usage whether the argument is given or not:

\newenvironment{foobarother}[1][]{start code}{end code}

The empty [] means empty optional argument value, i.e. if \begin{foobarother} is used without [] the #1 is empty, otherwise specify it as \begin{foobarother}[Foobar].

If a default title should be used, say 'My nice default title', then use \newenvironment{foobarother}[1][My nice default title]{start code}{end code} which applies My nice default title if there's no optional argument specified.

• Use optional and mandatory arguments, i.e. \newenvironment{yetanotherfoobar}[2][]{start code}{end code} with \begin{yetanotherfoobar}[Some other title]{Yet another foobar}, where [...] is optional

More sophisticated ways are possible with \NewEnviron from environ package and \NewDocumentEnvironment from xparse (for example). Please note that #1 etc. can't be used in the end code of an environment defined with \newenvironment, but \NewDocumentEnvironment and \NewEnviron allow usage of the parameters in the end code section of the environment.

\documentclass{article}
\usepackage{etoolbox}

\newcounter{example}[section]
\newenvironment{examplewithoptarg}[1][]{\refstepcounter{example}\par\medskip
\noindent \textbf{Example~\theexample.\notblank{#1}{~#1}{}} \rmfamily}{\medskip}

\newenvironment{examplewitharg}[1]{\refstepcounter{example}\par\medskip
\noindent \textbf{Example~\theexample. #1} \rmfamily}{\medskip}

\newenvironment{examplewithoutargument}{\refstepcounter{example}\par\medskip
\noindent \textbf{Example~\theexample} \rmfamily}{\medskip}

\begin{document}

\begin{examplewithoptarg}% Empty optional argument
Test
\end{examplewithoptarg}

% Non-empty optional argument, title is My nice title
\begin{examplewithoptarg}[My nice title]
Test
\end{examplewithoptarg}

% Correct syntax for example with arg: Use {Foo} as argument and Foo as title, Test is the environment body content
\begin{examplewitharg}{Foo}
Test
\end{examplewitharg}

% 'Wrong' usage -- grabs F, regards it as title and then displays oo Test
\begin{examplewitharg}
Foo Test
\end{examplewitharg}

% No argument -- this has the standard title Example \theexample by definition
\begin{examplewithoutargument}
Test
\end{examplewithoutargument}

\end{document}