2010-02-13 4 views
4

en utilisant LyX J'essaie de convertir les "commentaires" en "notes marginales".Latex: Convertir "Comment" en "Note marginale"

J'ai essayé plusieurs choses mais sans chance.

Le meilleur coup était comme ça:

\makeatletter

\@ifundefined{comment}{}{%

\renewenvironment{comment}[1]%

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

{\endgroup}}

\makeatother

ou comme ceci:

\@ifundefined{comment}{}{%

\renewenvironment{comment}%

{\marginpar{}%

{}}%

Mais ce que je reçois est que le premier caractère du texte converti. Comme dans cette image:

IMAGE MARGINAL NOTE

J'ai cherché beaucoup à essayer de trouver comment résoudre cela, mais sans chance. J'ai trouvé l'explication de ce qui se passe:

sortie inattendue Un seul personnage est dans la nouvelle police Vous pensiez que vous avez changé la police sur une sélection de texte, mais seul le premier caractère est sorti dans la nouvelle police . Vous avez probablement utilisé une commande au lieu d'une déclaration. La commande devrait prendre le texte comme argument. Si vous ne groupez pas le texte, seul le premier caractère sera passé en argument.

Ce que je ne sais pas et n'a pas pu trouver est comment grouper le texte.

quelqu'un Hope pourrait me aider :-)

Un grand merci.

Cordialement,

Diego (diegostex)

Répondre

5

D'accord, nous allons marcher à travers votre (première) redéfinition pour voir ce qui se passe:

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 

Voilà comment LATEX pense à ce que vous avez dit qu'il:

\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 

Notez que xyzzy est l'argument obligatoire (#1). Le contenu de l'environnement (« This is the ... ») sont insérés entre les lignes 3 et 4.

Si vous écrivez ce qui suit dans votre document:

\begin{comment}% <-- missing mandatory argument 
    This is the contents of the environment. 
\end{comment} 

Ensuite LATEX prendra le premier jeton comme argument obligatoire. Dans ce cas, le premier jeton est T, le premier caractère du contenu de l'environnement. Donc la lettre T sera mise dans la marge et le reste du texte apparaîtra dans un paragraphe normal. D'accord, donc pour réaliser ce que nous voulons, l'environnement comment n'a pas besoin d'arguments. Ce que nous allons faire est de créer une boîte, mettre le contenu de l'environnement dans cette boîte, puis placez cette boîte dans la marge.

Avant de commencer, si vous incluez ce code dans le préambule d'un document, vous aurez besoin de l'envelopper le tout dans \makeatletter et \makeatother puisque nous allons utiliser les commandes avec au signe (@) dans leur des noms.

Tout d'abord, nous allons créer une boîte pour stocker le matériel dans:

\newsavebox{\marginbox}% contains the contents of the comment environment 

Ensuite, nous allons commencer à définir l'environnement comment. Nous allons définir les commandes begin et end de l'environnement sur \relax. De cette façon, notre commande \newenvironment sera garantie pour fonctionner.

\let\comment\relax% removes and previous definition of \begin{comment} 
\let\endcomment\relax% removes any previous definition of \end{comment} 

Avec cela de la manière, nous pouvons définir notre nouveau comment environnement:

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

Maintenant, dans votre document, vous pouvez taper:

\begin{comment} 
    This is a comment that gets printed in the margin. 
\end{comment} 

Alors que pour la facilité de copier et coller, voici à quoi ressemblerait un document complet:

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

Salut godbyk, excellent !!!! Merci beaucoup, il fait exactement ce dont j'avais besoin. Merci beaucoup de prendre le temps pour cette explication détaillée, cela m'a aidé à comprendre ce qui se passait et comment utiliser la boîte pour stocker du texte. Je peux l'utiliser pour beaucoup de nouvelles astuces :-)))) Cheers, Diego – diegos

+0

Je suis heureux que cela a aidé. Je pense que votre problème se résume à une légère incompréhension de la façon dont la commande '\ renewenvironment' a fonctionné; il m'a lancé un peu quand je l'ai rencontré pour la première fois, puisque le contenu de l'environnement n'est pas spécifié par un '# 1' - à la place, vous écrivez simplement les commandes 'before environment contents' et 'after environment contents'. – godbyk

+0

Beau travail; Je ne savais pas à propos de '{lrbox}'. +1 –

4

Je pense que ce que vous voulez est une macro et non un environnement. Voici ce que j'utilise tout le temps. Définition d'une macro:

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

utilisation Exemple:

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

J'ai fait des variations de certains co-auteurs, par exemple, le \remark laisse un minuscule diamant de largeur fixe dans le texte qu'il marque.

+0

Norman, un grand merci pour votre réponse rapide. Oui, j'utilise aussi quelque chose comme ça, mais en particulier je veux redéfinir l'environnement "commentaire" à une note marginale parce que je veux pouvoir utiliser la "recherche de la note suivante" dans LyX et aussi imprimer les commentaires sur le côté afin qu'ils ne changent pas le flux du texte principal. La seule façon, je pense, est de renouveler l'environnement de commentaire mais je ne sais pas comment grouper le texte du commentaire, donc je pourrais tout convertir au lieu de la première lettre. – diegos

+0

@diagos: Je vois que l'environnement '{lrbox}' est le héros de cette histoire. Beau travail @ godbyk! –

1

J'utilise le LyX commente la même manière, et trouvé la solution suivante:

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