# HG changeset patch # User Glenn Morris # Date 1189908111 0 # Node ID c72d88d40ef88841c1a1f2dd95bf207e22e77264 # Parent df33036a8f3f6287b25759a5ebfdb42fda0e4253 (tex-region): Handle the case where the region is not in `tex-main-file'. Move the old code that applies to both cases... (tex-region-1): ...to this new function. diff -r df33036a8f3f -r c72d88d40ef8 lisp/textmodes/tex-mode.el --- a/lisp/textmodes/tex-mode.el Sun Sep 16 02:01:30 2007 +0000 +++ b/lisp/textmodes/tex-mode.el Sun Sep 16 02:01:51 2007 +0000 @@ -2103,57 +2103,41 @@ (let* ((zap-directory (file-name-as-directory (expand-file-name tex-directory))) (tex-out-file (expand-file-name (concat tex-zap-file ".tex") - zap-directory))) + 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) ;; 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)) - ;; Write the new temp file. - (save-excursion - (save-restriction - (widen) - (goto-char (point-min)) - (forward-line 100) - (let ((search-end (point)) - (default-directory zap-directory) - (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)) - - ;; 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 (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))) ;; 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 @@ -2162,6 +2146,56 @@ (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)) + + ;; 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))))) + (defun tex-buffer () "Run TeX on current buffer. See \\[tex-region] for more information. Does not save the buffer, so it's useful for trying experimental versions.