Авто-отступ \ операторы if с AUCTeX

12

Текущее AUCTeXповедение примитивного texкода, включающего операторы if- like, состоит в том, чтобы сделать отступ условного оператора на том же уровне, что и окружающее условие. Т.е. код такой как

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

появляется как большой блок текста. Я хотел бы сделать AUCTeXотступ для фрагмента следующим образом:

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

Это возможно?

elemakil
источник

Ответы:

7

Это возможно:

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

Обратите внимание, что мне пришлось переопределить LaTeX-indent-level-count. Разница это просто одна condветка:

((looking-at "else\\b"))
Або-або
источник
Работает как шарм!
elemakil
Имея ту же проблему, что и OP, я скопировал ваш код, и он работал, но не полностью удовлетворительно. Это отступает только до следующего \else. Позиция \elseправильная, но следующий код ( \doanotherthinсм. Вопрос) по-прежнему находится в первом столбце, а не в столбце 3. Я изменил вашу первую строку кода, добавив также команду \ ifx и мысль, добавив команду else помогло бы, но я потерпел неудачу (по крайней мере с повторным отступом после \else). Итак, вот мой частично рабочий код: есть (setq LaTeX-begin-regexp "\\(?:begin\\|if\\|ifx\\|else\\)\\b") идеи?
января