Jak napisać [0,1) w trybie LaTeX bez przerywania wcięcia?

9

Pisząc LaTeX za pomocą latex-mode, często chcę pisać w tekście „półotwarte interwały”. Na przykład, [0,1)który odnosi się do zestawu wszystkich liczb xz 0 <= x < 1.

Niestety, te „niezrównoważone separatory” zdają się mylić parser wcięć, powodując niewłaściwe wcięcie następującego tekstu, zwykle przesuwając się w prawo.

Oto przykładowy dokument. Poniższy tekst to wynik po wykonaniu C-x h M-x indent-region. Prawidłowe zachowanie polega na tym, że wszystkie oba akapity są wcięte 0 spacjami.

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

Obecnie pracuję nad tym z brzydkim włamaniem: definiuję makro LaTeX, które rozwija się do zera, i piszę „pasujące” ograniczniki wewnątrz wywołania tego makra. Spowoduje to powrót synchronizacji wgłębnika.

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

Ale to naprawdę nieprzyjemne. Czy jest lepsze rozwiązanie?

Używam GNU Emacs 24.4.1.

Nate Eldredge
źródło
3
Nie odpowiadasz na twoje pytanie, ale czy zastanawiałeś się nad wypróbowaniem AUCTeX? Na przykład nie cierpi z powodu tego małego robaka.
giordano
@giordano: Patrzyłem na to. Jego domyślne zachowanie jest znacznie cięższe niż to, czego chcę. Wolę edytować kod podobny do LaTeXa i tak naprawdę nie chcę renderowania w edytorze w stylu WYSIWYG. Być może można to wszystko wyłączyć i korzystać z edytora tekstu, ale nadal sprawia, że ​​AUCTeX wydaje się przesadą.
Nate Eldredge
6
O jakim zachowaniu przypominasz WYSIWYG? Jedynie takie funkcje to podgląd i tryb składania i żadna z nich nie jest domyślnie aktywna (nie trzeba nawet ładować odpowiednich pakietów, aby użyć AUCTeX). Główną różnicą między trybami AUCTeX i waniliowym * TeX jest znacznie lepszy mechanizm autouzupełniania podczas wstawiania makr i środowisk. Jeśli cenisz autouzupełnianie, najlepszym rozwiązaniem jest AUCTeX. Ponadto w AUCTeX zawsze musisz edytować * kod TeX, nie ma innych możliwości, nie wiem, dlaczego miałeś tak złe wrażenie.
giordano

Odpowiedzi:

7

Nie jest to rozwiązanie Emacsa, ale mój kod LaTeX zapisuje takie przedziały jak \halfopen{0}{1}, gdzie

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

Ta konwencja przesuwa kwestię równoważenia do miejsca, w którym jest mało prawdopodobne, aby powodowała problemy. I można to przeszukiwać :-)

Norman Ramsey
źródło
2
Do czego używasz (0,1]?
Andrew Swann,
@ andrew-swann Być może \openhalfhehehe
Dox
@AndrewSwann\halfclosed
Norman Ramsey
2

Funkcja wcięcie latex-indentz latex-modezestawów składnia do stołu tex-latex-indent-syntax-tablei wzywa latex-find-indentco z kolei połączeń latex-backward-sexp-1.

Składnia ?\(i ?\)jest ustawiona "."na „interpunkcja”. Więc nie jest już ogranicznikiem.

W związku z tym wyrażenia podobne [0,1)do wyników w, scan-errorw latex-backward-sexp-1których prowadzi do nieoczekiwanego zachowania.

Można tego uniknąć, dodając następujące elementy do pliku init:

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

Ale nie znam negatywnych konsekwencji tego ustawienia, ponieważ używam auctex. Spodziewaj się więc najgorszego ;-).

Tobiasz
źródło