![Auctex:当 Auctex 插入定理环境时提示输入所需参数?](https://linux22.com/image/383593/Auctex%EF%BC%9A%E5%BD%93%20Auctex%20%E6%8F%92%E5%85%A5%E5%AE%9A%E7%90%86%E7%8E%AF%E5%A2%83%E6%97%B6%E6%8F%90%E7%A4%BA%E8%BE%93%E5%85%A5%E6%89%80%E9%9C%80%E5%8F%82%E6%95%B0%EF%BC%9F.png)
因此,我在一个单独的文件中定义了一个定理环境/样式structure.tex
,并且我想在使用时将此定理环境添加到 Auctex 环境集合中C-c C-e
。但是,我还希望 Auctex 提示我输入两个参数,就像我插入方程式或其他此类环境时一样。
这是我的定理环境的副本。
\usepackage{amsmath,amsfonts,amssymb,amsthm}
\usepackage{thmtools}
\usepackage{mathtools}
\usepackage[framemethod=tikz]{mdframed}
\usetikzlibrary{calc}
\usepackage{xcolor}
\newenvironment{theo}[2][]{%
\refstepcounter{theo}
\ifstrempty{#1}%
{\mdfsetup{%
frametitle={%
\tikz[baseline=(current bounding box.east),outer sep=0pt]
\node[anchor=east,rectangle,fill=theorem_color]
{\strut Theorem~\thetheo};}}
}%
{\mdfsetup{%
frametitle={%
\tikz[baseline=(current bounding box.east),outer sep=0pt]
\node[anchor=east,rectangle,fill=theorem_color]
{\strut Theorem~\thetheo:~#1};}}%
}%
\mdfsetup{innertopmargin=10pt,linecolor=black,%
linewidth=0.5pt,topline=true,backgroundcolor=lightgray!25,%
frametitleaboveskip=\dimexpr-\ht\strutbox\relax
}
\begin{mdframed}[]\relax%
\label{#2}}{\end{mdframed}}
这个定理环境有两个参数。第一个是定理的标题,第二个是定理的标签引用。因此,实际定理插入文档时应如下所示:
\begin{theo}[Title of my theorem]{thm:mytheorem}
...
\end{theo}
我还在 Auctex 文档中找到了有关自定义环境的部分。链接是https://www.gnu.org/software/auctex/manual/auctex/Adding-Environments.html#Adding-Environments
文档建议执行类似下面的代码的操作。但我对 elisp 了解不够,不知道是否必须在定理参数中引用特定位置,或者如何设置括号,因为参数需要格式化\begin{theo}[#1]{#2}
。而且 #2 参数最好使用“thm:”作为标签。
(TeX-add-style-hook
"theo"
(lambda ()
(LaTeX-add-environments
'("theo" "Title" "Label"))))
不幸的是,文档没有详细介绍如何自定义这样的功能。有人知道如何实现这个目标吗?
更新:我注意到的一件事是,Auctex 会提示我输入定理标题的单个必需参数。但是,它不会提示我输入标签的第二个参数。我不确定这是否是 Auctex 从定理定义中得到的东西——特别是\newenvironment{theo}[2][]
上面的这一行:。
答案1
虽然可以编写一个 lisp 函数来实现你想要的功能,但我建议你不要将标签作为强制参数添加到你的环境中,而是使用\label{foo}
。这使得 AUCTeX 和 RefTeX 的文件解析变得更加容易(我强烈建议这样做)。
我建议你将定义放在里面structure.sty
(而不是structure.tex
),然后在 .tex 文件中执行\usepackage{structure}
。在你的structure.el
文件中,输入以下代码:
(TeX-add-style-hook
"theo"
(lambda ()
;; Tell AUCTeX about the env and the prefix:
(add-to-list 'LaTeX-label-alist '("theo" . "thm:"))
;; Tell RefTeX about the env and the prefix:
(when (boundp 'reftex-label-alist)
(add-to-list (make-local-variable 'reftex-label-alist)
'("theo" ?m "thm:" "~\\ref{%s}" nil)))
;; Add the env to AUCTeX:
(LaTeX-add-environments
'("theo"
(lambda (environment)
(LaTeX-insert-environment
environment
(let ((title (TeX-read-string
(TeX-argument-prompt t nil "Title"))))
(when (and title (not (string= title "")))
(concat LaTeX-optop title LaTeX-optcl))))
(when (LaTeX-label environment 'environment)
(LaTeX-newline)
(indent-according-to-mode)))))))
现在,当您点击 时C-c C-e theo RET,系统会要求您输入可选的标题和标签;使用 RefTeX,标签会自动插入,如下所示:
\begin{theo}[Optional title]
\label{thm:1}
Cursor here
\end{theo}