auctex
[Top][All Lists]
Advanced

[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è



reply via email to

[Prev in Thread] Current Thread [Next in Thread]