Come posso scrivere [0,1) in modalità LaTeX senza interrompere il rientro?


9

Quando scrivo LaTeX usando latex-mode, spesso desidero scrivere "intervalli semi-aperti" nel mio testo. Ad esempio, [0,1)che si riferisce all'insieme di tutti i numeri xcon 0 <= x < 1.

Sfortunatamente, questi "delimitatori sbilanciati" sembrano confondere il parser di indentazione, causando un rientro inappropriato del testo seguente, che di solito si sposta alla destra.

Ecco un documento di esempio. Il testo seguente è il risultato dopo averlo fatto C-x h M-x indent-region. Il comportamento corretto sarebbe di far rientrare tutti e due i paragrafi di 0 spazi.

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

Attualmente sto lavorando a questo con un brutto trucco: definisco una macro LaTeX che non si espande e scrivo i delimitatori "corrispondenti" all'interno di un'invocazione di questa macro. Ciò ripristina la sincronizzazione del rientro.

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

Ma questo è davvero spiacevole. C'è una soluzione migliore?

Sto usando GNU Emacs 24.4.1.


3
Non hai risposto alla tua domanda, ma hai mai pensato di provare AUCTeX? Non soffre di questo piccolo bug, per uno.
giordano,

@giordano: l'ho visto. Il suo comportamento predefinito è molto più pesante di quello che voglio. Preferisco modificare il codice come LaTeX e non voglio davvero il rendering in editor in stile WYSIWYG. Forse è possibile disattivare tutto ciò e avere un'esperienza di editor di testo, ma fa comunque sembrare eccessivo AUCTeX.
Nate Eldredge,

6
A quale comportamento simile a WYSIWYG ti riferisci? Solo tali funzionalità sono anteprima e modalità piega e nessuna di esse è attiva per impostazione predefinita (non è nemmeno necessario caricare i pacchetti corrispondenti per utilizzare AUCTeX). La principale differenza tra le modalità AUCTeX e Vanilla * TeX è un meccanismo di completamento automatico di gran lunga superiore quando si inseriscono macro e ambienti. Se apprezzi il completamento automatico AUCTeX è la strada da percorrere. Inoltre, in AUCTeX devi sempre modificare il codice * TeX, non ci sono altre possibilità, non so perché hai avuto questa impressione sbagliata.
giordano,

Risposte:


7

Non una soluzione Emacs, ma il mio codice LaTeX scrive intervalli come \halfopen{0}{1}, dove

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

Questa convenzione spinge il problema del bilanciamento in un luogo in cui è improbabile che causi problemi. Ed è ricercabile :-)


2
Per cosa usi (0,1]?
Andrew Swann,

@ andrew-swann Forse \openhalfhehehe
Dox,

@AndrewSwann\halfclosed
Norman Ramsey

2

La funzione latex-indentdi rientro latex-modeimposta la tabella di sintassi su tex-latex-indent-syntax-tablee chiama latex-find-indentche a sua volta chiama latex-backward-sexp-1.

La sintassi di ?\(e ?\)è impostata su "."quale sta per "punteggiatura". Quindi non è più un delimitatore.

Pertanto, espressioni come [0,1)risultato in una scan-errorin latex-backward-sexp-1che conduce al comportamento imprevisto.

Puoi evitarlo aggiungendo quanto segue al tuo file init:

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

Ma non conosco le conseguenze negative di questa impostazione da quando uso auctex. Quindi, aspettati il ​​peggio ;-).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.