Emacs& LaTeX:表/矩阵/数组的列数

时间:2012-09-19 14:47:57

标签: arrays emacs matrix latex

有人会建议如何去做:

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

在数组之后的部分中添加或删除clr会在数组环境中的所有行中添加或删除&

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

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

4 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

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

  1. 对齐&,例如: C-x。 &安培;

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

  3. 使用 C-x r k 剪切矩形区域。

  4. 这不是超级自动的,但考虑到一些练习并不是一个障碍,除非你必须重新格式化一些旧文档并同时进行大量修改。

    修改

    (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,然后使用块选择/插入命令进行操作?这似乎与逃脱的&符号智能地工作。我发现在此操作期间禁用包装很有用。我根本没有发现这很难编辑,因为相对规则的重新对齐使得所有内容都非常易读。