好的,让我们来看一下你(第一个)重新定义发生了什么:
1 \@ifundefined{comment}{}{
2 \renewenvironment{comment}[1]
3 {\begingroup\marginpar{\bgroup#1\egroup}}
4 {\endgroup}}
以下是LaTeX对您提供的信息的处理方式:
这是LaTeX思考您所提供信息的方式:
\begin{comment}{xyzzy}
This is the contents of the environment.
\end{comment}
请注意,
xyzzy
是必需的参数(
#1
)。环境的内容(“
This is the
...”)插入在第 3 和第 4 行之间。
如果您在文档中编写以下内容:
\begin{comment}
This is the contents of the environment.
\end{comment}
然后LaTeX将把第一个标记作为必需的参数。在这种情况下,第一个标记是环境内容的第一个字符“T”。因此,字母“T”将放置在边距中,其余文本将显示在普通段落中。
好的,为了实现我们想要的效果,“comment”环境不需要任何参数。我们将创建一个框,将环境的内容放入该框中,然后将该框放置在边距中。
在开始之前,如果您将此代码包含在文档的导言部分中,则需要将其全部包装在“\makeatletter”和“\makeatother”中,因为我们将使用名称中带有符号“@”的命令。
首先,让我们创建一个框来存储材料:
\newsavebox{\marginbox}% contains the contents of the comment environment
接下来,我们将开始定义comment
环境。我们将把环境的开始和结束命令设置为\relax
。这样我们的\newenvironment
命令就能够保证正常工作。
\let\comment\relax
\let\endcomment\relax
首先,我们可以定义一个新的comment
环境:
\newenvironment{comment}{
\begin{lrbox}{\marginbox}
\begin{minipage}{\marginparwidth}
\footnotesize
}{
\end{minipage}
\end{lrbox}
\marginpar{\usebox{\marginbox}}
}
现在,在您的文档中,您可以输入:
\begin{comment}
This is a comment that gets printed in the margin.
\end{comment}
为了方便复制和粘贴,以下是完整文档的示例:
\documentclass{article}
\makeatletter
\newsavebox{\marginbox}
\let\comment\relax
\let\endcomment\relax
\newenvironment{comment}{
\begin{lrbox}{\marginbox}
\begin{minipage}{\marginparwidth}
\footnotesize
}{
\end{minipage}
\end{lrbox}
\marginpar{\usebox{\marginbox}}
}
\makeatother
\usepackage{lipsum}
\begin{document}
Hello, world!
\begin{comment}
This is a comment that gets printed in the margin.
\end{comment}
\lipsum
\end{document}
\renewenvironment
命令工作方式的轻微误解;当我第一次遇到它时,它也让我感到困惑,因为环境的内容不是由#1
指定的--相反,你只需编写“环境内容之前”的命令和“环境内容之后”的命令即可。 - godbyk