Autoindenting \ if declaraciones con AUCTeX


12

El AUCTeXcomportamiento actual para el texcódigo primitivo que involucra declaraciones if- like es sangrar la declaración condicional al mismo nivel que la condición circundante. Es decir, código como

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

aparece como un gran bloque de texto. Me gustaría AUCTeXsangrar el fragmento de la siguiente manera:

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

es posible?

Respuestas:


7

Es posible:

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

Tenga en cuenta que tuve que redefinir LaTeX-indent-level-count. La diferencia es simplemente una condrama:

((looking-at "else\\b"))

¡Funciona de maravilla!
elemakil

Al tener el mismo problema que el OP, copié su código y funcionó, pero no del todo satisfactorio. Solo sangra hasta el siguiente \else. La posición del \elsees correcta, pero el siguiente código ( \doanotherthinvea la pregunta) todavía está en la primera columna, en lugar de la columna 3. Cambié su primera línea de código, para incorporar también el comando \ ifx y pensé, agregando el comando else ayudaría, pero fallé (al menos con sangría de nuevo después \else). Así que aquí está mi código que funciona parcialmente: ¿ (setq LaTeX-begin-regexp "\\(?:begin\\|if\\|ifx\\|else\\)\\b") Alguna idea?
Ene
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.