3

Currently I use TexStudio, with the command pdflatex -synctex=1 -interaction=nonstopmode -output-directory=./aux/ "paper".tex which works fine to compile and put all auxilary files in the aux directory.

However, I need to manually create an aux directory every time in the directory where my .tex file is placed for it to work, otherwise TexStudio will return the error:

Process started: pdflatex -synctex=1 -interaction=nonstopmode -output-directory=./aux/ "paper".tex

Process exited with error(s)

My question is, how can I make it so my aux directory is created automatically, preferable through my pdflatex command? Also, as a secondary question, can I automatically copy my created pdf from this aux directory to the current directory (the parent of aux directory)?

4
  • Can you use something else than TeXStudio for the compile process? Or do you need to use TeXStudio for the entire workflow?
    – Ole Aldric
    Feb 16, 2021 at 10:54
  • 1
    it is much better not to use output-directory. If you put the auxiliary files to a non-standard place you will have to configure every additional tool to look there and this not easy, you can find quite a lot questions from people having various problems with it. Feb 16, 2021 at 11:25
  • @OleAldric I don't think it matters if I use TexStudio or not, suppose I use the mentioned pdflatex command in a terminal if you prefer.
    – J. Schmidt
    Feb 16, 2021 at 12:33
  • on the command line, latexmk -outdir=aux -pdf filename where filename is your .tex file. This creates an aux directory and puts both auxiliary and final output file there. When you're done you can just cp aux/*.pdf ./ . Feb 16, 2021 at 14:39

2 Answers 2

1

I use .latexmkrc in my project folders, and then I compile from the command line. Here is how my latexmkrc file looks like:

This solution will create the temp and build folder if it doesn't exist and you can have these on a per project basis. (by using the file .latexmkrc in the project folder)

ensure_path('TEXINPUTS', './some/paths//'); # "//" searches recursively

$clean_ext = 'aux, fdb_latexmk, fls, out, xdv'; # files to clean
#$pdflatex = ""; # add your chain here.
$pdf_mode = [..]; # see latexmk documentation for your os 
$pdf_update_method = [..]; # see latexmk documentation for your viewer.
$pdf_previewer = 'start "some/pdf/viewer" %O %S'; # If you use the -pvc switch

sub latex_fix_aux {
  my @move_exts = ('dvi', 'fls', 'pdf', 'ps', 'synctex.gz' );
  my $auxD = '';
  my $outD = '';

  foreach (@_) {
     if ( /^-{1,2}aux-directory=(.*)$/ ) {
        $auxD = $1;
     }
     elsif ( /^-{1,2}output-directory=(.*)$/ ) {
        $outD = $1;
     }
  }

  if ( $outD eq '' ) { $outD = '.'; }
  if ( $auxD eq '' ) { $auxD = $outD; }

  my @args_act = ();
  my $set_outD = 0;
  
  foreach (@_) {
     if ( /^-{1,2}(aux|output)-directory=.*$/ ) {
        if ( ! $set_outD ) {
       push @args_act, "-output-directory=$auxD";
       $set_outD = 1;
    }
     }
     else {
        push @args_act, $_;
     }
  }
    
  my $outD1 = $outD;
  my $auxD1 = $auxD;
  foreach ( $auxD1, $outD1 ) {
     if ( ($_ ne '')  && ! m([\\/\:]$) ) {
        $_ .= '/';
     }
     while ( s[^\.\/][] ) {}
   }

  print "Running: '@args_act'\n";
  my $ret = system @args_act;
  if ($auxD ne $outD) {
     print "Move @move_exts files from '$auxD' to '$outD'\n";
     foreach my $ext (@move_exts) {
        copy "$auxD1$root_filename.$ext", "$outD1$root_filename.$ext";
        unlink "$auxD1$root_filename.$ext";
     }
  }
  return $ret;
}

$out_dir = '.build/'; # pdf and fls etc. goes here.
$aux_dir = '.temp/'; # other aux files goes here

Then I usually run latexmk in live mode like this:

latexmk -pvc -jobname=projectName

Which will start latexmk in live mode (continuous compile on save) and the files will be named projectName.pdf etc.

1

Assuming you're on a *nix environement...

If you don't want to use something like latexmk, you could just create a simple shell script, e.g., ~/bin/mypdflatex.sh, which could be as simple as:

#!/bin/bash
filename="$1"
[[ -d ./aux ]] || mkdir ./aux
pdflatex -synctex=1 -interaction=nonstopmode -output-directory=./aux/ "$filename"

Make it excutable:

chmod a+x ~/bin/mypdflatex.sh

Then in TeXStudio, under Options > Configure TeXStudio > Commands > pdfLaTeX put:

/path/to/bin/mypdflatex.sh %.tex

Something comparable could be done on Windows, most likely. (But don't ask me how.)

1
  • Nice and simple. You could maybe top it off with && mv *.pdf .. or similar, moving the compiled PDF up a directory.
    – Ingmar
    Mar 15 at 6:47

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.