Como recuar itens nos ambientes com itens LaTeX / AUCTeX?

17

P: como posso obter o recuo "adequado" dos itemizeambientes LaTeX auctex?

Aqui é onde eu gostaria de estar com itemum itemizeambiente:

  • \item A linha é recuada dois espaços em relação ao início do ambiente
  • linhas de continuação no item são recuadas dois espaços adicionais em relação à \itemlinha

Isto é o que eu gostaria / esperava ver:

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

Pode-se ajustar o recuo inicial do item com a LaTeX-item-indentvariável, cujo padrão é -2. Com este padrão, eu recebo o comportamento indesejável da \itemnão sendo recuado, mas eu faço obter o comportamento desejado das linhas de continuação sendo compensados por mais dois espaços:

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

Definir LaTeX-item-indentpara 0obtém o recuo desejado na \itemlinha (dois espaços em), mas não obtém a segunda metade do comportamento desejado das linhas de continuação sendo compensadas por dois espaços adicionais:

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

Então: como obter os dois comportamentos desejados:

  • recuo inicial da \itemlinha dois espaços e
  • linhas de continuação dois espaços adicionais recuados?

(Observe o thread SO relacionado .)

Dan
fonte
2
Estou brincando com esse problema exato há algumas horas; seu primeiro método funcionará se você também definir LaTeX-indent-level4. Os itens serão recuados para 4 - 2 = 2 e as linhas de continuação serão recuadas para 4 = 2 + 2. No entanto, isso significa que todos os outros ambientes no arquivo serão recuados para 4 (e não 2), o que pode ou não ser desejável. Eu prefiro que eles sejam recuados em 2 eles mesmos, que é onde eu estou preso.
Sykora
Você tentou personalizar LaTeX-indent-environment-liste adicionar uma função personalizada para recuo? A função LaTeX-indent-tabularpode fornecer um ponto de partida razoável (ou pelo menos um exemplo razoável de recuo personalizado dentro de um ambiente). Eu apenas me deparei com essa variável / função, então não tive a chance de investigar por mim mesma.
zroth

Respostas:

14

O comentário de @ sykora (setq LaTeX-item-indent -2 LaTeX-indent-level 4)está quase lá, mas significa que também passamos para todos os outros ambientes. Então, por exemplo, também teríamos:

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

A função a seguir cria um trecho de código antigo (e aparentemente quebrado?) Do Tassilo Horn . Ele obtém o recuo correto, inclusive para ambientes aninhados. Ele funciona para itemize, enumeratee descriptionambientes, para inicializar:

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

Não posso deixar de sentir que estou perdendo uma configuração muito simples e esta é a versão do Rube Goldberg . Ainda assim, ele funciona e arranha uma coceira que sinto há anos .

EDIT: em resposta ao comentário do @ sykora, revi a função para remover a codificação. \items agora são LaTeX-indent-levelespaços recuados . As linhas de continuação podem assumir o valor de uma nova variável, LaTeX-indent-level-item-continuationou, se você não quiser vincular a última, duas vezes o valor de LaTeX-indent-level.

Por acaso, a ligação e a configuração LaTeX-indent-level-item-continuationpara 8 oferecem resultados esteticamente agradáveis. Eu posso até mudar para ele:

\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
fonte
Passei um pouco de tempo olhando para ela hoje de manhã, mas precisava me concentrar em outra coisa. Eu acho que a linha 3060 de latex.el- isto é, (+ (LaTeX-indent-calculate-last force-type) LaTeX-item-indent))- está contribuindo para o nível de recuo.
lawlist
Levei-o para um passeio de teste e parece ter um bom desempenho - obrigado! Se possível, você pode substituir os 2s codificados por uma LaTeX-indent-levelou uma nova variável - LateX-item-continuation-indent?
sykora
@ sykora: boa sugestão! Incorporado.
Dan
Como um TeXer frequente, isso é fantástico . Realmente sempre me incomodou! Obrigado :)
Sean Allred
Que modo de embalagem você está usando aqui? Eu recebo todas as linhas liberadas para a esquerda. Veja i61.tinypic.com/eq8n7b.jpg
NVaughan