Auctex:当 Auctex 插入定理环境时提示输入所需参数?

Auctex:当 Auctex 插入定理环境时提示输入所需参数?

因此,我在一个单独的文件中定义了一个定理环境/样式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}

相关内容