Pas*_*ten 8 arrays emacs latex matrix
有人会建议如何去做:
\begin{array}{cc}
Lorem & Ipsum \\
More & Stuff \\
\end{array}
Run Code Online (Sandbox Code Playgroud)
其中添加或删除c,l或r在部件阵列之后将添加或删除&从在阵列环境中的所有行.
基本上,相同的技巧可以应用于矩阵或表格环境.
至少我会对其他人如何处理这个"容易出错","难以有效改变"的任务感兴趣.
按照建议,您可以制作一个YASnippet,根据第二个参数中的字母数量array自动添加适当数量的&s 添加到数组的第一行:
# -*- 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}
Run Code Online (Sandbox Code Playgroud)
该手册举例说明了该技术。的行(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}
Run Code Online (Sandbox Code Playgroud)
此代码片段的一个问题是,\\即使只有一列,它也会添加,但这样的数组可能很少见。
将 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"))))
Run Code Online (Sandbox Code Playgroud)