Recuo entre colchetes

8

Ainda outra pergunta sobre o recuo no AUCTeX ...

Gostaria de poder recuar o conteúdo entre colchetes [...]. Seria útil para listas de opções do tikz, por exemplo, ou árvores desenhadas usando forestou qtree: ambos os pacotes usam colchetes como sintaxe, o que facilita a digitalização do código-fonte em um editor que suporta a indentação por parênteses.

Infelizmente, o AUCTeX recua apenas o conteúdo dos ambientes e o conteúdo entre chaves {...}.

O forestexemplo também é uma situação em que trapacear adicionando chaves ao redor do conteúdo que queremos recuado não funcionará, porque chaves impedem que todo o conteúdo seja avaliado como uma árvore.

Exemplo:

\documentclass{article}
\usepackage{forest}

\begin{document}

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

\end{document}

O qual gostaria de recuar como:

\documentclass{article}
\usepackage{forest}

\begin{document}

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

\end{document}

Há algum jeito?

T. Verron
fonte
Apenas dentro do forestambiente?
Giordano #
@giordano Idealmente, em qualquer lugar. Mas se você tiver uma solução trabalhando especificamente para a floresta, ainda será um bom começo.
T. Verron
Bem, eu tive uma idéia, mas não estava funcionando, então eu tenho que pensar mais
Giordano
@giordano @ T.Verron Há algum tempo, desde o último post: Você encontrou uma solução para isso? Eu tentei adaptar a solução para Lisp mencionada aqui, mas sem resultados. Mais precisamente, eu tentei (modify-syntax-entry ?\[ "(]" LaTeX-mode-syntax-table) (modify-syntax-entry ?\] ")[" LaTeX-mode-syntax-table).
Timm
@ Timm Infelizmente, ainda não tenho solução. A tabela de sintaxe está correta: character: [ (...) syntax: (] which means: open, matches ]mas parece que o mecanismo de indentação do AUCTeX desconsidera essas informações.
50516 Ver T.

Respostas:

7

A configuração LaTeX-begin-regexpe LaTeX-end-regexpnão ajuda aqui porque dentro LaTeX-indent-level-countdela pesquisa uma barra invertida antes de verificar o regexp.

Eu consegui fazê-lo modificando TeX-brace-count-line. Esta solução conta []como chave {}. Compará-lo funcionará original se você quiser ver a diferença.

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