Lekukan dalam tanda kurung

8

Namun pertanyaan lain tentang lekukan di AUCTeX ...

Saya ingin membuat indentasi konten di dalam tanda kurung siku [...]. Ini akan berguna untuk daftar opsi tikz, misalnya, atau pohon yang digambar menggunakan forestatau qtree: kedua paket ini menggunakan tanda kurung siku untuk sintaksanya, yang membuatnya mudah untuk memindai kode sumber dalam editor yang mendukung indenasi paren.

Sayangnya, AUCTeX hanya membuat indentasi lingkungan dan konten antara kawat gigi {...}.

The forestcontoh adalah juga situasi di mana kecurangan dengan menambahkan kawat gigi sekitar konten yang kita inginkan menjorok tidak akan bekerja, karena kawat gigi akan melarikan diri semua konten dari yang dievaluasi sebagai sebuah pohon.

Contoh:

\documentclass{article}
\usepackage{forest}

\begin{document}

\begin{forest}
  [A
  [B]
  [C
  [D]
  [E]
  ]
  ]
\end{forest}

\end{document}

Yang saya ingin indentasi sebagai:

\documentclass{article}
\usepackage{forest}

\begin{document}

\begin{forest}
  [A
    [B]
    [C
      [D]
      [E]
    ]
  ]
\end{forest}

\end{document}

Apakah ada cara?

T. Verron
sumber
Hanya di dalam forestlingkungan?
giordano
@giordano Idealnya, di mana-mana. Tetapi jika Anda memiliki solusi yang bekerja khusus untuk hutan, itu masih akan menjadi awal yang baik.
T. Verron
Yah, saya punya ide tetapi tidak benar-benar berfungsi, jadi saya harus berpikir lebih banyak
giordano
@giordano @ T.Verron Karena beberapa waktu telah berlalu sejak posting terakhir: Apakah Anda menemukan solusi untuk ini? Saya sudah mencoba menyesuaikan solusi untuk Lisp yang disebutkan di sini tetapi tanpa hasil. Lebih tepatnya, saya sudah mencoba (modify-syntax-entry ?\[ "(]" LaTeX-mode-syntax-table) (modify-syntax-entry ?\] ")[" LaTeX-mode-syntax-table).
Timm
@Timm Sedihnya, saya masih belum punya solusi. Tabel sintaks sudah benar: character: [ (...) syntax: (] which means: open, matches ]tetapi tampaknya mekanisme indentasi AUCTeX mengabaikan informasi ini.
T. Verron

Jawaban:

7

Pengaturan LaTeX-begin-regexpdan LaTeX-end-regexptidak membantu di sini karena di LaTeX-indent-level-countdalamnya mencari backslash sebelum memeriksa regexp.

Saya membuatnya bekerja dengan memodifikasi TeX-brace-count-line. Solusi ini dianggap []sebagai penjepit {}. Bandingkan saja kan fungsi aslinya jika ingin melihat perbedaannya.

(defun TeX-brace-count-line ()
  "Count number of open/closed braces."
  (save-excursion
    (let ((count 0) (limit (line-end-position)) char)
      (while (progn
               (skip-chars-forward "^{}[]\\\\" limit)
               (when (and (< (point) limit) (not (TeX-in-comment)))
                 (setq char (char-after))
                 (forward-char)
                 (cond ((eq char ?\{)
                        (setq count (+ count TeX-brace-indent-level)))
                       ((eq char ?\})
                        (setq count (- count TeX-brace-indent-level)))
                       ((eq char ?\[)
                        (setq count (+ count TeX-brace-indent-level)))
                       ((eq char ?\])
                        (setq count (- count TeX-brace-indent-level)))
                       ((eq char ?\\)
                        (when (< (point) limit)
                          (forward-char)
                          t))))))
      count)))
Hebi Li
sumber