有人会建议如何去做:
\begin{array}{cc}
Lorem & Ipsum \\
More & Stuff \\
\end{array}
在数组之后的部分中添加或删除c
,l
或r
会在数组环境中的所有行中添加或删除&
。
基本上,同样的技巧可以应用于矩阵或表格环境。
至少我会对其他人如何处理这种“容易出错”,“难以有效改变”的任务感兴趣。
答案 0 :(得分:3)
我通常使用不同的格式(制表符分隔值或组织模式表)生成表格,其中此类操作更简单。
答案 1 :(得分:2)
这不是完全的答案,但这就是我的做法:
对齐&,例如: 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 会删除所选行中的每一个&符号。
答案 2 :(得分:1)
As suggested你可以根据第二个参数array
中的字母数量YASnippet自动将适当数量的&
添加到第一行数组:
# -*- 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}
手册exemplifies this technique。 (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"))))
答案 3 :(得分:1)
在@wvxvw的解决方案的基础上,如何在表格/矩阵/数组环境中使用M-x align-current
,然后使用块选择/插入命令进行操作?这似乎与逃脱的&符号智能地工作。我发现在此操作期间禁用包装很有用。我根本没有发现这很难编辑,因为相对规则的重新对齐使得所有内容都非常易读。