Dear all,

Here is a contribution that makes RefTeX TOC function more or less work
with Texinfo files: it now can grasp the document structuring commands
(like @top, @section, etc...), but labels (@node, @anchor) and @include
are still not yet supported (so forget about documents from multifile
source files).

OK, I acknowledge that this is far from perfect, however this is still
better than the current situation in which Texinfo is not handled at all
by RefTeX, and I personnally find the contribution quite usefull.

VBR,
   Vincent.

Index: tex-info.el
===================================================================
RCS file: /sources/auctex/auctex/tex-info.el,v
retrieving revision 5.162
diff -r5.162 tex-info.el
345a346,395
> (defun Texinfo-reftex-section-info (file)
>   ;; Return a section entry for the current match.
>   ;; Carefull: This function expects the match-data to be still in place!
>   (let* ((marker (set-marker (make-marker) (1- (match-beginning 3))))
>          (macro (reftex-match-string 3))
>          (level-exp (cdr (assoc macro reftex-section-levels-all)))
>          (level (if (symbolp level-exp)
>                     (save-match-data (funcall level-exp))
>                   level-exp))
>          (unnumbered  (< level 0))
>          (level (abs level))
>          (section-number (reftex-section-number level unnumbered))
>          (text1 (save-match-data 
>                   (save-excursion
> 		    (buffer-substring-no-properties (point) (progn (end-of-line) (point))))))
>          (literal (buffer-substring-no-properties
>                    (1- (match-beginning 3))
>                    (min (point-max) (+ (match-end 0) (length text1) 1))))
>          ;; Literal can be too short since text1 too short. No big problem. 
>          (text (reftex-nicify-text text1)))
> 
>     ;; Add section number and indentation
>     (setq text
>           (concat
>            (make-string (* reftex-level-indent level) ?\ )
>            (if (nth 1 reftex-label-menu-flags) ; section number flag
>                (concat section-number " "))
>            text))
>     (list 'toc "toc" text file marker level section-number
>           literal (marker-position marker))))
> 
> (defun Texinfo-reftex-hook ()
>   "Hook function to plug Texinfo into RefTeX."
>   ;; force recompilation of variables
>   (when (string= TeX-base-mode-name "Texinfo")
>     (dolist (v `((reftex-section-pre-regexp . "@")
> 		 ; section post-regexp must contain exactly one group
> 		 (reftex-section-post-regexp . "\\([ \t]+\\)")
> 		 (reftex-section-info-function . Texinfo-reftex-section-info)
> 	       (reftex-section-levels 
> 		. ,(mapcar 
> 		    (lambda (x)
> 		      (if (string-match "\\(\\`unnumbered\\)\\|\\(heading\\'\\)\\|\\(\\`top\\'\\)"
> 					(car x))
> 			  (cons (car x) (- (cadr x)))
> 			(cons (car x) (cadr x))))
> 		    texinfo-section-list))))
>       (set (make-local-variable (car v) ) (cdr v)))
>     (setq reftex-tables-dirty t)
>     (reftex-ensure-compiled-variables)))
683a734,738
>   ;; RefTeX plugging
>   (add-hook 'reftex-mode-hook 'Texinfo-reftex-hook)
>   (if (and (boundp 'reftex-mode) reftex-mode)
>       (Texinfo-reftex-hook))
> 
Index: ChangeLog
===================================================================
RCS file: /sources/auctex/auctex/ChangeLog,v
retrieving revision 5.1764
diff -r5.1764 ChangeLog
0a1,5
> 2012-07-17  Vincent Belaïche  <vincen...@users.sourceforge.net>
> 
> 	* tex-info.el (Texinfo-reftex-hook): Added function.
> 	(TeX-texinfo-mode): Added RefTeX plugging.
> 
Index: lisp/reftex-toc.el
===================================================================
RCS file: /sources/auctex/reftex/lisp/reftex-toc.el,v
retrieving revision 1.41
diff -r1.41 reftex-toc.el
712c712
<       (if (looking-at (concat "\\([ \t]*\\\\\\)" (regexp-quote name)))
---
>       (if (looking-at (concat "\\([ \t]*" reftex-section-pre-regexp "\\)" (regexp-quote name)))
Index: lisp/reftex-base.el
===================================================================
RCS file: /sources/auctex/reftex/lisp/reftex-base.el,v
retrieving revision 1.21
diff -r1.21 reftex-base.el
689a690,694
> ;; Constants for making RefTeX open to Texinfo hooking
> (defvar reftex-section-pre-regexp "\\\\")
> (defvar reftex-section-post-regexp "\\*?\\(\\[[^]]*\\]\\)?[[{ \t\r\n\\]")
> (defvar reftex-section-info-function 'reftex-section-info)
> 
1107c1112
<             (concat wbol "\\\\\\("
---
>             (concat wbol reftex-section-pre-regexp "\\("
1110c1115
<                     "\\)\\*?\\(\\[[^]]*\\]\\)?[[{ \t\r\n\\]"))
---
>                     "\\)" reftex-section-post-regexp))
Index: lisp/reftex-parse.el
===================================================================
RCS file: /sources/auctex/reftex/lisp/reftex-parse.el,v
retrieving revision 1.38
diff -r1.38 reftex-parse.el
254c254
<                  (setq toc-entry (reftex-section-info file))
---
>                  (setq toc-entry (funcall reftex-section-info-function file))
Index: ChangeLog
===================================================================
RCS file: /sources/auctex/reftex/ChangeLog,v
retrieving revision 1.89
diff -r1.89 ChangeLog
0a1,17
> 2012-07-17  Vincent Belaïche  <vincen...@users.sourceforge.net>
> 
> 	* lisp/reftex-parse.el (reftex-parse-from-file): Use variable
> 	reftex-section-info-function in order to be compatible with
> 	Texinfo integration.
> 
> 	* lisp/reftex-base.el (reftex-section-pre-regexp)
> 	(reftex-section-post-regexp, reftex-section-info-function): New
> 	variable.
> 	(reftex-compile-variables): Use variables
> 	reftex-section-pre-regexp, reftex-section-post-regexp, and
> 	reftex-section-info-function in order to be compatible with Texinfo integration.
> 
> 	* lisp/reftex-toc.el (reftex-toc-promote-action): use
> 	reftex-section-pre-regexp variable in order to be compatible with
> 	Texinfo integration.
> 
_______________________________________________
auctex mailing list
auctex@gnu.org
https://lists.gnu.org/mailman/listinfo/auctex

Reply via email to