Einrückung in eckigen Klammern

8

Noch eine Frage zum Einrücken in AUCTeX ...

Ich möchte Inhalte in eckige Klammern einrücken können [...]. Es wäre für tikz Optionslisten nützlich sein, zum Beispiel, oder Bäume gezeichnet mit forestoder qtree: diese beiden Paketen eckige Klammern für ihre Syntax verwenden, die es in einem Editor unterstützt paren-Vertiefung leicht zu scannen im Quellcode macht.

Leider rückt AUCTeX nur den Inhalt von Umgebungen und den Inhalt zwischen geschweiften Klammern ein {...}.

Das forestBeispiel ist auch eine Situation, in der das Betrügen durch Hinzufügen von geschweiften Klammern um den gewünschten Einzug nicht funktioniert, da geschweifte Klammern den gesamten Inhalt nicht als Baum auswerten.

Beispiel:

\documentclass{article}
\usepackage{forest}

\begin{document}

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

\end{document}

Was ich gerne eingerückt hätte als:

\documentclass{article}
\usepackage{forest}

\begin{document}

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

\end{document}

Gibt es einen Weg?

T. Verron
quelle
Nur in der forestUmgebung?
Giordano
@ Giordano Idealerweise überall. Wenn Sie jedoch eine Lösung haben, die speziell für den Wald funktioniert, ist dies immer noch ein guter Anfang.
T. Verron
Nun, ich hatte eine Idee, funktionierte aber nicht wirklich, also muss ich mehr darüber nachdenken
Giordano
@giordano @ T.Verron Wie seit dem letzten Beitrag ist einige Zeit vergangen: Haben Sie eine Lösung dafür gefunden? Ich habe versucht, die hier erwähnte Lösung für Lisp anzupassen , aber ohne Ergebnisse. Genauer gesagt habe ich es versucht (modify-syntax-entry ?\[ "(]" LaTeX-mode-syntax-table) (modify-syntax-entry ?\] ")[" LaTeX-mode-syntax-table).
Timm
@Timm Leider habe ich noch keine Lösung. Die Syntaxtabelle ist korrekt: character: [ (...) syntax: (] which means: open, matches ]Es scheint jedoch, dass der Einrückungsmechanismus von AUCTeX diese Informationen ignoriert.
T. Verron

Antworten:

7

Das Einstellen LaTeX-begin-regexpund LaTeX-end-regexphilft hier nicht, da LaTeX-indent-level-countdarin ein Backslash gesucht wird, bevor der reguläre Ausdruck überprüft wird.

Ich habe es durch Modifizieren zum Laufen gebracht TeX-brace-count-line. Diese Lösung zählt []als Klammer {}. Vergleichen Sie es wird ursprüngliche Funktion, wenn Sie den Unterschied sehen möchten.

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