我正在用 yasnippet 编写模板。
使用 {eqnarray} 在 latex 中编写方程式意味着我将在某处引用它,因此我将为其添加标签。使用 {eqnarray*} 时,不需要标签。
我是 lisp 和 yasnippet 的新手,因此我遵循 c 模式的现有模板:
# -*- mode: snippet -*-
# name : printf
# contributor : joaotavora
# --
printf ("${1:%s}\\n"${1:$(if (string-match "%" text) "," "\);")
}$2${1:$(if (string-match "%" text) "\);" "")}
效果很好。请注意,此模板中有反斜杠。我的模板是:
# -*- mode: snippet -*-
# name: eqnarray
# key: eq
# --
\begin{eqnarray$1}
${1:$(if (string-match "*" text) "\\label{eq:" "")}$2${1:$(if (string-match "*" text) "}" "")}
$0\end{eqnrrary$1}
其结果将是:
\begin{eqnarray*}label{eq:xxx}
XXX\end{eqnarrary*}
“标签”前面缺少预期的反斜杠!当我用\\
或\"
替换时\(
,我可以得到预期的结果,这意味着“标签”前面将分别有“ 或 ( 。
这真的让我很困惑...
此外,我发现我的代码中有一个逻辑错误... if 命令应该是(if (string-match "*" text) "" "\\label{eq:")
。由于这个错误误导了那些回答我问题的人,我认为我必须将我的错误保留在这里:)
而且我昨天才开始使用 yasnippet,我发现这个模板距离实际用途还差得很远,正如下面的评论所指出的那样……
答案1
您需要更多反斜杠!有两个级别的引用。正如您在第一个示例中注意到的那样,\n
必须放入\\n
源代码。对于您的情况,您需要编写\\\\label
:
# -*- mode: snippet -*-
# name: eqnarray
# key: eq
# --
\begin{eqnarray$1}
${1:$(if (string-match "*" yas-text) "\\\\label{eq:" "")}$2${1:$(if (string-match "*" yas-text) "}" "")}
$0\end{eqnrrary$1}
[我有一个相对较新的版本,yassnippet
其中旧变量text
已被较新的变量取代yas-text
。]
答案2
解决方案骨架模式
将此代码放入您的.emacs
(define-skeleton eqnstar
"Doc string"
nil
"\\begin{eqnarray*}\n"
" " _ " \n"
"\\end{eqnarray*}")
与 一起使用M-x eqnstar
。