Как я могу написать [0,1) в режиме LaTeX, не прерывая отступ?

9

Когда я пишу с использованием LaTeX latex-mode, я часто хочу написать «полуоткрытые интервалы» в моем тексте. Например, [0,1)который относится к набору всех чисел xс 0 <= x < 1.

К сожалению, эти «несбалансированные разделители», похоже, сбивают с толку синтаксический анализатор, вызывая неправильный отступ следующего текста, обычно смещаясь вправо.

Вот пример документа. Текст ниже - результат после выполнения C-x h M-x indent-region. Правильное поведение будет иметь все два абзаца с отступом в 0 пробелов.

\documentclass{article}
\begin{document}

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam volutpat
at dui et mattis. Here is a half open interval $[0,1)$.  Proin
  fringilla lectus nec mi tincidunt aliquet. Vestibulum fermentum eu
  neque id egestas. Here is another $[1,2)$.  Nullam et lectus
    convallis, placerat neque non, vehicula nisi.  Fusce imperdiet
    dignissim ante, eget fringilla nisi.

    Integer fermentum nunc eget purus molestie commodo. Integer
    tristique tincidunt odio, vel rutrum diam commodo quis. Fusce a
    aliquet quam. Cras suscipit est et nisl sollicitudin
    iaculis. Aliquam erat volutpat. Phasellus sapien arcu, aliquet ut
    hendrerit in, lobortis nec ante.

\end{document}

В настоящее время я работаю над этим с безобразным хаком: я определяю макрос LaTeX, который ничего не раскрывает, и записываю «совпадающие» разделители внутри вызова этого макроса. Это возвращает индентора обратно в синхронизацию.

\documentclass{article}
\newcommand{\ugh}[1]{}
\begin{document}
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam volutpat
at dui et mattis. Here is a half open interval $[0,1)$.  Proin
  fringilla lectus nec mi tincidunt aliquet. Vestibulum fermentum eu
  neque id egestas. \ugh{(]} Now on the next line we are back in sync.
Nullam et lectus convallis, placerat neque non, vehicula nisi.  Fusce
imperdiet dignissim ante, eget fringilla nisi.
\end{document}

Но это действительно неприятно. Есть ли лучшее решение?

Я использую GNU Emacs 24.4.1.

Нейт Элдридж
источник
3
Не отвечая на ваш вопрос, но рассматривали ли вы возможность попробовать AUCTeX? Это не страдает от этой маленькой ошибки, например.
Джордано
@giordano: я смотрел на это. Его поведение по умолчанию намного тяжелее, чем я хочу. Я предпочитаю редактировать код, похожий на LaTeX, и я не хочу рендеринга в стиле WYSIWYG в редакторе. Возможно, можно отключить все это и получить опыт работы с текстовым редактором, но это все равно делает AUCTeX излишним.
Нейт Элдредж
6
Какое WYSIWYG-подобное поведение вы имеете в виду? Только такими функциями являются режим предварительного просмотра и режим сгиба, и ни одна из них не активна по умолчанию (вам даже не нужно загружать соответствующие пакеты для использования AUCTeX). Основное различие между режимами AUCTeX и vanilla * TeX заключается в значительно более высоком механизме автозаполнения при вставке макросов и сред. Если вы цените автодополнение, AUCTeX - это путь. Кроме того, в AUCTeX вы всегда должны редактировать * TeX-код, других возможностей нет, я не знаю, почему у вас сложилось неправильное впечатление.
Джордано

Ответы:

7

Не решение Emacs, но мой код LaTeX записывает такие интервалы, как \halfopen{0}{1}, где

\newcommand\halfopen[2]{\ensuremath{[#1,#2)}}

Это соглашение выдвигает проблему балансировки в такое место, где это вряд ли вызовет проблемы. И это для поиска :-)

Норман Рэмси
источник
2
Что вы используете для (0,1]?
Эндрю Суонн
@-Свана андрей Возможно \openhalfхехехе
DOX
@AndrewSwann\halfclosed
Норман Рэмси,
2

Углубление функция latex-indentиз latex-modeмножества синтаксис-таблицы для tex-latex-indent-syntax-tableи вызовов latex-find-indent, в свою очередь вызовов latex-backward-sexp-1.

Синтаксис ?\(и ?\)установлен в "."который означает «пунктуация». Так что это больше не разделитель.

Поэтому такие выражения , как [0,1)результат в scan-errorиной , latex-backward-sexp-1что приводит к неожиданному поведению.

Вы можете избежать этого, добавив в файл инициализации следующее:

(eval-after-load "tex-mode"
    '(progn (modify-syntax-entry ?\( "()" tex-latex-indent-syntax-table)
             (modify-syntax-entry ?\) ")(" tex-latex-indent-syntax-table)))

Но я не знаю негативных последствий этой настройки, так как я использую auctex. Итак, ожидайте худшего ;-).

Тобиас
источник