Function: latexenc-find-file-coding-system

latexenc-find-file-coding-system is an autoloaded and byte-compiled function defined in latexenc.el.gz.

Signature

(latexenc-find-file-coding-system ARG-LIST)

Documentation

Determine the coding system of a LaTeX file if it uses "inputenc.sty".

The mapping from LaTeX's "inputenc.sty" encoding names to Emacs coding system names is determined from latex-inputenc-coding-alist.

Source Code

;; Defined in /usr/src/emacs/lisp/international/latexenc.el.gz
;;;###autoload
(defun latexenc-find-file-coding-system (arg-list)
  "Determine the coding system of a LaTeX file if it uses \"inputenc.sty\".
The mapping from LaTeX's \"inputenc.sty\" encoding names to Emacs
coding system names is determined from `latex-inputenc-coding-alist'."
  (if (eq (car arg-list) 'insert-file-contents)
      (save-excursion
        ;; try to find the coding system in this file
        (goto-char (point-min))
	(if (catch 'cs
	      (let ((case-fold-search nil))
		(while (search-forward "inputenc" nil t)
		  (goto-char (match-beginning 0))
		  (beginning-of-line)
		  (if (or (looking-at "[^%\n]*\\\\usepackage\\[\\([^]]*\\)\\]{\\([^}]*,\\)?inputenc\\(,[^}]*\\)?}")
			  (looking-at "[^%\n]*\\\\inputencoding{\\([^}]*\\)}"))
		      (throw 'cs t)
		    (goto-char (match-end 0))))))
	    (let* ((match (match-string 1))
		   (sym (or (latexenc-inputenc-to-coding-system match)
                            (intern match))))
	      (cond
               ((coding-system-p sym) sym)
               ((and (require 'code-pages nil t) (coding-system-p sym)) sym)
               (t 'undecided)))
          ;; else try to find it in the master/main file

	  ;; Fixme: If the current file is in an archive (e.g. tar,
	  ;; zip), we should find the master file in that archive.
	  ;; But, that is not yet implemented.   -- K.Handa
          (let ((default-directory (if (stringp (nth 1 arg-list))
				       (file-name-directory (nth 1 arg-list))
				     default-directory))
		latexenc-main-file)
            ;; Is there a TeX-master or tex-main-file in the local
            ;; variables section or is it globally set to a constant
            ;; string?
            (unless latexenc-dont-use-TeX-master-flag
              (goto-char (point-max))
	      (search-backward "\n\^L" (max (- (point-max) 3000) (point-min))
                               'move)
	      (re-search-forward "^%+ *Local Variables:" nil t)
              (let ((file (if (re-search-forward
                               "^%+ *\\(TeX-master\\|tex-main-file\\): *\"\\(.+\\)\""
                               nil t)
                              (match-string 2)
                            (or (and (bound-and-true-p TeX-master)
                                     (stringp TeX-master)
                                     TeX-master)
                                (bound-and-true-p tex-main-file)))))
                ;; Decode the main file name, assuming it's in UTF-8.
                (if (stringp file)
                    (setq file (decode-coding-string file 'utf-8)))
                (dolist (ext `("" ,(if (boundp 'TeX-default-extension)
                                       (concat "." TeX-default-extension)
                                     "")
                               ".tex" ".ltx" ".dtx" ".drv"))
                  (if (and (null latexenc-main-file) ;Stop at first.
                           (file-exists-p (concat file ext)))
                      (setq latexenc-main-file (concat file ext))))))
            ;; try tex-modes tex-guess-main-file
            (when (and (not latexenc-dont-use-tex-guess-main-file-flag)
                       (not latexenc-main-file))
              ;; Use a separate `when' so the byte-compiler sees the fboundp.
              (when (fboundp 'tex-guess-main-file)
                (let ((tex-start-of-header "\\\\document\\(style\\|class\\)"))
                  (setq latexenc-main-file (tex-guess-main-file)))))
            ;; if we found a master/main file get the coding system from it
            (if (and latexenc-main-file
                     (file-regular-p latexenc-main-file)
                     (file-readable-p latexenc-main-file))
                (let* ((latexenc-dont-use-tex-guess-main-file-flag t)
                       (latexenc-dont-use-TeX-master-flag t)
                       (latexenc-main-buffer
                        (find-file-noselect latexenc-main-file t)))
                  (coding-system-base   ;Disregard the EOL part of the CS.
                   (with-current-buffer latexenc-main-buffer
                     (or coding-system-for-write buffer-file-coding-system
			 'undecided))))
              'undecided))))
    'undecided))