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?

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"))

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.