]> git.eshelyaron.com Git - emacs.git/commitdiff
(tex-region): Handle the case where the region is not in
authorGlenn Morris <rgm@gnu.org>
Sun, 16 Sep 2007 02:01:51 +0000 (02:01 +0000)
committerGlenn Morris <rgm@gnu.org>
Sun, 16 Sep 2007 02:01:51 +0000 (02:01 +0000)
`tex-main-file'.  Move the old code that applies to both cases...
(tex-region-1): ...to this new function.

lisp/textmodes/tex-mode.el

index c8476b0d15cbdca4fe8f48d65fea4144af01f2e8..70b6133f544bf06bfdf0acab4266dd6142b27e7c 100644 (file)
@@ -2103,57 +2103,41 @@ The value of `tex-command' specifies the command to use to run TeX."
   (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 @@ The value of `tex-command' specifies the command to use to run TeX."
     (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.