4

Part I:

Could someone please give me an example of how to configure AUCTeX to use the -output-directory option?

I've tried inserting -output-directory="/tmp" in a variety of ways at different locations, but it's not working -- with two hyphens, with one hyphen, with double quotes, with single quotes, without any quotes, before the %t, after the %t, right before the closing single quote, . . . .

Here is the generic latexmk code for the working directory in my init.el file:

(custom-set-variables
 '(TeX-command-list (quote ( ("LaTeX" "%`%l%(mode)%' %t" TeX-run-TeX nil (latex-mode) :help "Run LaTeX"))))
)

Part II -- Extra Credit

Then, I'd like to take one step further and copy the PDF back to the working directory with the following example. I'm on OSX with TeX Live, so -aux-directory is not supported.

Configure latexmk so that the command it uses for pdflatex does the ordinary pdflatex command and then copies the output file where you want it. You'd invoke latexmk with the -output-directory option.

An appropriate line in one of latexmk's configuration files is

$pdflatex .= ' && cp "%D" "%R.pdf"';

You could also persuade it to display a message about the copying of the output file:

$pdflatex .= ' && (cp "%D" "%R.pdf"; echo Output file copied from "%D" to "%R.pdf" in current directory)';

(N.B. The second suggestion was all supposed to be on one line.)

Then you invoke latexmk by something like the following:

latexmk -outdir=/tmp

For anyone interested in synctex with the -output-directory option on an OSX box, add -synctex=1 to the line of code proposed by T. Verron in the answer below:

;; use Skim as default pdf viewer
;; Skim's displayline is used for forward search (from .tex to .pdf)
;; option -b highlights the current line; option -g opens Skim in the background

(setq TeX-PDF-mode t)

(setq TeX-view-program-selection '((output-pdf "Skim")))

(setq TeX-view-program-list
    '(("Skim" "/Applications/Skim.app/Contents/SharedSupport/displayline -b -g %n /tmp/%o %b")))

(server-start); start emacs in server mode so that skim can talk to it

See also https://stackoverflow.com/questions/7899845/emacs-synctex-skim-how-to-correctly-set-up-syncronization-none-of-the-exi


EDIT: The following stackoverflow link contains an alternative method of using Emacs and start-process to run latexmk and copy the .pdf file back to the working directory (leaving the auxiliary files in the /tmp folder) -- if the latexmk compilation is successful, then Skim is opened (with forward sync) -- if the latexmk compilation generates errors, then the error buffer is displayed. https://stackoverflow.com/questions/18705774/if-latexmk-finishes-okay-then-show-pdf-else-display-errors

lawlist
  • 1,382
  • 1
  • 16
  • 21
  • The question is quite unclear. It has two parts, one about emacs and one about latexmk. For the emacs part, I don't see the difference between "your generic latexmk code" and the default option for latex-ing documents. Maybe somewhere else, you have some code which tells auctex to substitute %l with latexmk instead of (pdf)latex? (1/3) – T. Verron May 01 '13 at 22:51
  • Now, since you are using latexmk, the -output-directory option should be given in the config file for latexmk, instead of your init.el. See this answer for a way of doing it : http://tex.stackexchange.com/a/31253/9517 . In any case, there is good chance that I missed your point, since as I said, I don't understand what is the question. (2/3) – T. Verron May 01 '13 at 22:52
  • It almost looks like the first part is a question and the second one its answer -- except the answer doesn't really answer the question. (3/3) – T. Verron May 01 '13 at 22:52
  • The package AUCTeX for Emacs uses the difficult to use format cited in my question and that is why I'm having trouble. I can do this from the terminal and also from Sublime Text with a plugin that I wrote myself, but AUCTeX doesn't seem to support the same format as the terminal. – lawlist May 01 '13 at 22:59
  • The first component of this question regarding inserting the -output-directory=/tmp should be a question that a user of Emacs AUCTeX can answer fairly easily. The second part of the question was just in case there is a genius in the audience . . . :) I'd be happy with the first component of the question, and I'll post the second answer myself in a couple of weeks after I get the basic format under my belt. – lawlist May 01 '13 at 23:03
  • About the emacs part, I would advise to simply use a generic latexmk entry ( http://tex.stackexchange.com/questions/10561/compile-using-latexmk-in-emacs ), and let latexmk pass all relevant options to pdflatex. About the latexmk question, maybe you could clarify what is the question? Usually, the policy would be to advise you to post different questions in separate threads, but here, I have a feeling you can very well merge both questions into one, directed by your final goal (which is emulating -aux-directory with latexmk, if I understand correctly). – T. Verron May 01 '13 at 23:19
  • The joy of using Emacs with AUCTeX is something that is widely espoused all throughout the internet. I want to experience that same joy for myself. AUCTeX is using latexmk with the code cited in my question -- Running LaTeX on `file-name' with ``pdflatex --synctex=1 -interaction=nonstopmode "\input" file-name.tex'' This is pdfTeX, Version 3.1415926-2.4-1.40.13 (TeX Live 2012) - restricted \write18 enabled. . . . – lawlist May 01 '13 at 23:32
  • There seems to be a confusion... Auctex, by default, isn't using latexmk. – T. Verron May 02 '13 at 05:04
  • Thank you for pointing that out -- it may be part (or all) of the reason why the command line being used by AUCTeX is so foreign to what I'm accustomed to seeing. – lawlist May 02 '13 at 14:59
  • If this helps anyone figure out my issue, here is a link to a post where someone has already figured out how to use the output-directory option with AUCTeX. http://tex.stackexchange.com/questions/62845/auctex-detecting-modified-files-using-different-output-directory I've never p.m.'ed anyone before -- it looks like MGwynne knows how to use the -output-directory option, but the post doesn't describe how he did it. – lawlist May 02 '13 at 15:03

2 Answers2

6

If you want to use AUCTeX so desperately:

(add-hook 'LaTeX-mode-hook (lambda ()
                 (push 
                  '("Latex_outdir" "%`pdflatex --output-directory=/tmp %(mode)%' %t" 
                TeX-run-TeX nil (latex-mode doctex-mode) 
                :help "Run pdflatex with output in /tmp")
                  TeX-command-list)))

The question you linked to in your last comment is still unanswered, and will cause a serious problem with this setup: AUCTeX won't be able to locate your auxiliary files, and thus deduce the next step in the compilation step.

I suggest you use latexmk for the whole process instead:

(add-hook 'LaTeX-mode-hook (lambda ()
                 (push 
                  '("Make" "latexmk -outdir=/tmp %t" TeX-run-TeX nil t
                :help "Make pdf output using latexmk.")
                  TeX-command-list)))

Latexmk is aware of the option outdir, and will automatically search for the auxiliary files in this directory.

Either way, note the following point (from man latexmk):

Commonly, the directory specified for output files is a subdirectory of the current working directory. However, if you specify some other directory, e.g., "/tmp/foo" or "../output", be aware that this could cause problems, e.g., with makeindex or bibtex. This is because modern versions of these programs, by default, will refuse to work when they find that they are asked to write to a file in a directory that appears not to be the current working directory or one of its subdirectories. This is part of security measures by the whole TeX system that try to prevent malicious or errant TeX documents from incorrectly messing with a user's files. If for $out_dir or $aux_dir you really do need to specify an absolute pathname (e.g., "/tmp/foo") or a path (e.g., "../output") that includes a higher-level directory, then you need to disable the security measures (and assume any risks). This can be done by temporarily setting the operating system's environment variable openout_any to "a" (as in "all"), to override the default "paranoid" setting.

Another potential problem with this setting is that all your documents will share the same temporary directory, so you will need to make sure they all have different names.

For your cp step, you can use this line in your .latexmkrc:

$pdflatex .= ' && cp -v %Z/%D %D';

Note that most of this is untested, please let me know if it doesn't work.

T. Verron
  • 13,552
  • Thank you very much for taking the time to post such a detailed solution. I'll try it out late this evening after work and report back . . . – lawlist May 02 '13 at 21:34
  • Both of the hooks that are provided in this answer by T. Verron work perfectly, with the advantage being the latexmk solution and copying the .pdf back to the working directory -- eliminating the need to clean-up. I was not able to get the copy command working with the copy code in this answer. However, the copy code provided in the question does work on my OSX box. That particular code for copying the .pdf actually came from John Collins, Ph.D. (author of latexmk.pl). Thank you very much for the hooks -- your help is greatly appreciated ! – lawlist May 05 '13 at 01:05
  • I've added the synctex option to the bottom of my question for anyone who is interested. – lawlist May 05 '13 at 04:30
  • In order to assign a keyboard shortcut to build and view, it will be necessary to create a defun equivalent for the hooks. TeX-command-master is not linked to build, but rather Recent Output Buffer (i.e., whatever command was last run). I do not yet have a complete solution, but will post one when I find it . . . A variation of this seems to be working, but I need to adapt it to the jump-to-pdf also: http://tex.stackexchange.com/questions/60181/pdflatex-latexmk-synctex-adding-an-option-to-pdflatex-causes-synctex-to-fail – lawlist May 05 '13 at 05:54
  • 1
    When you press C-c C-c, you are prompted for the name of the compilation command. Entering Make here should start the latexmk script. Alternatively, you can add (add-hook 'LaTeX-mode-hook '(lambda () (setq TeX-command-default "Make"))) to your .emacs. Note that latexmk is also able to start a viewer automatically when compilation ends. – T. Verron May 05 '13 at 09:16
  • For the problem with copying, are you by any chance using windows? – T. Verron May 05 '13 at 09:17
  • Thank you for the additional hook to set the Tex-command-default -- I've added that to my .emacs file. I'm on OSX -- two computers with Snow Leopard; and one with Mountain Lion. – lawlist May 05 '13 at 15:30
2

As for the cp step, on Ubuntu 13.10 it worked for me using this line in my latexmkrc file: $pdflatex = 'xelatex %O %S && cp %D %R.pdf';.

My complete latexmkrc file goes like this:

$pdf_mode = "1";
$out_dir = "out";
$pdflatex = 'xelatex %O %S && cp %D %R.pdf';
Apteryx
  • 521
  • Does Tex Live for Linux distributions also not support the command line of -aux-directory or the $aux_dir option in the .latexmkrc, and is that the reason you are using copy? I used the copy command on OSX because those auxiliary functions are not supported (as of the year 2012). Or is it a different story when using xelatex? – lawlist Oct 18 '13 at 05:20
  • -aux-directory is indeed not implemented for any TeX Live distribution. Ubuntu 13.10 has TeX Live 2013 in its repository. – Apteryx Oct 18 '13 at 20:11