誰かが次のことをどうするかについて提案がありますか?
\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、選択した行の1つおきのアンパサンドを削除します。
@wvxvw によるソリューションに基づいてM-x align-current、表形式/マトリックス/配列環境で使用してから、ブロックの選択/挿入コマンドを使用して操作するのはどうですか? これは、エスケープされたアンパサンドでインテリジェントに機能するようです。この操作中はラッピングを無効にすると便利です。比較的定期的な再配置により、すべてが非常に読みやすくなるため、これを編集するのはまったく難しいとは思いません。
提案されているように、2 番目の引数の文字数に応じて、適切な量のs を配列の最初の行に自動的に追加するYASnippetを作成できます。array&
# -*- 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}
このスニペットの問題は、\\列が 1 つしかない場合でも追加されることですが、そのような配列はまれです。
スニペットに埋め込まれた 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"))))