AUCTEX 和算法包中的缩进

AUCTEX 和算法包中的缩进

在使用 EMACS+AUCTEX 时,我遇到了使用该algorithmic包时正确缩进的问题。

在此 MWE 中:

\documentclass[12pt]{article}
\usepackage{algorithmic}
\begin{document}
\begin{algorithmic}
  \IF {list.first $\neq x_{min}$} 
  \STATE bla 
  \STATE bla 2
  \ENDIF
\end{algorithmic}
\end{document}

我有一个正确的缩进,但C-c C-q C-e在算法的环境中,会产生:

\begin{algorithmic}
  \IF {list.first $\neq x_{min}$} \STATE bla \STATE bla 2
  \ENDIF
\end{algorithmic}

当尝试添加嵌套的 if 时,我无法完全获得良好的缩进。

有人知道这个问题吗? 可能的解决方案是什么?

答案1

Emacs 在缩进方面非常聪明。不幸的是,你必须更加聪明才能让它做一些新的事情。

在这种情况下,最简单的做法是自定义变量LaTeX-paragraph-commands。默认情况下,它是空的。如果您添加 IF 和 STATE,则C-c C-q C-e应该尊重您的意愿,不要把所有东西混在一起。

为此,请调用M-x customize-variable LaTeX-paragraph-commands,单击INS按钮并在字符串框中添加 IF,INS再次单击并添加STATE到第二个字符串框。单击apply and save

正确缩进嵌套的 IF 语句会比较棘手。一种方法是自定义变量LaTeX-begin-regexpLaTeX-end-regexp。第一个默认为begin\b,第二个默认为end\b。如果您分别将它们扩展为begin\b\|IF\bend\b\|ENDIF\b,Auctex 将按您的喜好缩进 IF 块。

为此,请调用M-x customize-variable LaTeX-begin-regexp并将 更改begin\bbegin\b\|IF\b,然后单击apply and save。对 执行相同操作LaTeX-end-regexp,添加\|ENDIF\b位。

但是,如果您没有使用 ENDIF 结束 IF 块,那么当您离开算法环境时缩进不会恢复正常。要让 Auctex 正确处理未结束的 IF 块,您需要编写自定义缩进函数。我还不知道该怎么做,但当我做到时可能会回来。

答案2

添加algorithmicLaTeX-indent-environment-list,无需指定任何函数。这样它就可以缩进,但不能重新换行。

当您添加它时,可能还会想将其添加tikzpicturescope列表中。

M-x customize-variable LaTeX-indent-environment-list

-然后使用界面添加新条目。

答案3

此答案适用于那些有兴趣手动将代码添加到 .emacs 文件的人。我遇到了一个让我困惑的问题,所以我认为未来的读者可能会从中受益。以下代码足以修复 、 和 的缩进\IF\FOR以及\LOOP将每个缩进保持\STATE在自己的行上。

(defun my-latex-mode-setup ()
  "Redefines and updates variables for various customizations."
  (setq LaTeX-paragraph-commands
      '("IF" "STATE" "LOOP" "FOR"))
  (setq LaTeX-begin-regexp
    (concat "begin\\b" "\\|IF\\b" "\\|LOOP\\b" "\\|FOR\\b"))
  (setq LaTeX-end-regexp
    (concat "end\\b" "\\|ENDIF\\b" "\\|ENDLOOP\\b" "\\|ENDFOR\\b"))
  (setq LaTeX-paragraph-commands-regexp (LaTeX-paragraph-commands-regexp-make)))

(add-hook 'LaTeX-mode-hook 'my-latex-mode-setup)

除了最后一个修改的调用外,每个setq调用都会重新定义在另一个答案中使用 Customize 设置的相同变量LaTeX-paragraph-commands-regexp

最后setq修改是通过调用生成的内部变量,该变量将LaTeX-paragraph-commands-regexp-make列表中的附加命令LaTeX-paragraph-commands与变量中定义的内部命令列表相结合LaTeX-paragraph-commands-internal

更新变量LaTeX-paragraph-commands-regexp是必要的,因为对的原始调用LaTeX-paragraph-commands-regexp-make发生在调用 .emacs 文件中的钩子之前。没有它,LaTeX-paragraph-commands-regexp它不包含在 中定义的新命令LaTeX-paragraph-commands

最后,对于那些不熟悉 emacs 正则表达式的人来说,双反斜杠\\很重要,以确保字符串被正确地读取为正则表达式。

相关内容