Retrait entre crochets

8

Encore une autre question sur l'indentation dans AUCTeX ...

J'aimerais pouvoir mettre en retrait le contenu entre crochets [...]. Il serait utile pour les listes d'options tikz, par exemple, ou les arbres dessinés à l'aide de forestou qtree: ces deux packages utilisent des crochets pour leur syntaxe, ce qui facilite la numérisation du code source dans un éditeur prenant en charge l'indentation paren.

Malheureusement, AUCTeX ne met en retrait que le contenu des environnements et le contenu entre accolades {...}.

L' forestexemple est également une situation où la tricherie en ajoutant des accolades autour du contenu que nous voulons indenté ne fonctionnera pas, car les accolades échapperont à tout le contenu d'être évalué comme un arbre.

Exemple:

\documentclass{article}
\usepackage{forest}

\begin{document}

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

\end{document}

Que j'aimerais mettre en retrait comme:

\documentclass{article}
\usepackage{forest}

\begin{document}

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

\end{document}

Y a-t-il un moyen?

T. Verron
la source
Juste à forestl' intérieur de l' environnement?
giordano
@giordano Idéalement, partout. Mais si vous avez une solution qui fonctionne spécifiquement pour la forêt, ce sera toujours un bon début.
T. Verron
Eh bien, j'avais une idée mais je ne travaillais pas vraiment, donc je dois réfléchir davantage
giordano
@giordano @ T.Verron Comme un certain temps s'est écoulé depuis le dernier message: Avez-vous trouvé une solution à cela? J'ai essayé d'adapter la solution pour Lisp mentionnée ici mais sans résultats. Plus précisément, j'ai essayé (modify-syntax-entry ?\[ "(]" LaTeX-mode-syntax-table) (modify-syntax-entry ?\] ")[" LaTeX-mode-syntax-table).
Timm
@Timm Malheureusement, je n'ai toujours pas de solution. Le tableau de syntaxe est correct: character: [ (...) syntax: (] which means: open, matches ]mais il semble que le mécanisme d'indentation d'AUCTeX ignore ces informations.
T. Verron

Réponses:

7

Définir LaTeX-begin-regexpet LaTeX-end-regexpn'aide pas ici car à l'intérieur, LaTeX-indent-level-countil recherche une barre oblique inverse avant de vérifier l'expression rationnelle.

Je l'ai fait fonctionner en modifiant TeX-brace-count-line. Cette solution compte []comme appareil orthopédique {}. Comparez-le fonctionnera d'origine si vous voulez voir la différence.

(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
la source