Sangría entre corchetes

8

Sin embargo, otra pregunta acerca de hendidura en AUCTeX ...

Me gustaría poder sangrar contenido dentro de corchetes [...]. Sería útil para las listas de opciones de tikz, por ejemplo, o los árboles dibujados con foresto qtree: ambos paquetes usan corchetes para su sintaxis, lo que facilita el escaneo del código fuente en un editor que admite sangría parenteral.

Desafortunadamente, AUCTeX solo sangra el contenido de los entornos y el contenido entre llaves {...}.

El forestejemplo también es una situación en la que hacer trampa al agregar llaves alrededor del contenido que queremos sangrar no funcionará, porque las llaves escaparán de todo el contenido de ser evaluado como un árbol.

Ejemplo:

\documentclass{article}
\usepackage{forest}

\begin{document}

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

\end{document}

Que me gustaría sangrar como:

\documentclass{article}
\usepackage{forest}

\begin{document}

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

\end{document}

¿Hay alguna manera?

T. Verron
fuente
¿Solo dentro del forestambiente?
giordano
@giordano Idealmente, en todas partes. Pero si tiene una solución que funcione específicamente para el bosque, será un buen comienzo.
T. Verron
Bueno, tenía una idea, pero realmente no estaba funcionando, así que tengo que pensar más
giordano
@giordano @ T.Verron Como ha pasado algún tiempo desde la última publicación: ¿Has encontrado una solución para esto? Intenté adaptar la solución para Lisp mencionada aquí pero sin resultados. Más precisamente, lo he intentado (modify-syntax-entry ?\[ "(]" LaTeX-mode-syntax-table) (modify-syntax-entry ?\] ")[" LaTeX-mode-syntax-table).
Timm
@Timm Lamentablemente, todavía no tengo ninguna solución. La tabla de sintaxis es correcta: character: [ (...) syntax: (] which means: open, matches ]pero parece que el mecanismo de sangría de AUCTeX ignora esta información.
T. Verron

Respuestas:

7

Configuración LaTeX-begin-regexpy LaTeX-end-regexpno ayuda aquí porque en LaTeX-indent-level-countsu interior busca una barra invertida antes de verificar la expresión regular.

Lo hice funcionar modificando TeX-brace-count-line. Esta solución cuenta []como llave {}. Compárelo funcionará de forma original si desea ver la diferencia.

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