Come rientrare gli oggetti negli ambienti di dettaglio LaTeX / AUCTeX?


17

D: come posso ottenere il rientro "corretto" degli itemizeambienti LaTeX auctex?

Ecco dove mi piacerebbe essere con un itemin un itemizeambiente:

  • \item la linea è rientrata di due spazi rispetto all'inizio dell'ambiente
  • le linee di continuazione nell'elemento sono rientrate di due spazi aggiuntivi rispetto alla \itemlinea

Questo è quello che vorrei / mi aspetto di vedere:

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

Si può regolare il rientro iniziale dell'elemento con la LaTeX-item-indentvariabile, che per impostazione predefinita è -2. Con questa impostazione predefinita, ottengo il comportamento indesiderato del \itemnon essere rientrato, ma faccio ottenere il comportamento desiderato delle righe di continuazione di essere compensati da ulteriori due spazi:

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

L'impostazione LaTeX-item-indentper 0farmi ottenere il rientro desiderato sulla \itemlinea (due spazi in), ma non mi fa sì che la seconda metà del comportamento desiderato delle linee di continuazione sia compensata da altri due spazi:

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

Quindi: come si ottengono entrambi i comportamenti desiderati:

  • rientro iniziale della \itemriga due spazi e
  • linee di continuazione ulteriori due spazi rientrati?

(Nota thread SO correlato .)


2
Sono stato in giro con questo problema esatto per un paio d'ore; il primo metodo funziona anche se impostato LaTeX-indent-levelsu 4. Gli elementi saranno rientrati a 4 - 2 = 2 e le righe di continuazione saranno rientrati a 4 = 2 + 2. Tuttavia, ciò significa che ogni altro ambiente nel file sarà rientrato a 4 (e non 2), che può essere o non essere desiderabile. Preferirei che fossero indentati a 2 stessi, che è dove sono bloccato.
Sykora,

Hai provato a personalizzare LaTeX-indent-environment-liste aggiungere una funzione personalizzata per il rientro? La funzione LaTeX-indent-tabularpotrebbe fornire un ragionevole punto di partenza (o almeno un ragionevole esempio di rientro personalizzato all'interno di un ambiente). Mi sono appena imbattuto in questa variabile / funzione, quindi non ho avuto la possibilità di esaminarla da solo.
zroth,

Risposte:


14

Il commento di @ Sykora (setq LaTeX-item-indent -2 LaTeX-indent-level 4)è quasi arrivato , ma significa che ci riversiamo anche in ogni altro ambiente. Quindi, per esempio, avremmo anche:

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

La seguente funzione crea un vecchio frammento di codice (e apparentemente rotto?) Di Tassilo Horn . Ottiene il rientro corretto, anche per gli ambienti nidificati. Funziona per itemize, enumeratee descriptionambienti, per l'avvio:

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

Non posso fare a meno di sentire che manca un'impostazione molto semplice e questa è la versione di Rube Goldberg . Tuttavia, funziona e graffia un prurito che ho avuto per anni .

EDIT: in risposta al commento di @ sykora, ho modificato la funzione per eliminare la codifica rigida. \itemora sono LaTeX-indent-levelspazi rientrati . Le righe di continuazione possono assumere il valore di una nuova variabile LaTeX-indent-level-item-continuationo, se non si desidera associare quest'ultima, il doppio del valore di LaTeX-indent-level.

In effetti, il legame e l'impostazione LaTeX-indent-level-item-continuationsu 8 fornisce risultati esteticamente gradevoli. Potrei anche passare ad esso:

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

Ho trascorso un po 'di tempo a guardarlo stamattina, ma dovevo concentrarmi su qualcos'altro. Penso che la riga 3060 di latex.el- cioè, (+ (LaTeX-indent-calculate-last force-type) LaTeX-item-indent))- stia contribuendo al livello di rientro.
elenco delle leggi del

L'ho appena fatto per un giro di prova e sembra funzionare abbastanza bene - grazie! Se possibile, è possibile sostituire i 2 hardcoded con una LaTeX-indent-levelo una nuova variabile - LateX-item-continuation-indent?
Sykora,

@sykora: buon suggerimento! Incorporated.
Dan

Come frequente TeXer, questo è fantastico . Mi ha sempre infastidito davvero! Grazie :)
Sean Allred,

Quale modalità di avvolgimento stai usando qui? Ottengo ogni linea cancellata a sinistra. Vedi i61.tinypic.com/eq8n7b.jpg
NVaughan
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.