在 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.el
Emacs 中的 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”解释为命令。
请注意,要搜索括号“{”,您只需使用{
,但使用\\[
来搜索方括号。