Латекс: преобразовать «Комментарий» в «Заметка на полях» - PullRequest
4 голосов
/ 13 февраля 2010

используя LyX, я пытаюсь преобразовать «комментарии» в «заметки на полях».

Я пробовал несколько вещей, но без удачи.

Лучший выстрел был такой:

\makeatletter

\@ifundefined{comment}{}{%

\renewenvironment{comment}[1]%

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

{\endgroup}}

\makeatother

или как это:

\@ifundefined{comment}{}{%

\renewenvironment{comment}%

{\marginpar{}%

{}}%

Но я получаю только первый преобразованный текст. Как на этом изображении:

ОБРАТНАЯ СВЯЗЬ ДЛЯ КАРТИНКИ

Я много искал, пытаясь найти способ решить эту проблему, но без удачи. Я нашел объяснение происходящего:

Неожиданный вывод В новом шрифте только один символ Вы думали, что изменили шрифт над выделенным текстом, но в новом шрифте появился только первый символ. Скорее всего, вы использовали команду вместо объявления. Команда должна принять текст в качестве аргумента. Если вы не сгруппируете текст, в качестве аргумента будет передан только первый символ.

Что я не знаю и не смог найти, так это как сгруппировать текст.

Надеюсь, кто-нибудь может мне помочь: -)

Большое спасибо.

С наилучшими пожеланиями,

Диего (Diegostex)

Ответы [ 3 ]

5 голосов
/ 14 февраля 2010

Хорошо, давайте пройдемся по вашему (первому) переопределению, чтобы увидеть, что происходит:

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, так как мы будем использовать команды со знаками at (@) в их именах.

Сначала создадим коробку для хранения материала:

\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}
4 голосов
/ 13 февраля 2010

Я думаю, что вы хотите, это макрос, а не среда. Вот что я использую все время. Определение макроса:

\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 оставляет крошечный ромб фиксированной ширины в тексте, который он отмечает.

1 голос
/ 20 февраля 2011

Я так же использую комментарии 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}}
...