Latex:将“Comment”转换为“Marginal Note”

时间:2010-02-13 19:05:01

标签: latex comments lyx

使用LyX我试图将“评论”转换为“边缘笔记”。

我尝试了几件事,但没有运气。

最好的镜头是这样的:

\makeatletter

\@ifundefined{comment}{}{%

\renewenvironment{comment}[1]%

{\begingroup\marginpar{\bgroup#1\egroup}}%

{\endgroup}}

\makeatother

或者像这样:

\@ifundefined{comment}{}{%

\renewenvironment{comment}%

{\marginpar{}%

{}}%

但我得到的只是转换文本的第一个字符。就像在这张图片中一样:

IMAGE MARGINAL NOTE

我搜索了很多试图找到如何解决这个问题,但没有运气。我找到了正在发生的事情的解释:

  

意外输出   新字体中只有一个字符   您以为您在选择的文本上更改了字体,但只有第一个字符出现在新字体中。   您最有可能使用命令而不是声明。该命令应该以文本作为参数。如果不对文本进行分组,则只传递第一个字符作为参数。

我不知道并且无法找到的是如何对文本进行分组。

希望有人能帮助我: - )

非常感谢。

最诚挚的问候,

迭 (diegostex)

3 个答案:

答案 0 :(得分:5)

好的,让我们逐步完成你的(第一次)重新定义,看看发生了什么:

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中,因为我们将使用命令在他们名下的标志(@)。

首先,让我们创建一个框来存储材料:

\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}

答案 1 :(得分:4)

我认为你想要的是宏而不是环境。 这是我一直用的东西。宏定义:

\def\remark#1{\marginpar{\raggedright\hbadness=10000
    \def\baselinestretch{0.8}\tiny
    \it #1\par}}

样品使用:

\remark{Interesting comparisons with the 
   internal language of \citet{harper:type-theoretic}}

我为一些共同作者做了变化,例如,\remark在它标记的文本中留下了一个小的固定宽度的菱形。

答案 2 :(得分:1)

我以同样的方式使用LyX注释,并找到了以下解决方案:

\usepackage{environ}
\let\comment\relax% removes and previous definition of \begin{comment}
\let\endcomment\relax% removes any previous definition of \end{comment}
\NewEnviron{comment}{\marginpar{\BODY}}