在使用 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-regexp
和LaTeX-end-regexp
。第一个默认为begin\b
,第二个默认为end\b
。如果您分别将它们扩展为begin\b\|IF\b
和end\b\|ENDIF\b
,Auctex 将按您的喜好缩进 IF 块。
为此,请调用M-x customize-variable LaTeX-begin-regexp
并将 更改begin\b
为begin\b\|IF\b
,然后单击apply and save
。对 执行相同操作LaTeX-end-regexp
,添加\|ENDIF\b
位。
但是,如果您没有使用 ENDIF 结束 IF 块,那么当您离开算法环境时缩进不会恢复正常。要让 Auctex 正确处理未结束的 IF 块,您需要编写自定义缩进函数。我还不知道该怎么做,但当我做到时可能会回来。
答案2
添加algorithmic
到LaTeX-indent-environment-list
,无需指定任何函数。这样它就可以缩进,但不能重新换行。
当您添加它时,可能还会想将其添加tikzpicture
到scope
列表中。
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 正则表达式的人来说,双反斜杠\\
很重要,以确保字符串被正确地读取为正则表达式。