有人会建议如何去做:
\begin{array}{cc}
Lorem & Ipsum \\
More & Stuff \\
\end{array}
添加或删除c
,l
或r
在数组之后的部分中将添加或删除&
数组环境中所有行的 。
基本上相同的技巧可以应用于矩阵或表格环境。
至少我会对其他人如何处理这个“容易出错”、“难以有效改变”的任务感兴趣。
我通常从不同格式(制表符分隔值或组织模式表)生成表,其中此类操作更简单。
这不完全是答案,但这就是我的做法:
在 & 上对齐,例如:C-x . &.
使用常规选择命令选择我需要的整个列。
使用 切割一个矩形区域C-x r k。
这不是超级自动的,但经过一些练习并不是真正的障碍,除非您必须重新格式化一些旧文档并同时进行大量更改。
编辑
(defun latex-merge-next-column (start end column)
"Works on selected region, removes COLUMN'th ampersand
in every line in the selected region"
(interactive "r\nnColumn to merge: ")
(labels ((%nth-index-of
(line)
(let ((i -1) (times 0))
(while (and (< times column) i)
(setq i (position ?\& line :start (1+ i))
times (1+ times))) i)))
(let ((region (split-string (buffer-substring start end) "\n"))
amp-pos
replacement)
(dolist (line region)
(setq amp-pos (%nth-index-of line)
replacement
(cons (if amp-pos
(concat (subseq line 0 amp-pos)
(subseq line (1+ amp-pos)))
line) replacement)))
(kill-region start end)
(insert (mapconcat #'identity (reverse replacement) "\n")))))
这将适用于所选区域并删除每行中的第 n 个 & 符号。你可以将它绑定到一些你觉得舒服的键上,比如:
(global-set-key (kbd "C-c C-n") 'latex-merge-next-column)
然后C-c C-n 2将删除所选行中的第二个&符号。
正如建议的那样,您可以制作一个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}
该手册举例说明了这种技术。与的行(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}
这个片段的一个问题是,\\
即使只有一列,它也会添加,但这样的数组可能很少见。
在片段中向嵌入的 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"))))
以@wvxvw 的解决方案为基础,M-x align-current
在表格/矩阵/数组环境中使用然后使用块选择/插入命令进行操作怎么样?这似乎与转义的 & 符号一起智能地工作。我发现在此操作期间禁用包装很有用。我根本不觉得这很难编辑,因为相对定期的重新对齐使所有内容都非常可读。