Mercurial > emacs
annotate lisp/international/latexenc.el @ 62166:9aa364d49b37
(calc-commute-left, calc-commute-right, calc-sel-unpack)
(calc-sel-isolate): Rename variable reselect to calc-sel-reselect.
author | Jay Belanger <jay.p.belanger@gmail.com> |
---|---|
date | Sat, 07 May 2005 21:23:19 +0000 |
parents | 935929fcdb78 |
children | 68b153fd6cd9 |
rev | line source |
---|---|
61909 | 1 ;;; latexenc.el --- guess correct coding system in LaTeX files |
2 | |
3 ;; Copyright (C) 2005 Free Software Foundation, Inc. | |
4 | |
5 ;; Author: Arne J,Ax(Brgensen <arne@arnested.dk> | |
6 ;; Keywords: mule, coding system, latex | |
7 | |
8 ;; This file is part of GNU Emacs. | |
9 | |
10 ;; GNU Emacs is free software; you can redistribute it and/or modify | |
11 ;; it under the terms of the GNU General Public License as published by | |
12 ;; the Free Software Foundation; either version 2, or (at your option) | |
13 ;; any later version. | |
14 | |
15 ;; GNU Emacs is distributed in the hope that it will be useful, | |
16 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of | |
17 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
18 ;; GNU General Public License for more details. | |
19 | |
20 ;; You should have received a copy of the GNU General Public License | |
21 ;; along with GNU Emacs; see the file COPYING. If not, write to the | |
22 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, | |
23 ;; Boston, MA 02111-1307, USA. | |
24 | |
25 ;;; Commentary: | |
26 | |
27 ;; This code tries to guess the correct coding system of a LaTeX file. | |
28 | |
29 ;; First it searches for a \inputencoding{...} or | |
30 ;; \usepackage[...]{inputenc} line in the file and looks up the ... in | |
31 ;; `latex-inputenc-coding-alist' to find the corresponding coding | |
32 ;; system. | |
33 | |
34 ;; If this fails it will search for AUCTeX's TeX-master or tex-mode's | |
35 ;; tex-main-file variable in the local variables section and visit | |
36 ;; that file to get the coding system from the master file. This check | |
37 ;; can be disabled by setting `latexenc-dont-use-TeX-master-flag' to | |
38 ;; t. | |
39 | |
40 ;; If we have still not found a coding system we will try to use the | |
41 ;; standard tex-mode's `tex-guess-main-file' and get the coding system | |
42 ;; from the main file. This check can be disabled by setting | |
43 ;; `latexenc-dont-use-tex-guess-main-file-flag' to t. | |
44 | |
45 ;; The functionality is enabled by adding the function | |
46 ;; `latexenc-find-file-coding-system' to `file-coding-system-alist' | |
47 ;; like this | |
48 | |
49 ;; (add-to-list 'file-coding-system-alist | |
50 ;; '("\\.tex\\|\\.ltx\\|\\.dtx\\|\\.drv\\'" . latexenc-find-file-coding-system)) | |
51 | |
52 ;;; Code: | |
53 | |
54 ;;;###autoload | |
55 (defcustom latex-inputenc-coding-alist | |
56 '(("ansinew" . windows-1252) ; MS Windows ANSI encoding, extension of Latin-1 | |
57 ("applemac" . mac-roman) | |
58 ("ascii" . us-ascii) | |
59 ("cp1250" . windows-1250) ; MS Windows encoding, codepage 1250 | |
60 ("cp1252" . windows-1252) ; synonym of ansinew | |
61 ("cp1257" . cp1257) | |
62 ("cp437de" . cp437) ; IBM code page 437 (German version): 225 is \ss | |
63 ("cp437" . cp437) ; IBM code page 437: 225 is \beta | |
64 ("cp850" . cp850) ; IBM code page 850 | |
65 ("cp852" . cp852) ; IBM code page 852 | |
66 ;; ("cp858" . undecided) ; IBM code page 850 but with a euro symbol | |
67 ("cp865" . cp865) ; IBM code page 865 | |
68 ;; The DECMultinational charaterset used by the OpenVMS system | |
69 ;; ("decmulti" . undecided) | |
70 ("latin1" . iso-8859-1) | |
71 ("latin2" . iso-8859-2) | |
72 ("latin3" . iso-8859-3) | |
73 ("latin4" . iso-8859-4) | |
74 ("latin5" . iso-8859-5) | |
75 ("latin9" . iso-8859-15) | |
76 ;; ("latin10" . undecided) | |
77 ;; ("macce" . undecided) ; Apple Central European | |
78 ("next" . next) ; The Next encoding | |
79 ("utf8" . utf-8) | |
80 ("utf8x" . utf-8)) ; used by the Unicode LaTeX package | |
81 "Mapping from encoding names used by LaTeX's \"inputenc.sty\" to Emacs coding systems. | |
82 Used by the function `latexenc-find-file-coding-system'." | |
83 :group 'files | |
84 :group 'mule | |
85 :type '(alist :key-type (string :tag "LaTeX input encoding") | |
86 :value-type (coding-system :tag "Coding system"))) | |
87 | |
88 ;;;###autoload | |
89 (defun latexenc-inputenc-to-coding-system (inputenc) | |
90 "Return the corresponding coding-system for the specified input encoding. | |
91 Return nil if no matching coding system can be found." | |
92 (cdr (assoc inputenc latex-inputenc-coding-alist))) | |
93 | |
94 ;;;###autoload | |
95 (defun latexenc-coding-system-to-inputenc (cs) | |
96 "Return the corresponding input encoding for the specified coding system. | |
97 Return nil if no matching input encoding can be found." | |
98 (let (result) | |
99 (catch 'result | |
100 (dolist (elem latex-inputenc-coding-alist result) | |
101 (let ((elem-cs (cdr elem))) | |
102 (when (and (coding-system-p elem-cs) | |
103 (coding-system-p cs) | |
104 (eq (coding-system-base cs) (coding-system-base elem-cs))) | |
105 (setq result (car elem)) | |
106 (throw 'result result))))))) | |
107 | |
108 (defvar latexenc-dont-use-TeX-master-flag nil | |
109 "Non-nil means don't follow TeX-master to find the coding system.") | |
110 | |
111 (defvar latexenc-dont-use-tex-guess-main-file-flag nil | |
112 "Non-nil means don't use tex-guessmain-file to find the coding system.") | |
113 | |
114 ;;;###autoload | |
115 (defun latexenc-find-file-coding-system (arg-list) | |
116 "Determine the coding system of a LaTeX file if it uses \"inputenc.sty\". | |
117 The mapping from LaTeX's \"inputenc.sty\" encoding names to Emacs | |
118 coding system names is determined from `latex-inputenc-coding-alist'." | |
119 (if (eq (car arg-list) 'insert-file-contents) | |
120 (save-excursion | |
121 ;; try to find the coding system in this file | |
122 (goto-char (point-min)) | |
123 (if (or | |
61958
935929fcdb78
(latexenc-find-file-coding-system): Fix regular expressions.
Lute Kamstra <lute@gnu.org>
parents:
61920
diff
changeset
|
124 (re-search-forward "^[^%\n]*\\\\inputencoding{\\(.*\\)}" nil t) |
935929fcdb78
(latexenc-find-file-coding-system): Fix regular expressions.
Lute Kamstra <lute@gnu.org>
parents:
61920
diff
changeset
|
125 (re-search-forward "^[^%\n]*\\\\usepackage\\[\\(.*\\)\\]{inputenc}" nil t)) |
61909 | 126 (let* ((match (match-string 1)) |
127 (sym (intern match))) | |
128 (when (latexenc-inputenc-to-coding-system match) | |
129 (setq sym (latexenc-inputenc-to-coding-system match)) | |
130 (when (coding-system-p sym) | |
131 sym | |
132 (if (and (require 'code-pages nil t) (coding-system-p sym)) | |
133 sym | |
134 'undecided)))) | |
135 ;; else try to find it in the master/main file | |
136 (let (latexenc-main-file) | |
137 ;; is there a TeX-master or tex-main-file in the local variable section | |
138 (unless latexenc-dont-use-TeX-master-flag | |
139 (goto-char (point-max)) | |
140 (when (re-search-backward "^%+ *\\(TeX-master\\|tex-main-file\\): *\"\\(.+\\)\"" nil t) | |
141 (let ((file (concat (file-name-directory (nth 1 arg-list)) (match-string 2)))) | |
142 (if (file-exists-p file) | |
143 (setq latexenc-main-file file) | |
144 (if (boundp 'TeX-default-extension) | |
145 (when (file-exists-p (concat file "." TeX-default-extension)) | |
146 (setq latexenc-main-file (concat file "." TeX-default-extension))) | |
147 (dolist (ext '("drv" "dtx" "ltx" "tex")) | |
148 (if (file-exists-p (concat file "." ext)) | |
149 (setq latexenc-main-file (concat file "." ext))))))))) | |
150 ;; try tex-modes tex-guess-main-file | |
151 (when (and (not latexenc-dont-use-tex-guess-main-file-flag) | |
152 (not latexenc-main-file)) | |
153 (when (fboundp 'tex-guess-main-file) | |
154 (let ((tex-start-of-header "\\\\document\\(style\\|class\\)") | |
155 (default-directory (file-name-directory (nth 1 arg-list)))) | |
156 (setq latexenc-main-file (tex-guess-main-file))))) | |
157 ;; if we found a master/main file get the coding system from it | |
158 (if (and latexenc-main-file | |
159 (file-readable-p latexenc-main-file)) | |
160 (let* ((latexenc-dont-use-tex-guess-main-file-flag t) | |
161 (latexenc-dont-use-TeX-master-flag t) | |
162 (latexenc-main-buffer (find-file-noselect latexenc-main-file t))) | |
163 (or (buffer-local-value 'coding-system-for-write latexenc-main-buffer) | |
164 (buffer-local-value 'buffer-file-coding-system latexenc-main-buffer))) | |
165 'undecided)))) | |
166 'undecided)) | |
167 | |
168 (provide 'latexenc) | |
169 | |
61920 | 170 ;; arch-tag: f971bc3e-1fec-4609-8f2f-73dd41ab22e1 |
61909 | 171 ;;; latexenc.el ends here |