Bagaimana saya bisa menulis [0,1) dalam mode LaTeX tanpa melanggar indentasi?

9

Saat menulis LaTeX menggunakan latex-mode, saya sering ingin menulis "interval setengah terbuka" dalam teks saya. Misalnya,, [0,1)yang mengacu pada himpunan semua angka xdengan 0 <= x < 1.

Sayangnya, "pembatas tidak seimbang" ini tampaknya membingungkan pengurai indentasi, menyebabkan teks berikut ini indentasi tidak tepat, biasanya melayang ke kanan.

Ini contoh dokumen. Teks di bawah ini adalah hasil setelah melakukan C-x h M-x indent-region. Perilaku yang benar adalah memiliki semua paragraf kedua indentasi dengan 0 spasi.

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

Saat ini saya sedang mengatasinya dengan hack jelek: Saya mendefinisikan makro LaTeX yang tidak berkembang, dan menulis pembatas "cocok" di dalam doa makro ini. Ini membuat indentor kembali sinkron.

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

Tetapi ini benar-benar tidak menyenangkan. Apakah ada solusi yang lebih baik?

Saya menggunakan GNU Emacs 24.4.1.

Nate Eldredge
sumber
3
Tidak menjawab pertanyaan Anda, tetapi apakah Anda sudah mempertimbangkan mencoba AUCTeX? Tidak menderita bug kecil ini, misalnya.
giordano
@giordano: Saya sudah melihatnya. Perilaku default-nya jauh lebih berat daripada yang saya inginkan. Saya lebih suka mengedit kode seperti LaTeX, dan saya tidak benar-benar ingin rendering dalam-editor WYSIWYG-style. Mungkin itu mungkin untuk mematikan semua itu dan memiliki pengalaman editor teks, tetapi itu masih membuat AUCTeX tampak seperti berlebihan.
Nate Eldredge
6
Perilaku seperti WYSIWYG mana yang Anda maksud? Hanya fitur seperti itu yang pratinjau dan mode lipat dan tidak ada yang aktif secara default (Anda bahkan tidak perlu memuat paket terkait untuk menggunakan AUCTeX). Perbedaan utama antara mode AUCTeX dan vanilla * TeX adalah mekanisme pelengkapan otomatis yang jauh lebih unggul saat memasukkan makro dan lingkungan. Jika Anda menghargai penyelesaian otomatis, AUCTeX adalah cara yang tepat. Selain itu, di AUCTeX Anda selalu harus mengedit kode * TeX, tidak ada kemungkinan lain, saya tidak tahu mengapa Anda memiliki kesan yang salah ini.
giordano

Jawaban:

7

Bukan solusi Emacs, tetapi kode LaTeX saya menulis interval seperti di \halfopen{0}{1}mana

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

Konvensi ini mendorong masalah keseimbangan ke tempat yang tidak mungkin menimbulkan masalah. Dan itu bisa dicari :-)

Norman Ramsey
sumber
2
Apa yang Anda gunakan untuk (0,1]?
Andrew Swann
@ andrew-swann Mungkin \openhalfhehehe
Dox
@AndrewSwann\halfclosed
Norman Ramsey
2

Fungsi lekukan latex-indentdari latex-modeset sintaks-meja ke tex-latex-indent-syntax-tabledan panggilan latex-find-indentyang pada panggilan gilirannya latex-backward-sexp-1.

Sintaksis ?\(dan ?\)diatur ke "."yang merupakan singkatan dari "tanda baca". Jadi tidak lagi pembatas.

Oleh karena itu, ekspresi seperti [0,1)hasil ke scan-errordalam latex-backward-sexp-1yang mengarah pada perilaku yang tidak terduga.

Anda dapat menghindari ini dengan menambahkan berikut ini ke file init Anda:

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

Tapi, saya tidak tahu konsekuensi negatif dari pengaturan ini sejak saya gunakan auctex. Jadi, harapkan yang terburuk ;-).

Tobias
sumber