Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Latex: Convert "Comment" into "Marginal Note"

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)

like image 550
diegos Avatar asked Dec 30 '22 02:12

diegos


2 Answers

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}
like image 180
godbyk Avatar answered Jan 05 '23 15:01

godbyk


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.

like image 42
Norman Ramsey Avatar answered Jan 05 '23 17:01

Norman Ramsey