tags:

views:

404

answers:

2

Hi, 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)

+3  A: 

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.

Norman Ramsey
Norman, many thanks for your prompt reply.Yes, I also use something like this, but in particular I want to redefine the "comment" environment to a marginal note becuase I want to be able to use the "search next note" inside LyX and also print the comments on the side so they don't change the flow of the main text.The only way, I think, is renewing the comment environment but I don't know how to group the text of the comment, so I could convert all of it instead of the first letter.
diegos
@diagos: I see the `{lrbox}` environment is the hero of this story. Nice work @godbyk!
Norman Ramsey
+4  A: 

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}
godbyk
Hi godbyk, excellent!!!! many thanks it does exactly what I needed.Also many thanks for taking the time for this detailed explanation, it helped me understand what was going on and how to use the box to store text. I can used it for a lot of new tricks :-))))Cheers,Diego
diegos
I'm glad it helped. I think your problem boiled down to a slight misunderstanding of how the `\renewenvironment` command worked; it threw me for a bit when I first encountered it also, since the contents of the environment aren't specified by a `#1` -- instead, you just write 'before environment contents' commands and 'after environment contents' commands.
godbyk
Nice work; I didn't know about `{lrbox}`. +1
Norman Ramsey