changeset 78801:c72d88d40ef8

(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.
author Glenn Morris <rgm@gnu.org>
date Sun, 16 Sep 2007 02:01:51 +0000
parents df33036a8f3f
children 79a04b97da0a
files lisp/textmodes/tex-mode.el
diffstat 1 files changed, 82 insertions(+), 48 deletions(-) [+]
line wrap: on
line diff
--- 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.