Indentation automatique \ instructions if avec AUCTeX

12

Le AUCTeXcomportement actuel du texcode primitif impliquant des instructions de type if est de mettre en retrait l'instruction conditionnelle au même niveau que la condition environnante. Ie code tel que

\if@sometoggle%
\dosomething%
\else%
\doanotherthing%
\fi%

apparaît comme un gros bloc de texte. Je voudrais mettre en AUCTeXretrait l'extrait de code comme suit:

\if@sometoggle%
  \dosomething%
\else%
  \doanotherthing%
\fi%

Est-ce possible?

elemakil
la source

Réponses:

7

C'est possible:

(setq LaTeX-begin-regexp "\\(?:begin\\|if@\\)\\b")
(setq LaTeX-end-regexp "\\(?:end\\|else\\|fi\\)\\b")
(defun LaTeX-indent-level-count ()
  "Count indentation change caused by all \\left, \\right, \\begin, and
\\end commands in the current line."
  (save-excursion
    (save-restriction
      (let ((count 0))
        (narrow-to-region (point)
                          (save-excursion
                            (re-search-forward
                             (concat "[^" TeX-esc "]"
                                     "\\(" LaTeX-indent-comment-start-regexp
                                     "\\)\\|\n\\|\\'"))
                            (backward-char)
                            (point)))
        (while (search-forward TeX-esc nil t)
          (cond
            ((looking-at "left\\b")
             (setq count (+ count LaTeX-left-right-indent-level)))
            ((looking-at "right\\b")
             (setq count (- count LaTeX-left-right-indent-level)))
            ((looking-at LaTeX-begin-regexp)
             (setq count (+ count LaTeX-indent-level)))
            ((looking-at "else\\b"))
            ((looking-at LaTeX-end-regexp)
             (setq count (- count LaTeX-indent-level)))
            ((looking-at (regexp-quote TeX-esc))
             (forward-char 1))))
        count))))

Notez que j'ai dû redéfinir LaTeX-indent-level-count. Le diff est simplement une condbranche:

((looking-at "else\\b"))
abo-abo
la source
Fonctionne comme un charme!
elemakil
Ayant le même problème que l'OP, j'ai copié votre code et cela a fonctionné, mais pas entièrement satisfaisant. Il ne se met en retrait que jusqu'au prochain \else. La position du \elseest correcte, mais le code suivant ( \doanotherthin, voir question) est toujours dans la première colonne, au lieu de la colonne 3. J'ai changé votre première ligne de code, pour incorporer également la commande \ ifx et pensé, en ajoutant la commande else aiderait, mais j'ai échoué (au moins avec indentation à nouveau après \else). Voici donc mon code partiellement fonctionnel: (setq LaTeX-begin-regexp "\\(?:begin\\|if\\|ifx\\|else\\)\\b") Des idées?
Jan