Хорошо, давайте пройдемся по вашему (первому) переопределению, чтобы увидеть, что происходит:
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
Вот как LaTeX думает о том, что вы сказали:
\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
Обратите внимание, что xyzzy
является обязательным аргументом (#1
). Содержимое среды ("This is the
...") вставляется между строками 3 и 4.
Если вы напишите в своем документе следующее:
\begin{comment}% <-- missing mandatory argument
This is the contents of the environment.
\end{comment}
Тогда LaTeX примет первый токен в качестве обязательного аргумента. В этом случае первый токен - T
, первый символ содержимого среды. Таким образом, буква T
будет помещена на полях, а остальная часть текста будет отображаться в обычном абзаце.
Хорошо, поэтому для достижения того, что мы хотим, среда comment
не нуждается в аргументах. Что мы сделаем, так это создадим ящик, поместим содержимое окружения в этот ящик, а затем поместим этот ящик на поле.
Прежде чем мы начнем, если вы включаете этот код в преамбулу документа, вам нужно обернуть все это в \makeatletter
и \makeatother
, так как мы будем использовать команды со знаками at (@
) в их именах.
Сначала создадим коробку для хранения материала:
\newsavebox{\marginbox}% contains the contents of the comment environment
Далее мы начнем определять среду comment
. Мы установим команды начала и окончания среды на \relax
. Таким образом, наша команда \newenvironment
будет гарантированно работать.
\let\comment\relax% removes and previous definition of \begin{comment}
\let\endcomment\relax% removes any previous definition of \end{comment}
При этом мы можем определить нашу новую 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
}
Теперь в своем документе вы можете ввести:
\begin{comment}
This is a comment that gets printed in the margin.
\end{comment}
Так что для простоты копирования и вставки вот как будет выглядеть весь документ:
\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}