;; 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)