GNU bug report logs - #31132
AUCTeX, RefTeX and biblatex's multicite commands

Previous Next

Package: auctex;

Reported by: gusbrs.2016 <at> gmail.com

Date: Thu, 12 Apr 2018 06:06:02 UTC

Severity: normal

Done: Arash Esbati <arash <at> gnu.org>

Bug is archived. No further changes may be made.

To add a comment to this bug, you must first unarchive it, by sending
a message to control AT debbugs.gnu.org, with unarchive 31132 in the body.
You can then email your comments to 31132 AT debbugs.gnu.org in the normal way.

Toggle the display of automated, internal messages from the tracker.

View this report as an mbox folder, status mbox, maintainer mbox


Report forwarded to bug-auctex <at> gnu.org:
bug#31132; Package auctex. (Thu, 12 Apr 2018 06:06:02 GMT) Full text and rfc822 format available.

Acknowledgement sent to gusbrs.2016 <at> gmail.com:
New bug report received and forwarded. Copy sent to bug-auctex <at> gnu.org. (Thu, 12 Apr 2018 06:06:02 GMT) Full text and rfc822 format available.

Message #5 received at submit <at> debbugs.gnu.org (full text, mbox):

From: gusbrs.2016 <at> gmail.com
To: bug-auctex <at> gnu.org
Subject: AUCTeX, RefTeX and biblatex's multicite commands
Date: Wed, 11 Apr 2018 20:35:39 -0300
From TeX.SX: https://tex.stackexchange.com/q/425883/105447


RefTeX's relations biblatex's multicite commands (such as \parencites, 
\footcites, \textcites and so on) leave some things to be desired for. 
Namely, they do not seem to be recognized as citation commands. This 
results in RefTeX's `reftex-view-crossref` (C-c &) returning "Not on a 
crossref macro argument". Also, in adding an extra bibkey to an already 
existing multicite command, it is not possible to access RefTeX's 
facilities.

Arash Esbati generously provided patches at TeX.SX that go a long way in 
dealing with these problems. However, support for the presence of global 
optional arguments (between parentheses) is still missing. At their 
request, I write to report this issue.

So, I kindly request that this issue be addressed when opportune.


With my warmest thanks for the great software,

gusbrs





Information forwarded to bug-auctex <at> gnu.org:
bug#31132; Package auctex. (Thu, 19 Apr 2018 19:47:02 GMT) Full text and rfc822 format available.

Message #8 received at 31132 <at> debbugs.gnu.org (full text, mbox):

From: Arash Esbati <arash <at> gnu.org>
To: gusbrs.2016 <at> gmail.com
Cc: 31132 <at> debbugs.gnu.org
Subject: Re: bug#31132: AUCTeX, RefTeX and biblatex's multicite commands
Date: Thu, 19 Apr 2018 21:45:51 +0200
gusbrs.2016 <at> gmail.com writes:

> From TeX.SX: https://tex.stackexchange.com/q/425883/105447
>
>
> RefTeX's relations biblatex's multicite commands (such as \parencites,
> \footcites, \textcites and so on) leave some things to be desired
> for. Namely, they do not seem to be recognized as citation
> commands. This results in RefTeX's `reftex-view-crossref` (C-c &)
> returning "Not on a crossref macro argument". Also, in adding an extra
> bibkey to an already existing multicite command, it is not possible to
> access RefTeX's facilities.
>
> Arash Esbati generously provided patches at TeX.SX that go a long way
> in dealing with these problems. However, support for the presence of
> global optional arguments (between parentheses) is still missing. At
> their request, I write to report this issue.

Hi Gusbrs,

thanks for the report.  I fiddled a little around and I think I have a
working setup for this issue.  I think with this patch, RefTeX will also
recognize referencing commands provided by cleveref.sty.

--8<---------------cut here---------------start------------->8---
diff --git a/lisp/textmodes/reftex-cite.el b/lisp/textmodes/reftex-cite.el
index fd229a6..3f4965a 100644
--- a/lisp/textmodes/reftex-cite.el
+++ b/lisp/textmodes/reftex-cite.el
@@ -763,7 +763,9 @@ in order to only add another reference in the same cite command."
       (setq format "%l"))

      ((and (stringp macro)
-           (string-match "\\`\\\\cite\\|cite\\'" macro))
+           (string-match "\\`\\\\cite\\|cite\\([s*]\\|texts?\\)?\\'" macro))
+      ;; Match also commands from biblatex ending with `s' (\cites) or
+      ;; `*' (\parencite*) and `texts?' (\footcitetext and \footcitetexts).
       ;; We are already inside a cite macro
       (if (or (not arg) (not (listp arg)))
           (setq format
diff --git a/lisp/textmodes/reftex-dcr.el b/lisp/textmodes/reftex-dcr.el
index 74a5e63..b93d05d 100644
--- a/lisp/textmodes/reftex-dcr.el
+++ b/lisp/textmodes/reftex-dcr.el
@@ -60,10 +60,13 @@ to the functions `reftex-view-cr-cite' and `reftex-view-cr-ref'."
       (setq reftex-call-back-to-this-buffer (current-buffer))

       (cond
-       ((string-match "\\`\\\\cite\\|cite\\*?\\'\\|bibentry" macro)
+       ((string-match "\\`\\\\cite\\|cite\\([s*]\\|texts?\\)?\\'\\|bibentry" macro)
+        ;; Match also commands from biblatex ending with `s' (\cites) or
+        ;; `*' (\parencite*) and `texts?' (\footcitetext and \footcitetexts).
        ;; A citation macro: search for bibitems or BibTeX entries
        (setq dw (reftex-view-cr-cite arg key auto-how)))
-       ((string-match "\\`\\\\ref\\|ref\\(range\\)?\\*?\\'" macro)
+       ((string-match "\\`\\\\ref\\|ref\\(s\\|range\\)?\\*?\\'" macro)
+        ;; Match also commands from cleveref ending with `s' (\namecrefs).
        ;; A reference macro: search for labels
        (setq dw (reftex-view-cr-ref arg key auto-how)))
        (auto-how nil)  ;; No further action for automatic display (speed)
diff --git a/lisp/textmodes/reftex-parse.el b/lisp/textmodes/reftex-parse.el
index 492f546..31e108c 100644
--- a/lisp/textmodes/reftex-parse.el
+++ b/lisp/textmodes/reftex-parse.el
@@ -788,12 +788,13 @@ move backward to the closing parenthesis of the previous argument.
 This function understands the splitting of macros over several lines
 in TeX."
   (cond
-   ;; Just to be quick:
-   ((memq (preceding-char) '(?\] ?\})))
+   ;; Just to be quick: biblatex uses () as delimiters for optional
+   ;; arguments in qualified citation lists.
+   ((memq (preceding-char) '(?\] ?\) ?\})))
    ;; Do a search
    ((and reftex-allow-detached-macro-args
          (re-search-backward
-          "[]}][ \t]*[\n\r]?\\([ \t]*%[^\n\r]*[\n\r]\\)*[ \t]*\\=" bound t))
+          "[])}][ \t]*[\n\r]?\\([ \t]*%[^\n\r]*[\n\r]\\)*[ \t]*\\=" bound t))
     (goto-char (1+ (match-beginning 0)))
     t)
    (t nil)))
@@ -842,12 +843,22 @@ considered an argument of macro \\macro."
             (while (and (reftex-move-to-previous-arg bound)
                         (condition-case nil
                             (let ((forward-sexp-function nil))
-                              (backward-sexp) t)
+                              (if (= (preceding-char) ?\))
+                                  (let ((temp-table (make-syntax-table)))
+                                    (modify-syntax-entry ?\( "()" temp-table)
+                                    (modify-syntax-entry ?\) ")(" temp-table)
+                                    (with-syntax-table temp-table
+                                      (backward-sexp)))
+                                (backward-sexp))
+                              t)
                           (error nil)))
-              (if (eq (following-char) ?\[) (cl-incf cnt-opt))
+              (if (or (eq (following-char) ?\[)
+                      (eq (following-char) ?\())
+                  (cl-incf cnt-opt))
               (cl-incf cnt))
             (setq pos (point))
             (when (and (or (= (following-char) ?\[)
+                           (= (following-char) ?\()
                            (= (following-char) ?\{))
                        (re-search-backward "\\\\[*a-zA-Z]+\\=" nil t))
               (setq cmd (reftex-match-string 0))
--8<---------------cut here---------------end--------------->8---

One thing I don't understand is why (backward-sexp) doesn't work on
(Global Pre) arguments.  Maybe somebody can enlighten me.  For now, I
added a trickery with `with-syntax-table'.

Further, I think the functions `reftex-move-over-touching-args' and
`reftex-move-to-next-arg' must also be patched in order to support
optional arguments in parentheses.

My test file for this looks like this.  In case somebody wants to try
this out, the complete functions are inserted below.  Any comments
welcome.


--8<---------------cut here---------------start------------->8---
\documentclass{article}

\begin{filecontents}{biblatex-bib.bib}
@book{lamp:94,
  author    = {Leslie Lamport},
  title     = {LaTeX - {A} Document Preparation System: User's Guide
               and Reference Manual, Second Edition},
  publisher = {Pearson / Prentice Hall},
  year      = {1994},
  isbn      = {978-0-201-52983-8},
  timestamp = {Fri, 08 Apr 2011 18:21:00 +0200},
}

@book{mitt:97,
  author    = {Michel Goossens and
               Sebastian Rahtz and
               Frank Mittelbach},
  title     = {The LaTeX Graphics Companion - Illustrating documents
               with TeX and PostScript},
  series    = {Addison-Wesley series on tools and techniques
               for computer typesetting},
  publisher = {Addison-Wesley},
  year      = {1997},
  isbn      = {978-0-201-85469-5},
}
\end{filecontents}

\usepackage[style=authoryear]{biblatex}

\addbibresource{biblatex-bib.bib}

\begin{document}

%% =============== RefTeX standard

\cite{mitt:97}
==> \verb|C-c &| Ok, \verb|C-c [| Ok

\cites[Pre][Post]{mitt:97}[Pre][Post]{lamp:94}
==> \verb|C-c &| Ok, \verb|C-c [| Ok

\footcitetext[Pre][Post]{mitt:97}
==> \verb|C-c &| NOk, \verb|C-c [| NOk

\parencite*[Pre][Post]{mitt:97}
==> \verb|C-c &| Ok, \verb|C-c [| NOk

\parencites{mitt:97}
\parencites(GPre)()[Pre][]{mitt:97}[Pre][]{lamp:94}
\parencites(pre)()[pre][]{mitt:97}
\parencites(post)[post]{mitt:97}
==> \verb|C-c &| NOk, \verb|C-c [| NOk

%% ============== RefTeX patched

\parencites[Pre][Post]{mitt:97}[Pre][Post]{lamp:94}
==> \verb|C-c &| Ok, \verb|C-c [| Ok

\parencites(Global Pre)(Global Post)[Pre][Post]{mitt:97}[Pre][Post]{lamp:94}
==> \verb|C-c &| Ok, \verb|C-c [| Ok


\begin{verbatim}
(defun reftex-view-crossref (&optional arg auto-how fail-quietly)
  "View cross reference of macro at point.  Point must be on the KEY
argument.  When at a `\\ref' macro, show corresponding `\\label'
definition, also in external documents (`xr').  When on a label, show
a locations where KEY is referenced.  Subsequent calls find additional
locations.  When on a `\\cite', show the associated `\\bibitem' macro or
the BibTeX database entry.  When on a `\\bibitem', show a `\\cite' macro
which uses this KEY. When on an `\\index', show other locations marked
by the same index entry.
To define additional cross referencing items, use the option
`reftex-view-crossref-extra'.  See also `reftex-view-crossref-from-bibtex'.
With one or two C-u prefixes, enforce rescanning of the document.
With argument 2, select the window showing the cross reference.
AUTO-HOW is only for the automatic crossref display and is handed through
to the functions `reftex-view-cr-cite' and `reftex-view-cr-ref'."

  (interactive "P")
  ;; See where we are.
  (let* ((macro (car (reftex-what-macro-safe 1)))
         (key (reftex-this-word "^{}%\n\r, \t"))
         dw)

    (if (or (null macro) (reftex-in-comment))
        (or fail-quietly
            (error "Not on a crossref macro argument"))

      (setq reftex-call-back-to-this-buffer (current-buffer))

      (cond
       ((string-match "\\`\\\\cite\\|cite\\([s*]\\|texts?\\)?\\'\\|bibentry" macro)
        ;; Match also commands from biblatex ending with `s' (\cites) or
        ;; `*' (\parencite*) and `texts?' (\footcitetext and \footcitetexts).
        ;; A citation macro: search for bibitems or BibTeX entries
        (setq dw (reftex-view-cr-cite arg key auto-how)))
       ((string-match "\\`\\\\ref\\|ref\\(s\\|range\\)?\\*?\\'" macro)
        ;; Match also commands from cleveref ending with `s' (\namecrefs).
        ;; A reference macro: search for labels
        (setq dw (reftex-view-cr-ref arg key auto-how)))
       (auto-how nil)  ;; No further action for automatic display (speed)
       ((or (equal macro "\\label")
            (member macro reftex-macros-with-labels))
        ;; A label macro: search for reference macros
        (reftex-access-scan-info arg)
        (setq dw (reftex-view-regexp-match
                  (format reftex-find-reference-format (regexp-quote key))
                  4 nil nil)))
       ((equal macro "\\bibitem")
        ;; A bibitem macro: search for citations
        (reftex-access-scan-info arg)
        (setq dw (reftex-view-regexp-match
                  (format reftex-find-citation-regexp-format (regexp-quote key))
                  4 nil nil)))
       ((member macro reftex-macros-with-index)
        (reftex-access-scan-info arg)
        (setq dw (reftex-view-regexp-match
                  (format reftex-find-index-entry-regexp-format
                          (regexp-quote key))
                  3 nil nil)))
       (t
        (reftex-access-scan-info arg)
        (catch 'exit
          (let ((list reftex-view-crossref-extra)
                entry mre action group)
            (while (setq entry (pop list))
              (setq mre (car entry)
                    action (nth 1 entry)
                    group (nth 2 entry))
              (when (string-match mre macro)
                (setq dw (reftex-view-regexp-match
                          (format action key) group nil nil))
                (throw 'exit t))))
          (error "Not on a crossref macro argument"))))
      (if (and (eq arg 2) (windowp dw)) (select-window dw)))))

(defun reftex-figure-out-cite-format (arg &optional no-insert format-key)
  "Check if there is already a cite command at point and change cite format
in order to only add another reference in the same cite command."
  (let ((macro (car (reftex-what-macro 1)))
        (cite-format-value (reftex-get-cite-format))
        key format)
    (cond
     (no-insert
      ;; Format does not really matter because nothing will be inserted.
      (setq format "%l"))

     ((and (stringp macro)
           (string-match "\\`\\\\cite\\|cite\\([s*]\\|texts?\\)?\\'" macro))
      ;; Match also commands from biblatex ending with `s' (\cites) or
      ;; `*' (\parencite*) and `texts?' (\footcitetext and \footcitetexts).
      ;; We are already inside a cite macro
      (if (or (not arg) (not (listp arg)))
          (setq format
                (concat
                 (if (member (preceding-char) '(?\{ ?,))
                     ""
                   reftex-cite-key-separator)
                 "%l"
                 (if (member (following-char) '(?\} ?,))
                     ""
                   reftex-cite-key-separator)))
        (setq format "%l")))
     (t
      ;; Figure out the correct format
      (setq format
            (if (and (symbolp cite-format-value)
                     (assq cite-format-value reftex-cite-format-builtin))
                (nth 2 (assq cite-format-value reftex-cite-format-builtin))
              cite-format-value))
      (when (listp format)
        (setq key
              (or format-key
                  (reftex-select-with-char
                   "" (concat "SELECT A CITATION FORMAT\n\n"
                              (mapconcat
                               (lambda (x)
                                 (format "[%c] %s  %s" (car x)
                                         (if (> (car x) 31) " " "")
                                         (cdr x)))
                               format "\n")))))
        (if (assq key format)
            (setq format (cdr (assq key format)))
          (error "No citation format associated with key `%c'" key)))))
    format))

(defun reftex-move-to-previous-arg (&optional bound)
  "Assuming that we are in front of a macro argument,
move backward to the closing parenthesis of the previous argument.
This function understands the splitting of macros over several lines
in TeX."
  (cond
   ;; Just to be quick: biblatex uses () as delimiters for optional
   ;; arguments in qualified citation lists.
   ((memq (preceding-char) '(?\] ?\) ?\})))
   ;; Do a search
   ((and reftex-allow-detached-macro-args
         (re-search-backward
          "[])}][ \t]*[\n\r]?\\([ \t]*%[^\n\r]*[\n\r]\\)*[ \t]*\\=" bound t))
    (goto-char (1+ (match-beginning 0)))
    t)
   (t nil)))


(defun reftex-what-macro (which &optional bound)
  "Find out if point is within the arguments of any TeX-macro.
The return value is either (\"\\macro\" . (point)) or a list of them.

If WHICH is nil, immediately return nil.
If WHICH is 1, return innermost enclosing macro.
If WHICH is t, return list of all macros enclosing point.
If WHICH is a list of macros, look only for those macros and return the
  name of the first macro in this list found to enclose point.
If the optional BOUND is an integer, bound backwards directed
  searches to this point.  If it is nil, limit to nearest \\section -
  like statement.

This function is pretty stable, but can be fooled if the text contains
things like \\macro{aa}{bb} where \\macro is defined to take only one
argument.  As RefTeX cannot know this, the string \"bb\" would still be
considered an argument of macro \\macro."
  (unless reftex-section-regexp (reftex-compile-variables))
  (catch 'exit
    (if (null which) (throw 'exit nil))
    (let ((bound (or bound (save-excursion (re-search-backward
                                            reftex-section-regexp nil 1)
                                           (point))))
          pos cmd-list cmd cnt cnt-opt entry)
      (save-restriction
        (save-excursion
          (narrow-to-region (max (point-min) bound) (point-max))
          ;; move back out of the current parenthesis
          (while (condition-case nil
                     (let ((forward-sexp-function nil))
                       (up-list -1) t)
                   (error nil))
            (setq cnt 1 cnt-opt 0)
            ;; move back over any touching sexps
            (while (and (reftex-move-to-previous-arg bound)
                        (condition-case nil
                            (let ((forward-sexp-function nil))
                              (if (= (preceding-char) ?\))
                                  (let ((temp-table (make-syntax-table)))
                                    (modify-syntax-entry ?\( "()" temp-table)
                                    (modify-syntax-entry ?\) ")(" temp-table)
                                    (with-syntax-table temp-table
                                      (backward-sexp)))
                                (backward-sexp))
                              t)
                          (error nil)))
              (if (or (eq (following-char) ?\[)
                      (eq (following-char) ?\())
                  (cl-incf cnt-opt))
              (cl-incf cnt))
            (setq pos (point))
            (when (and (or (= (following-char) ?\[)
                           (= (following-char) ?\()
                           (= (following-char) ?\{))
                       (re-search-backward "\\\\[*a-zA-Z]+\\=" nil t))
              (setq cmd (reftex-match-string 0))
              (when (looking-at "\\\\begin{[^}]*}")
                (setq cmd (reftex-match-string 0)
                      cnt (1- cnt)))
              ;; This does ignore optional arguments.  Very hard to fix.
              (when (setq entry (assoc cmd reftex-env-or-mac-alist))
                (if (> cnt (or (nth 4 entry) 100))
                    (setq cmd nil)))
              (cond
               ((null cmd))
               ((eq t which)
                (push (cons cmd (point)) cmd-list))
               ((or (eq 1 which) (member cmd which))
                (throw 'exit (cons cmd (point))))))
            (goto-char pos)))
        (nreverse cmd-list)))))

\end{verbatim}

\end{document}

--8<---------------cut here---------------end--------------->8---

Best, Arash




Information forwarded to bug-auctex <at> gnu.org:
bug#31132; Package auctex. (Sun, 22 Apr 2018 00:30:02 GMT) Full text and rfc822 format available.

Message #11 received at 31132 <at> debbugs.gnu.org (full text, mbox):

From: Gustavo Barros <gusbrs.2016 <at> gmail.com>
To: Arash Esbati <arash <at> gnu.org>
Cc: 31132 <at> debbugs.gnu.org
Subject: Re: bug#31132: AUCTeX, RefTeX and biblatex's multicite commands
Date: Sat, 21 Apr 2018 21:29:13 -0300
Hi Arash,

thank you very much for the patches. They are really appreciated.
And sorry for the delay in reporting back. I didn't have the time these 
last couple of days to look at this with due care.

I've performed some tests with the patches you sent on the full set of 
biblatex's citation commands, and can gladly report that both "C-c &" 
(reftex-view-crossref) and "C-c [" (reftex-citation) (when issued on the 
key of an existing citation command) work flawlessly on all of them.

But, in performing the tests, I observed some other things associated 
with biblatex's citation commands (some related to this issue, some not) 
that I might as well report too, in the hope they will be useful. As a 
regular biblatex user, I consider them minor.

1 - The multicite variants of 'volcite' are neither fontified nor call 
RefTeX when inserted (with "C-c RET"). They are inserted "plain" but, 
once inserted, "C-c [" will work on them. They are the following:
-volcites
-Volcites
-pvolcites
-Pvolcites
-fvolcites
-Fvolcites
-svolcites
-Svolcites
-tvolcites
-Tvolcites
-avolcites
-Avolcites

2 - A couple of 'volcite' variants are fontified, but don't call RefTeX 
when inserted:
-pvolcite
-ftvolcite

3 - One command is not fontified:
-footfullcite

4 - 'mcite'-like citation commands are neither fontified, nor call 
RefTeX when inserted:
-mcite
-Mcite
-mparencite
-Mparencite
-mfootcite
-mfootcitetext
-mtextcite
-Mtextcite


I can report something else too. In the last couple of weeks, for all 
the critical issues for my regular workflow with LaTeX I found my way 
around with Emacs, so I think the "potential deal breakers" are 
overcome. Even though I'm clearly still in the steep part of the 
learning curve with Emacs, I do believe I've been hooked. Still 
struggling, but already bewitched. :)
So I'm looking forward to sticking around.

Thank you very much once again.

Best,
gusbrs


PS: The test file used was the following:

\documentclass{article}

\begin{filecontents}{biblatex-bib.bib}
@book{lamp:94,
  author    = {Leslie Lamport},
  title     = {LaTeX - {A} Document Preparation System: User's Guide
               and Reference Manual, Second Edition},
  publisher = {Pearson / Prentice Hall},
  year      = {1994},
  isbn      = {978-0-201-52983-8},
  timestamp = {Fri, 08 Apr 2011 18:21:00 +0200},
}

@book{mitt:97,
  author    = {Michel Goossens and
               Sebastian Rahtz and
               Frank Mittelbach},
  title     = {The LaTeX Graphics Companion - Illustrating documents
               with TeX and PostScript},
  series    = {Addison-Wesley series on tools and techniques
               for computer typesetting},
  publisher = {Addison-Wesley},
  year      = {1997},
  isbn      = {978-0-201-85469-5},
}
\end{filecontents}

\usepackage[style=authoryear, natbib=true, mcite=true]{biblatex}

\addbibresource{biblatex-bib.bib}

\begin{document}

% Standard commands
\cite[pre][pos]{mitt:97}
\Cite[pre][pos]{lamp:94}
\parencite[pre][pos]{mitt:97}
\Parencite[pre][pos]{lamp:94}
\footcite[pre][pos]{mitt:97}
\footcitetext[pre][pos]{lamp:94}
% Style specific commands
\textcite[pre][pos]{mitt:97}
\Textcite[pre][pos]{lamp:94,}
\smartcite[pre][pos]{mitt:97}
\Smartcite[pre][pos]{lamp:94}
\cite*[pre][pos]{mitt:97}
\parencite*[pre][pos]{lamp:94}
% \supercite{mitt:97}
% Qualified citation lists
\cites(gpre)(gpos)[pre][pos]{mitt:97}[pre][pos]{lamp:94}[pre][pos]{lamp:94}
\Cites(gpre)(gpos)[pre][pos]{mitt:97}[pre][pos]{lamp:94}
\parencites(gpre)(gpos)[pre][pos]{mitt:97}[pre][pos]{lamp:94}
\Parencites(gpre)(gpos)[pre][pos]{mitt:97}[pre][pos]{lamp:94}
\footcites(gpre)(gpos)[pre][pos]{mitt:97}[pre][pos]{lamp:94}
\footcitetexts(gpre)(gpos)[pre][pos]{mitt:97}[pre][pos]{lamp:94}
\smartcites(gpre)(gpos)[pre][pos]{mitt:97}[pre][pos]{lamp:94}
\Smartcites(gpre)(gpos)[pre][pos]{mitt:97}[pre][pos]{lamp:94}
\textcites(gpre)(gpos)[pre][pos]{mitt:97}[pre][pos]{lamp:94}
\Textcites(gpre)(gpos)[pre][pos]{lamp:94}[pre][pos]{mitt:97}
% \supercites(gpre)(gpos)[pre][pos]{mitt:97}[pre][pos]{lamp:94}
% Style independent commands
\autocite[pre][pos]{mitt:97}
\Autocite[pre][pos]{lamp:94}
\autocite*[pre][pos]{mitt:97}
\Autocite*[pre][pos]{lamp:94}
\autocites(gpre)(gpos)[pre][pos]{mitt:97}[pre][pos]{lamp:94}
\Autocites(gpre)(gpos)[pre][pos]{mitt:97}[pre][pos]{lamp:94}
% Text commands
\citeauthor[pre][pos]{mitt:97}
\citeauthor*[pre][pos]{mitt:97}
\Citeauthor[pre][pos]{lamp:94}
\Citeauthor*[pre][pos]{lamp:94}
\citetitle[pre][pos]{mitt:97,lamp:94}
\citetitle*[pre][pos]{lamp:94}
\citeyear[pre][pos]{mitt:97}
\citeyear*[pre][pos]{lamp:94}
\citedate[pre][pos]{mitt:97}
\citedate*[pre][pos]{lamp:94}
\citeurl[pre][pos]{mitt:97}
% Special commands
\nocite{mitt:97}
\fullcite[pre][pos]{lamp:94}
\footfullcite[pre][pos]{mitt:97}
\volcite[pre]{2}[pg]{mitt:97}
\Volcite[pre]{1}[pg]{lamp:94}
\volcites(gpre)(gpos)[pre]{2}[pg]{lamp:94}[pre]{1}[pg]{mitt:97}
\Volcites(gpre)(gpos)[pre]{2}[pg]{mitt:97}[pre]{2}[pg]{lamp:94}
\pvolcite[pre]{1}[pg]{lamp:94}
\Pvolcite[pre]{2}[pg]{mitt:97}
\pvolcites(gpre)(gpos)[pre]{1}[pg]{mitt:97}[pre]{2}[pg]{lamp:94}
\Pvolcites(gpre)(gpos)[pre]{3}[pg]{lamp:94}[pre]{1}[pg]{mitt:97}
\fvolcite[pre]{3}[pg]{lamp:94}
\ftvolcite[pre]{3}[pg]{lamp:94}
\fvolcites(gpre)(gpos)[pre]{3}[pg]{mitt:97}[pre]{2}[pg]{lamp:94}
\Fvolcites(gpre)(gpos)[pre]{2}[pg]{lamp:94}[pre]{3}[pg]{mitt:97}
\svolcite[pre]{2}[pg]{lamp:94}
\Svolcite[pre]{4}[pg]{mitt:97}
\svolcites(gpre)(gpos)[pre]{3}[pg]{mitt:97}[pre]{2}[pg]{lamp:94}
\Svolcites(gpre)(gpos)[pre]{3}[pg]{mitt:97}[pre]{2}[pg]{lamp:94}
\tvolcite[pre]{5}[pg]{mitt:97}
\Tvolcite[pre]{2}[pg]{lamp:94}
\tvolcites(gpre)(gpos)[pre]{2}[pg]{lamp:94}[pre]{3}[pg]{mitt:97}
\Tvolcites(gpre)(gpos)[pre]{2}[pg]{lamp:94}[pre]{3}[pg]{mitt:97}
\avolcite[pre]{3}[pg]{lamp:94}
\Avolcite[pre]{1}[pg]{mitt:97}
\avolcites(gpre)(gpos)[pre]{2}[pg]{lamp:94}[pre]{1}[pg]{mitt:97}
\Avolcites(gpre)(gpos)[pre]{2}[pg]{lamp:94}[pre]{1}[pg]{mitt:97}
\notecite[pre][pos]{lamp:94}
\Notecite[pre][pos]{mitt:97}
\pnotecite[pre][pos]{mitt:97}
\Pnotecite[pre][pos]{lamp:94}
\fnotecite[pre][pos]{lamp:94}
% Low-level commands
\citename[pre][pos]{lamp:94}{author}
\citelist[pre][pos]{lamp:94}{publisher}
\citefield[pre][pos]{lamp:94}{isbn}
% natbib compatibility commands
\citet[pre][pos]{mitt:97}
\citet*[pre][pos]{lamp:94}
\citep[pre][pos]{lamp:94}
\citep*[pre][pos]{mitt:97}
\citealt[pre][pos]{lamp:94}
\citealt*[pre][pos]{mitt:97}
\citealp[pre][pos]{mitt:97}
\citealp*[pre][pos]{lamp:94}
\Citet[pre][pos]{lamp:94}
\Citet*[pre][pos]{mitt:97}
\Citep[pre][pos]{lamp:94}
\Citep*[pre][pos]{mitt:97}
% mcite-like citation commands
\mcite[pre][pos]{lamp:94,mitt:97}
\Mcite[pre][pos]{mitt:97,lamp:94}
\mparencite[pre][pos]{lamp:94,mitt:97}
\Mparencite[pre][pos]{lamp:94,mitt:97}
\mfootcite[pre][pos]{lamp:94,mitt:97}
\mfootcitetext[pre][pos]{lamp:94,mitt:97}
\mtextcite[pre][pos]{lamp:94,mitt:97}
\Mtextcite[pre][pos]{lamp:94,mitt:97}
% \msupercite[pre][pos]{lamp:94,mitt:97}

\end{document}
%%% Local Variables:
%%% mode: latex
%%% TeX-master: t
%%% End:




On 19/04/18 16:45, Arash Esbati wrote:
> gusbrs.2016 <at> gmail.com writes:
>
>>  From TeX.SX: https://tex.stackexchange.com/q/425883/105447
>>
>>
>> RefTeX's relations biblatex's multicite commands (such as \parencites,
>> \footcites, \textcites and so on) leave some things to be desired
>> for. Namely, they do not seem to be recognized as citation
>> commands. This results in RefTeX's `reftex-view-crossref` (C-c &)
>> returning "Not on a crossref macro argument". Also, in adding an extra
>> bibkey to an already existing multicite command, it is not possible to
>> access RefTeX's facilities.
>>
>> Arash Esbati generously provided patches at TeX.SX that go a long way
>> in dealing with these problems. However, support for the presence of
>> global optional arguments (between parentheses) is still missing. At
>> their request, I write to report this issue.
> Hi Gusbrs,
>
> thanks for the report.  I fiddled a little around and I think I have a
> working setup for this issue.  I think with this patch, RefTeX will also
> recognize referencing commands provided by cleveref.sty.
>
> --8<---------------cut here---------------start------------->8---
> diff --git a/lisp/textmodes/reftex-cite.el b/lisp/textmodes/reftex-cite.el
> index fd229a6..3f4965a 100644
> --- a/lisp/textmodes/reftex-cite.el
> +++ b/lisp/textmodes/reftex-cite.el
> @@ -763,7 +763,9 @@ in order to only add another reference in the same cite command."
>         (setq format "%l"))
>
>        ((and (stringp macro)
> -           (string-match "\\`\\\\cite\\|cite\\'" macro))
> +           (string-match "\\`\\\\cite\\|cite\\([s*]\\|texts?\\)?\\'" macro))
> +      ;; Match also commands from biblatex ending with `s' (\cites) or
> +      ;; `*' (\parencite*) and `texts?' (\footcitetext and \footcitetexts).
>         ;; We are already inside a cite macro
>         (if (or (not arg) (not (listp arg)))
>             (setq format
> diff --git a/lisp/textmodes/reftex-dcr.el b/lisp/textmodes/reftex-dcr.el
> index 74a5e63..b93d05d 100644
> --- a/lisp/textmodes/reftex-dcr.el
> +++ b/lisp/textmodes/reftex-dcr.el
> @@ -60,10 +60,13 @@ to the functions `reftex-view-cr-cite' and `reftex-view-cr-ref'."
>         (setq reftex-call-back-to-this-buffer (current-buffer))
>
>         (cond
> -       ((string-match "\\`\\\\cite\\|cite\\*?\\'\\|bibentry" macro)
> +       ((string-match "\\`\\\\cite\\|cite\\([s*]\\|texts?\\)?\\'\\|bibentry" macro)
> +        ;; Match also commands from biblatex ending with `s' (\cites) or
> +        ;; `*' (\parencite*) and `texts?' (\footcitetext and \footcitetexts).
>          ;; A citation macro: search for bibitems or BibTeX entries
>          (setq dw (reftex-view-cr-cite arg key auto-how)))
> -       ((string-match "\\`\\\\ref\\|ref\\(range\\)?\\*?\\'" macro)
> +       ((string-match "\\`\\\\ref\\|ref\\(s\\|range\\)?\\*?\\'" macro)
> +        ;; Match also commands from cleveref ending with `s' (\namecrefs).
>          ;; A reference macro: search for labels
>          (setq dw (reftex-view-cr-ref arg key auto-how)))
>          (auto-how nil)  ;; No further action for automatic display (speed)
> diff --git a/lisp/textmodes/reftex-parse.el b/lisp/textmodes/reftex-parse.el
> index 492f546..31e108c 100644
> --- a/lisp/textmodes/reftex-parse.el
> +++ b/lisp/textmodes/reftex-parse.el
> @@ -788,12 +788,13 @@ move backward to the closing parenthesis of the previous argument.
>   This function understands the splitting of macros over several lines
>   in TeX."
>     (cond
> -   ;; Just to be quick:
> -   ((memq (preceding-char) '(?\] ?\})))
> +   ;; Just to be quick: biblatex uses () as delimiters for optional
> +   ;; arguments in qualified citation lists.
> +   ((memq (preceding-char) '(?\] ?\) ?\})))
>      ;; Do a search
>      ((and reftex-allow-detached-macro-args
>            (re-search-backward
> -          "[]}][ \t]*[\n\r]?\\([ \t]*%[^\n\r]*[\n\r]\\)*[ \t]*\\=" bound t))
> +          "[])}][ \t]*[\n\r]?\\([ \t]*%[^\n\r]*[\n\r]\\)*[ \t]*\\=" bound t))
>       (goto-char (1+ (match-beginning 0)))
>       t)
>      (t nil)))
> @@ -842,12 +843,22 @@ considered an argument of macro \\macro."
>               (while (and (reftex-move-to-previous-arg bound)
>                           (condition-case nil
>                               (let ((forward-sexp-function nil))
> -                              (backward-sexp) t)
> +                              (if (= (preceding-char) ?\))
> +                                  (let ((temp-table (make-syntax-table)))
> +                                    (modify-syntax-entry ?\( "()" temp-table)
> +                                    (modify-syntax-entry ?\) ")(" temp-table)
> +                                    (with-syntax-table temp-table
> +                                      (backward-sexp)))
> +                                (backward-sexp))
> +                              t)
>                             (error nil)))
> -              (if (eq (following-char) ?\[) (cl-incf cnt-opt))
> +              (if (or (eq (following-char) ?\[)
> +                      (eq (following-char) ?\())
> +                  (cl-incf cnt-opt))
>                 (cl-incf cnt))
>               (setq pos (point))
>               (when (and (or (= (following-char) ?\[)
> +                           (= (following-char) ?\()
>                              (= (following-char) ?\{))
>                          (re-search-backward "\\\\[*a-zA-Z]+\\=" nil t))
>                 (setq cmd (reftex-match-string 0))
> --8<---------------cut here---------------end--------------->8---
>
> One thing I don't understand is why (backward-sexp) doesn't work on
> (Global Pre) arguments.  Maybe somebody can enlighten me.  For now, I
> added a trickery with `with-syntax-table'.
>
> Further, I think the functions `reftex-move-over-touching-args' and
> `reftex-move-to-next-arg' must also be patched in order to support
> optional arguments in parentheses.
>
> My test file for this looks like this.  In case somebody wants to try
> this out, the complete functions are inserted below.  Any comments
> welcome.
>
>
> --8<---------------cut here---------------start------------->8---
> \documentclass{article}
>
> \begin{filecontents}{biblatex-bib.bib}
> @book{lamp:94,
>    author    = {Leslie Lamport},
>    title     = {LaTeX - {A} Document Preparation System: User's Guide
>                 and Reference Manual, Second Edition},
>    publisher = {Pearson / Prentice Hall},
>    year      = {1994},
>    isbn      = {978-0-201-52983-8},
>    timestamp = {Fri, 08 Apr 2011 18:21:00 +0200},
> }
>
> @book{mitt:97,
>    author    = {Michel Goossens and
>                 Sebastian Rahtz and
>                 Frank Mittelbach},
>    title     = {The LaTeX Graphics Companion - Illustrating documents
>                 with TeX and PostScript},
>    series    = {Addison-Wesley series on tools and techniques
>                 for computer typesetting},
>    publisher = {Addison-Wesley},
>    year      = {1997},
>    isbn      = {978-0-201-85469-5},
> }
> \end{filecontents}
>
> \usepackage[style=authoryear]{biblatex}
>
> \addbibresource{biblatex-bib.bib}
>
> \begin{document}
>
> %% =============== RefTeX standard
>
> \cite{mitt:97}
> ==> \verb|C-c &| Ok, \verb|C-c [| Ok
>
> \cites[Pre][Post]{mitt:97}[Pre][Post]{lamp:94}
> ==> \verb|C-c &| Ok, \verb|C-c [| Ok
>
> \footcitetext[Pre][Post]{mitt:97}
> ==> \verb|C-c &| NOk, \verb|C-c [| NOk
>
> \parencite*[Pre][Post]{mitt:97}
> ==> \verb|C-c &| Ok, \verb|C-c [| NOk
>
> \parencites{mitt:97}
> \parencites(GPre)()[Pre][]{mitt:97}[Pre][]{lamp:94}
> \parencites(pre)()[pre][]{mitt:97}
> \parencites(post)[post]{mitt:97}
> ==> \verb|C-c &| NOk, \verb|C-c [| NOk
>
> %% ============== RefTeX patched
>
> \parencites[Pre][Post]{mitt:97}[Pre][Post]{lamp:94}
> ==> \verb|C-c &| Ok, \verb|C-c [| Ok
>
> \parencites(Global Pre)(Global Post)[Pre][Post]{mitt:97}[Pre][Post]{lamp:94}
> ==> \verb|C-c &| Ok, \verb|C-c [| Ok
>
>
> \begin{verbatim}
> (defun reftex-view-crossref (&optional arg auto-how fail-quietly)
>    "View cross reference of macro at point.  Point must be on the KEY
> argument.  When at a `\\ref' macro, show corresponding `\\label'
> definition, also in external documents (`xr').  When on a label, show
> a locations where KEY is referenced.  Subsequent calls find additional
> locations.  When on a `\\cite', show the associated `\\bibitem' macro or
> the BibTeX database entry.  When on a `\\bibitem', show a `\\cite' macro
> which uses this KEY. When on an `\\index', show other locations marked
> by the same index entry.
> To define additional cross referencing items, use the option
> `reftex-view-crossref-extra'.  See also `reftex-view-crossref-from-bibtex'.
> With one or two C-u prefixes, enforce rescanning of the document.
> With argument 2, select the window showing the cross reference.
> AUTO-HOW is only for the automatic crossref display and is handed through
> to the functions `reftex-view-cr-cite' and `reftex-view-cr-ref'."
>
>    (interactive "P")
>    ;; See where we are.
>    (let* ((macro (car (reftex-what-macro-safe 1)))
>           (key (reftex-this-word "^{}%\n\r, \t"))
>           dw)
>
>      (if (or (null macro) (reftex-in-comment))
>          (or fail-quietly
>              (error "Not on a crossref macro argument"))
>
>        (setq reftex-call-back-to-this-buffer (current-buffer))
>
>        (cond
>         ((string-match "\\`\\\\cite\\|cite\\([s*]\\|texts?\\)?\\'\\|bibentry" macro)
>          ;; Match also commands from biblatex ending with `s' (\cites) or
>          ;; `*' (\parencite*) and `texts?' (\footcitetext and \footcitetexts).
>          ;; A citation macro: search for bibitems or BibTeX entries
>          (setq dw (reftex-view-cr-cite arg key auto-how)))
>         ((string-match "\\`\\\\ref\\|ref\\(s\\|range\\)?\\*?\\'" macro)
>          ;; Match also commands from cleveref ending with `s' (\namecrefs).
>          ;; A reference macro: search for labels
>          (setq dw (reftex-view-cr-ref arg key auto-how)))
>         (auto-how nil)  ;; No further action for automatic display (speed)
>         ((or (equal macro "\\label")
>              (member macro reftex-macros-with-labels))
>          ;; A label macro: search for reference macros
>          (reftex-access-scan-info arg)
>          (setq dw (reftex-view-regexp-match
>                    (format reftex-find-reference-format (regexp-quote key))
>                    4 nil nil)))
>         ((equal macro "\\bibitem")
>          ;; A bibitem macro: search for citations
>          (reftex-access-scan-info arg)
>          (setq dw (reftex-view-regexp-match
>                    (format reftex-find-citation-regexp-format (regexp-quote key))
>                    4 nil nil)))
>         ((member macro reftex-macros-with-index)
>          (reftex-access-scan-info arg)
>          (setq dw (reftex-view-regexp-match
>                    (format reftex-find-index-entry-regexp-format
>                            (regexp-quote key))
>                    3 nil nil)))
>         (t
>          (reftex-access-scan-info arg)
>          (catch 'exit
>            (let ((list reftex-view-crossref-extra)
>                  entry mre action group)
>              (while (setq entry (pop list))
>                (setq mre (car entry)
>                      action (nth 1 entry)
>                      group (nth 2 entry))
>                (when (string-match mre macro)
>                  (setq dw (reftex-view-regexp-match
>                            (format action key) group nil nil))
>                  (throw 'exit t))))
>            (error "Not on a crossref macro argument"))))
>        (if (and (eq arg 2) (windowp dw)) (select-window dw)))))
>
> (defun reftex-figure-out-cite-format (arg &optional no-insert format-key)
>    "Check if there is already a cite command at point and change cite format
> in order to only add another reference in the same cite command."
>    (let ((macro (car (reftex-what-macro 1)))
>          (cite-format-value (reftex-get-cite-format))
>          key format)
>      (cond
>       (no-insert
>        ;; Format does not really matter because nothing will be inserted.
>        (setq format "%l"))
>
>       ((and (stringp macro)
>             (string-match "\\`\\\\cite\\|cite\\([s*]\\|texts?\\)?\\'" macro))
>        ;; Match also commands from biblatex ending with `s' (\cites) or
>        ;; `*' (\parencite*) and `texts?' (\footcitetext and \footcitetexts).
>        ;; We are already inside a cite macro
>        (if (or (not arg) (not (listp arg)))
>            (setq format
>                  (concat
>                   (if (member (preceding-char) '(?\{ ?,))
>                       ""
>                     reftex-cite-key-separator)
>                   "%l"
>                   (if (member (following-char) '(?\} ?,))
>                       ""
>                     reftex-cite-key-separator)))
>          (setq format "%l")))
>       (t
>        ;; Figure out the correct format
>        (setq format
>              (if (and (symbolp cite-format-value)
>                       (assq cite-format-value reftex-cite-format-builtin))
>                  (nth 2 (assq cite-format-value reftex-cite-format-builtin))
>                cite-format-value))
>        (when (listp format)
>          (setq key
>                (or format-key
>                    (reftex-select-with-char
>                     "" (concat "SELECT A CITATION FORMAT\n\n"
>                                (mapconcat
>                                 (lambda (x)
>                                   (format "[%c] %s  %s" (car x)
>                                           (if (> (car x) 31) " " "")
>                                           (cdr x)))
>                                 format "\n")))))
>          (if (assq key format)
>              (setq format (cdr (assq key format)))
>            (error "No citation format associated with key `%c'" key)))))
>      format))
>
> (defun reftex-move-to-previous-arg (&optional bound)
>    "Assuming that we are in front of a macro argument,
> move backward to the closing parenthesis of the previous argument.
> This function understands the splitting of macros over several lines
> in TeX."
>    (cond
>     ;; Just to be quick: biblatex uses () as delimiters for optional
>     ;; arguments in qualified citation lists.
>     ((memq (preceding-char) '(?\] ?\) ?\})))
>     ;; Do a search
>     ((and reftex-allow-detached-macro-args
>           (re-search-backward
>            "[])}][ \t]*[\n\r]?\\([ \t]*%[^\n\r]*[\n\r]\\)*[ \t]*\\=" bound t))
>      (goto-char (1+ (match-beginning 0)))
>      t)
>     (t nil)))
>
>
> (defun reftex-what-macro (which &optional bound)
>    "Find out if point is within the arguments of any TeX-macro.
> The return value is either (\"\\macro\" . (point)) or a list of them.
>
> If WHICH is nil, immediately return nil.
> If WHICH is 1, return innermost enclosing macro.
> If WHICH is t, return list of all macros enclosing point.
> If WHICH is a list of macros, look only for those macros and return the
>    name of the first macro in this list found to enclose point.
> If the optional BOUND is an integer, bound backwards directed
>    searches to this point.  If it is nil, limit to nearest \\section -
>    like statement.
>
> This function is pretty stable, but can be fooled if the text contains
> things like \\macro{aa}{bb} where \\macro is defined to take only one
> argument.  As RefTeX cannot know this, the string \"bb\" would still be
> considered an argument of macro \\macro."
>    (unless reftex-section-regexp (reftex-compile-variables))
>    (catch 'exit
>      (if (null which) (throw 'exit nil))
>      (let ((bound (or bound (save-excursion (re-search-backward
>                                              reftex-section-regexp nil 1)
>                                             (point))))
>            pos cmd-list cmd cnt cnt-opt entry)
>        (save-restriction
>          (save-excursion
>            (narrow-to-region (max (point-min) bound) (point-max))
>            ;; move back out of the current parenthesis
>            (while (condition-case nil
>                       (let ((forward-sexp-function nil))
>                         (up-list -1) t)
>                     (error nil))
>              (setq cnt 1 cnt-opt 0)
>              ;; move back over any touching sexps
>              (while (and (reftex-move-to-previous-arg bound)
>                          (condition-case nil
>                              (let ((forward-sexp-function nil))
>                                (if (= (preceding-char) ?\))
>                                    (let ((temp-table (make-syntax-table)))
>                                      (modify-syntax-entry ?\( "()" temp-table)
>                                      (modify-syntax-entry ?\) ")(" temp-table)
>                                      (with-syntax-table temp-table
>                                        (backward-sexp)))
>                                  (backward-sexp))
>                                t)
>                            (error nil)))
>                (if (or (eq (following-char) ?\[)
>                        (eq (following-char) ?\())
>                    (cl-incf cnt-opt))
>                (cl-incf cnt))
>              (setq pos (point))
>              (when (and (or (= (following-char) ?\[)
>                             (= (following-char) ?\()
>                             (= (following-char) ?\{))
>                         (re-search-backward "\\\\[*a-zA-Z]+\\=" nil t))
>                (setq cmd (reftex-match-string 0))
>                (when (looking-at "\\\\begin{[^}]*}")
>                  (setq cmd (reftex-match-string 0)
>                        cnt (1- cnt)))
>                ;; This does ignore optional arguments.  Very hard to fix.
>                (when (setq entry (assoc cmd reftex-env-or-mac-alist))
>                  (if (> cnt (or (nth 4 entry) 100))
>                      (setq cmd nil)))
>                (cond
>                 ((null cmd))
>                 ((eq t which)
>                  (push (cons cmd (point)) cmd-list))
>                 ((or (eq 1 which) (member cmd which))
>                  (throw 'exit (cons cmd (point))))))
>              (goto-char pos)))
>          (nreverse cmd-list)))))
>
> \end{verbatim}
>
> \end{document}
>
> --8<---------------cut here---------------end--------------->8---
>
> Best, Arash





Information forwarded to bug-auctex <at> gnu.org:
bug#31132; Package auctex. (Sun, 22 Apr 2018 00:55:02 GMT) Full text and rfc822 format available.

Message #14 received at 31132 <at> debbugs.gnu.org (full text, mbox):

From: Gustavo Barros <gusbrs.2016 <at> gmail.com>
To: Arash Esbati <arash <at> gnu.org>
Cc: 31132 <at> debbugs.gnu.org
Subject: Re: bug#31132: AUCTeX, RefTeX and biblatex's multicite commands
Date: Sat, 21 Apr 2018 21:54:21 -0300
Hi Arash,

I did observe something else, as I closed my file after testing, and was 
cleaning up things.
I had observed the behavior before, but was unsure if my "noobiness" was 
to blame. (So please be understanding).

The behavior is the following. When I first open the file, if I try to 
issue 'C-c &' on a multicite command key, it returns "Not on a crossref 
macro argument". 'C-c [' works though. And *after* I have either issued 
'C-c [' on a key or issued successfully 'C-c &' on a regular citation 
command, then 'C-c &' will work also on multicite commands.
It's a small glitch in my view, and was somehow hard to spot. But I can 
reproduce this behavior with the test file I sent previously.

Sorry for the previous incomplete report. But I only could figure the 
logic of what was going on, after I closed and reopened things.

Thank you once again.

Best,
gusbrs


On 21/04/18 21:29, Gustavo Barros wrote:
> Hi Arash,
>
> thank you very much for the patches. They are really appreciated.
> And sorry for the delay in reporting back. I didn't have the time 
> these last couple of days to look at this with due care.
>
> I've performed some tests with the patches you sent on the full set of 
> biblatex's citation commands, and can gladly report that both "C-c &" 
> (reftex-view-crossref) and "C-c [" (reftex-citation) (when issued on 
> the key of an existing citation command) work flawlessly on all of them.
>
> But, in performing the tests, I observed some other things associated 
> with biblatex's citation commands (some related to this issue, some 
> not) that I might as well report too, in the hope they will be useful. 
> As a regular biblatex user, I consider them minor.
>
> 1 - The multicite variants of 'volcite' are neither fontified nor call 
> RefTeX when inserted (with "C-c RET"). They are inserted "plain" but, 
> once inserted, "C-c [" will work on them. They are the following:
> -volcites
> -Volcites
> -pvolcites
> -Pvolcites
> -fvolcites
> -Fvolcites
> -svolcites
> -Svolcites
> -tvolcites
> -Tvolcites
> -avolcites
> -Avolcites
>
> 2 - A couple of 'volcite' variants are fontified, but don't call 
> RefTeX when inserted:
> -pvolcite
> -ftvolcite
>
> 3 - One command is not fontified:
> -footfullcite
>
> 4 - 'mcite'-like citation commands are neither fontified, nor call 
> RefTeX when inserted:
> -mcite
> -Mcite
> -mparencite
> -Mparencite
> -mfootcite
> -mfootcitetext
> -mtextcite
> -Mtextcite
>
>
> I can report something else too. In the last couple of weeks, for all 
> the critical issues for my regular workflow with LaTeX I found my way 
> around with Emacs, so I think the "potential deal breakers" are 
> overcome. Even though I'm clearly still in the steep part of the 
> learning curve with Emacs, I do believe I've been hooked. Still 
> struggling, but already bewitched. :)
> So I'm looking forward to sticking around.
>
> Thank you very much once again.
>
> Best,
> gusbrs
>
>
> PS: The test file used was the following:
>
> \documentclass{article}
>
> \begin{filecontents}{biblatex-bib.bib}
> @book{lamp:94,
>   author    = {Leslie Lamport},
>   title     = {LaTeX - {A} Document Preparation System: User's Guide
>                and Reference Manual, Second Edition},
>   publisher = {Pearson / Prentice Hall},
>   year      = {1994},
>   isbn      = {978-0-201-52983-8},
>   timestamp = {Fri, 08 Apr 2011 18:21:00 +0200},
> }
>
> @book{mitt:97,
>   author    = {Michel Goossens and
>                Sebastian Rahtz and
>                Frank Mittelbach},
>   title     = {The LaTeX Graphics Companion - Illustrating documents
>                with TeX and PostScript},
>   series    = {Addison-Wesley series on tools and techniques
>                for computer typesetting},
>   publisher = {Addison-Wesley},
>   year      = {1997},
>   isbn      = {978-0-201-85469-5},
> }
> \end{filecontents}
>
> \usepackage[style=authoryear, natbib=true, mcite=true]{biblatex}
>
> \addbibresource{biblatex-bib.bib}
>
> \begin{document}
>
> % Standard commands
> \cite[pre][pos]{mitt:97}
> \Cite[pre][pos]{lamp:94}
> \parencite[pre][pos]{mitt:97}
> \Parencite[pre][pos]{lamp:94}
> \footcite[pre][pos]{mitt:97}
> \footcitetext[pre][pos]{lamp:94}
> % Style specific commands
> \textcite[pre][pos]{mitt:97}
> \Textcite[pre][pos]{lamp:94,}
> \smartcite[pre][pos]{mitt:97}
> \Smartcite[pre][pos]{lamp:94}
> \cite*[pre][pos]{mitt:97}
> \parencite*[pre][pos]{lamp:94}
> % \supercite{mitt:97}
> % Qualified citation lists
> \cites(gpre)(gpos)[pre][pos]{mitt:97}[pre][pos]{lamp:94}[pre][pos]{lamp:94} 
>
> \Cites(gpre)(gpos)[pre][pos]{mitt:97}[pre][pos]{lamp:94}
> \parencites(gpre)(gpos)[pre][pos]{mitt:97}[pre][pos]{lamp:94}
> \Parencites(gpre)(gpos)[pre][pos]{mitt:97}[pre][pos]{lamp:94}
> \footcites(gpre)(gpos)[pre][pos]{mitt:97}[pre][pos]{lamp:94}
> \footcitetexts(gpre)(gpos)[pre][pos]{mitt:97}[pre][pos]{lamp:94}
> \smartcites(gpre)(gpos)[pre][pos]{mitt:97}[pre][pos]{lamp:94}
> \Smartcites(gpre)(gpos)[pre][pos]{mitt:97}[pre][pos]{lamp:94}
> \textcites(gpre)(gpos)[pre][pos]{mitt:97}[pre][pos]{lamp:94}
> \Textcites(gpre)(gpos)[pre][pos]{lamp:94}[pre][pos]{mitt:97}
> % \supercites(gpre)(gpos)[pre][pos]{mitt:97}[pre][pos]{lamp:94}
> % Style independent commands
> \autocite[pre][pos]{mitt:97}
> \Autocite[pre][pos]{lamp:94}
> \autocite*[pre][pos]{mitt:97}
> \Autocite*[pre][pos]{lamp:94}
> \autocites(gpre)(gpos)[pre][pos]{mitt:97}[pre][pos]{lamp:94}
> \Autocites(gpre)(gpos)[pre][pos]{mitt:97}[pre][pos]{lamp:94}
> % Text commands
> \citeauthor[pre][pos]{mitt:97}
> \citeauthor*[pre][pos]{mitt:97}
> \Citeauthor[pre][pos]{lamp:94}
> \Citeauthor*[pre][pos]{lamp:94}
> \citetitle[pre][pos]{mitt:97,lamp:94}
> \citetitle*[pre][pos]{lamp:94}
> \citeyear[pre][pos]{mitt:97}
> \citeyear*[pre][pos]{lamp:94}
> \citedate[pre][pos]{mitt:97}
> \citedate*[pre][pos]{lamp:94}
> \citeurl[pre][pos]{mitt:97}
> % Special commands
> \nocite{mitt:97}
> \fullcite[pre][pos]{lamp:94}
> \footfullcite[pre][pos]{mitt:97}
> \volcite[pre]{2}[pg]{mitt:97}
> \Volcite[pre]{1}[pg]{lamp:94}
> \volcites(gpre)(gpos)[pre]{2}[pg]{lamp:94}[pre]{1}[pg]{mitt:97}
> \Volcites(gpre)(gpos)[pre]{2}[pg]{mitt:97}[pre]{2}[pg]{lamp:94}
> \pvolcite[pre]{1}[pg]{lamp:94}
> \Pvolcite[pre]{2}[pg]{mitt:97}
> \pvolcites(gpre)(gpos)[pre]{1}[pg]{mitt:97}[pre]{2}[pg]{lamp:94}
> \Pvolcites(gpre)(gpos)[pre]{3}[pg]{lamp:94}[pre]{1}[pg]{mitt:97}
> \fvolcite[pre]{3}[pg]{lamp:94}
> \ftvolcite[pre]{3}[pg]{lamp:94}
> \fvolcites(gpre)(gpos)[pre]{3}[pg]{mitt:97}[pre]{2}[pg]{lamp:94}
> \Fvolcites(gpre)(gpos)[pre]{2}[pg]{lamp:94}[pre]{3}[pg]{mitt:97}
> \svolcite[pre]{2}[pg]{lamp:94}
> \Svolcite[pre]{4}[pg]{mitt:97}
> \svolcites(gpre)(gpos)[pre]{3}[pg]{mitt:97}[pre]{2}[pg]{lamp:94}
> \Svolcites(gpre)(gpos)[pre]{3}[pg]{mitt:97}[pre]{2}[pg]{lamp:94}
> \tvolcite[pre]{5}[pg]{mitt:97}
> \Tvolcite[pre]{2}[pg]{lamp:94}
> \tvolcites(gpre)(gpos)[pre]{2}[pg]{lamp:94}[pre]{3}[pg]{mitt:97}
> \Tvolcites(gpre)(gpos)[pre]{2}[pg]{lamp:94}[pre]{3}[pg]{mitt:97}
> \avolcite[pre]{3}[pg]{lamp:94}
> \Avolcite[pre]{1}[pg]{mitt:97}
> \avolcites(gpre)(gpos)[pre]{2}[pg]{lamp:94}[pre]{1}[pg]{mitt:97}
> \Avolcites(gpre)(gpos)[pre]{2}[pg]{lamp:94}[pre]{1}[pg]{mitt:97}
> \notecite[pre][pos]{lamp:94}
> \Notecite[pre][pos]{mitt:97}
> \pnotecite[pre][pos]{mitt:97}
> \Pnotecite[pre][pos]{lamp:94}
> \fnotecite[pre][pos]{lamp:94}
> % Low-level commands
> \citename[pre][pos]{lamp:94}{author}
> \citelist[pre][pos]{lamp:94}{publisher}
> \citefield[pre][pos]{lamp:94}{isbn}
> % natbib compatibility commands
> \citet[pre][pos]{mitt:97}
> \citet*[pre][pos]{lamp:94}
> \citep[pre][pos]{lamp:94}
> \citep*[pre][pos]{mitt:97}
> \citealt[pre][pos]{lamp:94}
> \citealt*[pre][pos]{mitt:97}
> \citealp[pre][pos]{mitt:97}
> \citealp*[pre][pos]{lamp:94}
> \Citet[pre][pos]{lamp:94}
> \Citet*[pre][pos]{mitt:97}
> \Citep[pre][pos]{lamp:94}
> \Citep*[pre][pos]{mitt:97}
> % mcite-like citation commands
> \mcite[pre][pos]{lamp:94,mitt:97}
> \Mcite[pre][pos]{mitt:97,lamp:94}
> \mparencite[pre][pos]{lamp:94,mitt:97}
> \Mparencite[pre][pos]{lamp:94,mitt:97}
> \mfootcite[pre][pos]{lamp:94,mitt:97}
> \mfootcitetext[pre][pos]{lamp:94,mitt:97}
> \mtextcite[pre][pos]{lamp:94,mitt:97}
> \Mtextcite[pre][pos]{lamp:94,mitt:97}
> % \msupercite[pre][pos]{lamp:94,mitt:97}
>
> \end{document}
> %%% Local Variables:
> %%% mode: latex
> %%% TeX-master: t
> %%% End:
>
>
>
>
> On 19/04/18 16:45, Arash Esbati wrote:
>> gusbrs.2016 <at> gmail.com writes:
>>
>>>  From TeX.SX: https://tex.stackexchange.com/q/425883/105447
>>>
>>>
>>> RefTeX's relations biblatex's multicite commands (such as \parencites,
>>> \footcites, \textcites and so on) leave some things to be desired
>>> for. Namely, they do not seem to be recognized as citation
>>> commands. This results in RefTeX's `reftex-view-crossref` (C-c &)
>>> returning "Not on a crossref macro argument". Also, in adding an extra
>>> bibkey to an already existing multicite command, it is not possible to
>>> access RefTeX's facilities.
>>>
>>> Arash Esbati generously provided patches at TeX.SX that go a long way
>>> in dealing with these problems. However, support for the presence of
>>> global optional arguments (between parentheses) is still missing. At
>>> their request, I write to report this issue.
>> Hi Gusbrs,
>>
>> thanks for the report.  I fiddled a little around and I think I have a
>> working setup for this issue.  I think with this patch, RefTeX will also
>> recognize referencing commands provided by cleveref.sty.
>>
>> --8<---------------cut here---------------start------------->8---
>> diff --git a/lisp/textmodes/reftex-cite.el 
>> b/lisp/textmodes/reftex-cite.el
>> index fd229a6..3f4965a 100644
>> --- a/lisp/textmodes/reftex-cite.el
>> +++ b/lisp/textmodes/reftex-cite.el
>> @@ -763,7 +763,9 @@ in order to only add another reference in the 
>> same cite command."
>>         (setq format "%l"))
>>
>>        ((and (stringp macro)
>> -           (string-match "\\`\\\\cite\\|cite\\'" macro))
>> +           (string-match "\\`\\\\cite\\|cite\\([s*]\\|texts?\\)?\\'" 
>> macro))
>> +      ;; Match also commands from biblatex ending with `s' (\cites) or
>> +      ;; `*' (\parencite*) and `texts?' (\footcitetext and 
>> \footcitetexts).
>>         ;; We are already inside a cite macro
>>         (if (or (not arg) (not (listp arg)))
>>             (setq format
>> diff --git a/lisp/textmodes/reftex-dcr.el b/lisp/textmodes/reftex-dcr.el
>> index 74a5e63..b93d05d 100644
>> --- a/lisp/textmodes/reftex-dcr.el
>> +++ b/lisp/textmodes/reftex-dcr.el
>> @@ -60,10 +60,13 @@ to the functions `reftex-view-cr-cite' and 
>> `reftex-view-cr-ref'."
>>         (setq reftex-call-back-to-this-buffer (current-buffer))
>>
>>         (cond
>> -       ((string-match "\\`\\\\cite\\|cite\\*?\\'\\|bibentry" macro)
>> +       ((string-match 
>> "\\`\\\\cite\\|cite\\([s*]\\|texts?\\)?\\'\\|bibentry" macro)
>> +        ;; Match also commands from biblatex ending with `s' 
>> (\cites) or
>> +        ;; `*' (\parencite*) and `texts?' (\footcitetext and 
>> \footcitetexts).
>>          ;; A citation macro: search for bibitems or BibTeX entries
>>          (setq dw (reftex-view-cr-cite arg key auto-how)))
>> -       ((string-match "\\`\\\\ref\\|ref\\(range\\)?\\*?\\'" macro)
>> +       ((string-match "\\`\\\\ref\\|ref\\(s\\|range\\)?\\*?\\'" macro)
>> +        ;; Match also commands from cleveref ending with `s' 
>> (\namecrefs).
>>          ;; A reference macro: search for labels
>>          (setq dw (reftex-view-cr-ref arg key auto-how)))
>>          (auto-how nil)  ;; No further action for automatic display 
>> (speed)
>> diff --git a/lisp/textmodes/reftex-parse.el 
>> b/lisp/textmodes/reftex-parse.el
>> index 492f546..31e108c 100644
>> --- a/lisp/textmodes/reftex-parse.el
>> +++ b/lisp/textmodes/reftex-parse.el
>> @@ -788,12 +788,13 @@ move backward to the closing parenthesis of the 
>> previous argument.
>>   This function understands the splitting of macros over several lines
>>   in TeX."
>>     (cond
>> -   ;; Just to be quick:
>> -   ((memq (preceding-char) '(?\] ?\})))
>> +   ;; Just to be quick: biblatex uses () as delimiters for optional
>> +   ;; arguments in qualified citation lists.
>> +   ((memq (preceding-char) '(?\] ?\) ?\})))
>>      ;; Do a search
>>      ((and reftex-allow-detached-macro-args
>>            (re-search-backward
>> -          "[]}][ \t]*[\n\r]?\\([ \t]*%[^\n\r]*[\n\r]\\)*[ \t]*\\=" 
>> bound t))
>> +          "[])}][ \t]*[\n\r]?\\([ \t]*%[^\n\r]*[\n\r]\\)*[ \t]*\\=" 
>> bound t))
>>       (goto-char (1+ (match-beginning 0)))
>>       t)
>>      (t nil)))
>> @@ -842,12 +843,22 @@ considered an argument of macro \\macro."
>>               (while (and (reftex-move-to-previous-arg bound)
>>                           (condition-case nil
>>                               (let ((forward-sexp-function nil))
>> -                              (backward-sexp) t)
>> +                              (if (= (preceding-char) ?\))
>> +                                  (let ((temp-table 
>> (make-syntax-table)))
>> +                                    (modify-syntax-entry ?\( "()" 
>> temp-table)
>> +                                    (modify-syntax-entry ?\) ")(" 
>> temp-table)
>> +                                    (with-syntax-table temp-table
>> +                                      (backward-sexp)))
>> +                                (backward-sexp))
>> +                              t)
>>                             (error nil)))
>> -              (if (eq (following-char) ?\[) (cl-incf cnt-opt))
>> +              (if (or (eq (following-char) ?\[)
>> +                      (eq (following-char) ?\())
>> +                  (cl-incf cnt-opt))
>>                 (cl-incf cnt))
>>               (setq pos (point))
>>               (when (and (or (= (following-char) ?\[)
>> +                           (= (following-char) ?\()
>>                              (= (following-char) ?\{))
>>                          (re-search-backward "\\\\[*a-zA-Z]+\\=" nil t))
>>                 (setq cmd (reftex-match-string 0))
>> --8<---------------cut here---------------end--------------->8---
>>
>> One thing I don't understand is why (backward-sexp) doesn't work on
>> (Global Pre) arguments.  Maybe somebody can enlighten me.  For now, I
>> added a trickery with `with-syntax-table'.
>>
>> Further, I think the functions `reftex-move-over-touching-args' and
>> `reftex-move-to-next-arg' must also be patched in order to support
>> optional arguments in parentheses.
>>
>> My test file for this looks like this.  In case somebody wants to try
>> this out, the complete functions are inserted below.  Any comments
>> welcome.
>>
>>
>> --8<---------------cut here---------------start------------->8---
>> \documentclass{article}
>>
>> \begin{filecontents}{biblatex-bib.bib}
>> @book{lamp:94,
>>    author    = {Leslie Lamport},
>>    title     = {LaTeX - {A} Document Preparation System: User's Guide
>>                 and Reference Manual, Second Edition},
>>    publisher = {Pearson / Prentice Hall},
>>    year      = {1994},
>>    isbn      = {978-0-201-52983-8},
>>    timestamp = {Fri, 08 Apr 2011 18:21:00 +0200},
>> }
>>
>> @book{mitt:97,
>>    author    = {Michel Goossens and
>>                 Sebastian Rahtz and
>>                 Frank Mittelbach},
>>    title     = {The LaTeX Graphics Companion - Illustrating documents
>>                 with TeX and PostScript},
>>    series    = {Addison-Wesley series on tools and techniques
>>                 for computer typesetting},
>>    publisher = {Addison-Wesley},
>>    year      = {1997},
>>    isbn      = {978-0-201-85469-5},
>> }
>> \end{filecontents}
>>
>> \usepackage[style=authoryear]{biblatex}
>>
>> \addbibresource{biblatex-bib.bib}
>>
>> \begin{document}
>>
>> %% =============== RefTeX standard
>>
>> \cite{mitt:97}
>> ==> \verb|C-c &| Ok, \verb|C-c [| Ok
>>
>> \cites[Pre][Post]{mitt:97}[Pre][Post]{lamp:94}
>> ==> \verb|C-c &| Ok, \verb|C-c [| Ok
>>
>> \footcitetext[Pre][Post]{mitt:97}
>> ==> \verb|C-c &| NOk, \verb|C-c [| NOk
>>
>> \parencite*[Pre][Post]{mitt:97}
>> ==> \verb|C-c &| Ok, \verb|C-c [| NOk
>>
>> \parencites{mitt:97}
>> \parencites(GPre)()[Pre][]{mitt:97}[Pre][]{lamp:94}
>> \parencites(pre)()[pre][]{mitt:97}
>> \parencites(post)[post]{mitt:97}
>> ==> \verb|C-c &| NOk, \verb|C-c [| NOk
>>
>> %% ============== RefTeX patched
>>
>> \parencites[Pre][Post]{mitt:97}[Pre][Post]{lamp:94}
>> ==> \verb|C-c &| Ok, \verb|C-c [| Ok
>>
>> \parencites(Global Pre)(Global 
>> Post)[Pre][Post]{mitt:97}[Pre][Post]{lamp:94}
>> ==> \verb|C-c &| Ok, \verb|C-c [| Ok
>>
>>
>> \begin{verbatim}
>> (defun reftex-view-crossref (&optional arg auto-how fail-quietly)
>>    "View cross reference of macro at point.  Point must be on the KEY
>> argument.  When at a `\\ref' macro, show corresponding `\\label'
>> definition, also in external documents (`xr').  When on a label, show
>> a locations where KEY is referenced.  Subsequent calls find additional
>> locations.  When on a `\\cite', show the associated `\\bibitem' macro or
>> the BibTeX database entry.  When on a `\\bibitem', show a `\\cite' macro
>> which uses this KEY. When on an `\\index', show other locations marked
>> by the same index entry.
>> To define additional cross referencing items, use the option
>> `reftex-view-crossref-extra'.  See also 
>> `reftex-view-crossref-from-bibtex'.
>> With one or two C-u prefixes, enforce rescanning of the document.
>> With argument 2, select the window showing the cross reference.
>> AUTO-HOW is only for the automatic crossref display and is handed 
>> through
>> to the functions `reftex-view-cr-cite' and `reftex-view-cr-ref'."
>>
>>    (interactive "P")
>>    ;; See where we are.
>>    (let* ((macro (car (reftex-what-macro-safe 1)))
>>           (key (reftex-this-word "^{}%\n\r, \t"))
>>           dw)
>>
>>      (if (or (null macro) (reftex-in-comment))
>>          (or fail-quietly
>>              (error "Not on a crossref macro argument"))
>>
>>        (setq reftex-call-back-to-this-buffer (current-buffer))
>>
>>        (cond
>>         ((string-match 
>> "\\`\\\\cite\\|cite\\([s*]\\|texts?\\)?\\'\\|bibentry" macro)
>>          ;; Match also commands from biblatex ending with `s' 
>> (\cites) or
>>          ;; `*' (\parencite*) and `texts?' (\footcitetext and 
>> \footcitetexts).
>>          ;; A citation macro: search for bibitems or BibTeX entries
>>          (setq dw (reftex-view-cr-cite arg key auto-how)))
>>         ((string-match "\\`\\\\ref\\|ref\\(s\\|range\\)?\\*?\\'" macro)
>>          ;; Match also commands from cleveref ending with `s' 
>> (\namecrefs).
>>          ;; A reference macro: search for labels
>>          (setq dw (reftex-view-cr-ref arg key auto-how)))
>>         (auto-how nil)  ;; No further action for automatic display 
>> (speed)
>>         ((or (equal macro "\\label")
>>              (member macro reftex-macros-with-labels))
>>          ;; A label macro: search for reference macros
>>          (reftex-access-scan-info arg)
>>          (setq dw (reftex-view-regexp-match
>>                    (format reftex-find-reference-format (regexp-quote 
>> key))
>>                    4 nil nil)))
>>         ((equal macro "\\bibitem")
>>          ;; A bibitem macro: search for citations
>>          (reftex-access-scan-info arg)
>>          (setq dw (reftex-view-regexp-match
>>                    (format reftex-find-citation-regexp-format 
>> (regexp-quote key))
>>                    4 nil nil)))
>>         ((member macro reftex-macros-with-index)
>>          (reftex-access-scan-info arg)
>>          (setq dw (reftex-view-regexp-match
>>                    (format reftex-find-index-entry-regexp-format
>>                            (regexp-quote key))
>>                    3 nil nil)))
>>         (t
>>          (reftex-access-scan-info arg)
>>          (catch 'exit
>>            (let ((list reftex-view-crossref-extra)
>>                  entry mre action group)
>>              (while (setq entry (pop list))
>>                (setq mre (car entry)
>>                      action (nth 1 entry)
>>                      group (nth 2 entry))
>>                (when (string-match mre macro)
>>                  (setq dw (reftex-view-regexp-match
>>                            (format action key) group nil nil))
>>                  (throw 'exit t))))
>>            (error "Not on a crossref macro argument"))))
>>        (if (and (eq arg 2) (windowp dw)) (select-window dw)))))
>>
>> (defun reftex-figure-out-cite-format (arg &optional no-insert 
>> format-key)
>>    "Check if there is already a cite command at point and change cite 
>> format
>> in order to only add another reference in the same cite command."
>>    (let ((macro (car (reftex-what-macro 1)))
>>          (cite-format-value (reftex-get-cite-format))
>>          key format)
>>      (cond
>>       (no-insert
>>        ;; Format does not really matter because nothing will be 
>> inserted.
>>        (setq format "%l"))
>>
>>       ((and (stringp macro)
>>             (string-match "\\`\\\\cite\\|cite\\([s*]\\|texts?\\)?\\'" 
>> macro))
>>        ;; Match also commands from biblatex ending with `s' (\cites) or
>>        ;; `*' (\parencite*) and `texts?' (\footcitetext and 
>> \footcitetexts).
>>        ;; We are already inside a cite macro
>>        (if (or (not arg) (not (listp arg)))
>>            (setq format
>>                  (concat
>>                   (if (member (preceding-char) '(?\{ ?,))
>>                       ""
>>                     reftex-cite-key-separator)
>>                   "%l"
>>                   (if (member (following-char) '(?\} ?,))
>>                       ""
>>                     reftex-cite-key-separator)))
>>          (setq format "%l")))
>>       (t
>>        ;; Figure out the correct format
>>        (setq format
>>              (if (and (symbolp cite-format-value)
>>                       (assq cite-format-value 
>> reftex-cite-format-builtin))
>>                  (nth 2 (assq cite-format-value 
>> reftex-cite-format-builtin))
>>                cite-format-value))
>>        (when (listp format)
>>          (setq key
>>                (or format-key
>>                    (reftex-select-with-char
>>                     "" (concat "SELECT A CITATION FORMAT\n\n"
>>                                (mapconcat
>>                                 (lambda (x)
>>                                   (format "[%c] %s  %s" (car x)
>>                                           (if (> (car x) 31) " " "")
>>                                           (cdr x)))
>>                                 format "\n")))))
>>          (if (assq key format)
>>              (setq format (cdr (assq key format)))
>>            (error "No citation format associated with key `%c'" key)))))
>>      format))
>>
>> (defun reftex-move-to-previous-arg (&optional bound)
>>    "Assuming that we are in front of a macro argument,
>> move backward to the closing parenthesis of the previous argument.
>> This function understands the splitting of macros over several lines
>> in TeX."
>>    (cond
>>     ;; Just to be quick: biblatex uses () as delimiters for optional
>>     ;; arguments in qualified citation lists.
>>     ((memq (preceding-char) '(?\] ?\) ?\})))
>>     ;; Do a search
>>     ((and reftex-allow-detached-macro-args
>>           (re-search-backward
>>            "[])}][ \t]*[\n\r]?\\([ \t]*%[^\n\r]*[\n\r]\\)*[ \t]*\\=" 
>> bound t))
>>      (goto-char (1+ (match-beginning 0)))
>>      t)
>>     (t nil)))
>>
>>
>> (defun reftex-what-macro (which &optional bound)
>>    "Find out if point is within the arguments of any TeX-macro.
>> The return value is either (\"\\macro\" . (point)) or a list of them.
>>
>> If WHICH is nil, immediately return nil.
>> If WHICH is 1, return innermost enclosing macro.
>> If WHICH is t, return list of all macros enclosing point.
>> If WHICH is a list of macros, look only for those macros and return the
>>    name of the first macro in this list found to enclose point.
>> If the optional BOUND is an integer, bound backwards directed
>>    searches to this point.  If it is nil, limit to nearest \\section -
>>    like statement.
>>
>> This function is pretty stable, but can be fooled if the text contains
>> things like \\macro{aa}{bb} where \\macro is defined to take only one
>> argument.  As RefTeX cannot know this, the string \"bb\" would still be
>> considered an argument of macro \\macro."
>>    (unless reftex-section-regexp (reftex-compile-variables))
>>    (catch 'exit
>>      (if (null which) (throw 'exit nil))
>>      (let ((bound (or bound (save-excursion (re-search-backward
>> reftex-section-regexp nil 1)
>>                                             (point))))
>>            pos cmd-list cmd cnt cnt-opt entry)
>>        (save-restriction
>>          (save-excursion
>>            (narrow-to-region (max (point-min) bound) (point-max))
>>            ;; move back out of the current parenthesis
>>            (while (condition-case nil
>>                       (let ((forward-sexp-function nil))
>>                         (up-list -1) t)
>>                     (error nil))
>>              (setq cnt 1 cnt-opt 0)
>>              ;; move back over any touching sexps
>>              (while (and (reftex-move-to-previous-arg bound)
>>                          (condition-case nil
>>                              (let ((forward-sexp-function nil))
>>                                (if (= (preceding-char) ?\))
>>                                    (let ((temp-table 
>> (make-syntax-table)))
>>                                      (modify-syntax-entry ?\( "()" 
>> temp-table)
>>                                      (modify-syntax-entry ?\) ")(" 
>> temp-table)
>>                                      (with-syntax-table temp-table
>>                                        (backward-sexp)))
>>                                  (backward-sexp))
>>                                t)
>>                            (error nil)))
>>                (if (or (eq (following-char) ?\[)
>>                        (eq (following-char) ?\())
>>                    (cl-incf cnt-opt))
>>                (cl-incf cnt))
>>              (setq pos (point))
>>              (when (and (or (= (following-char) ?\[)
>>                             (= (following-char) ?\()
>>                             (= (following-char) ?\{))
>>                         (re-search-backward "\\\\[*a-zA-Z]+\\=" nil t))
>>                (setq cmd (reftex-match-string 0))
>>                (when (looking-at "\\\\begin{[^}]*}")
>>                  (setq cmd (reftex-match-string 0)
>>                        cnt (1- cnt)))
>>                ;; This does ignore optional arguments.  Very hard to 
>> fix.
>>                (when (setq entry (assoc cmd reftex-env-or-mac-alist))
>>                  (if (> cnt (or (nth 4 entry) 100))
>>                      (setq cmd nil)))
>>                (cond
>>                 ((null cmd))
>>                 ((eq t which)
>>                  (push (cons cmd (point)) cmd-list))
>>                 ((or (eq 1 which) (member cmd which))
>>                  (throw 'exit (cons cmd (point))))))
>>              (goto-char pos)))
>>          (nreverse cmd-list)))))
>>
>> \end{verbatim}
>>
>> \end{document}
>>
>> --8<---------------cut here---------------end--------------->8---
>>
>> Best, Arash
>





Information forwarded to bug-auctex <at> gnu.org:
bug#31132; Package auctex. (Sat, 06 Apr 2024 21:01:01 GMT) Full text and rfc822 format available.

Message #17 received at 31132 <at> debbugs.gnu.org (full text, mbox):

From: Arash Esbati <arash <at> gnu.org>
To: Gustavo Barros <gusbrs.2016 <at> gmail.com>
Cc: 31132 <at> debbugs.gnu.org
Subject: Re: bug#31132: AUCTeX, RefTeX and biblatex's multicite commands
Date: Sat, 06 Apr 2024 23:00:39 +0200
Hi Gustavo,

Gustavo Barros <gusbrs.2016 <at> gmail.com> writes:

> thank you very much for the patches. They are really appreciated.
> And sorry for the delay in reporting back. I didn't have the time
> these last couple of days to look at this with due care.

Sorry for my late response; it seems I didn't have time during the last
couple of years ;-)  Somehow this report went lost.

> I've performed some tests with the patches you sent on the full set of
> biblatex's citation commands, and can gladly report that both "C-c &"
> (reftex-view-crossref) and "C-c [" (reftex-citation) (when issued on
> the key of an existing citation command) work flawlessly on all of
> them.

I had a look again and I plan to install the following change in Emacs
master:

--8<---------------cut here---------------start------------->8---
diff --git a/lisp/textmodes/reftex-parse.el b/lisp/textmodes/reftex-parse.el
index 9694a1364d3..6e1c229561a 100644
--- a/lisp/textmodes/reftex-parse.el
+++ b/lisp/textmodes/reftex-parse.el
@@ -801,17 +801,17 @@ reftex-notice-new
   )

 (defsubst reftex-move-to-previous-arg (&optional bound)
-  "Assuming that we are in front of a macro argument,
-move backward to the closing parenthesis of the previous argument.
-This function understands the splitting of macros over several lines
-in TeX."
+  "Move backward to the closing parenthesis of the previous argument.
+This happens under the assumption that we are in front of a macro
+argument.  This function understands the splitting of macros over
+several lines in TeX."
   (cond
    ;; Just to be quick:
-   ((memq (preceding-char) '(?\] ?\})))
+   ((memq (preceding-char) '(?\] ?\) ?\})))
    ;; Do a search
    ((and reftex-allow-detached-macro-args
          (re-search-backward
-          "[]}][ \t]*[\n\r]?\\([ \t]*%[^\n\r]*[\n\r]\\)*[ \t]*\\=" bound t))
+          "[])}][ \t]*[\n\r]?\\([ \t]*%[^\n\r]*[\n\r]\\)*[ \t]*\\=" bound t))
     (goto-char (1+ (match-beginning 0)))
     t)
    (t nil)))
@@ -860,13 +860,19 @@ reftex-what-macro
             (while (and (reftex-move-to-previous-arg bound)
                         (condition-case nil
                             (let ((forward-sexp-function nil))
-                              (backward-sexp) t)
+                              (if (eq (preceding-char) ?\))
+                                  (let ((temp-table (make-syntax-table)))
+                                    (modify-syntax-entry ?\( "()" temp-table)
+                                    (modify-syntax-entry ?\) ")(" temp-table)
+                                    (with-syntax-table temp-table
+                                      (backward-sexp)))
+                                (backward-sexp))
+                              t)
                           (error nil)))
-              (if (eq (following-char) ?\[) (cl-incf cnt-opt))
+              (if (memq (following-char) '(?\( ?\[)) (cl-incf cnt-opt))
               (cl-incf cnt))
             (setq pos (point))
-            (when (and (or (= (following-char) ?\[)
-                           (= (following-char) ?\{))
+            (when (and (memq (following-char) '(?\[ ?\( ?\{))
                        (re-search-backward "\\\\[*a-zA-Z]+\\=" nil t))
               (setq cmd (reftex-match-string 0))
               (when (looking-at "\\\\begin{[^}]*}")
--8<---------------cut here---------------end--------------->8---

Do you have the chance to install this locally and test it again?  I
will push it afterwards.  Thanks.

> But, in performing the tests, I observed some other things associated
> with biblatex's citation commands (some related to this issue, some
> not) that I might as well report too, in the hope they will be
> useful. As a regular biblatex user, I consider them minor.
>
> 1 - The multicite variants of 'volcite' are neither fontified nor call
> RefTeX when inserted (with "C-c RET"). They are inserted "plain" but,
> once inserted, "C-c [" will work on them. They are the following:
> -volcites
> -Volcites
> -pvolcites
> -Pvolcites
> -fvolcites
> -Fvolcites
> -svolcites
> -Svolcites
> -tvolcites
> -Tvolcites
> -avolcites
> -Avolcites

Fontification should work now for limited number of args:
https://git.savannah.gnu.org/cgit/auctex.git/tree/font-latex.el#n305

> 2 - A couple of 'volcite' variants are fontified, but don't call
> RefTeX when inserted:
> -pvolcite
> -ftvolcite

Fixed with commit 9ba0093b.

> 3 - One command is not fontified:
> -footfullcite

Is fixed.

> 4 - 'mcite'-like citation commands are neither fontified, nor call
> RefTeX when inserted:
> -mcite
> -Mcite
> -mparencite
> -Mparencite
> -mfootcite
> -mfootcitetext
> -mtextcite
> -Mtextcite

This is indeed nasty because of the notation (biblatex.pdf, page 120):

\mcite{key1,setA,*keyA1,*keyA2,*keyA3,key2,setB,*keyB1,*keyB2,*keyB3}

I have no idea what the best approach for this is.

Again, sorry the late response.

Best, Arash




Information forwarded to bug-auctex <at> gnu.org:
bug#31132; Package auctex. (Sat, 06 Apr 2024 21:53:02 GMT) Full text and rfc822 format available.

Message #20 received at 31132 <at> debbugs.gnu.org (full text, mbox):

From: gusbrs <gusbrs.2016 <at> gmail.com>
To: Arash Esbati <arash <at> gnu.org>
Cc: 31132 <at> debbugs.gnu.org
Subject: Re: bug#31132: AUCTeX, RefTeX and biblatex's multicite commands
Date: Sat, 6 Apr 2024 18:51:30 -0300
Hi Arash,

On Sat, 6 Apr 2024 at 18:00, Arash Esbati <arash <at> gnu.org> wrote:

> Sorry for my late response; it seems I didn't have time during the last
> couple of years ;-)  Somehow this report went lost.

Oh, wow! Back from ancient times. I think this was my first ever
AUCTeX report.  :-)

>
> I had a look again and I plan to install the following change in Emacs
> master:
>
> [...]
>
> Do you have the chance to install this locally and test it again?  I
> will push it afterwards.  Thanks.
>

Sure, but please put me up to speed (it's been a long time, after
all). If I read the patch correctly, it seems the intent here is
adding support for "global" arguments (the ones delimited with
parentheses). Is that correct? Anything else? (I'm asking so I know
what to look for).

Also, I have been patching this and some related RefTeX functions,
especially for this reason, plus some others. Since you have your
hands on this, would you like me to share what I have here for them,
to see if you can spot anything which might be worth handling at this
point?

> > But, in performing the tests, I observed some other things associated
> > with biblatex's citation commands (some related to this issue, some
> > not) that I might as well report too, in the hope they will be
> > useful. As a regular biblatex user, I consider them minor.
> >
> > 1 - The multicite variants of 'volcite' are neither fontified nor call
> > RefTeX when inserted (with "C-c RET"). They are inserted "plain" but,
> > once inserted, "C-c [" will work on them. They are the following:
> > -volcites
> > -Volcites
> > -pvolcites
> > -Pvolcites
> > -fvolcites
> > -Fvolcites
> > -svolcites
> > -Svolcites
> > -tvolcites
> > -Tvolcites
> > -avolcites
> > -Avolcites
>
> Fontification should work now for limited number of args:
> https://git.savannah.gnu.org/cgit/auctex.git/tree/font-latex.el#n305
>
> > 2 - A couple of 'volcite' variants are fontified, but don't call
> > RefTeX when inserted:
> > -pvolcite
> > -ftvolcite
>
> Fixed with commit 9ba0093b.
>
> > 3 - One command is not fontified:
> > -footfullcite
>
> Is fixed.
>

Thanks for that! :-)

> > 4 - 'mcite'-like citation commands are neither fontified, nor call
> > RefTeX when inserted:
> > -mcite
> > -Mcite
> > -mparencite
> > -Mparencite
> > -mfootcite
> > -mfootcitetext
> > -mtextcite
> > -Mtextcite
>
> This is indeed nasty because of the notation (biblatex.pdf, page 120):
>
> \mcite{key1,setA,*keyA1,*keyA2,*keyA3,key2,setB,*keyB1,*keyB2,*keyB3}
>
> I have no idea what the best approach for this is.

Mhm, yeah. Tricky notation. No particularly interesting approach pops up to me.
In fairness, I've never seen any of those "in the wild".

>
> Again, sorry the late response.
>

I'm surprised you dug this back. It is appreciated. Thank you.

Best,
gusbrs




Information forwarded to bug-auctex <at> gnu.org:
bug#31132; Package auctex. (Sun, 07 Apr 2024 09:02:02 GMT) Full text and rfc822 format available.

Message #23 received at 31132 <at> debbugs.gnu.org (full text, mbox):

From: Arash Esbati <arash <at> gnu.org>
To: gusbrs <gusbrs.2016 <at> gmail.com>
Cc: 31132 <at> debbugs.gnu.org
Subject: Re: bug#31132: AUCTeX, RefTeX and biblatex's multicite commands
Date: Sun, 07 Apr 2024 11:01:34 +0200
Hi Gustavo,

gusbrs <gusbrs.2016 <at> gmail.com> writes:

> Oh, wow! Back from ancient times. I think this was my first ever
> AUCTeX report.  :-)

Time flies :-)

> Sure, but please put me up to speed (it's been a long time, after
> all). If I read the patch correctly, it seems the intent here is
> adding support for "global" arguments (the ones delimited with
> parentheses). Is that correct? Anything else? (I'm asking so I know
> what to look for).

It's solely about getting C-& work with things like:

\parencites(Global Pre)(Global Post)[Pre][Post]{mitt:97}[Pre][Post]{lamp:94}

> Also, I have been patching this and some related RefTeX functions,
> especially for this reason, plus some others. Since you have your
> hands on this, would you like me to share what I have here for them,
> to see if you can spot anything which might be worth handling at this
> point?

Yes, please, share them, and we can see what we can incorporate
upstream, highly appreciated 👍

> Mhm, yeah. Tricky notation. No particularly interesting approach pops
> up to me.  In fairness, I've never seen any of those "in the wild".

We can leave that open for now.

> I'm surprised you dug this back. It is appreciated. Thank you.

I started looking at our old bug reports, let's see if we can close this
one as well.  Since it is your first report, it should get the attention
deserved ;-)

Best, Arash




Information forwarded to bug-auctex <at> gnu.org:
bug#31132; Package auctex. (Mon, 08 Apr 2024 14:33:02 GMT) Full text and rfc822 format available.

Message #26 received at 31132 <at> debbugs.gnu.org (full text, mbox):

From: gusbrs <gusbrs.2016 <at> gmail.com>
To: Arash Esbati <arash <at> gnu.org>
Cc: 31132 <at> debbugs.gnu.org
Subject: Re: bug#31132: AUCTeX, RefTeX and biblatex's multicite commands
Date: Mon, 8 Apr 2024 11:31:34 -0300
Hi Arash,

On Sun, 7 Apr 2024 at 06:01, Arash Esbati <arash <at> gnu.org> wrote:
>
> Time flies :-)
>

Oh, reading the old thread was a little embarrassing. I didn't even
know how to reply to a mailing list (full html contents at the end,
etc., sigh... ;-).

>
> It's solely about getting C-& work with things like:
>
> \parencites(Global Pre)(Global Post)[Pre][Post]{mitt:97}[Pre][Post]{lamp:94}
>

Great, and it is very welcome that you are revisiting this. Thank you.

I did test things and the TL;DR is: looks good to me.

The long version: I tested both with AUCTeX and built-in latex-mode,
with the following setups.

With AUCTeX:

    (add-to-list 'load-path "~/.emacs.d/elpa/auctex-14.0.4")
    (load "auctex.el" nil t t)
    (load "reftex.el" nil t t)
    (setq TeX-parse-self t)
    (setq TeX-auto-save t)
    (setq reftex-plug-into-AUCTeX t)
    (add-hook 'LaTeX-mode-hook 'turn-on-reftex)
    (require 'reftex-parse) ;; just being sure...
    ;; and apply Arash's patch

Without AUCTeX:

    (load "reftex.el" nil t t)
    (add-hook 'latex-mode-hook 'turn-on-reftex)
    (require 'reftex-parse) ;; just being sure...
    ;; and apply Arash's patch

I used the same test file I had used in the original report. It is
possibly not up to date six years later, but should be thorough enough
for our purposes.

I tested the citation lists of interest both for "C-c &" and "C-c [",
and they worked as expected in all cases. (The only thing in
`\volcite' and friends where the volume is given in braces, thus
mistaken for a key which is not found, but nothing to do there, I'd
say).

I did not attempt to test for possible side effects in other areas,
given that `reftex-move-to-previous-arg' and `reftex-what-macro' are
general purpose utility functions. But I think the patch at hand is
pretty careful in changing the syntax of the parentheses only locally.
That's what I'd do too and my assessment is that I see no reason it
shouldn't be safe. (That's not what I currently do in my own config,
see below, but that's because I'm lazy and free to shoot myself in the
foot in my own config ;-).

All in all, the patch looks good to me.

The only other thing of note I observed is that the mcite-like
citation commands are not fontified as reference/citation commands
(they get only the generic `font-latex-sedate-face'). I had agreed
with you that the case is tricky and arguably not worth the trouble on
RefTeX's side of things. But fontification for them should be trivial.
So, why not?


> > Also, I have been patching this and some related RefTeX functions,
> > especially for this reason, plus some others. Since you have your
> > hands on this, would you like me to share what I have here for them,
> > to see if you can spot anything which might be worth handling at this
> > point?
>
> Yes, please, share them, and we can see what we can incorporate
> upstream, highly appreciated 👍

Nice, perhaps something useful comes out of it. I'll share the code
first and comment later. I'm using `el-patch' in my config, but it
should be easy enough to read, even if you are not acquainted with it.
And, of course, this is not a real patch or anything, just some stuff
to grab ideas from.

#+begin_src emacs-lisp
(with-eval-after-load 'el-patch
  ;; For 'reftex-what-macro' and 'reftex-move-to-previous-arg'.
  (el-patch-feature reftex-parse)
  (with-eval-after-load 'reftex-parse
    ;; Provide replacement for 'reftex-what-macro' which recognizes 'biblatex'
    ;; citation lists global optional arguments (between parentheses, instead
    ;; of brackets).  These are *renamed* versions of them, just for use in
    ;; 'reftex-figure-out-cite-format' and 'reftex-view-crossref', I don't
    ;; want these changes to affect the behavior of RefTeX elsewhere (playing
    ;; safe...).  Note that the same procedure for 'reftex-what-macro-safe'
    ;; fails because of the syntax table used, so we just go with
    ;; 'reftex-what-macro' on 'reftex-view-crossref'.
    (el-patch-defun (el-patch-swap reftex-what-macro
                                   gb/reftex-what-macro-parens)
      (which &optional bound)
      "Find out if point is within the arguments of any TeX-macro.
The return value is either (\"\\macro\" . (point)) or a list of them.

If WHICH is nil, immediately return nil.
If WHICH is 1, return innermost enclosing macro.
If WHICH is t, return list of all macros enclosing point.
If WHICH is a list of macros, look only for those macros and return the
  name of the first macro in this list found to enclose point.
If the optional BOUND is an integer, bound backwards directed
  searches to this point.  If it is nil, limit to nearest \\section -
  like statement.

This function is pretty stable, but can be fooled if the text contains
things like \\macro{aa}{bb} where \\macro is defined to take only one
argument.  As RefTeX cannot know this, the string \"bb\" would still be
considered an argument of macro \\macro."
      (unless reftex-section-regexp (reftex-compile-variables))
      (catch 'exit
        (if (null which) (throw 'exit nil))
        (let ((bound (or bound (save-excursion (re-search-backward
                                                reftex-section-regexp nil 1)
                                               (point))))
              pos cmd-list cmd cnt cnt-opt entry)
          (save-restriction
            (save-excursion
              (narrow-to-region (max (point-min) bound) (point-max))
              ;; move back out of the current parenthesis
              (while (condition-case nil
                         (let ((forward-sexp-function nil))
                           (up-list -1) t)
                       (error nil))
                (setq cnt 1 cnt-opt 0)
                ;; move back over any touching sexps
                (while (and (el-patch-swap
                              (reftex-move-to-previous-arg bound)
                              (gb/reftex-move-to-previous-arg-parens bound))
                            (condition-case nil
                                (let ((forward-sexp-function nil))
                                  (backward-sexp) t)
                              (error nil)))
                  (if (eq (following-char) ?\[) (cl-incf cnt-opt))
                  (cl-incf cnt))
                (setq pos (point))
                (when (and (or (= (following-char) ?\[)
                               (= (following-char) ?\{)
                               (el-patch-add (= (following-char) ?\()))
                           (re-search-backward "\\\\[*a-zA-Z]+\\=" nil t))
                  (setq cmd (reftex-match-string 0))
                  (when (looking-at "\\\\begin{[^}]*}")
                    (setq cmd (reftex-match-string 0)
                          cnt (1- cnt)))
                  ;; This does ignore optional arguments.  Very hard to fix.
                  (when (setq entry (assoc cmd reftex-env-or-mac-alist))
                    (if (> cnt (or (nth 4 entry) 100))
                        (setq cmd nil)))
                  (cond
                   ((null cmd))
                   ((eq t which)
                    (push (cons cmd (point)) cmd-list))
                   ((or (eq 1 which) (member cmd which))
                    (throw 'exit (cons cmd (point))))))
                (goto-char pos)))
            (nreverse cmd-list)))))

    (el-patch-defsubst (el-patch-swap reftex-move-to-previous-arg
                                      gb/reftex-move-to-previous-arg-parens)
      (&optional bound)
      "Assuming that we are in front of a macro argument,
move backward to the closing parenthesis of the previous argument.
This function understands the splitting of macros over several lines
in TeX."
      (cond
       ;; Just to be quick:
       ((memq (preceding-char) '(?\] ?\} (el-patch-add ?\)))))
       ;; Do a search
       ((and reftex-allow-detached-macro-args
             (re-search-backward
              (el-patch-swap
                "[]}][ \t]*[\n\r]?\\([ \t]*%[^\n\r]*[\n\r]\\)*[ \t]*\\="
                "[]})][ \t]*[\n\r]?\\([ \t]*%[^\n\r]*[\n\r]\\)*[ \t]*\\=")
              bound t))
        (goto-char (1+ (match-beginning 0)))
        t)
       (t nil)))))

(with-eval-after-load 'el-patch
  (el-patch-feature reftex-cite); for 'reftex-figure-out-cite-format'.
  (with-eval-after-load 'reftex-cite
    ;; Select citation format with completion.
    (el-patch-defun reftex-figure-out-cite-format (arg &optional
no-insert format-key)
      "Check if there is already a cite command at point and change cite format
in order to only add another reference in the same cite command."
      (let ((macro (car (el-patch-swap
                          (reftex-what-macro 1)
                          (gb/reftex-what-macro-parens 1))))
            (cite-format-value (reftex-get-cite-format))
            key format)
        (cond
         (no-insert
          ;; Format does not really matter because nothing will be inserted.
          (setq format "%l"))

         ((and (stringp macro)
               (el-patch-swap
                 ;; Match also commands from biblatex ending with `s'
                 ;; (\parencites) or `*' (\parencite*) and `texts?'
                 ;; (\footcitetext and \footcitetexts).
                 (string-match
"\\`\\\\cite\\|cite\\([s*]\\|texts?\\)?\\'" macro)
                 (and (string-match
                       (concat
                        ;; The original regexp.
                        "\\`\\\\cite\\|cite\\([s*]\\|texts?\\)?\\'"
                        ;; Plus some...
                        "\\|\\`\\\\begin{\\(foreign\\|hyphen\\)?displaycquote}")
                       macro)

                      ;; Make sure we are in a mandatory arg.
                      (save-excursion
                        (let ((forward-sexp-function nil))
                          (ignore-errors (up-list -1)))
                        (= (following-char) ?\{)))))
          ;; We are already inside a cite macro
          (if (or (not arg) (not (listp arg)))
              (setq format
                    (concat
                     (if (member (preceding-char) '(?\{ ?,))
                 ""
               reftex-cite-key-separator)
                     "%l"
                     (if (member (following-char) '(?\} ?,))
                 ""
               reftex-cite-key-separator)))
            (setq format "%l")))
         (t
          ;; Figure out the correct format
          (setq format
                (if (and (symbolp cite-format-value)
                         (assq cite-format-value reftex-cite-format-builtin))
                    (nth 2 (assq cite-format-value reftex-cite-format-builtin))
                  cite-format-value))
          (when (listp format)
            (setq key
                  (or format-key
                      (el-patch-swap
                        ;; RefTeX offers a selection by key...
                        (reftex-select-with-char
                         "" (concat "SELECT A CITATION FORMAT\n\n"
                                    (mapconcat
                                     (lambda (x)
                                       (format "[%c] %s  %s" (car x)
                                               (if (> (car x) 31) " " "")
                                               (cdr x)))
                                     format "\n")))
                        ;; ... I prefer to select with completion.
                        ;; I'm stripping the slash and the empty arguments
                        ;; from the candidates with 'replace-regexp-in-string'
                        ;; to have a cleaner list of candidates.  Technically
                        ;; speaking this is not fully general, since we can
                        ;; have two candidates (and thus two keys) which are
                        ;; identical or whose only difference are the
                        ;; arguments (e.g. "\\cite{%l}" and "\\cite[][]{%l}",
                        ;; as in the jurabib format in
                        ;; 'reftex-cite-format-builtin').  But I can well do
                        ;; without it by using an adequate
                        ;; 'gb/reftex-cite-format-biblatex' with no such
                        ;; duplicate entries, particularly since I also let
                        ;; 'reftex-cite-prompt-optional-args' set to 'maybe',
                        ;; and thus am not queried by default for optional
                        ;; args anyway and can always include them on demand
                        ;; with a prefix arg.
                        (let* ((cands (mapcar (lambda (c)
                                                (cons
                                                 (replace-regexp-in-string
                                                  "\\(\\[]\\)*\\({%l}\\)*\\'" ""
                                                  (replace-regexp-in-string
                                                   "\\`\\\\" ""
                                                   (cdr c)))
                                                 (car c)))
                                              format))
                               (ans (completing-read "Citation format: "
                                                     cands nil t)))
                          (cdr (assoc ans cands))))))
            (if (assq key format)
                (setq format (cdr (assq key format)))
              (error "No citation format associated with key `%c'" key)))))
        format))))

(with-eval-after-load 'el-patch
  (el-patch-feature reftex-dcr); for 'reftex-view-crossref' and
                               ; 'reftex-view-crossref-when-idle'.
  (with-eval-after-load 'reftex-dcr
    ;; 'reftex-view-crossref' and the related 'reftex-view-crossref-when-idle'
    ;; have an annoying bug of reporting non-existing bibentries when point is
    ;; actually on pre- or post-notes.  This has been reported
    ;; (https://lists.gnu.org/archive/html/bug-auctex/2019-11/msg00007.html),
    ;; but the bug report was not really well received (see thread
    ;; https://lists.gnu.org/archive/html/bug-auctex/2020-08/msg00007.html).
    ;; So I unfortunately have to patch it here.  This must be done also for
    ;; "ref" commands, since 'zcref' takes an optional argument, and thus is
    ;; subject to the same issue.  I've also added support for 'zcheck' and
    ;; for 'csquotes' integrated display environments here.  Some of this
    ;; stuff could arguably be done by means of 'reftex-view-crossref-extra'
    ;; but, in the end, this is somewhat restrictive, since it only allows to
    ;; enable search in the current buffer, which particularly defeats
    ;; citation keys.
    (el-patch-defun reftex-view-crossref (&optional arg auto-how fail-quietly)
      "View cross reference of macro at point.

Point must be on the KEY argument.  When at a `\\ref' macro, show
corresponding `\\label' definition, also in external
documents (`xr').  When on a label, show a locations where KEY is
referenced.  Subsequent calls find additional locations.  When on
a `\\cite', show the associated `\\bibitem' macro or the BibTeX
database entry.  When on a `\\bibitem', show a `\\cite' macro
which uses this KEY.  When on an `\\index', show other locations
marked by the same index entry.

To define additional cross referencing items, use the option
`reftex-view-crossref-extra'.  See also `reftex-view-crossref-from-bibtex'.
With one or two \\[universal-argument] prefixes, enforce rescanning of
the document.
With argument 2, select the window showing the cross reference.
AUTO-HOW is only for the automatic crossref display and is handed through
to the functions `reftex-view-cr-cite' and `reftex-view-cr-ref'."
      (interactive "P")
      (el-patch-add (require 'reftex-parse))
      ;; See where we are.
      (let* ((macro (car (el-patch-swap
                           (reftex-what-macro-safe 1)
                           (gb/reftex-what-macro-parens 1))))
             (key (reftex-this-word "^{}%\n\r, \t"))
             dw)

        (if (or (null macro) (reftex-in-comment))
            (or fail-quietly
                (error "Not on a crossref macro argument"))

          (setq reftex-call-back-to-this-buffer (current-buffer))

          (cond
           ((el-patch-swap
              (string-match
"\\`\\\\cite\\|cite\\([s*]\\|texts?\\)?\\'\\|bibentry" macro)
              ;; A citation macro: search for bibitems or BibTeX entries.
              ;; Match also commands from biblatex ending with `s'
              ;; (\parencites) or `*' (\parencite*) and `texts?'
              ;; (\footcitetext and \footcitetexts).
              (and (string-match
                    (concat
                     ;; The original regexp.
                     "\\`\\\\cite\\|cite\\([s*]\\|texts?\\)?\\'\\|bibentry"
                     ;; Plus some...
                     "\\|\\`\\\\begin{\\(foreign\\|hyphen\\)?displaycquote}")
                    macro)

                   ;; Make sure we are in a mandatory arg.
                   (save-excursion
                     (let ((forward-sexp-function nil))
                       (ignore-errors (up-list -1)))
                     (= (following-char) ?\{))))
            (setq dw (reftex-view-cr-cite arg key auto-how)))
           ((el-patch-swap
              (string-match "\\`\\\\ref\\|ref\\(range\\|s\\)?\\*?\\'" macro)
              ;; A reference macro: search for labels.
              ;; Match also commands from cleveref ending with `s' (\namecrefs).
              (and (string-match
                    (concat
                     ;; The original regexp.
                     "\\`\\\\ref\\|ref\\(range\\|s\\)?\\*?\\'"
                     ;; Plus some...
                     "\\|\\`\\\\zcheck\\*?\\'")
                    macro)
                   ;; Make sure we are in a mandatory arg.
                   (save-excursion
                     (let ((forward-sexp-function nil))
                       (ignore-errors (up-list -1)))
                     (and (= (following-char) ?\{)
                          ;; And make sure it is the *first* mandatory arg
                          ;; (for '\zcheck').
                          (progn (backward-sexp 1) t)
                          (not (= (following-char) ?\{))))))
            (setq dw (reftex-view-cr-ref arg key auto-how)))
           (auto-how nil)  ;; No further action for automatic display (speed)
           ((or (equal macro "\\label")
                (el-patch-add (equal macro "\\begin{zcregion}"))
                (member macro reftex-macros-with-labels))
            ;; A label macro: search for reference macros
            (reftex-access-scan-info arg)
            (setq dw (reftex-view-regexp-match
                      (format reftex-find-reference-format (regexp-quote key))
                      4 nil nil)))
           ((equal macro "\\bibitem")
            ;; A bibitem macro: search for citations
            (reftex-access-scan-info arg)
            (setq dw (reftex-view-regexp-match
                      (format reftex-find-citation-regexp-format
(regexp-quote key))
                      4 nil nil)))
           ((member macro reftex-macros-with-index)
            (reftex-access-scan-info arg)
            (setq dw (reftex-view-regexp-match
                      (format reftex-find-index-entry-regexp-format
                              (regexp-quote key))
                      3 nil nil)))
           (t
            (reftex-access-scan-info arg)
            (catch 'exit
              (let ((list reftex-view-crossref-extra)
                    entry mre action group)
                (while (setq entry (pop list))
                  (setq mre (car entry)
                        action (nth 1 entry)
                        group (nth 2 entry))
                  (when (string-match mre macro)
                    (setq dw (reftex-view-regexp-match
                              (format action key) group nil nil))
                    (throw 'exit t))))
              (error "Not on a crossref macro argument"))))
          (if (and (eq arg 2) (windowp dw)) (select-window dw)))))

    ;; Allow for 'reftex-view-crossref' to find reference commands with
    ;; multiple labels.  Also add support for '\zcheck'.
    (setopt reftex-find-reference-format
            (concat
             "\\\\\\(ref[a-zA-Z]*\\|[a-zA-Z]*ref\\(range\\)?\\|zcheck\\)\\*?"
             "\\(\\[[^]]*\\]\\|{[^}]*}\\)*"
             "{\\(?:[^}]*,[ \n]*\\)?\\(%s\\)[ ]*[},]"))

    (el-patch-defun reftex-view-crossref-when-idle ()
      ;; Display info about crossref at point in echo area or a window.
      ;; This function was designed to work with an idle timer.
      ;; We try to get out of here as quickly as possible if the call
is useless.
      (and reftex-mode
           ;; Make sure message area is free if we need it.
           (or (eq reftex-auto-view-crossref 'window) (not (current-message)))
           ;; Make sure we are not already displaying this one
           (not (memq last-command '(reftex-view-crossref
                                     reftex-mouse-view-crossref)))
           ;; Quick precheck if this might be a relevant spot
           ;; `reftex-view-crossref' will do a more thorough check.
           (save-excursion
             (search-backward "\\" nil t)
             (looking-at
              (el-patch-swap
                "\\\\[a-zA-Z]*\\(cite\\|ref\\|bibentry\\)"
                (concat
                 ;; The original regexp.
                 "\\\\[a-zA-Z]*\\(cite\\|ref\\|bibentry\\)"
                 ;; Plus some...
                 "\\|\\\\zcheck"
                 "\\|\\\\begin{\\(foreign\\|hyphen\\)?displaycquote}"))))

           (condition-case nil
               (let ((current-prefix-arg nil))
                 (cond
                  ((eq reftex-auto-view-crossref t)
                   (reftex-view-crossref -1 'echo 'quiet))
                  ((eq reftex-auto-view-crossref 'window)
                   (reftex-view-crossref -1 'tmp-window 'quiet))
                  (t nil)))
             (error nil))))))

(with-eval-after-load 'el-patch
  (el-patch-feature reftex-parse); for 'reftex-parse-from-file'
  (with-eval-after-load 'reftex-parse
    ;; With lazy-macro-expansion to avoid startup errors if 'el-patch' is not
    ;; installed.
    (gb/with-lazy-macro-expansion
     ;; Add RefTeX support for zref-xr.  I have made a feature request at
     ;; https://lists.gnu.org/archive/html/auctex-devel/2021-11/msg00012.html
     ;; which met with a positive answer by Arash at
     ;; https://lists.gnu.org/archive/html/auctex-devel/2021-12/msg00000.html.
     ;; But, even if this really makes it, it will take a long time for me to
     ;; enjoy.  In the meantime, we can use a patch, and a "template" at that,
     ;; since this is a tiny change in a large function.
     (el-patch-define-and-eval-template
      (defun reftex-parse-from-file)
      (el-patch-swap
        "\\\\external\\(?:cite\\)?document"
        "\\\\z?external\\(?:cite\\)?document\\*?")))))
#+end_src

Comments, starting with exclusions. Naturally, my changes to
`reftex-what-macro' and `reftex-move-to-previous-arg' will become
obsolete with your patch (Thanks!!). There are obvious idiosyncrasies
of mine, like preferring completing-read to a key dispatcher to choose
the citation command. Disregard those.

Net of this kind of stuff are some things which accumulated over time,
to add support to specific packages, or fixing things I didn't like.
In hindsight, my general take on those is that RefTeX seems to presume
that only the standard, or very traditional, reference and citation
commands exist and, hence, chooses to hard-code most of the relevant
behavior, making it very hard to extend and tweak. Inaccessible to the
less daring users and, more importantly, to AUCTeX style files.

Now, as an author of some non-standard cross-reference packages I'm
certainly more sensitive to these restrictions than the regular user.
Which makes me partial in this regard. But the simple fact that
`csquotes' integrated display environments are not supported by this
feature set of RefTeX is likely sufficient to convince that this
hard-coding bites more widely than the users of some niche package.

The fact that `reftex-view-crossref' does not exclude optional
arguments with its implications to `reftex-view-crossref-when-idle'
would also remain, but this was reported and discussed elsewhere, and
I have nothing new to add on this matter.

In summary, ideally some of this stuff could be exposed so as to be
accessible from AUCTeX style files. Failing that, I'd say adding
support to `csquotes', even if hard-coded, would be very welcome.

> > I'm surprised you dug this back. It is appreciated. Thank you.
>
> I started looking at our old bug reports, let's see if we can close this
> one as well.  Since it is your first report, it should get the attention
> deserved ;-)

I recall you questioning somewhat the relevance of this peculiar
notation of biblatex's citation lists
(https://lists.gnu.org/archive/html/auctex-devel/2023-05/msg00015.html)
so, as a regular user of them, I'm glad and thankful to see you soften
a little your stance in this regard.

Best,
gusbrs




Information forwarded to bug-auctex <at> gnu.org:
bug#31132; Package auctex. (Tue, 09 Apr 2024 12:41:01 GMT) Full text and rfc822 format available.

Message #29 received at 31132 <at> debbugs.gnu.org (full text, mbox):

From: Arash Esbati <arash <at> gnu.org>
To: gusbrs <gusbrs.2016 <at> gmail.com>
Cc: 31132 <at> debbugs.gnu.org
Subject: Re: bug#31132: AUCTeX, RefTeX and biblatex's multicite commands
Date: Tue, 09 Apr 2024 14:39:29 +0200
[Message part 1 (text/plain, inline)]
Hi Gustavo,

gusbrs <gusbrs.2016 <at> gmail.com> writes:

> Oh, reading the old thread was a little embarrassing. I didn't even
> know how to reply to a mailing list (full html contents at the end,
> etc., sigh... ;-).

Wait another year or two, and you'll be writing Mails within Emacs ;-)

> I did test things and the TL;DR is: looks good to me.

Thanks, I installed that change on Emacs master, commit 7236010d2e.

> I did not attempt to test for possible side effects in other areas,
> given that `reftex-move-to-previous-arg' and `reftex-what-macro' are
> general purpose utility functions. But I think the patch at hand is
> pretty careful in changing the syntax of the parentheses only locally.
> That's what I'd do too and my assessment is that I see no reason it
> shouldn't be safe.

Thanks, this is/was also my impression; hopefully no side-effects.

> The only other thing of note I observed is that the mcite-like
> citation commands are not fontified as reference/citation commands
> (they get only the generic `font-latex-sedate-face'). I had agreed
> with you that the case is tricky and arguably not worth the trouble on
> RefTeX's side of things. But fontification for them should be trivial.
> So, why not?

Ok, I had another look, and biblatex manual says on page 120:

  In contrast to that, a biblatex entry set is an entity in its own
  right.

So I think the change attached gives sort of support for mcite-like
macros, incl. fontification.  Do you want to give it a roll?  Please
ignore the re-indent changes.

> Nice, perhaps something useful comes out of it. I'll share the code
> first and comment later.

Thanks, I will read through it later.  I'd like to address the issues in
this report and close it before we proceed.

> I'm using `el-patch' in my config, but it should be easy enough to
> read, even if you are not acquainted with it.

Yes, I think I get the message.

> Net of this kind of stuff are some things which accumulated over time,
> to add support to specific packages, or fixing things I didn't like.
> In hindsight, my general take on those is that RefTeX seems to presume
> that only the standard, or very traditional, reference and citation
> commands exist and, hence, chooses to hard-code most of the relevant
> behavior, making it very hard to extend and tweak. Inaccessible to the
> less daring users and, more importantly, to AUCTeX style files.

Yes, this is true: RefTeX hardcodes plenty of stuff.

> I recall you questioning somewhat the relevance of this peculiar
> notation of biblatex's citation lists
> (https://lists.gnu.org/archive/html/auctex-devel/2023-05/msg00015.html)
> so, as a regular user of them, I'm glad and thankful to see you soften
> a little your stance in this regard.

TBH, I still don't want to touch font-latex.el in order to make
fontification for cite-lists work, but we have an imperfect solution in
place which hopefully is enough for you and other users :-)

Again, thank you for your support.

Best, Arash
[biblatex.el.diff (text/x-patch, attachment)]

Information forwarded to bug-auctex <at> gnu.org:
bug#31132; Package auctex. (Tue, 09 Apr 2024 14:35:01 GMT) Full text and rfc822 format available.

Message #32 received at 31132 <at> debbugs.gnu.org (full text, mbox):

From: gusbrs <gusbrs.2016 <at> gmail.com>
To: Arash Esbati <arash <at> gnu.org>
Cc: 31132 <at> debbugs.gnu.org
Subject: Re: bug#31132: AUCTeX, RefTeX and biblatex's multicite commands
Date: Tue, 9 Apr 2024 11:33:55 -0300
Hi Arash,

On Tue, 9 Apr 2024 at 09:39, Arash Esbati <arash <at> gnu.org> wrote:

> Thanks, I installed that change on Emacs master, commit 7236010d2e.

Great, thank you very much! I'm already looking forward to Emacs 30 now. :-)

> > The only other thing of note I observed is that the mcite-like
> > citation commands are not fontified as reference/citation commands
> > (they get only the generic `font-latex-sedate-face'). I had agreed
> > with you that the case is tricky and arguably not worth the trouble on
> > RefTeX's side of things. But fontification for them should be trivial.
> > So, why not?
>
> Ok, I had another look, and biblatex manual says on page 120:
>
>   In contrast to that, a biblatex entry set is an entity in its own
>   right.
>
> So I think the change attached gives sort of support for mcite-like
> macros, incl. fontification.  Do you want to give it a roll?  Please
> ignore the re-indent changes.

Oh, wow! You went far there. I had only thought of a simple
`font-latex-add-keywords` for them when I mentioned.

I did take it for a spin (light, but should be sufficient for this).
And it does more than I'd expect, you are even handling the insertion
of the sets. Fontification is fine too.
For these macros, seldom used, macro insertion on the AUCTeX side with
TeX-insert-macro is more than sufficient. Pretty good, looks good to
me. Thank you!

Sure, the peculiar bibkey notation still defeats
`reftex-view-crossref', but... as previously discussed.

> > Nice, perhaps something useful comes out of it. I'll share the code
> > first and comment later.
>
> Thanks, I will read through it later.  I'd like to address the issues in
> this report and close it before we proceed.
>
> [...]
>
> Yes, this is true: RefTeX hardcodes plenty of stuff.

Use this stuff as you see fit. As I said, just to get some ideas from.
Discuss if you feel like it, but feel free to keep it to yourself too.
I offered without giving it much thought, and it turned out to be
quite a lot.
Take it as an example of what an interested user had to do to add
support to a few non-standard packages to this feature set in RefTeX.
I doubt the general view emerging from it is any news to folks in this
list, but sometimes a concrete example helps building perspective. I
don't expect anything to come out of it, except perhaps be a useful
food for thought to you.

> TBH, I still don't want to touch font-latex.el in order to make
> fontification for cite-lists work, but we have an imperfect solution in
> place which hopefully is enough for you and other users :-)

Fair, and understood. And, granted, this one is actually easy to
handle on the user side (if one can live with a discrete warning face
on the backslash). I just couldn't resist poking you a little bit
about it.  ;-)

> Again, thank you for your support.

I thank _you_!

Best,
gusbrs




Information forwarded to bug-auctex <at> gnu.org:
bug#31132; Package auctex. (Tue, 09 Apr 2024 19:53:02 GMT) Full text and rfc822 format available.

Message #35 received at 31132 <at> debbugs.gnu.org (full text, mbox):

From: Arash Esbati <arash <at> gnu.org>
To: gusbrs <gusbrs.2016 <at> gmail.com>
Cc: 31132 <at> debbugs.gnu.org
Subject: Re: bug#31132: AUCTeX, RefTeX and biblatex's multicite commands
Date: Tue, 09 Apr 2024 21:52:25 +0200
Hi Gustavo,

gusbrs <gusbrs.2016 <at> gmail.com> writes:

> For these macros, seldom used, macro insertion on the AUCTeX side with
> TeX-insert-macro is more than sufficient. Pretty good, looks good to
> me. Thank you!

Thanks for testing, I installed that change on AUCTeX master with commit
d9f8ff12b1.

> I don't expect anything to come out of it, except perhaps be a useful
> food for thought to you.

I think we can find things which are useful for users, even for one
single user.  You just need to be patient :-)

> I just couldn't resist poking you a little bit about it.  ;-)

That's a good habit, please don't stop that ;-)

I think we have addressed all the issues in the original report, or am I
missing something?  Otherwise I'll close this report.

Best, Arash




Information forwarded to bug-auctex <at> gnu.org:
bug#31132; Package auctex. (Tue, 09 Apr 2024 20:04:02 GMT) Full text and rfc822 format available.

Message #38 received at 31132 <at> debbugs.gnu.org (full text, mbox):

From: gusbrs <gusbrs.2016 <at> gmail.com>
To: Arash Esbati <arash <at> gnu.org>
Cc: 31132 <at> debbugs.gnu.org
Subject: Re: bug#31132: AUCTeX, RefTeX and biblatex's multicite commands
Date: Tue, 9 Apr 2024 17:03:08 -0300
Hi Arash,

On Tue, 9 Apr 2024 at 16:52, Arash Esbati <arash <at> gnu.org> wrote:

> I think we have addressed all the issues in the original report, or am I
> missing something?  Otherwise I'll close this report.

I think so too, this one is good to close. Once again, thank you very much!

Best,
gusbrs




Reply sent to Arash Esbati <arash <at> gnu.org>:
You have taken responsibility. (Tue, 09 Apr 2024 20:34:02 GMT) Full text and rfc822 format available.

Notification sent to gusbrs.2016 <at> gmail.com:
bug acknowledged by developer. (Tue, 09 Apr 2024 20:34:02 GMT) Full text and rfc822 format available.

Message #43 received at 31132-done <at> debbugs.gnu.org (full text, mbox):

From: Arash Esbati <arash <at> gnu.org>
To: gusbrs <gusbrs.2016 <at> gmail.com>
Cc: 31132-done <at> debbugs.gnu.org
Subject: Re: bug#31132: AUCTeX, RefTeX and biblatex's multicite commands
Date: Tue, 09 Apr 2024 22:33:11 +0200
gusbrs <gusbrs.2016 <at> gmail.com> writes:

> I think so too, this one is good to close. Once again, thank you very
> much!

You're welcome, and thank you for your support.  I think we will go on
with discussion about your proposals on auctex-devel.  For now, I'm
closing this report.

Best, Arash




Information forwarded to bug-auctex <at> gnu.org:
bug#31132; Package auctex. (Tue, 09 Apr 2024 20:53:02 GMT) Full text and rfc822 format available.

Message #46 received at 31132-done <at> debbugs.gnu.org (full text, mbox):

From: gusbrs <gusbrs.2016 <at> gmail.com>
To: Arash Esbati <arash <at> gnu.org>
Cc: 31132-done <at> debbugs.gnu.org
Subject: Re: bug#31132: AUCTeX, RefTeX and biblatex's multicite commands
Date: Tue, 9 Apr 2024 17:52:08 -0300
Hi Arash,

On Tue, 9 Apr 2024 at 17:33, Arash Esbati <arash <at> gnu.org> wrote:

> I think we will go on
> with discussion about your proposals on auctex-devel.

Please CC me if/when you do so.

Cheers!




Information forwarded to bug-auctex <at> gnu.org:
bug#31132; Package auctex. (Tue, 09 Apr 2024 21:08:03 GMT) Full text and rfc822 format available.

Message #49 received at 31132-done <at> debbugs.gnu.org (full text, mbox):

From: Arash Esbati <arash <at> gnu.org>
To: gusbrs <gusbrs.2016 <at> gmail.com>
Cc: 31132-done <at> debbugs.gnu.org
Subject: Re: bug#31132: AUCTeX, RefTeX and biblatex's multicite commands
Date: Tue, 09 Apr 2024 23:07:22 +0200
gusbrs <gusbrs.2016 <at> gmail.com> writes:

> On Tue, 9 Apr 2024 at 17:33, Arash Esbati <arash <at> gnu.org> wrote:
>
>> I think we will go on
>> with discussion about your proposals on auctex-devel.
>
> Please CC me if/when you do so.

No worries :-)




bug archived. Request was from Debbugs Internal Request <help-debbugs <at> gnu.org> to internal_control <at> debbugs.gnu.org. (Wed, 08 May 2024 11:24:06 GMT) Full text and rfc822 format available.

This bug report was last modified 7 days ago.

Previous Next


GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997,2003 nCipher Corporation Ltd, 1994-97 Ian Jackson.