Comment puis-je écrire [0,1) en mode LaTeX sans casser l'indentation?

9

Lors de l'écriture de LaTeX en utilisant latex-mode, je veux souvent écrire des "intervalles semi-ouverts" dans mon texte. Par exemple, [0,1)qui fait référence à l'ensemble de tous les nombres xavec 0 <= x < 1.

Malheureusement, ces «délimiteurs déséquilibrés» semblent confondre l'analyseur d'indentation, provoquant un retrait indu du texte suivant, généralement dérivant vers la droite.

Voici un exemple de document. Le texte ci-dessous est le résultat après avoir fait C-x h M-x indent-region. Le comportement correct serait d'avoir tous les deux paragraphes en retrait de 0 espace.

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

Actuellement, je travaille autour de cela avec un hack laid: je définis une macro LaTeX qui se développe à rien, et j'écris les délimiteurs "correspondants" dans une invocation de cette macro. Cela rétablit la synchronisation du pénétrateur.

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

Mais c'est vraiment désagréable. Y a-t-il une meilleure solution?

J'utilise GNU Emacs 24.4.1.

Nate Eldredge
la source
3
Vous ne répondez pas à votre question, mais avez-vous envisagé d'essayer AUCTeX? Il ne souffre pas de ce petit bug, pour commencer.
giordano
@giordano: Je l'ai regardé. Son comportement par défaut est beaucoup plus lourd que ce que je veux. Je préfère éditer du code LaTeX, et je ne veux pas vraiment le rendu dans l'éditeur de style WYSIWYG. Il est peut-être possible de désactiver tout cela et d'avoir une expérience d'éditeur de texte, mais cela donne toujours l'impression que AUCTeX est exagéré.
Nate Eldredge
6
À quel comportement de type WYSIWYG faites-vous référence? Seules ces fonctionnalités sont l'aperçu et le mode de pliage et aucune d'entre elles n'est active par défaut (vous n'avez même pas besoin de charger les packages correspondants pour utiliser AUCTeX). La principale différence entre les modes AUCTeX et vanilla * TeX est un mécanisme d'autocomplétion bien supérieur lors de l'insertion de macros et d'environnements. Si vous appréciez la saisie semi-automatique, AUCTeX est la solution. De plus, dans AUCTeX, vous devez toujours éditer le code * TeX, il n'y a pas d'autres possibilités, je ne sais pas pourquoi vous avez eu cette mauvaise impression.
giordano

Réponses:

7

Pas une solution Emacs, mais mon code LaTeX écrit des intervalles tels que \halfopen{0}{1}, où

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

Cette convention pousse le problème d'équilibrage à un endroit où il est peu probable qu'il cause des problèmes. Et c'est consultable :-)

Norman Ramsey
la source
2
Pourquoi utilisez-vous (0,1]?
Andrew Swann
@ andrew-swann Peut-être \openhalfhehehe
Dox
@AndrewSwann\halfclosed
Norman Ramsey
2

La fonction d'indentation latex-indentde latex-modedéfinit la table de syntaxe tex-latex-indent-syntax-tableet appelle latex-find-indentqui à son tour appelle latex-backward-sexp-1.

La syntaxe de ?\(et ?\)est définie sur "."ce qui signifie "ponctuation". Ce n'est donc plus un délimiteur.

Par conséquent, des expressions comme [0,1)résultent en un scan-errordans latex-backward-sexp-1lequel conduit au comportement inattendu.

Vous pouvez éviter cela en ajoutant ce qui suit à votre fichier init:

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

Mais, je ne connais pas les conséquences négatives de ce paramètre depuis que je l'utilise auctex. Alors, attendez-vous au pire ;-).

Tobias
la source