8

有人会建议如何去做:

\begin{array}{cc}
Lorem & Ipsum \\
More & Stuff \\
\end{array}

添加或删除c,lr在数组之后的部分中将添加或删除&数组环境中所有行的 。

基本上相同的技巧可以应用于矩阵或表格环境。

至少我会对其他人如何处理这个“容易出错”、“难以有效改变”的任务感兴趣。

4

4 回答 4

3

我通常从不同格式(制表符分隔值或组织模式表)生成表,其中此类操作更简单。

于 2012-09-19T15:43:47.300 回答
2

这不完全是答案,但这就是我的做法:

  1. 在 & 上对齐,例如:C-x . &.

  2. 使用常规选择命令选择我需要的整个列。

  3. 使用 切割一个矩形区域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将删除所选行中的第二个&符号。

于 2012-09-20T07:53:51.487 回答
1

正如建议的那样,您可以制作一个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"))))
于 2012-09-20T10:36:27.477 回答
1

以@wvxvw 的解决方案为基础,M-x align-current在表格/矩阵/数组环境中使用然后使用块选择/插入命令进行操作怎么样?这似乎与转义的 & 符号一起智能地工作。我发现在此操作期间禁用包装很有用。我根本不觉得这很难编辑,因为相对定期的重新对齐使所有内容都非常可读。

于 2012-09-20T16:32:07.283 回答