在 AUCTeX 中向自定义宏添加数学行为

在 AUCTeX 中向自定义宏添加数学行为

我为我的方程式定义了一个自定义宏,以简化和减少我编写的代码量

\newcommand{\eqn}[1]{
  \begin{equation}
    #1
  \end{equation}
}

\eqn{\alpha + \beta = \gamma}

但是我没有 AUCTeX 提供的数学宏和子/上标样式的语法高亮,因为它没有意识到它是一个数学环境。

我应该怎么做才能启用这些功能\eqn{}

答案1

请注意,如果制作宏(例如所示的宏),则很容易引入虚假空格,该宏会在方程式上方生成一条虚假的“白色”线,仅由缩进框和\rightskip粘连线组成。它添加的垂直空间小于,\baselineskip因为它导致\bovedisplayshortskip使用而不是,\abovedisplayskip因为方程式上方的线(非常)短。

在此处输入图片描述

\documentclass{article}

\begin{document}

\newcommand{\eqn}[1]{
  \begin{equation}
    #1
  \end{equation}
}

\showoutput
\noindent
\begin{minipage}[t]{.5\textwidth}
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.
\eqn{x}
bbb

\hrule
\end{minipage}%
\begin{minipage}[t]{.5\textwidth}
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.
\begin{equation}
x
\end{equation}
bbb

\hrule
\end{minipage}

\end{document}

至于你原来的问题,请参阅

texmathp-tex-commands is a variable defined in `texmathp.el'.
Its value is nil

  This variable is potentially risky when used as a file local variable.

Documentation:
List of environments and macros influencing (La)TeX math mode.
This user-defined list is used in addition to LaTeX and AMSLaTeX defaults.
The structure of each entry is (NAME TYPE)

- The first item in each entry is the name of an environment or macro.
  If it's a macro, include the backslash.

- The second item is a symbol indicating how the command works:
    `env-on'     Environment: turns math mode for its body  on
    `env-off'    Environment: turns math mode for its body  off
    `arg-on'     Command: turns math mode for its arguments on
    `arg-off'    Command: turns math mode for its arguments off
    `sw-on'      Switch: turns math-mode of following text  on
    `sw-off'     Switch: turns math-mode of following text  off
    `sw-toggle'  Switch: toggles math mode of following text

You can customize this variable.

[back]

答案2

根据 @Johannes_B 的说法和 @DavidCarlisle 的回复,你最好在 emacs 中创建一个缩写。输入如下内容

/eqn

emacs 会将其视为缩写并将其扩展为您想要的内容。

设置缩写的方式有很多种。以下是我使用的方法:

创建新的缩写表

(defvar my-abbrev-table (make-abbrev-table))

定义函数

(defun my-insert-equation ()
  (insert "\\begin{equation}\n\n")
  (insert "\\end{equation}\n")
  (forward-line -2))

然后将此功能添加到您的缩写表中

(define-abbrev my-abbrev-table "/eqn" "" 'my-insert-equation t)

将此设为您的本地缩写表

(setq local-abbrev-table my-abbrev-table)

以上内容均可放入其自己的.el文件中。

然后添加tex-mode-hook一个调用来加载该.el文件。从那里开始你应该就可以了。

如果您确保您的函数返回t,那么您可以控制扩展控制字符是否也将用作输入文本。

比较以下两个:

(defun my-insert-equation ()
  (insert "\\begin{equation}\n\n")
  (insert "\\end{equation}\n")
  (forward-line -2)
  t)

(defun my-insert-junk () 
  (insert "this is just junk")
  t)

现在添加另一行

(put 'my-insert-equation 'no-self-insert t)

创建以下两个键:

(define-abbrev my-abbrev-table "/eqn"  "" 'my-insert-equation t)
(define-abbrev my-abbrev-table "/junk" "" 'my-insert-junk     t)

然后输入

/ e q n . 

emacs 将扩展它为

\begin{equation}
[]
\end{equation}

其中[]表示光标的位置。请注意,句点.并未显示出来。

但是通过输入

/ j u n k .

emacs 将扩展它为

this is just junk.[]

请注意用于触发扩展的标点符号是如何包含在扩展中的。

很重要的一点

关于上述缩写,我忘记了我已经修改了我的语法表。

缩写仅适用于单词字符。要使上述操作生效,您必须按如下方式修改语法表

(modify-syntax-entry ?/ "w" tex-mode-syntax-table)

但如果您使用通常的单词字符定义缩写,则实际上没有必要这样做。通过创建/单词字符,我在向前或向后移动文件路径时会造成一点不便,但这只是这种修改唯一一次造成麻烦(而且麻烦不大)。通过采用这种语法,我相信我的缩写不会是我真正想在没有扩展的情况下输入的东西。

尽管如此,

(define-abbrev my-abbrev-table "eqn"  "" 'my-insert-equation t)
(define-abbrev my-abbrev-table "junk" "" 'my-insert-junk     t)

是完美的缩写。如果你真的只是想要junk输入为 justjunk而不是被下一个非单词字符扩展,那么你可以输入

j u n k \c-q <non-word character>

emacs 不会扩展 word。但是,当我一时兴起创建文档时,我太笨了,无法识别出其中的区别。

顺便说一句,如果您的缩写只是要扩展为另一个字符串(例如 的情况/junk),则无需创建与此缩写相对应的函数。相反,您可以将其定义为

(define-abbrev my-abbrev-table "/junk" "This is just junk.  Plain and simple" nil t)

相关内容