emacs+auctex:插入 itemize 时防止区域填充

emacs+auctex:插入 itemize 时防止区域填充

当在某些文本周围插入itemize环境(使用 Cc Ce)时,AucTeX 坚持对所述文本进行段落填充,这会弄乱我的布局。有没有简单的方法可以防止这种情况发生?

上下文是,我正在将纯文本笔记转换为乳胶文档。当纯文本草稿包含以下内容时:

- first item
- second item

我想要选择这两行,输入 Cc Ce itemize RET,然后获得:

\begin{itemize}
\item - first item
- second item
\end{itemize}

然后,在需要的地方添加缺少的命令就很容易了\item。但是,AucTeX 调用了LaTeX-fill-region环境的内容(参见latex.el第 686 行),结果如下:

\begin{itemize}
\item - first item - second item
\end{itemize}

显然,对于这么短的列表来说,这不是什么大问题。但对于一些较长的文本来说,情况就不同了,因为我的列表结构已经丢失。

答案1

我快速浏览了一下源代码和 auctex真的想要填充该区域-)

显然,你可以改变所有需要改变的地方,但编写一个只插入开始和结束的简单函数会更简单,而不是真正基于 auctex 代码。

或者最简单的方法是选择区域

- first item
- second item

并使用C-w C-x C-e <return> C-y

即删除区域,在空白处插入环境,然后将区域拉回。这只需要几次额外的按键,因此比编写新功能所需的时间要少,除非您经常这样做:-)

答案2

原因LaTeX-env-itemlatex.el呼叫LaTeX-fill-paragraph

幸运的是,这种行为可以通过以下方式改变:建议这些功能。以下代码在运行LaTeX-fill-paragraph时关闭。LaTeX-env-item

;; Empty function that just do nothing
(defun my-empty-func (orig-func &rest args))

;; Call orig-func with LaTeX-fill-paragraph disabled
(defun my-tex-no-fill (orig-func &rest args)
  ;; Replace LaTeX-fill-paragraph with my-empty-func
  (advice-add 'LaTeX-fill-paragraph :around #'my-empty-func)
  (let ((res (apply orig-func args))) ;; Call orig-func
    ;; Enable original LaTeX-fill-paragraph
    (advice-remove 'LaTeX-fill-paragraph #'my-empty-func)
    res))

;; Disable filling for LaTeX-env-item
(advice-add 'LaTeX-env-item :around #'my-tex-no-fill)

请注意,此代码使用了Emacs 24.4 中引入的advice-add/函数。advice-remove

编辑:

使用函数的简化版本ignore(感谢乔达诺他的评论):

;; Call orig-func with LaTeX-fill-paragraph disabled
(defun my-tex-no-fill (orig-func &rest args)
  ;; Disable LaTeX-fill-paragraph
  (advice-add 'LaTeX-fill-paragraph :around #'ignore)
  (let ((res (apply orig-func args))) ;; Call orig-func
    ;; Enable LaTeX-fill-paragraph
    (advice-remove 'LaTeX-fill-paragraph #'ignore)
    res))

;; Disable filling for LaTeX-env-item
(advice-add 'LaTeX-env-item :around #'my-tex-no-fill)

答案3

这是一个快速而肮脏的功能:

(defun itemize (beg end) 
 "wrap the active region in an 'itemize' environment,
  converting hyphens at the beginning of a line to \item"
  (interactive "r")
  (save-restriction
    (narrow-to-region beg end)
    (beginning-of-buffer)
    (insert "\\begin{itemize}\n")
    (while (re-search-forward "^- " nil t)
      (replace-match "\\\\item "))
    (end-of-buffer)
    (insert "\\end{itemize}\n")))

选择要转换的区域并调用M-x itemize。这会将行首的“- ”硬编码为项目的开头。如果您使用其他约定,则需要进行相应的调整。

答案4

M-<return>在正确的位置(之后)使用first item,插入一个回车符和一个\item。 在环境中M-<return>使用时也很棒,因为它插入下一个标签。RefTex-modealign\\

(更多评论,但作为新用户,声誉太低,无法评论 :/)

相关内容