我正在使用 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
。