using LyX I'm trying to convert the "comments" into "marginal notes".
I tried several things but without luck.
The best shot was like this:
\makeatletter
\@ifundefined{comment}{}{%
\renewenvironment{comment}[1]%
{\begingroup\marginpar{\bgroup#1\egroup}}%
{\endgroup}}
\makeatother
or like this:
\@ifundefined{comment}{}{%
\renewenvironment{comment}%
{\marginpar{}%
{}}%
But what I get is only the first character of the text converted. Like in this image:
IMAGE MARGINAL NOTE
I searched a lot trying to find how to solve this but without luck. I found the explanation of what is happening:
Unexpected Output Only one character is in the new font You thought you changed font over a selection of text, but only the first character has come out in the new font. You have most probably used a command instead of a declaration. The command should take the text as its argument. If you don't group the text, only the first character will be passed as the argument.
What I don't know and wasn't able to find is how to group the text.
Hope someone could help me :-)
Many thanks.
Best Regards,
Diego (diegostex)
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}
I think what you want is a macro and not an environment. Here's what I use all the time. Macro definition:
\def\remark#1{\marginpar{\raggedright\hbadness=10000
\def\baselinestretch{0.8}\tiny
\it #1\par}}
Sample use:
\remark{Interesting comparisons with the
internal language of \citet{harper:type-theoretic}}
I've done variations for some coauthors, e.g., the \remark
leaves a tiny fixed-width diamond in the text that it marks.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With