(defun digits-to-letters ()
(interactive)
(goto-char (point-min))
(save-excursion
(save-restriction
(narrow-to-region (search-forward "\\title" nil t)
(search-forward "\\abstract" nil t))
(goto-char (point-min))
(while (search-forward-regexp "\\([0-9]+\\)" nil t)
(setq digit (match-string 0))
;; 1-26 to a-z
(if (< digit 27)
(perform-replace digit
`((lambda (data count)
(string (+ (1- ?a) digit))))
t t nil 1 nil (point-min) (point-max))
;; 27-52 to aa-az
(if (and (> digit 26)
(< digit 53))
(perform-replace digit
`((lambda (data count)
(string (+ (1- ?a) (concat "a"
digit)))))
t t nil 1 nil (point-min) (point-max))
;; 53-104 to ba-bz
(if (and (> digit 52)
(< digit 105))
(perform-replace "\\([0-9]+\\)"
`((lambda (data count)
(string (+ (1- ?a) (concat "b"
digit)))))
t t nil 1 nil (point-min) (point-max))
)))
))))
P.S. I have just asked something like this, but for the first 26 digits: How to replace a digit by a letter?.
Updates
There is a mistake in the correspodence between digits and letters:
53 --> ba
...
78 --> bz
79 --> ca
...
104 --> cz
I have corrected my code as it follows:
(defun digits-to-letters ()
(interactive)
(goto-char (point-min))
(save-excursion
(save-restriction
(narrow-to-region (search-forward "\\title" nil t)
(search-forward "\\abstract" nil t))
(goto-char (point-min))
(while (search-forward-regexp "\\([0-9]+\\)" nil t)
(setq digit (string-to-number (match-string 0)))
(setq sdigit (match-string 0))
;; 1-26 to a-z
(if (< digit 27)
(replace-match (string (+ (1- ?a) digit)))
;; 27-52 to aa-az
(if (and (> digit 26)
(< digit 53))
(replace-match (concat
"a"
(string (+ (1- ?a) (- digit 26)))))
;; 53-78 to ba-bz
(if (and (> digit 52)
(< digit 79))
(replace-match (concat
"b"
(string (+ (1- ?a) (- digit 52)))))
;; 79-104 to ba-bz
(if (and (> digit 78)
(< digit 105))
(replace-match (concat
"c"
(string (+ (1- ?a) (- digit 78)))))
))))
))))
Now it works.