Okay, let's walk through your (first) redefinition to see what's happening:
1 \@ifundefined{comment}{}{% only do this if the comment environment has been defined
2 \renewenvironment{comment}[1]% redefining a 'comment' environment with one mandatory argument
3 {\begingroup\marginpar{\bgroup#1\egroup}}% put the mandatory argument inside a marginpar
4 {\endgroup}}% close the environment
Here's how LaTeX is thinking about what you've told it:
\begin{comment}{xyzzy}% <-- note the mandatory argument (runs line 3)
This is the contents of the environment.
\end{comment}% <-- this is where LaTeX runs line 4
Note that xyzzy
is the mandatory argument (#1
). The contents of the environment ("This is the
...") are inserted between lines 3 and 4.
If you write the following in your document:
\begin{comment}% <-- missing mandatory argument
This is the contents of the environment.
\end{comment}
Then LaTeX will take the first token as the mandatory argument. In this case, the first token is T
, the first character of the environment contents. So the letter T
will be put in the margin and the remainder of the text will show up in a normal paragraph.
Okay, so to achieve what we want, the comment
environment doesn't need any arguments. What we'll do is create a box, put the contents of the environment in that box, and then place that box in the margin.
Before we get started, if you're including this code in the preamble of a document, you'll need to wrap it all in \makeatletter
and \makeatother
since we'll be using commands with at signs (@
) in their names.
First, let's create a box to store the material in:
\newsavebox{\marginbox}% contains the contents of the comment environment
Next, we'll start defining the comment
environment. We'll set the environment begin and end commands to \relax
. That way our \newenvironment
command will be guaranteed to work.
\let\comment\relax% removes and previous definition of \begin{comment}
\let\endcomment\relax% removes any previous definition of \end{comment}
With that out of the way, we can define our new comment
environment:
\newenvironment{comment}{%
\begin{lrbox}{\marginbox}% store the contents of the environment in a box named \marginbox
\begin{minipage}{\marginparwidth}% create a box with the same width as the marginpar width
\footnotesize% set any font or other style changes you'd like
}{% the following lines are for the \end{comment} command
\end{minipage}% close the minipage
\end{lrbox}% close the box
\marginpar{\usebox{\marginbox}}% typeset the box in the margin
}
Now, in your document, you can type:
\begin{comment}
This is a comment that gets printed in the margin.
\end{comment}
So just for ease of copying and pasting, here's what a complete document would look like:
\documentclass{article}
\makeatletter
\newsavebox{\marginbox}% contains the contents of the comment environment
\let\comment\relax% removes and previous definition of \begin{comment}
\let\endcomment\relax% removes any previous definition of \end{comment}
\newenvironment{comment}{%
\begin{lrbox}{\marginbox}% store the contents of the environment in a box named \marginbox
\begin{minipage}{\marginparwidth}% create a box with the same width as the marginpar width
\footnotesize% set any font or other style changes you'd like
}{% the following lines are for the \end{comment} command
\end{minipage}% close the minipage
\end{lrbox}% close the box
\marginpar{\usebox{\marginbox}}% typeset the box in the margin
}
\makeatother
\usepackage{lipsum}% just provides some filler text
\begin{document}
Hello, world!
\begin{comment}
This is a comment that gets printed in the margin.
\end{comment}
\lipsum
\end{document}