[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [AUCTeX] Snippet for tabular
From: |
Mosè Giordano |
Subject: |
Re: [AUCTeX] Snippet for tabular |
Date: |
Tue, 1 Mar 2016 00:19:59 +0100 |
Hi Denis,
2016-02-29 18:36 GMT+01:00 Denis Bitouzé <address@hidden>:
> Hi,
>
> I just came across the following yasnippet (see
> https://groups.google.com/d/msg/smart-snippet/8Og-1U5zJ2E/3aIMTNmwrKAJ):
>
> --8<---------------cut here---------------start------------->8---
> # -*- mode: snippet -*-
> # name: nxm matrix
> # key: pm
>
> # type: command
> # --
> (insert "\\begin{pmatrix}\n")
> (let ((width (read-number "Matrix width?" 3))
> (height (read-number "Matrix height?" 3))
> (snippet-text ""))
> (dotimes (i height)
> (dotimes (j width)
> (setq snippet-text (format "%s ${%d:m%d%d} %s"
> snippet-text
> (1+ (+ (* height i) j))
> (1+ i)
> (1+ j)
>
> (if (= j (1- width))
> (if (/= i (1- height)) "\\\\\\"
> "")
> "&"))))
> (setq snippet-text (format "%s\n" snippet-text)))
> (yas/expand-snippet (format "%s\\end{pmatrix}" snippet-text)))
> --8<---------------cut here---------------end--------------->8---
>
> What's nice: you are able to specify the dimensions of the matrix and
> the resulting template provides placeholders.
>
> What about similar feature provided by AUCTeX for e.g. tabulars?
This looks like a good idea. For tabular-like environments with
format specifier we have that great mechanism that reads the format
and decides how many ampersands should be inserted, but for those
environments without a format specifier we have to insert all
ampersands by hand.
Maybe something like this should work:
--8<---------------cut here---------------start------------->8---
(defun LaTeX-env-ampersands (env)
"Insert ENV environment and ask for the number of columns of rows.
Insert ampersands for a table with the given numbers of columns
and rows."
(LaTeX-insert-environment env)
(let* ((columns (read-number "Columns number: " 3))
(rows (and (natnump columns)
(null (zerop columns))
(read-number "Rows number: " 3))))
(and (natnump rows)
(null (zerop rows))
(LaTeX-env-ampersands--columns-rows columns rows))))
(defun LaTeX-env-ampersands--columns-rows (columns rows)
"Insert ampersands for a table with COLUMNS columns and ROWS rows."
;; Prevent from asking optional argument for "\\" macro.
(let ((TeX-insert-macro-default-style 'mandatory-args-only))
(save-excursion
(dotimes (line rows)
(insert (make-string (1- columns) ?&))
(unless (= line (1- rows))
(end-of-line)
(just-one-space)
(TeX-insert-macro "\\")
(indent-according-to-mode)
(newline-and-indent)))))
(indent-according-to-mode))
--8<---------------cut here---------------end--------------->8---
This is just a start, the code can be improved. You should associate
`LaTeX-env-ampersands' to "pmatrix" environment (actually we will do
that in amsmath.el style file when implemented). Comments welcome.
Bye,
Mosè