tags:

views:

346

answers:

3

How can I wrap a LaTeX command in an environment? In essence, how can I turn \somecommand{contents} into \begin{somecommand} contents \end{somecommand}? I have tried the obvious in creating a new environment as such:

\newenvironment{somecommand}[0]{
  \somecommand{
}
{
  }
}

but this causes problems with the curly brackets. Let me give a more concrete example. Say that you want to create the environment very-important and you want to use the command emph to accomplish this. An straightforward (but incorrect) solution would be to write something as

\newenvironment{very-important}[0]{
  \emph{
}
{
  }
}

The problem here is that the command works with the information that is found inside the environment, so it is not one of the opening commands of the environment, nor is it a closing command of the environment. The question is then: how can you do this?

A: 

New environment somecommand defines the macro \somecommand. You can not use macro with the same name \somecommand inside.

Moreover you should write

\newenvironment{name}{openning command}{closing commands}

rather than

\newenvironment{somecommand}[0]{ \somecommand{ } { } }

You obviously have a problem with closing commands.

Alexey Malistov
You reiterated my problem, so I modified my original question to better explain the problem I am having. I hope this clarifies it! Thanks anyway!
kvaruni
A: 

It seems that now I can guess what is the question.

\newenvironment{very-important}{\startimportant}{}
\def\startimportant#1\end{\emph{#1}\end}

\begin{very-important}
Something
\end{very-important}

This solution works well. But IMHO it is bad idea to wrap all text in the environment. Why? There are two ways to do something with the text. For example, you want to change the font and use italic.

  • The first method. \textit{sentence written in italics}
  • The second method. {\it sentence written in italics\/}

What is the difference? The thing is that first method use the second one. \it macro changes the font and the brace } changes it back. \textit macro reads the full argument, changes the font and inserts the argument again: \textit is defined roughly as follows (not exactly).

\def\texit#1{{\it#1\/}}

The first method is always doing extra work. It reads the argument twice. Almost always, you can make changes and then you can everything back.

Eventually why do you use the environment? Use macros.

\veryimportant{
   Any thought
}
Alexey Malistov
Thank you for this solution! Actually, I do not need the environment for something as trivial as emphasizing text. The main reason for providing this example is because most people will understand this, making the question and the answer applicable to many. My personal use is to embed a colorbox and some alignment in a new environment. Since colorbox is a command, I did not know how to do this. Nevertheless, for my usage it makes more sense to use an environment, not the least because it prevents clutter and a downpour of curly brackets which makes editing at a later stage quite hard. Thanks!
kvaruni
+1  A: 

This can be done with the environ package as follows:

\usepackage{environ}
...
\NewEnviron{very-important}{\emph{\BODY}}

\BODY contains the body of the environment, and environments may be nested. See the documentation for more details.

Will Robertson
Thank you, though the other solution works, the solution you propose is certainly simpler!
kvaruni