提案されているように、2 番目の引数の文字数に応じて、適切な量のs を配列の最初の行に自動的に追加するYASnippetを作成できます。array
&
# -*- mode: snippet -*-
# name: array
# key: arr
# expand-env: ((yas/indent-line 'fixed))
# --
\begin{array}{${1:cc}}$0
${1:$
(let ((row ""))
(dotimes (i (- (string-width yas/text) 1) row)
(setq row (concat row "& "))))
}\\\\
\end{array}
マニュアルは、このテクニックを例示しています。の行(yas/indent-line 'fixed)
は、AUCTeX が行をインデントしないようにするためのものです。スニペットの終了点 ( ) を最初の行の先頭ではなく、配列の宣言の最後に配置する理由は$0
、最初の行の先頭に配置すると、終了点が期待どおりに動作しないためです。
次のスニペットも、列と同じ数の行を追加します。
# -*- mode: snippet -*-
# name: array
# key: arr
# expand-env: ((yas/indent-line 'fixed))
# --
\begin{array}{${1:cc}}$0
${1:$
(let ((row "") (allrows ""))
(dotimes (i (- (string-width yas/text) 1))
(setq row (concat row "& ")))
(dotimes (i (string-width yas/text) allrows)
(setq allrows (concat allrows row "\\\\\\\\\n"))))
}\end{array}
このスニペットの問題は、\\
列が 1 つしかない場合でも追加されることですが、そのような配列はまれです。
スニペットに埋め込まれた Lisp コードに Lisp コメントを追加すると問題が発生するようです。そのため、説明するために Lisp コードのみのコメント バージョンを追加します。
;; Make an empty row with as many columns as symbols in $1 (the $1 in
;; the snippet which is what yas/text refer to)
(let ((row "") (allrows ""))
;; Make an empty row with as many columns as symbols in $1
(dotimes (i (- (string-width yas/text) 1))
(setq row (concat row "& ")))
;; Make as many rows as symbols in $1
(dotimes (i (string-width yas/text) allrows)
(setq allrows (concat allrows row "\\\\\\\\\n"))))