Wie kann ich [0,1) im LaTeX-Modus schreiben, ohne die Einrückung zu unterbrechen?

9

Wenn latex-modeich LaTeX mit schreibe , möchte ich oft "halboffene Intervalle" in meinen Text schreiben. Zum Beispiel, [0,1)das sich auf die Menge aller Zahlen xmit bezieht 0 <= x < 1.

Leider scheinen diese "unausgeglichenen Trennzeichen" den Einrückungsparser zu verwirren, was dazu führt, dass der folgende Text unangemessen eingerückt wird und normalerweise nach rechts driftet.

Hier ist ein Beispieldokument. Der folgende Text ist das Ergebnis nach dem Ausführen C-x h M-x indent-region. Das richtige Verhalten wäre, alle Absätze durch 0 Leerzeichen eingerückt zu haben.

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

Derzeit arbeite ich mit einem hässlichen Hack daran: Ich definiere ein LaTeX-Makro, das sich zu nichts erweitert, und schreibe die "passenden" Trennzeichen in einen Aufruf dieses Makros. Dadurch wird der Eindringkörper wieder synchronisiert.

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

Das ist aber wirklich unangenehm. Gibt es eine bessere Lösung?

Ich benutze GNU Emacs 24.4.1.

Nate Eldredge
quelle
3
Sie haben Ihre Frage nicht beantwortet, aber haben Sie darüber nachgedacht, AUCTeX auszuprobieren? Zum einen leidet es nicht an diesem kleinen Fehler.
Giordano
@ Giordano: Ich habe es angeschaut. Das Standardverhalten ist viel schwerer als ich will. Ich ziehe es vor, LaTeX wie Code zu bearbeiten, und ich möchte nicht wirklich das Rendern im Editor im WYSIWYG-Stil. Vielleicht ist es möglich, all das auszuschalten und ein Texteditor-Erlebnis zu haben, aber AUCTeX wirkt trotzdem übertrieben.
Nate Eldredge
6
Auf welches WYSIWYG-ähnliche Verhalten beziehen Sie sich? Nur solche Funktionen sind Vorschau- und Falzmodus und keine von ihnen ist standardmäßig aktiv (Sie müssen nicht einmal entsprechende Pakete laden, um AUCTeX zu verwenden). Der Hauptunterschied zwischen den Modi AUCTeX und Vanilla * TeX ist ein weitaus besserer Mechanismus für die automatische Vervollständigung beim Einfügen von Makros und Umgebungen. Wenn Sie Wert auf automatische Vervollständigung legen, ist AUCTeX der richtige Weg. Außerdem müssen Sie in AUCTeX immer * TeX-Code bearbeiten, es gibt keine anderen Möglichkeiten, ich weiß nicht, warum Sie diesen falschen Eindruck hatten.
Giordano

Antworten:

7

Keine Emacs-Lösung, aber mein LaTeX-Code schreibt Intervalle wie \halfopen{0}{1}, wo

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

Diese Konvention bringt das Ausgleichsproblem an einen Ort, an dem es unwahrscheinlich ist, dass es Probleme verursacht. Und es ist durchsuchbar :-)

Norman Ramsey
quelle
2
Wofür benutzt du (0,1]?
Andrew Swann
Vielleicht @ Andrew-swann \openhalfhehehe
Dox
@ AndrewSwann\halfclosed
Norman Ramsey
2

Die Einrückungsfunktion latex-indentvon latex-modesetzt die Syntaxtabelle auf tex-latex-indent-syntax-tableund ruft auf, latex-find-indentwas wiederum aufruft latex-backward-sexp-1.

Die Syntax von ?\(und ?\)ist festgelegt, "."die für "Interpunktion" steht. Es ist also kein Trennzeichen mehr.

Ausdrücke wie [0,1)führen daher zu einem, scan-errorin latex-backward-sexp-1dem das unerwartete Verhalten auftritt.

Sie können dies vermeiden, indem Sie Ihrer Init-Datei Folgendes hinzufügen:

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

Aber ich kenne die negativen Konsequenzen dieser Einstellung nicht, da ich sie benutze auctex. Erwarten Sie also das Schlimmste ;-).

Tobias
quelle