From 17cd54a1ad7d7e7617d2c5df2b53d812254cfd51 Mon Sep 17 00:00:00 2001 From: Stevie Strickland Date: Wed, 2 Jul 2008 16:57:43 +0000 Subject: [PATCH] * latex can take in tex commands (including '\nonstopmode', which is useful), so do some... very bare-bones parsing of such so that we don't error if \nonstopmode + \input{foo} is used. * Have pdf-latex return a non-zero code to the shell if it fails instead of always returning 0. svn: r10559 --- collects/slatex/pdf-slatex-launcher.ss | 18 ++++++++++++----- collects/slatex/slatex-launcher.ss | 12 ++++++++---- collects/slatex/slatex-wrapper.ss | 27 ++++++++++++++++++-------- 3 files changed, 40 insertions(+), 17 deletions(-) diff --git a/collects/slatex/pdf-slatex-launcher.ss b/collects/slatex/pdf-slatex-launcher.ss index fc5bba43ac..78d90c7d47 100644 --- a/collects/slatex/pdf-slatex-launcher.ss +++ b/collects/slatex/pdf-slatex-launcher.ss @@ -10,9 +10,17 @@ ;; set up drag and drop (error 'slatex "pdf-slatex not supported under Mac OS Classic")] [(windows unix macosx) - (when (eq? (vector) argv) - (error 'slatex "expected a file on the command line~n")) - (parameterize ([error-escape-handler exit]) - (pdf-slatex (vector-ref argv 0))) - (exit)])) + (when (equal? (vector) argv) + (fprintf (current-error-port) "pdf-slatex: expected a file on the command line\n") + (exit 1)) + (let-values ([(nonstop? file) (if (string=? "\\nonstopmode" (vector-ref argv 0)) + (values #t (vector-ref argv 1)) + (values #f (vector-ref argv 0)))]) + (let ([result + (parameterize ([error-escape-handler exit] + [nonstop-mode? nonstop?]) + (pdf-slatex file))]) + (if result + (exit) + (exit 1))))])) diff --git a/collects/slatex/slatex-launcher.ss b/collects/slatex/slatex-launcher.ss index c901719a83..e97598b5b0 100644 --- a/collects/slatex/slatex-launcher.ss +++ b/collects/slatex/slatex-launcher.ss @@ -12,12 +12,16 @@ (for-each slatex (vector->list argv))] [(windows unix macosx) - (when (eq? (vector) argv) + (when (equal? (vector) argv) (fprintf (current-error-port) "slatex: expected a file on the command line\n") (exit 1)) + (let-values ([(nonstop? file) (if (string=? "\\nonstopmode" (vector-ref argv 0)) + (values #t (vector-ref argv 1)) + (values #f (vector-ref argv 0)))]) (let ([result - (parameterize ([error-escape-handler exit]) - (slatex (vector-ref argv 0)))]) + (parameterize ([error-escape-handler exit] + [nonstop-mode? nonstop?]) + (slatex file))]) (if result (exit) - (exit 1)))])) + (exit 1))))])) diff --git a/collects/slatex/slatex-wrapper.ss b/collects/slatex/slatex-wrapper.ss index a484989606..5784c8c2b9 100644 --- a/collects/slatex/slatex-wrapper.ss +++ b/collects/slatex/slatex-wrapper.ss @@ -1,33 +1,44 @@ -(module slatex-wrapper mzscheme +(module slatex-wrapper scheme/base (require mzlib/file mzlib/process mzlib/sendevent "slatex.ss") (provide slatex latex pdf-slatex pdf-latex slatex/no-latex - filename->latex-filename) - + filename->latex-filename nonstop-mode?) + (define (add-suffix p s) (path->string (bytes->path (bytes-append (path->bytes (if (string? p) (string->path p) p)) s)))) + (define (strip-input input-file) + (cond + [(regexp-match #rx"^\\\\input{(.*)}$" input-file) => cadr] + [else input-file])) + (define (filename->latex-filename input-file) - (let ([norm (normalize-path input-file)]) + (let* ([filename (strip-input input-file)] + [norm (normalize-path filename)]) (cond - [(file-exists? norm) input-file] + [(file-exists? norm) filename] [(file-exists? (add-suffix norm #".tex")) - (add-suffix input-file #".tex")] + (add-suffix filename #".tex")] [else - (error 'filename->latex-filename "~e does not exist" input-file)]))) + (error 'filename->latex-filename "~e does not exist" filename)]))) + + (define nonstop-mode? + (make-parameter #f)) (define (exec-latex exe file) (let ([latex-path (find-executable-path exe #f)]) (unless latex-path (error 'latex "could not find latex binary: ~e" exe)) - (system* latex-path file))) + (if (nonstop-mode?) + (system* latex-path "\\nonstopmode" (string-append "\\input{" file "}")) + (system* latex-path file)))) ;; latex, pdf-latex : string -> boolean ;; boolean result indicates success