在 Emacs 中跳过用户宏内容的拼写

在 Emacs 中跳过用户宏内容的拼写

在 Emacs 中,为了跳过用户宏参数的拼写,需要将一个条目附加到变量中ispell-tex-skip-alists

例如,为了跳过解析的参数\mycommad,可以添加如下条目

("\\\\mycommad"    ispell-tex-arg-end) 

完整的命令(可能在 init 文件中)应该是

(setq ispell-tex-skip-alists
   (list
    (append
     (car ispell-tex-skip-alists) ;tell ispell to ignore content of this:
     '(("\\\\mycommad"       ispell-tex-arg-end)))
(cadr ispell-tex-skip-alists)))

因此里面的文本 \mycommad{blah blah}将被跳过。

但是,如果命令有两个参数,而我只想跳过第二个参数的拼写,该怎么办?那就是

\mycommad{spell this}{skip this}

使用文档ispell-tex-skip-alists非常有限。特别是,ispell-tex-arg-end有时会采用数字参数,它是什么?

答案1

理论

ispell-tex-skip-alists这是关于使用和的长答案ispell-tex-arg-end,但您可能想直接看到所提出的解决方案。

在检查ispell.elEmacs 中的 Lisp 代码后,我发现了以下内容。

要附加到 Emacs 初始化文件的跳过命令模板是:

(setq ispell-tex-skip-alists
      (list
       (append
    (car ispell-tex-skip-alists) 
    '(
      ("\\\\mycommand"       ispell-tex-arg-end)
      ("\\\\mycommandtwo"    ispell-tex-arg-end 2)
      ;; add as many lines like the previous two as you need before the "))"  
      ))
       (cadr ispell-tex-skip-alists)))

请注意,我使用了一种不常见的格式,以便非 Lisp 用户可以轻松插入行。普通格式如下:

(setq ispell-tex-skip-alists
      (list
       (append
    (car ispell-tex-skip-alists) 
    '(("\\\\mycommand"       ispell-tex-arg-end)
      ("\\\\mycommandtwo"      ispell-tex-arg-end 2)))
       (cadr ispell-tex-skip-alists)))

上述代码中\\\\mycommand是任何正则表达式,用于标识要跳过拼写的文本区域的开头。如果您想告诉 Emacs 使用特定的正则表达式来标记跳过区域的结尾,请使用如下跳过行:

("\\\\mycommand"       "myregexp")

其中"myregexp"是正则表达式的占位符。

通常,我们的命令是这样的:\mycommand{text to skip};因此括号}是跳过区域结束的标记,这表明这样写:

("\\\\mycommand"       "}")

但是,在大多数情况下,LaTeX 命令可能包含方括号中的可选 LaTeX 参数,这些参数包含不需要任何拼写的命令参数,例如:

\mycommand[skip this][skip this]{text to skip} 

要跳过方括号中的内容,不要使用"}"来表示跳过区域的结束,而是使用:

("\\\\mycommand"   ispell-tex-arg-end)

形式上ispell-tex-arg-end是拼写库内置的一个函数,它可以跳过方括号中任何命令参数的拼写。

ispell-tex-arg-end还有另一个重要特征。通常不会跳过第二个宏参数,例如:

\mycommand[skip this][skip this]{text to skip}{I will be spell-checked} 

但是,您可以通过给 提供一个整数参数来覆盖此行为ispell-tex-arg-end,即:

("\\\\mycommand"   ispell-tex-arg-end n)

在这种情况下,Emacs 拼写将跳过n的大括号参数\mycommand。省略n相当于传递 1。此外,如果n为 0,则只会跳过方括号中的参数。

后者回答了有关使用ispell-tex-skip-alists和的问题的第二部分ispell-tex-arg-end

现在来讨论更相关的部分。

解决方案 1

假设你是所有者并且\mycommand您可以/想要稍微修改它,只需重新定义它以交换参数。因此,它将像这样工作:

\mycommand{skip this}{spell this}

附加到您的 Emacs 初始化文件:

(setq ispell-tex-skip-alists
      (list
       (append
    (car ispell-tex-skip-alists) 
    '(("\\\\mycommand"   ispell-tex-arg-end 1)))
       (cadr ispell-tex-skip-alists)))

后面的数字 1ispell-tex-arg-end是为了清楚起见,但您可以省略它。

解决方案 2

如果重新定义\mycommand不适合您,您可以定义:

\newcommand{\mycommandSpell}[2]{%
\mycommand{#2}{#1}}

附加到您的 Emacs 初始化文件:

(setq ispell-tex-skip-alists
      (list
       (append
    (car ispell-tex-skip-alists) 
    '(("\\\\mycommandSpell"   ispell-tex-arg-end 1)))
       (cadr ispell-tex-skip-alists)))

至于之前的解决方案,后面的数字 1ispell-tex-arg-end只是为了清晰起见。

对于好奇

为什么正则表达式字符串中有四个斜杠"\\\\mycommand"?首先,您必须将斜杠加倍,\mycommand以告诉 Lisp 解释器,斜杠不表示转义序列(如换行符“\n”)。您必须再次将双斜杠加倍,因为正则表达式引擎以类似的方式将单个斜杠解释为命令后缀,就像在 LaTeX 中一样。因此,当您编写 时\\\\mycommand,您是\\mycommand在告诉 Lisp,当 Lisp 传递\\mycommand 给正则表达式解析器时,它将按原样查找字符串"\mycommand",而不是将“\m”解释为命令。
请注意,要搜索括号“{”,您只需使用{,但使用\\[来搜索方括号。

相关内容