使用LyX我试图将“评论”转换为“边缘笔记”。
我尝试了几件事,但没有运气。
最好的镜头是这样的:
\makeatletter
\@ifundefined{comment}{}{%
\renewenvironment{comment}[1]%
{\begingroup\marginpar{\bgroup#1\egroup}}%
{\endgroup}}
\makeatother
或者像这样:
\@ifundefined{comment}{}{%
\renewenvironment{comment}%
{\marginpar{}%
{}}%
但我得到的只是转换文本的第一个字符。就像在这张图片中一样:
我搜索了很多试图找到如何解决这个问题,但没有运气。我找到了正在发生的事情的解释:
意外输出 新字体中只有一个字符 您以为您在选择的文本上更改了字体,但只有第一个字符出现在新字体中。 您最有可能使用命令而不是声明。该命令应该以文本作为参数。如果不对文本进行分组,则只传递第一个字符作为参数。
我不知道并且无法找到的是如何对文本进行分组。
希望有人能帮助我: - )
非常感谢。
最诚挚的问候,
迭 (diegostex)
答案 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}}