# HG changeset patch # User Glenn Morris # Date 1189988652 0 # Node ID fb155376791a5c5022b4ddb12f884a058b680e73 # Parent b52ff2b36d6de6d5e892806d13b6a6dd8bd47479 (tex-region): Simplify previous change, handling the case where the region is not in `tex-main-file'. (tex-region-1): Delete. (tex-region-header): New function, doing the header part of the old tex-region-1. diff -r b52ff2b36d6d -r fb155376791a lisp/textmodes/tex-mode.el --- a/lisp/textmodes/tex-mode.el Mon Sep 17 00:23:55 2007 +0000 +++ b/lisp/textmodes/tex-mode.el Mon Sep 17 00:24:12 2007 +0000 @@ -2126,39 +2126,29 @@ (tex-out-file (expand-file-name (concat tex-zap-file ".tex") zap-directory)) (main-file (expand-file-name (tex-main-file))) - (texbuf (current-buffer)) - ;; Variables local to texbuf that are needed by t-r-1. - (hstart tex-start-of-header) - (hend tex-end-of-header) - (first tex-first-line-header-regexp) - (trailer tex-trailer) - size) + (ismain (string-equal main-file (buffer-file-name))) + already-output) ;; Don't delete temp files if we do the same buffer twice in a row. (or (eq (current-buffer) tex-last-buffer-texed) (tex-delete-last-temp-files t)) - (if (string-equal main-file (buffer-file-name)) - (tex-region-1 zap-directory tex-out-file beg end) - ; If this is not the main file, we need to first make a merged - ; buffer with the contents of the main file and this file. - (with-temp-buffer - ;; This is so we get prompted about any changes on disk. - (insert (with-current-buffer (find-file-noselect main-file) - (save-restriction - (widen) - (buffer-string)))) - ;; Get the size of the text inserted before the specified region. - (setq size (- (point-max) (point-min)) - beg (+ beg size) - end (+ end size)) - (insert (with-current-buffer texbuf - (save-restriction - (widen) - (buffer-string)))) - (set (make-local-variable 'tex-start-of-header) hstart) - (set (make-local-variable 'tex-end-of-header) hend) - (set (make-local-variable 'tex-first-line-header-regexp) first) - (set (make-local-variable 'tex-trailer) trailer) - (tex-region-1 zap-directory tex-out-file beg end))) + (let ((default-directory zap-directory)) ; why? + ;; We assume the header is fully contained in tex-main-file. + ;; We use f-f-ns so we get prompted about any changes on disk. + (with-current-buffer (find-file-noselect main-file) + (setq already-output (tex-region-header tex-out-file + (and ismain beg)))) + ;; Write out the specified region (but don't repeat anything + ;; already written in the header). + (write-region (if ismain + (max beg already-output) + beg) + end tex-out-file (not (zerop already-output))) + ;; Write the trailer, if any. + ;; Precede it with a newline to make sure it + ;; is not hidden in a comment. + (if tex-trailer + (write-region (concat "\n" tex-trailer) nil + tex-out-file t))) ;; Record the file name to be deleted afterward. (setq tex-last-temp-file tex-out-file) ;; Use a relative file name here because (1) the proper dir @@ -2167,55 +2157,51 @@ (tex-start-tex tex-command (concat tex-zap-file ".tex") zap-directory) (setq tex-print-file tex-out-file))) -(defun tex-region-1 (zap-directory tex-out-file beg end) - "Write the region BEG END of the current buffer to TEX-OUT-FILE. -The region is surrounded by a header and trailer, if they are found." - (save-excursion - (save-restriction - (widen) - (goto-char (point-min)) - (forward-line 100) - (let ((search-end (point)) - (default-directory zap-directory) ; why? - (already-output 0)) - (goto-char (point-min)) - - ;; Maybe copy first line, such as `\input texinfo', to temp file. - (and tex-first-line-header-regexp - (looking-at tex-first-line-header-regexp) - (write-region (point) - (progn (forward-line 1) - (setq already-output (point))) - tex-out-file nil nil)) +(defun tex-region-header (file &optional beg) + "If there is a TeX header in the current buffer, write it to FILE. +Return point at the end of the region so written, or zero. If +the optional buffer position BEG is specified, then the region +written out starts at BEG, if this lies before the start of the header. - ;; Write out the header, if there is one, - ;; and any of the specified region which extends before it. - ;; But don't repeat anything already written. - (if (re-search-forward tex-start-of-header search-end t) - (let (hbeg) - (beginning-of-line) - (setq hbeg (point)) ;mark beginning of header - (if (re-search-forward tex-end-of-header nil t) - (let (hend) - (forward-line 1) - (setq hend (point)) ;mark end of header - (write-region (max (min hbeg beg) already-output) - hend - tex-out-file - (not (zerop already-output)) nil) - (setq already-output hend))))) - - ;; Write out the specified region - ;; (but don't repeat anything already written). - (write-region (max beg already-output) end - tex-out-file - (not (zerop already-output)) nil)) - ;; Write the trailer, if any. - ;; Precede it with a newline to make sure it - ;; is not hidden in a comment. - (if tex-trailer - (write-region (concat "\n" tex-trailer) nil - tex-out-file t nil))))) +If the first line matches `tex-first-line-header-regexp', it is +also written out. The variables `tex-start-of-header' and +`tex-end-of-header' are used to locate the header. Note that the +start of the header is required to be within the first 100 lines." + (save-excursion + (save-restriction + (widen) + (goto-char (point-min)) + (let ((search-end (save-excursion + (forward-line 100) + (point))) + (already-output 0) + hbeg hend) + ;; Maybe copy first line, such as `\input texinfo', to temp file. + (and tex-first-line-header-regexp + (looking-at tex-first-line-header-regexp) + (write-region (point) + (progn (forward-line 1) + (setq already-output (point))) + file)) + ;; Write out the header, if there is one, and any of the + ;; specified region which extends before it. But don't repeat + ;; anything already written. + (and tex-start-of-header + (re-search-forward tex-start-of-header search-end t) + (progn + (beginning-of-line) + (setq hbeg (point)) ; mark beginning of header + (when (re-search-forward tex-end-of-header nil t) + (forward-line 1) + (setq hend (point)) ; mark end of header + (write-region + (max (if beg + (min hbeg beg) + hbeg) + already-output) + hend file (not (zerop already-output))) + (setq already-output hend)))) + already-output)))) (defun tex-buffer () "Run TeX on current buffer. See \\[tex-region] for more information.