;; gm-lingo.el ;; Translate to ISO from/to net/TeX conventions ... ;; Copyright 1993 Michael Gschwind (mike@vlsivie.tuwien.ac.at) ;; Keywords: tex, iso, latin, 8bit ;; From: mike@vlsivie.tuwien.ac.at (Michael Gschwind) ;; Newsgroups: gnu.emacs.sources ;; Subject: tex sequence to ISO latin conversions (and back) ;; Date: 13 Oct 1993 12:12:35 GMT ;; ;; The enclosed elisp file installs hooks which automatically translate ;; TeX sequences to ISO latin1 upon loading of a TeX file in emacs. This ;; allows editing of TeX documents without having to type escape ;; sequences. Upon saving a file, ISO latin1 characters are converted ;; back to TeX sequences. (If you have a tex style which can handle 8 bit ;; characters, this part is not necessary, but the loading half is still ;; neat to convert old files to 8 bit - also, 8 bit are less portable ;; than 7...) ;; ;; It also contains a function 'german which translates net conventions ;; for typing german characters into the real thing - if you install this ;; in news-reader/mail/whatever hooks, you'll never again be bothered ;; with having to read characters like "s or \3 or "a etc. ;; ;; mike ;; ;; This file works with GNU Emacs19 or higher, but is not part of GNU Emacs. ;; This program is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2 of the License, or ;; (at your option) any later version. ;; ;; This program is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; ;; You should have received a copy of the GNU General Public License ;; along with this program; if not, write to the Free Software ;; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ; it's the author's first lisp program in a long time, so don't judge ; him by it :( ; to do: translate buffer when displaying from GNUS, ; use function 'german which does the Right Thing ; upon saving, the buffer reverts to TeX format... ; Description: ; calling 'german will turn the net convention f. umlauts ("a etc.) ; into ISO latin umlaute for easy reading. ; hooks change TeX files to latin1 for editing and back to TeX sequences ; for calling TeX. An alternative is a TeX style that handles ; 8 bit ISO files (available on ftp.vlsivie.tuwien.ac.at in /pub/8bit) ; - but these files are difficult to transmit ... so while the net is ; still @ 7 bit this may be useful (defvar spanish-trans-tab '( ("~n" "ñ") ("\([a-zA-Z]\)#" "\\1ñ") ("~N" "Ñ") ( "\\([-a-zA-Z\"`]\\)\"u" "\\1ü") ( "\\([-a-zA-Z\"`]\\)\"U" "\\1Ü") ( "\\([-a-zA-Z]\\)'o" "\\1ó") ( "\\([-a-zA-Z]\\)'O" "\\Ó") ( "\\([-a-zA-Z]\\)'e" "\\1é") ( "\\([-a-zA-Z]\\)'E" "\\1É") ( "\\([-a-zA-Z]\\)'a" "\\1á") ( "\\([-a-zA-Z]\\)'A" "\\1A") ( "\\([-a-zA-Z]\\)'i" "\\1í") ( "\\([-a-zA-Z]\\)'I" "\\1Í") ) "Spanish") (defun translate-conventions (trans-tab) (interactive) (save-excursion (widen) (goto-char (point-min)) (let ((work-tab trans-tab) (buffer-read-only nil)) (while work-tab (save-excursion (let ((trans-this (car work-tab))) (while (re-search-forward (car trans-this) nil t) (replace-match (car (cdr trans-this)) nil nil))) (setq work-tab (cdr work-tab))))))) (defun spanish () "Translate net conventions for Spanish to ISO" (interactive) (translate-conventions spanish-trans-tab)) (defvar aggressive-german-trans-tab '( ( "\"a" "ä") ( "\"A" "Ä") ( "\"o" "ö") ( "\"O" "Ö") ( "\"u" "ü") ( "\"U" "Ü") ( "\"s" "ß") ( "\\\\3" "ß") ) "German - may do too much") (defvar conservative-german-trans-tab '( ( "\\([-a-zA-Z\"`]\\)\"a" "\\1ä") ( "\\([-a-zA-Z\"`]\\)\"A" "\\1Ä") ( "\\([-a-zA-Z\"`]\\)\"o" "\\1ö") ( "\\([-a-zA-Z\"`]\\)\"O" "\\1Ö") ( "\\([-a-zA-Z\"`]\\)\"u" "\\1ü") ( "\\([-a-zA-Z\"`]\\)\"U" "\\1Ü") ( "\\([-a-zA-Z\"`]\\)\"s" "\\1ß") ( "\\([-a-zA-Z\"`]\\)\\\\3" "\\1ß") ) "conservative German - may do too little") (defvar german-trans-tab aggressive-german-trans-tab "used for char translation") (defun german () "Translate net conventions for German to ISO" (interactive) (translate-conventions german-trans-tab)) (defvar iso2tex-trans-tab '( ("ä" "{\\\\\"a}") ("à" "{\\\\`a}") ("á" "{\\\\'a}") ("ã" "{\\\\~a}") ("â" "{\\\\^a}") ("ë" "{\\\\\"e}") ("è" "{\\\\`e}") ("é" "{\\\\'e}") ("ê" "{\\\\^e}") ("ï" "{\\\\\"\\\\i}") ("ì" "{\\\\`\\\\i}") ("í" "{\\\\'\\\\i}") ("î" "{\\\\^\\\\i}") ("ö" "{\\\\\"o}") ("ò" "{\\\\`o}") ("ó" "{\\\\'o}") ("õ" "{\\\\~o}") ("ô" "{\\\\^o}") ("ü" "{\\\\\"u}") ("ù" "{\\\\`u}") ("ú" "{\\\\'u}") ("û" "{\\\\^u}") ("Ä" "{\\\\\"A}") ("À" "{\\\\`A}") ("Á" "{\\\\'A}") ("Ã" "{\\\\~A}") ("Â" "{\\\\^A}") ("Ë" "{\\\\\"E}") ("È" "{\\\\`E}") ("É" "{\\\\'E}") ("Ê" "{\\\\^E}") ("Ï" "{\\\\\"I}") ("Ì" "{\\\\`I}") ("Í" "{\\\\'I}") ("Î" "{\\\\^I}") ("Ö" "{\\\\\"O}") ("Ò" "{\\\\`O}") ("Ó" "{\\\\'O}") ("Õ" "{\\\\~O}") ("Ô" "{\\\\^O}") ("Ü" "{\\\\\"U}") ("Ù" "{\\\\`U}") ("Ú" "{\\\\'U}") ("Û" "{\\\\^U}") ("ñ" "{\\\\~n}") ("Ñ" "{\\\\~N}") ("ç" "{\\\\c c}") ("Ç" "{\\\\c C}") ("ß" "{\\\\ss}") ("¿" "{?`}") ("¡" "{!`}") ) ) (defun iso2tex () "Translate ISO to TeX" (interactive) (translate-conventions iso2tex-trans-tab)) (defvar tex2iso-trans-tab '( ( "{\\\\\"a}" "ä") ( "{\\\\`a}" "à") ( "{\\\\'a}" "á") ( "{\\\\~a}" "ã") ( "{\\\\^a}" "â") ( "{\\\\\"e}" "ë") ( "{\\\\`e}" "è") ( "{\\\\'e}" "é") ( "{\\\\^e}" "ê") ( "{\\\\\"\\\\i}" "ï") ( "{\\\\`\\\\i}" "ì") ( "{\\\\'\\\\i}" "í") ( "{\\\\^\\\\i}" "î") ( "{\\\\\"i}" "ï") ( "{\\\\`i}" "ì") ( "{\\\\'i}" "í") ( "{\\\\^i}" "î") ( "{\\\\\"o}" "ö") ( "{\\\\`o}" "ò") ( "{\\\\'o}" "ó") ( "{\\\\~o}" "õ") ( "{\\\\^o}" "ô") ( "{\\\\\"u}" "ü") ( "{\\\\`u}" "ù") ( "{\\\\'u}" "ú") ( "{\\\\^u}" "û") ( "{\\\\\"A}" "Ä") ( "{\\\\`A}" "À") ( "{\\\\'A}" "Á") ( "{\\\\~A}" "Ã") ( "{\\\\^A}" "Â") ( "{\\\\\"E}" "Ë") ( "{\\\\`E}" "È") ( "{\\\\'E}" "É") ( "{\\\\^E}" "Ê") ( "{\\\\\"I}" "Ï") ( "{\\\\`I}" "Ì") ( "{\\\\'I}" "Í") ( "{\\\\^I}" "Î") ( "{\\\\\"O}" "Ö") ( "{\\\\`O}" "Ò") ( "{\\\\'O}" "Ó") ( "{\\\\~O}" "Õ") ( "{\\\\^O}" "Ô") ( "{\\\\\"U}" "Ü") ( "{\\\\`U}" "Ù") ( "{\\\\'U}" "Ú") ( "{\\\\^U}" "Û") ( "{\\\\~n}" "ñ") ( "{\\\\~N}" "Ñ") ( "{\\\\c c}" "ç") ( "{\\\\c C}" "Ç") ( "\\\\\"{a}" "ä") ( "\\\\`{a}" "à") ( "\\\\'{a}" "á") ( "\\\\~{a}" "ã") ( "\\\\^{a}" "â") ( "\\\\\"{e}" "ë") ( "\\\\`{e}" "è") ( "\\\\'{e}" "é") ( "\\\\^{e}" "ê") ( "\\\\\"{\\\\i}" "ï") ( "\\\\`{\\\\i}" "ì") ( "\\\\'{\\\\i}" "í") ( "\\\\^{\\\\i}" "î") ( "\\\\\"{i}" "ï") ( "\\\\`{i}" "ì") ( "\\\\'{i}" "í") ( "\\\\^{i}" "î") ( "\\\\\"{o}" "ö") ( "\\\\`{o}" "ò") ( "\\\\'{o}" "ó") ( "\\\\~{o}" "õ") ( "\\\\^{o}" "ô") ( "\\\\\"{u}" "ü") ( "\\\\`{u}" "ù") ( "\\\\'{u}" "ú") ( "\\\\^{u}" "û") ( "\\\\\"{A}" "Ä") ( "\\\\`{A}" "À") ( "\\\\'{A}" "Á") ( "\\\\~{A}" "Ã") ( "\\\\^{A}" "Â") ( "\\\\\"{E}" "Ë") ( "\\\\`{E}" "È") ( "\\\\'{E}" "É") ( "\\\\^{E}" "Ê") ( "\\\\\"{I}" "Ï") ( "\\\\`{I}" "Ì") ( "\\\\'{I}" "Í") ( "\\\\^{I}" "Î") ( "\\\\\"{O}" "Ö") ( "\\\\`{O}" "Ò") ( "\\\\'{O}" "Ó") ( "\\\\~{O}" "Õ") ( "\\\\^{O}" "Ô") ( "\\\\\"{U}" "Ü") ( "\\\\`{U}" "Ù") ( "\\\\'{U}" "Ú") ( "\\\\^{U}" "Û") ( "\\\\~{n}" "ñ") ( "\\\\~{N}" "Ñ") ( "\\\\c{c}" "ç") ( "\\\\c{C}" "Ç") ( "{\\\\ss}" "ß") ( "{?`}" "¿") ( "{!`}" "¡") ) ) (defun tex2iso () "Translate TeX to ISO" (interactive) (translate-conventions tex2iso-trans-tab)) (defvar gtex2iso-trans-tab '( ( "\"a" "ä") ( "\"A" "Ä") ( "\"o" "ö") ( "\"O" "Ö") ( "\"u" "ü") ( "\"U" "Ü") ( "\"s" "ß") ( "\\\\3" "ß") ( "{\\\\\"a}" "ä") ( "{\\\\`a}" "à") ( "{\\\\'a}" "á") ( "{\\\\~a}" "ã") ( "{\\\\^a}" "â") ( "{\\\\\"e}" "ë") ( "{\\\\`e}" "è") ( "{\\\\'e}" "é") ( "{\\\\^e}" "ê") ( "{\\\\\"\\\\i}" "ï") ( "{\\\\`\\\\i}" "ì") ( "{\\\\'\\\\i}" "í") ( "{\\\\^\\\\i}" "î") ( "{\\\\\"i}" "ï") ( "{\\\\`i}" "ì") ( "{\\\\'i}" "í") ( "{\\\\^i}" "î") ( "{\\\\\"o}" "ö") ( "{\\\\`o}" "ò") ( "{\\\\'o}" "ó") ( "{\\\\~o}" "õ") ( "{\\\\^o}" "ô") ( "{\\\\\"u}" "ü") ( "{\\\\`u}" "ù") ( "{\\\\'u}" "ú") ( "{\\\\^u}" "û") ( "{\\\\\"A}" "Ä") ( "{\\\\`A}" "À") ( "{\\\\'A}" "Á") ( "{\\\\~A}" "Ã") ( "{\\\\^A}" "Â") ( "{\\\\\"E}" "Ë") ( "{\\\\`E}" "È") ( "{\\\\'E}" "É") ( "{\\\\^E}" "Ê") ( "{\\\\\"I}" "Ï") ( "{\\\\`I}" "Ì") ( "{\\\\'I}" "Í") ( "{\\\\^I}" "Î") ( "{\\\\\"O}" "Ö") ( "{\\\\`O}" "Ò") ( "{\\\\'O}" "Ó") ( "{\\\\~O}" "Õ") ( "{\\\\^O}" "Ô") ( "{\\\\\"U}" "Ü") ( "{\\\\`U}" "Ù") ( "{\\\\'U}" "Ú") ( "{\\\\^U}" "Û") ( "{\\\\~n}" "ñ") ( "{\\\\~N}" "Ñ") ( "{\\\\c c}" "ç") ( "{\\\\c C}" "Ç") ( "\\\\\"{a}" "ä") ( "\\\\`{a}" "à") ( "\\\\'{a}" "á") ( "\\\\~{a}" "ã") ( "\\\\^{a}" "â") ( "\\\\\"{e}" "ë") ( "\\\\`{e}" "è") ( "\\\\'{e}" "é") ( "\\\\^{e}" "ê") ( "\\\\\"{\\\\i}" "ï") ( "\\\\`{\\\\i}" "ì") ( "\\\\'{\\\\i}" "í") ( "\\\\^{\\\\i}" "î") ( "\\\\\"{i}" "ï") ( "\\\\`{i}" "ì") ( "\\\\'{i}" "í") ( "\\\\^{i}" "î") ( "\\\\\"{o}" "ö") ( "\\\\`{o}" "ò") ( "\\\\'{o}" "ó") ( "\\\\~{o}" "õ") ( "\\\\^{o}" "ô") ( "\\\\\"{u}" "ü") ( "\\\\`{u}" "ù") ( "\\\\'{u}" "ú") ( "\\\\^{u}" "û") ( "\\\\\"{A}" "Ä") ( "\\\\`{A}" "À") ( "\\\\'{A}" "Á") ( "\\\\~{A}" "Ã") ( "\\\\^{A}" "Â") ( "\\\\\"{E}" "Ë") ( "\\\\`{E}" "È") ( "\\\\'{E}" "É") ( "\\\\^{E}" "Ê") ( "\\\\\"{I}" "Ï") ( "\\\\`{I}" "Ì") ( "\\\\'{I}" "Í") ( "\\\\^{I}" "Î") ( "\\\\\"{O}" "Ö") ( "\\\\`{O}" "Ò") ( "\\\\'{O}" "Ó") ( "\\\\~{O}" "Õ") ( "\\\\^{O}" "Ô") ( "\\\\\"{U}" "Ü") ( "\\\\`{U}" "Ù") ( "\\\\'{U}" "Ú") ( "\\\\^{U}" "Û") ( "\\\\~{n}" "ñ") ( "\\\\~{N}" "Ñ") ( "\\\\c{c}" "ç") ( "\\\\c{C}" "Ç") ( "{\\\\ss}" "ß") ( "{?`}" "¿") ( "{!`}" "¡") ) ) (defvar iso2gtex-trans-tab '( ("ä" "\"a") ("à" "{\\\\`a}") ("á" "{\\\\'a}") ("ã" "{\\\\~a}") ("â" "{\\\\^a}") ("ë" "{\\\\\"e}") ("è" "{\\\\`e}") ("é" "{\\\\'e}") ("ê" "{\\\\^e}") ("ï" "{\\\\\"\\\\i}") ("ì" "{\\\\`\\\\i}") ("í" "{\\\\'\\\\i}") ("î" "{\\\\^\\\\i}") ("ö" "\"o") ("ò" "{\\\\`o}") ("ó" "{\\\\'o}") ("õ" "{\\\\~o}") ("ô" "{\\\\^o}") ("ü" "\"u") ("ù" "{\\\\`u}") ("ú" "{\\\\'u}") ("û" "{\\\\^u}") ("Ä" "\"A") ("À" "{\\\\`A}") ("Á" "{\\\\'A}") ("Ã" "{\\\\~A}") ("Â" "{\\\\^A}") ("Ë" "{\\\\\"E}") ("È" "{\\\\`E}") ("É" "{\\\\'E}") ("Ê" "{\\\\^E}") ("Ï" "{\\\\\"I}") ("Ì" "{\\\\`I}") ("Í" "{\\\\'I}") ("Î" "{\\\\^I}") ("Ö" "\"O") ("Ò" "{\\\\`O}") ("Ó" "{\\\\'O}") ("Õ" "{\\\\~O}") ("Ô" "{\\\\^O}") ("Ü" "\"U") ("Ù" "{\\\\`U}") ("Ú" "{\\\\'U}") ("Û" "{\\\\^U}") ("ñ" "{\\\\~n}") ("Ñ" "{\\\\~N}") ("ç" "{\\\\c c}") ("Ç" "{\\\\c C}") ("ß" "\\\\3") ("¿" "{?`}") ("¡" "{!`}") ) ) (defun gtex2iso () "Translate german TeX to ISO" (interactive) (translate-conventions gtex2iso-trans-tab)) (defun iso2gtex () "Translate ISO to german TeX" (interactive) (translate-conventions iso2gtex-trans-tab)) (defun german-texP () "Check if tex buffer is german LaTeX" (save-excursion (widen) (goto-char (point-min)) (re-search-forward "\\\\documentstyle\\[.*german.*\\]" nil t))) (defun fix-iso2tex () "Turn ISO latin1 into TeX sequences" (if (equal major-mode 'latex-mode) (if (german-texP) (iso2gtex) (iso2tex))) (if (equal major-mode 'tex-mode) (iso2tex))) (defun fix-tex2iso () "Turn TeX sequences into ISO latin1" (if (equal major-mode 'latex-mode) (if (german-texP) (gtex2iso) (tex2iso))) (if (equal major-mode 'tex-mode) (tex2iso))) (add-hook 'find-file-hooks 'fix-tex2iso) (add-hook 'write-file-hooks 'fix-iso2tex)