RefTeX:是否可以使用正则表达式向前搜索以查找上下文?

RefTeX:是否可以使用正则表达式向前搜索以查找上下文?

我正在使用 RefTeX 在 LaTeX 文档中创建/引用标签。

在编写定义时,我通常会在定义环境的开头写上要定义的强调文本的“名称”,并且通常会将标签放在后面\begin{definition}。因此,我希望 RefTeX 能够向前从标签宏中搜索要用作标签的文本。

我已经设法得到落后搜索工作按照RefTeX 用户手册

以下是我的.emacs文件:

(setq reftex-label-alist
  '(
     ("theorem"    ?h "thm:" "~\\ref{%s}" t ("theorem" "thm.") )
     ("lemma"      ?l "lem:" "~\\ref{%s}" t ("lemma" "lem.") )
     ("corollary"  ?c "cor:" "~\\ref{%s}" t ("corollary" "cor." ))
     ("definition" ?d "def:" "~\\ref{%s}" "\\emph[[{]" ("definition" "def." ))
   )
  reftex-insert-label-flags '(t t))

我找不到关于前向搜索的提及文档,所以我担心这不是默认支持的功能。可以选择为上下文方法,但是我对(Emacs)Lisp 不够熟悉,无法编写这样的函数。

任何有关此事的帮助都将非常感激。

根据要求,以下是 MWE:

\documentclass{article}

\usepackage{amsthm}
\newtheorem{definition}{Definition}

\begin{document}

\begin{definition}
  A \emph{thing} is something that has a lot of useful properties.
\end{definition}

\end{document}

我希望当我在 之后插入标签(使用 RefTeX)时\begin{definition},RefTeX 会自动使用该单词thing作为标签,也就是说,结果行应为

\begin{definition}\label{def:thing}

答案1

问题

AUCTeX 已经附带了以下样式文件:amsthm提供完成、解析等。但将您的要求挂接到该样式中并不容易,因此,我建议您myamsthm使用相应的 AUCTeX 支持文件编写一个新的 LaTeX 包。

先决条件

您将需要它.emacs

(setq TeX-parse-self t)

接下来,您需要将变量自定义TeX-style-private为您选择的目录,例如:

(setq TeX-style-private "~/.emacs.d/mystyles")

我更喜欢这样

(setq reftex-insert-label-flags '("shlcd" "sft"))

在我的.emacs而不是

(setq reftex-insert-label-flags '(t t)

但这是你的选择。

包装器包myamsthm.sty看起来如下所示:

\ProvidesPackage{myamsthm}[2017/09/08]
\RequirePackage{amsthm}
\newtheorem{definition}{Definition}
\newtheorem{lemma}{Lemma}
% etc.
\newcommand\envcontext{}
\let\envcontext\emph

将此文件保存在 LaTeX 可以找到的地方。我建议您使用类似的宏,\envcontext而不是普通的\emph

韓國

将以下代码保存为myamsthm.el上述目录并重新启动 Emacs。

(defun LaTeX-myamsthm-env-label (environment)
  "Insert ENVIRONMENT, an optional argument, a reference and label."
  (let ((opthead (TeX-read-string
                  (TeX-argument-prompt t nil "Heading"))))
    (LaTeX-insert-environment environment
                              (when (and opthead
                                         (not (string= opthead "")))
                                (format "[%s]" opthead))))
  (let ((envcontext (TeX-read-string
                     (TeX-argument-prompt nil nil "Environment context"))))
    (unless (zerop (length envcontext))
      (indent-according-to-mode)
      (save-excursion
        (insert TeX-esc "envcontext" TeX-grop envcontext TeX-grcl))))
  (when (LaTeX-label environment 'environment)
    (LaTeX-newline)
    (indent-according-to-mode)))

(defun LaTeX-myamsthm-reftex-label (_environment)
  "Search for context of environment and pass it to RefTeX.
ENVIRONMENT is ignored."
  (if (save-excursion
        (re-search-forward
         "\\\\envcontext{\\([^}]+\\)}"
         (save-excursion
           (re-search-forward
            (concat "\\\\end{" (LaTeX-current-environment))))
         t))
      (match-string-no-properties 1)
    (error "Could not find the \"\\envcontext\" macro")))

(TeX-add-style-hook
 "myamsthm"
 (lambda ()

   (TeX-run-style-hooks "amsthm")

   (dolist (env '(("theorem" . "thm:")
                  ("lemma"   . "lem:")
                  ("corollary"  . "cor:")
                  ("definition" . "def:")))
     (LaTeX-add-environments `(,(car env) LaTeX-myamsthm-env-label))
     (add-to-list 'LaTeX-label-alist env))

   ;; Reftex support: Use `reftex-add-label-environments'
   (when (fboundp 'reftex-add-label-environments)
     (reftex-add-label-environments
      '(("theorem"    ?h "thm:" "~\\ref{%s}" (nil . LaTeX-myamsthm-reftex-label) ("theorem" "thm."))
        ("lemma"      ?l "lem:" "~\\ref{%s}" (nil . LaTeX-myamsthm-reftex-label) ("lemma" "lem."))
        ("corollary"  ?c "cor:" "~\\ref{%s}" (nil . LaTeX-myamsthm-reftex-label) ("corollary" "cor." ))
        ("definition" ?d "def:" "~\\ref{%s}" (nil . LaTeX-myamsthm-reftex-label) ("definition" "def." )))))

   (TeX-add-symbols
    '("envcontext" t))

   ;; Fontification
   (when (and (featurep 'font-latex)
              (eq TeX-install-font-lock 'font-latex-setup))
     (font-latex-add-keywords '(("envcontext" "{"))
                              'textual)))
 LaTeX-dialect)

我不会描述上面的代码,但是现在,您可以执行C-c C-e definition RET并完成,最终的代码将如下所示:

\begin{definition}
  \label{def:thing}
  A \envcontext{thing} is something that ...
\end{definition}

您要求的功能是LaTeX-myamsthm-reftex-label

相关内容