[Tex/LaTex] how to define commands within custom environment

environments

I am working on a custom .cls for typesetting my CV. I am trying to create a custom environment to provide formatting for job/education history. I would like to specify it as follows:

\begin{cvsection}
  \cvdate{xx-xx-xxxx}
  \cvcompany{Some company & Co.}
  \cvposition{Toilet cleaner}
  \cvcomment{I love cleanin' dem toilets!}
\end{cvsection}

So I've defined my environment and tried to use \newcommand... within the environment definition. LaTeX doesn't like that so what is the best way to approach this?

Best Answer

One purpose of organizing an environment in that way is to allow flexibility in the input.

You don't need to define the commands inside the environment; a frequently used strategy is the following:

\newcommand{\cvdate}[1]{\renewcommand{\givencvdate}{#1}}
\newcommand{\cvcompany}[1]{\renewcommand{\givencvcompany}{#1}}
\newcommand{\cvposition}[1]{\renewcommand{\givencvposition}{#1}}
\newcommand{\cvcomment}[1]{\renewcommand{\givencvcomment}{#1}}
\newcommand{\givencvdate}{REQUIRED!}
\newcommand{\givencvcompany}{REQUIRED!}
\newcommand{\givencvposition}{REQUIRED!}
\newcommand{\givencvcomment}{} % this is optional

\newenvironment{cvsection}
 {\begin{flushleft}}
 {\textbf{\givencvdate}\\
  \givencvcompany\\
  \givencvposition
  \ifx\empty\givencvcomment\else\\[.5ex] \textit{\givencvcomment}\fi
  \end{flushleft}}

In this way the order one specifies the data in the environment is irrelevant. Let's see a couple of examples

\begin{cvsection}
  \cvdate{xx-xx-xxxx}
  \cvcompany{Some company \& Co.}
  \cvposition{Toilet cleaner}
  \cvcomment{I love cleanin' dem toilets!}
\end{cvsection}

\begin{cvsection}
  \cvposition{Toilet cleaner}
  \cvdate{xx-xx-xxxx}
  \cvcompany{Another company \& Co.}
\end{cvsection}

Of course you have to adjust the definition of cvsection to suit your needs.

enter image description here