Jak wprowadzać wcięcia w elementach LaTeX / AUCTeX?

17

P: Jak mogę uzyskać „prawidłowe” wcięcie w itemiześrodowiskach LaTeX auctex?

Oto, gdzie chciałbym być itemw itemiześrodowisku:

  • \item linia jest wcięta o dwie spacje względem początku środowiska
  • linie kontynuacji w elemencie są wcięte o dodatkowe dwa spacje względem \itemlinii

Oto, co chciałbym / oczekuję:

\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}

Początkowe wcięcie elementu można dostosować za pomocą LaTeX-item-indentzmiennej, która domyślnie jest ustawiona na -2. Dzięki tej Domyślnie pojawia się niepożądane zachowanie tego \itemnie jest wcięty, ale zrobić uzyskać pożądany zachowanie linii uzupełniających są przesunięte o kolejne dwa miejsca:

\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}

Ustawianie LaTeX-item-indentsię 0dostaje mi żądaną wcięcia na \itemlinii (dwie spacje), ale czy nie dać mi drugą połowę pożądanego zachowania linii uzupełniających są przesunięte o kolejne dwa miejsca:

\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}

Więc: jak uzyskać oba pożądane zachowania:

  • początkowe wcięcie \itemwiersza dwie spacje oraz
  • linie kontynuacji wcięte dodatkowe dwa spacje?

(Uwaga Powiązany wątek SO .)

Dan
źródło
2
Przez kilka godzin bawiłem się tym dokładnie problemem; Twoja pierwsza metoda działa, jeśli ustawisz również LaTeX-indent-levelna 4. Elementy zostaną wcięte na 4 - 2 = 2, a linie kontynuacji zostaną wcięte na 4 = 2 + 2. Oznacza to jednak, że każde inne środowisko w pliku będzie wcięte na 4 (a nie 2), co może, ale nie musi być pożądane. Wolałbym, żeby były wcięte na 2 same, i właśnie tam utknąłem.
sykora,
Czy próbowałeś dostosować LaTeX-indent-environment-listi dodać niestandardową funkcję wcięcia? Ta funkcja LaTeX-indent-tabularmoże stanowić rozsądny punkt początkowy (lub przynajmniej rozsądny przykład niestandardowego wcięcia w środowisku). Właśnie natknąłem się na tę zmienną / funkcję, więc sam nie miałem okazji się jej przyjrzeć.
zroth

Odpowiedzi:

14

Komentarz @ sykora na ten temat (setq LaTeX-item-indent -2 LaTeX-indent-level 4)jest już prawie gotowy, ale oznacza to, że przeniknęliśmy także do każdego innego środowiska. Na przykład mielibyśmy również:

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

Poniższa funkcja opiera się na starym (i pozornie zepsutym?) Fragmencie kodu z Tassilo Horn . Poprawne wcięcie, w tym dla środowisk zagnieżdżonych. To działa na itemize, enumeratei descriptionśrodowiskach, do bagażnika:

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

Nie mogę się oprzeć wrażeniu, że brakuje mi bardzo prostego ustawienia i jest to wersja Rube Goldberg . Mimo to działa i drapie mnie od lat .

EDYCJA: w odpowiedzi na komentarz @ sykora zmieniłem funkcję usuwania twardego kodu. \items są teraz wciętymi LaTeX-indent-levelspacjami. Linie kontynuacji mogą przyjmować wartość nowej zmiennej LaTeX-indent-level-item-continuationlub, jeśli nie chcesz wiązać tej ostatniej, dwukrotność wartości LaTeX-indent-level.

Tak się składa, że ​​wiązanie i ustawienie LaTeX-indent-level-item-continuationna 8 daje estetyczne rezultaty. Mógłbym nawet przejść na to:

\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
źródło
Spędziłem trochę czasu, patrząc na to dziś rano, ale musiałem skupić się na czymś innym. Myślę, że linia 3060 latex.el- tj. (+ (LaTeX-indent-calculate-last force-type) LaTeX-item-indent))- przyczynia się do poziomu wcięcia.
prawnik
Właśnie wziąłem go na jazdę próbną i wydaje się, że działa całkiem dobrze - dzięki! Jeśli to możliwe, możesz zastąpić zakodowane 2s jedną LaTeX-indent-levellub nową zmienną - LateX-item-continuation-indent?
sykora,
@sykora: dobra sugestia! Rejestrowy.
Dan
Jako częsty TeXer jest to fantastyczne . Naprawdę zawsze mnie to denerwowało! Dzięki :)
Sean Allred
Z jakiego trybu pakowania korzystasz tutaj? Każdą linię opróżnia się w lewo. Zobacz i61.tinypic.com/eq8n7b.jpg
NVaughan