[Top][All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: TeX-master and TeX-output-master

From: Colin Baxter
Subject: Re: TeX-master and TeX-output-master
Date: Thu, 18 Jun 2020 06:03:15 +0100
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/26.3 (gnu/linux)

Dear Tohiko,

>>>>> Tohiko Looka <> writes:

    > Hello again, I was told that I should provide a rough sketch on
    > what I am planning to do.

    > First let me discuss my current implementation for the custom
    > output directory (attached). The implementation was simplified a
    > bit since my previous email. The basic idea is to advise
    > `TeX-active-master` to return the build directory (from a custom
    > variable `TeX-output-dir`) whenever the extension is an output one
    > (defined as matching one of the outputs in
    > `*TeX-clean-*-suffixes`). If `TeX-output-dir` is nil, then
    > `TeX-active-master` is called as usual. I also define a function
    > `TeX-master-output-file` that returns the value of
    > `TeX-output-dir` of the master-file (the variable's value of
    > non-master files should be irrelevant). In the attached script, I
    > also added an example hook to set the build directory and set
    > `TeX-command-extra-options` appropriately.

    > This works most of the time, except in cases where AUCTeX uses
    > `TeX-active-master` to get the master directory. For example,
    > `TeX-active-master` is called in `TeX-clean` without an extension
    > and then `file-name-directory` is called to extract the
    > directory. In these cases, the output directory should be used
    > instead.

    > In order to implement this natively, I am planning to add the same
    > variable `TeX-output-dir` in AUCTeX. Then, I have two options:
    > 1. Add a check at the beginning of `TeX-active-master` similar to
    > the one in my advice. If the extension is an output extension,
    > return the output directory instead of the master directory. I
    > would also change calls to TeX-active-master where a directory is
    > needed so that an extension is always passed (an output extension
    > if the output directory is needed like in `TeX-clean`, or a tex
    > extension if not) 2. The second way to implement this is to simply
    > replace the calls to `TeX-active-master` in AUCTeX with calls to
    > `TeX-master-output-file` whenever the extension is an output
    > one. Also, replace calls to `TeX-active-master` in places where
    > the output directory is needed (like in TeX-clean).

    > There are a few issues that I am trying to figure out at the
    > moment: 1. The latex compiler assumes that the output directory
    > exists. I am not sure where the best place to create it is.  2. I
    > think creating an expansion variable (in `TeX-expand-list`) for
    > the output directory might be better than using
    > `TeX-command-extra-options`. This is for several reasons, most
    > importantly it seems that when I call `TeX-command` on a
    > non-master file, the local variable `TeX-command-extra-options`
    > (from the non-master file) is expanded rather than the one from
    > the master file as I would expect (As an aside, I propose that the
    > value of the master file be expanded instead).

    > Sorry for the long email, I appreciate any feedback. Especially on
    > which implementation is preferred.

    > -- Tohiko

    > ;;; tex-output.el --- description -*- lexical-binding: t; -*-

    > (defcustom TeX-output-dir nil "*The place where the output files
    > will be generated.

    > If this variable is nil, AUCTeX will assume that the output dir is
    > the directory of TeX-master.

    > It is suggested that you use the File Variables (see the info node
    > in the Emacs manual) to set this variable permanently for each
    > file."  :group 'TeX-command :group 'TeX-parse :type '(string
    > :format "%v")) (make-variable-buffer-local 'TeX-output-dir) (put
    > 'TeX-output-dir 'safe-local-variable 'stringp-or-null-p)

    > (defun TeX-master-output-file (&optional extension) "Return the
    > value of `TeX-output-dir' in the master-file, opening it if
    > necessary.  if the optional argument is non-nil it is appended as
    > an extension to the output file" (interactive) (if (eq extension
    > t) (setq extension TeX-output-extension)) (let ((file
    > (TeX-master-file t)) name) (with-current-buffer (or
    > (find-buffer-visiting file) (find-file-noselect file)) (when
    > TeX-output-dir ;; Expand file name in case the master directory is
    > different from the ;; current directory (setq name (concat
    > (expand-file-name TeX-output-dir) (TeX-master-file))))) (if name
    > (if extension (concat name "." extension) name) (TeX-master-file
    > extension))))

    > (defun TeX-clean-extensions-regexp (&optional arg) "Return a
    > regexp to match extensions that should be cleaned by TeX-clean.
    > If the optional argument ARG is non-nil then output files are
    > included" (let* ((mode-prefix (TeX-mode-prefix)) (suffixes (append
    > (symbol-value (intern (concat mode-prefix
    > "-clean-intermediate-suffixes"))) (when arg (symbol-value (intern
    > (concat mode-prefix "-clean-output-suffixes")))))) (regexp (concat
    > (mapconcat 'identity suffixes "\\|") "\\|" (regexp-quote
    > (TeX-region-file t t))))) regexp))

    > (define-advice TeX-active-master (:around (TeX-master-file-fn
    > &optional extension &rest args) TeX-active-master-adv) (if (or
    > (null extension) (equal extension t) (not (string-match-p
    > (TeX-clean-extensions-regexp t) (concat "." extension)))) (apply
    > TeX-master-file-fn (cons extension args)) (TeX-master-output-file
    > extension)))

    > ;;;;;;;;;;; Example hook (defun set-latex-build-dir () ;; Check if
    > the current file is its own master (setq TeX-output-dir "build/")
    > (make-directory TeX-output-dir t) ;; Ensure directory exists (setq
    > TeX-command-extra-options (concat TeX-command-extra-options "
    > --output-directory=\"" TeX-output-dir "\"")))

    > (add-hook 'LaTeX-mode-hook 'set-latex-build-dir)

I must say, this is very nice. I particularly like the comments in the
code --- refreshingly comprehensive and helpful in understanding
things. Option 1. above would seem the least drastic to me, and I'd
prefer it. I never use TeX-clean in order to avoid multiple+ runs each
time I compile.

All in all, I now think this will be a useful addition to auctex. Excellent.

Best wishes,


Colin Baxter
GnuPG fingerprint: 68A8 799C 0230 16E7 BF68  2A27 BBFA 2492 91F5 41C8

reply via email to

[Prev in Thread] Current Thread [Next in Thread]