Wie werden Objekte in LaTeX / AUCTeX-Objektumgebungen eingerückt?

17

F: Wie kann ich eine "richtige" Einrückung von LaTeX- itemizeUmgebungen erzielen auctex?

Hier möchte ich itemin einer itemizeUmgebung sein:

  • \item Die Linie wird um zwei Leerzeichen relativ zum Beginn der Umgebung eingerückt
  • Fortsetzungszeilen im Element werden relativ zur \itemZeile um weitere zwei Leerzeichen eingerückt

Dies ist, was ich sehen möchte / erwarten würde:

\begin{itemize}
  \item Here's a really long item in a LaTeX itemize environment;
    note how the *initial* item line is indented two spaces, and the
    continuation lines are indented another two spaces.
\end{itemize}

Die anfängliche Einrückung des Elements kann mit der LaTeX-item-indentVariablen angepasst werden, die standardmäßig verwendet wird -2. Mit diesem Standard, erhalte ich das unerwünschte Verhalten der \itemnicht eingerückt ist, aber ich tun bekommen das gewünschte Verhalten der Fortsetzungszeilen um weitere zwei Räume versetzt sind:

\begin{itemize}
\item Here's a really long item in a LaTeX itemize environment;
  note how the *initial* item line is *NOT* indented two spaces,
  but the continuation lines are indented two spaces.
\end{itemize}

Einstellung LaTeX-item-indentzu 0wird mir die gewünschte Vertiefung auf der \itemLinie (zwei Räume in), aber es nicht bekommt mir in die zweite Hälfte des gewünschten Verhaltens der Fortsetzungszeilen um weitere zwei Räume versetzt ist:

\begin{itemize}
  \item Here's a really long item in a LaTeX itemize environment;
  note how the *initial* item line is indented two spaces, but the
  continuation lines are *NOT* indented an additional two spaces.
\end{itemize}

Also: wie bekommt man beide gewünschten Verhaltensweisen:

  • erster Einzug der \itemZeile zwei Leerzeichen und
  • Fortsetzungszeilen sind zusätzlich zwei Leerzeichen eingerückt?

(Beachten Sie den verwandten SO-Thread .)

Dan
quelle
2
Ich habe ein paar Stunden lang mit genau diesem Problem rumgespielt. Ihre erste Methode funktioniert, wenn Sie auch LaTeX-indent-levelauf 4 setzen. Elemente werden auf 4 - 2 = 2 eingerückt, und Fortsetzungszeilen werden auf 4 = 2 + 2 eingerückt. Dies bedeutet jedoch, dass jede andere Umgebung in der Datei eingerückt wird 4 (und nicht 2), was wünschenswert oder nicht wünschenswert sein kann. Ich würde es vorziehen, wenn sie bei 2 eingekerbt wären, da stecke ich fest.
Sykora
Haben Sie versucht LaTeX-indent-environment-list, eine benutzerdefinierte Funktion zum Einrücken anzupassen und hinzuzufügen? Die Funktion LaTeX-indent-tabularbietet möglicherweise einen sinnvollen Ausgangspunkt (oder zumindest ein sinnvolles Beispiel für eine benutzerdefinierte Einrückung in einer Umgebung). Ich bin gerade auf diese Variable / Funktion gestoßen, also hatte ich keine Chance, mich selbst damit zu befassen.
zroth

Antworten:

14

@ sykoras Kommentar zu (setq LaTeX-item-indent -2 LaTeX-indent-level 4)ist fast da, aber es bedeutet, dass wir auch auf jede andere Umgebung übergehen . So hätten wir zum Beispiel auch:

\begin{abstract}
    This indents to the 4th column, which is way too far!
\end{abstract}

Die folgende Funktion baut ein altes (und anscheinend defektes?) Code-Snippet von Tassilo Horn auf . Der Einzug wird korrekt dargestellt, auch in verschachtelten Umgebungen. Es funktioniert für itemize, enumerateund descriptionUmgebungen, um zu booten:

(defun LaTeX-indent-item ()
  "Provide proper indentation for LaTeX \"itemize\",\"enumerate\", and
\"description\" environments.

  \"\\item\" is indented `LaTeX-indent-level' spaces relative to
  the the beginning of the environment.

  Continuation lines are indented either twice
  `LaTeX-indent-level', or `LaTeX-indent-level-item-continuation'
  if the latter is bound."
  (save-match-data
    (let* ((offset LaTeX-indent-level)
           (contin (or (and (boundp 'LaTeX-indent-level-item-continuation)
                            LaTeX-indent-level-item-continuation)
                       (* 2 LaTeX-indent-level)))
           (re-beg "\\\\begin{")
           (re-end "\\\\end{")
           (re-env "\\(itemize\\|\\enumerate\\|description\\)")
           (indent (save-excursion
                     (when (looking-at (concat re-beg re-env "}"))
                       (end-of-line))
                     (LaTeX-find-matching-begin)
                     (current-column))))
      (cond ((looking-at (concat re-beg re-env "}"))
             (or (save-excursion
                   (beginning-of-line)
                   (ignore-errors
                     (LaTeX-find-matching-begin)
                     (+ (current-column)
                        (if (looking-at (concat re-beg re-env "}"))
                            contin
                          offset))))
                 indent))
             ((looking-at (concat re-end re-env "}"))
              indent)
            ((looking-at "\\\\item")
             (+ offset indent))
            (t
             (+ contin indent))))))

(defcustom LaTeX-indent-level-item-continuation 4
  "*Indentation of continuation lines for items in itemize-like
environments."
  :group 'LaTeX-indentation
  :type 'integer)

(eval-after-load "latex"
  '(setq LaTeX-indent-environment-list
         (nconc '(("itemize" LaTeX-indent-item)
                  ("enumerate" LaTeX-indent-item)
                  ("description" LaTeX-indent-item))
                LaTeX-indent-environment-list)))

Ich kann nicht anders, als das Gefühl zu haben, dass es eine sehr einfache Einstellung gibt, die mir fehlt, und dies ist die Rube Goldberg- Version. Trotzdem funktioniert es und kratzt an einem Juckreiz, den ich seit Jahren habe .

BEARBEITEN: Als Antwort auf den Kommentar von @ sykora habe ich die Funktion überarbeitet, um die harte Codierung zu entfernen. \items sind jetzt eingerückte LaTeX-indent-levelLeerzeichen. Fortsetzungszeilen können den Wert einer neuen Variablen LaTeX-indent-level-item-continuationoder, wenn Sie diese nicht binden möchten, den doppelten Wert von annehmen LaTeX-indent-level.

Das Binden und Einstellen LaTeX-indent-level-item-continuationvon 8 führt zu ästhetisch ansprechenden Ergebnissen. Ich könnte sogar dazu wechseln:

\begin{itemize}
  \item Example with LaTeX-indent-level-item-continuation set to 8.
  \item Here's a really long item that will spill over onto the
        continuation line; text lines up pretty nicely this way!
        \begin{itemize} 
          \item And here's a sub-item, with the environment
                indented to the relevant continuation line.
        \end{itemize}
\end{itemize}
Dan
quelle
Ich habe heute Morgen ein wenig darüber nachgedacht, musste mich aber auf etwas anderes konzentrieren. Ich denke, Zeile 3060 von latex.el- dh (+ (LaTeX-indent-calculate-last force-type) LaTeX-item-indent))- trägt zum Einrückungsgrad bei.
Gesetzesliste
Ich habe es gerade für eine Probefahrt genommen und es scheint ziemlich gut zu funktionieren - danke! Wenn möglich, könnten Sie die fest codierten 2en entweder durch LaTeX-indent-leveleine neue Variable ersetzen - LateX-item-continuation-indent?
Sykora
@sykora: guter vorschlag! Eingebaut.
Dan
Als regelmäßiger TeXer ist das fantastisch . Es nervt mich wirklich immer! Danke :)
Sean Allred
Welchen Umbruchmodus verwenden Sie hier? Ich bekomme jede Zeile links gespült. Siehe i61.tinypic.com/eq8n7b.jpg
NVaughan,