Comment mettre en retrait des éléments dans des environnements de détail LaTeX / AUCTeX?

17

Q: comment obtenir une indentation "correcte" des itemizeenvironnements LaTeX dans auctex?

Voici où j'aimerais être avec un itemdans un itemizeenvironnement:

  • \item la ligne est en retrait de deux espaces par rapport au début de l'environnement
  • les lignes de continuation de l'élément sont mises en retrait de deux espaces supplémentaires par rapport à la \itemligne

Voici ce que j'aimerais / j'attends de voir:

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

On peut ajuster l'indentation initiale de l'élément avec la LaTeX-item-indentvariable, qui est par défaut -2. Avec cette valeur par défaut, je reçois le comportement indésirable du \itempas en retrait, mais je n'obtenir le comportement souhaité des lignes de continuation étant compensée par une deux places supplémentaires:

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

La définition LaTeX-item-indentde 0me donne l'indentation souhaitée sur la \itemligne (deux espaces dedans), mais ne me donne pas la seconde moitié du comportement souhaité des lignes de continuation étant compensée par deux autres espaces:

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

Alors: comment obtient-on les deux comportements souhaités:

  • retrait initial de la \itemligne deux espaces, et
  • lignes de suite deux espaces supplémentaires en retrait?

(Notez le fil SO connexe .)

Dan
la source
2
Je m'amuse avec ce problème exact depuis quelques heures; votre première méthode fonctionne si vous définissez également LaTeX-indent-levelsur 4. Les éléments seront mis en retrait sur 4 - 2 = 2 et les lignes de continuation seront mises en retrait sur 4 = 2 + 2. Cependant, cela signifie que tous les autres environnements du fichier seront mis en retrait sur 4 (et non 2), ce qui peut être souhaitable ou non. Je préfère qu'ils soient en retrait à 2 eux-mêmes, c'est là que je suis coincé.
sykora
Avez-vous essayé de personnaliser LaTeX-indent-environment-listet d'ajouter une fonction personnalisée pour l'indentation? La fonction LaTeX-indent-tabularpeut fournir un point de départ raisonnable (ou au moins un exemple raisonnable d'indentation personnalisée dans un environnement). Je suis juste tombé sur cette variable / fonction, donc je n'ai pas eu l'occasion de l'examiner moi-même.
zroth

Réponses:

14

Le commentaire de @ sykora sur (setq LaTeX-item-indent -2 LaTeX-indent-level 4)est presque là, mais cela signifie que nous débordons également sur tous les autres environnements. Ainsi, par exemple, nous aurions également:

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

La fonction suivante s'appuie sur un ancien extrait de code (et apparemment cassé?) De Tassilo Horn . Il obtient l'indentation correcte, y compris pour les environnements imbriqués. Cela fonctionne pour itemize, enumerateet les descriptionenvironnements, pour démarrer:

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

Je ne peux pas m'empêcher de penser qu'il y a un paramètre très simple qui me manque et c'est la version Rube Goldberg . Pourtant, cela fonctionne, et ça gratte une démangeaison que j'ai depuis des années .

EDIT: en réponse au commentaire de @ sykora, j'ai révisé la fonction pour supprimer le codage dur. \items sont maintenant des LaTeX-indent-levelespaces en retrait . Les lignes de suite peuvent prendre la valeur d'une nouvelle variable, LaTeX-indent-level-item-continuationou, si vous ne voulez pas lier cette dernière, deux fois la valeur de LaTeX-indent-level.

En l'occurrence, la reliure et la mise LaTeX-indent-level-item-continuationà 8 donnent des résultats esthétiquement agréables. Je pourrais même y passer:

\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
la source
J'ai passé un peu de temps à le regarder ce matin, mais je devais me concentrer sur autre chose. Je pense que la ligne 3060 latex.el- c'est-à-dire (+ (LaTeX-indent-calculate-last force-type) LaTeX-item-indent))- contribue au niveau de retrait.
Lawlist
Je viens de le prendre pour un essai, et il semble fonctionner assez bien - merci! Si possible, vous pouvez remplacer les 2 codés en dur par une LaTeX-indent-levelou une nouvelle variable - LateX-item-continuation-indent?
sykora
@sykora: bonne suggestion! Incorporé.
Dan
En tant que TeXer fréquent, c'est fantastique . Ça me dérange vraiment toujours! Merci :)
Sean Allred
Quel mode d'emballage utilisez-vous ici? Je fais rincer toutes les lignes à gauche. Voir i61.tinypic.com/eq8n7b.jpg
NVaughan