LaTeX: Избегать нового абзаца?

Я использую команду \todo из пакета \todonotes. Я хотел бы расположить свой исходный код, чтобы поместить \todos отдельно от предыдущего абзаца:

Some text.

\todo{make note}

Но я не хочу, чтобы \todo начинал новый абзац, иначе это испортит интервал в документе.

Есть ли команда, чтобы избежать этого?

Если бы существовала команда/пакет для использования пробелов до него, я мог бы переопределить \todo для его использования.

Редактировать: добавление % между всем, очевидно, очень раздражает. Что-нибудь еще?


person Paul Biggar    schedule 21.08.2009    source источник
comment
Разве добавление одного символа на \todo не является наименее раздражающим решением, которое мы могли бы получить?   -  person Esteban Küber    schedule 21.08.2009
comment
voyager: Нет, я не хочу добавлять персонажей. Лучшее, что мы можем сделать, это иметь команду (скажем, \consume), которая потребляет ведущие к ней пробелы, чтобы я мог переопределить \todo для использования \consume.   -  person Paul Biggar    schedule 21.08.2009
comment
Есть \unskip для удаления последнего горизонтального пробела, но разделитель абзаца — это совсем другая история.   -  person Jouni K. Seppänen    schedule 17.09.2009


Ответы (8)


Я должен согласиться со всеми остальными, что вам, вероятно, следует просто добавить %, но я нахожу этот вопрос интересным. Проблема в том, что как только LaTeX читает пустую строку, она преобразуется в команду \par, которая завершает предыдущий абзац. В начале \todo та команда \par уже была выполнена, и отменить ее невозможно (думаю). Таким образом, ваша единственная надежда состоит в том, чтобы не допустить вставки этого \par или его нормального поведения. Если вы хотите предотвратить ее вставку, вы можете попробовать прочитать главу 8 "The TeXbook", в которой должно быть рассказано, как пустая строка преобразуется в \par. В качестве альтернативы вы можете попытаться найти решение, основанное на следующей идее:

Some text.{\let\par\relax

\todo{make note}}

Но будьте осторожны! Вы определенно не хотите глобально изменять поведение \par, поэтому я добавил дополнительную пару фигурных скобок (команды LaTeX ограничены областью действия, поэтому новое определение \par действует только внутри группы где было дано определение). Удачи.

person Anton Geraschenko    schedule 21.08.2009

Когда макрос предшествует нежелательному пробелу, % не нужен, если вы используете \@ifnextchar и \@gobble.

Рассмотрим что-то вроде (в преамбуле, конечно):

\makeatletter
\let\oldtodo\todo
\renewcommand\todo[1]{%
\oldtodo{#1}%
\@ifnextchar\par{\@gobble}{}}
\makeatother

Таким образом, если у вас есть что-то вроде:

\todo{Stuff}

Things

он будет действовать так же, как

\todo{Stuff}
%
Things

or

\todo{Stuff}
Things

Вы можете обобщить такие вещи с помощью макроса, например

\makeatletter
\newcommand\gobblepars{%
    \@ifnextchar\par%
        {\expandafter\gobblepars\@gobble}%
        {}}
\makeatother

Затем вы можете использовать \gobblepars везде, где хотите занять место (например, после todo). Вы также можете переопределить todo (как показано выше), чтобы автоматически ставить \gobblepars после него.

Для обработки ведущего пустого места. вы также можете использовать \gobblepars, но вы должны быть явными. Например:

Some text\gobblepars

\todo{Stuff}

предотвратит появление \par между двумя строками.

person TedPavlic    schedule 24.08.2011

Попробуй это:

Some text.
%
\todo{make note}
person redtuna    schedule 21.08.2009
comment
Добавление % между всем, очевидно, очень раздражает. Что-нибудь еще? - person Paul Biggar; 21.08.2009
comment
@Paul Biggar Очевидно, у нас с тобой разные допуски. ;-) - person Sinan Ünür; 21.08.2009
comment
@Sinan Ünür: Ну, я должен делать это везде. Вот почему я попросил команду для использования пробелов. - person Paul Biggar; 21.08.2009

может быть, вы не должны оставлять новую строку между текстом и заметкой о задаче или просто прокомментировать ее

Some text.
%
\todo{make note}
person stefita    schedule 21.08.2009
comment
Добавление % между всем, очевидно, очень раздражает. Что-нибудь еще? - person Paul Biggar; 21.08.2009
comment
не уверен, что это сработает, но если вы хотите оставить новую строку между текстом и заметкой, вы можете попробовать добавить символ возврата перед командой todo \b\todo{сделать заметку} - person stefita; 21.08.2009
comment
Просто полностью убрать пустую строку? Единственный способ для латекса начать новый абзац — это пустая строка. - person Martijn; 21.08.2009
comment
хорошо, спрашивающий, похоже, хочет избежать новых строк в выводе, но оставить их в исходном коде (может быть, из соображений удобочитаемости) - person stefita; 21.08.2009
comment
Почему бы не сделать отступ \todo вместо того, чтобы оставить пустую строку? Это должно быть как минимум читабельно. - person las3rjock; 21.08.2009

Как насчет

Some text.
%
\todo{make note}
%
some more text
person Sinan Ünür    schedule 21.08.2009
comment
Добавление % между всем, очевидно, очень раздражает. Что-нибудь еще? - person Paul Biggar; 21.08.2009
comment
Должно быть, со мной что-то не так, потому что я делал это с 1993 года всякий раз, когда хотел оставить место в середине абзаца без создания абзацев в LaTeX. У меня никогда не было мотивации даже задуматься, есть ли другой способ сделать это. - person Sinan Ünür; 21.08.2009
comment
@Sinan Ünür: Очевидно, вам не хватало важного проекта, чтобы откладывать его на потом ;) - person Paul Biggar; 21.08.2009

Установите \endlinechar=-1, чтобы пустые строки не имели никакого эффекта. Вам нужно будет использовать \par для разделения абзацев, что, я думаю, вызывает большее раздражение, чем необходимость вводить % в разделительных строках, но это то, о чем вы просите.

person Jouni K. Seppänen    schedule 14.09.2009
comment
Что я действительно прошу, так это возможность сказать, что последняя пустая строка не имела никакого эффекта. Но очень интересно, спасибо. - person Paul Biggar; 14.09.2009
comment
Я не думаю, что это будет легко. Когда TeX уже принял последнюю пустую строку в качестве разделителя абзаца, он завершает предыдущий абзац и добавляет его в список блоков для страницы и, возможно, решает, что страница заполнена, и вызывает процедуру вывода для страницы. Я не решаюсь сказать, что отменить это невыполнимое требование, учитывая трюки, которые могут проделать мастера TeX, но я действительно думаю, что вам нужно найти кого-то, хорошо знакомого с TeX, чтобы помочь вам с этим. - person Jouni K. Seppänen; 17.09.2009

Как насчет того, чтобы сохранить все, над чем еще предстоит работать, внутри тегов \def, а затем удалить их и переместить в соответствующий документ, когда больше нечего будет делать?

E.g.

\def \par1
{
It was the best of times, it was the
}

\def \par2000
{
"Repression is the only lasting philosophy. The dark deference of fear and slavery, my friend," observed the Marquis
}

\def \paridunno
{
The end
}

Повесть о двух городах, Чарльз Диккенс

\par1
\todo{write a whole bunch of pages}
\par2000
\todo{Visit ghost of Christmas future, copy pages from finished book}
\paridunno
\todo{Think of a better ending}

Это имеет дополнительное преимущество, поскольку дает вам \listoftodos как в исходном коде буквально, так и в

на выходе.

person s2m    schedule 31.01.2011

просто включите \todo прямо в середине текста. ни разрыва строки, ничего.

бла-бла-бла текст \todo{Сделай это сейчас!} еще текст бла-бла-бла.

на моем компьютере (win xp, miktex 2.7, texniccenter) это работает нормально, не создает разрыва строки и помещает заметку о задаче на полях. . .

person Mica    schedule 21.08.2009
comment
Я думаю, что первоначальный вопросник действительно хочет сделать \todo визуально отличительным в источнике. - person Anton Geraschenko; 21.08.2009
comment
со спецификатором пакета todo, например \todo[inline]{to do text}, он добавляет to do на поле с линией, соединяющей его с текстом... если вы используете параметр [inline], он примет всю строку и установите оранжевый цвет фона по умолчанию. - person Mica; 21.08.2009