quail: TeX input method: change UTF8 to tex and back: solution & problems

Uwe Brauer oub at mat.ucm.es
Tue Jan 8 09:26:36 EST 2008


>>>>> "Aidan" == Aidan Kehoe <kehoea at parhasard.net> writes:

   >  Ar an seachtú lá de mí Eanair, scríobh Uwe Brauer: 

   >> Anyhow the code worked, but there is a problem:
   >> 
   >> (defvar tex2utf8symb-trans-tab
   >> '(
   >> ("\\in" "∈")
   >> ("\\infty" "∞")
   >> ("\\int" "∫")
   >> 
   >> ))
   >> 
   >> While 
   >> \in and \int are transformed correctly 
   >> \infty is changed to ∈fty, 
   >> 
   >> which is wrong (on the other hand I don't understand why 
   >> \int is not transformed to ∈t but anyhow).
   >> 
   >> So the question is how shall I define the tex commands uniquely?

   > What you need to do is rewrite the code to use
   > #'posix-search-forward, which guarantees that it will return the
   > longest match (that is, it will always try to match "\\infty" if
   > possible, and only then look for "\in".) You might also want to
   > look into the #'regexp-opt function, which, given a list of
   > strings, returns a theoretically fast regexp to match that
   > list--you’ll need the regexp to pass to
   > posix-search-forward. (I’m not however certain if regexp-opt
   > interacts well with posix-search-forward; anyone else know?)

Hm the code is this

(defun fix-tex2utf8symbol ()
  "Replace SGML entity references with ISO 8859-1 (aka Latin-1) characters."
  (interactive)
;  (if (member major-mode utf8symbol-modes-list)
      (let ((buffer-modified-p (buffer-modified-p)))
	  (unwind-protect
	      (utf8symbol-translate-conventions tex2utf8symbol-trans-tab)
	    (set-buffer-modified-p buffer-modified-p))))

And the most relevant function:
(defun utf8symbol-translate-conventions (trans-tab)
  "Use the translation table argument to translate the current buffer."
  (save-excursion
    (let ((beg (point-min-marker))    ; see the `(elisp)Narrowing' Info node
	  (end (point-max-marker)))
      (unwind-protect
	  (progn
	    (widen)
	    (goto-char (point-min))
	    (let ((buffer-read-only nil) ; (inhibit-read-only t)?
		  (case-fold-search nil))
	      (while trans-tab
		(save-excursion
		  (let ((trans-this (car trans-tab)))
		    (while (search-forward (car trans-this) nil t)
		      (replace-match (car (cdr trans-this)) t t)))
		  (setq trans-tab (cdr trans-tab))))))
	(narrow-to-region beg end)))))

So tried to replace the line:
		    (while (search-forward (car trans-this) nil t)
By
		    (while (posix-search-forward (car trans-this) nil t)
but I obtained an error.

So I thought of using regexp-opt, as you suggested 

For me the following looked "logical":

(defun utf8symbol-translate-conventions (trans-tab)
  "Use the translation table argument to translate the current buffer."
  (save-excursion
    (let ((beg (point-min-marker))    ; see the `(elisp)Narrowing' Info node
	  (end (point-max-marker)))
      (unwind-protect
	  (progn
	    (widen)
	    (goto-char (point-min))
	    (let ((buffer-read-only nil) ; (inhibit-read-only t)?
		  (case-fold-search nil))
	      (while trans-tab
		(save-excursion
		  (let ((trans-this (car trans-tab)))
           (regexp-opt trans-this)
           ^^^^^^^^^^^^^^^^^^^^^^
		    (while (search-forward (car trans-this) nil t)
		      (replace-match (car (cdr trans-this)) t t)))
		  (setq trans-tab (cdr trans-tab))))))
	(narrow-to-region beg end)))))

But this did not work neither.

Uwe 



More information about the XEmacs-Beta mailing list