当在某些文本周围插入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-item
是latex.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
编辑:
;; 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-mode
align
\\
(更多评论,但作为新用户,声誉太低,无法评论 :/)