91

I have a source file called 2011-05-27_Myfilename.tex and I'd like to create a PDF file from it called only Myfilename.pdf.

Can this be configured from within the .tex file itself?

(It seems to be possible with

pdflatex -jobname=Myfilename.tex 2011-05-27_Myfilename.tex

However, as many different files are concerned, It would be easier to have an option like output=Myfilename in the LaTeX source code.)

doncherry
  • 54,637

5 Answers5

31

I'm afraid you cannot alter the output name from within the LaTeX source: the \jobname primitive can be read but not altered. You can arrange two-file solutions which allow one LaTeX file to 'call' another, but I am not sure that will answer your problem here.

Joseph Wright
  • 259,911
  • 34
  • 706
  • 1,036
  • 14
    Just found this question and I have one more remark: obviously, you can do \def\jobname{whatever}, and if you do it early enough, it will affect the names of the .aux, .toc etc. files - but not the pdf. – mbork Jul 31 '11 at 20:40
  • 2
    Can you, please, add details to the "two-file solution"? How do I "call" another tex file from another one? – digital-Ink Oct 22 '17 at 08:22
  • 2
    For solutions to output multiple files, refer to a related answer. – Coby Viner Jun 06 '18 at 19:41
29

You can specify additional parameters (like jobname) at the very beginning of your main file (even before \documentclass):

%& -job-name=newfilenameialwayswanted

It slightly depends on your compiler but it should work.

An additional comment: If you use an IDE, this may cause troubles for file opening hotkeys (the file they will try to open will not be there), in this case, you can look for an option like "output profile" (TeXnicCenter name) - you can also change the filename this way.

So there're no totally convenient ways to change your output filename from source, but it is possible.

masu
  • 6,571
  • These parameters must be at the first line(s) of the file for them to work. In case anyone else is having problems with that. – Robin Hartmann Mar 11 '20 at 16:23
  • 1
    This should be the accepted answer. – Matthias Arras Jun 17 '20 at 02:05
  • does the % not out comment the code after? I use TexStudio and when I use % it gets immediately out commented. So I don't know how it should work – IH Pro May 08 '22 at 12:40
  • Yes, a special kind of comment. Like #!/bin/bash is a comment on top of shell scripts. – masu May 16 '22 at 20:12
  • This does not work for me (I think with TeX Live on Windows, using VS Code and a LaTeX extension there, so not sure where exactly the problem happens). – clel Jul 14 '22 at 16:37
  • @clel It could be that VSCode might be adding other things to your file at the top... check whether it works or not without VSCODE from command line... But I really don't know. Haven't used tex for ages. – masu Sep 25 '22 at 15:08
  • This doesn't seem to work for me either using PDFLaTeX 3.141592653-2.6-1.40.22 on Linux. – David Z Jan 25 '23 at 19:25
6

You can do as follows.

\documentclass[preview,border=12pt]{standalone}
\usepackage{filecontents}
\begin{filecontents*}{template.tex}
\documentclass[preview,border=12pt]{standalone}
\begin{document}
Hello World
\end{document}
\end{filecontents*}

\usepackage{pgffor,graphicx}
\foreach \outputfilename in {a,b,c}{\immediate\write18{pdflatex -jobname=\outputfilename\space template}}
\begin{document}
The files we created automatically are:

\foreach \outputfilename in {a,b,c}{\fbox{\includegraphics[scale=2]{\outputfilename}}\endgraf}
\end{document}

enter image description here

  • this didn't work for me as is. I compiled with pdflatex Any ideas? Thanks. – PatrickT Mar 15 '17 at 12:50
  • 1
    @PatrickT you need to run pdflatex with the --shell-escape flag – Ahlqvist Mar 16 '17 at 17:55
  • Got it, thanks Ahlqvist! (on texstudio, I just added this at the top of the document: % !TeX TXS-program:compile = txs:///pdflatex/[--shell-escape]). – PatrickT Mar 17 '17 at 02:29
  • beware: if you are writing the list of filenames over several lines, end each line with a % to make sure you gobble up empty spaces. In my implementation \includegraphics was looking for a .pdf (with a space before the dot) and couldn't find it... – PatrickT Mar 18 '17 at 09:43
  • Please excuse my ignorance, but my file doesn't run even when entering !TeX TXS-program:compile = txs:///pdflatex/[--shell-escape] in the first line. Error: ! LaTeX Error: Missing \begin{document}. Without the line, my error is ! LaTeX Error: Filea' not found.` – Chris Peh Apr 19 '20 at 23:35
4

Inspired by https://tex.stackexchange.com/a/5265/46718 by @ulrike-fischer , the following code do the job for me for me when compiling with the --shell-escape option:

\def\myjobname{Myfilename}

\ifx\conditionmacro\undefined
  \immediate\write18{%
    pdflatex --jobname="\myjobname"
    "\gdef\string\conditionmacro{1}\string\input\space\jobname"
  }%
  \expandafter\stop
\fi

(this may need improvements since I'm not sure I understand all subtleties)

Tobard
  • 1,189
0

Although not exactly answering the OP's question, and looking at the accepted answer that seems to indicate a possibility via a multi-file solution I wanted to provide exactly such a multi-file solution alternative of managing such issues. If one is using VimTeX, it is quite easy to create differently named pdf files as output from the compilation process workflow of the same .tex file.

Here is an example provided the author of that plugin.

Roughly, have an outer student.tex and professor.tex (with possibly differently defined variables/commands/macros thereby controlling what gets typeset how). Both of these files get to \input{main.tex} the same file -- all three files in the same folder.

Once student.tex and professor.tex are setup, there is little to no need to keep updating them. All work can now happen in main.tex.

On opening main.tex, in Vim, the plugin automatically asks the user to specify which the calling file is -- student.tex or professor.tex. On making the choice, and on issuing the equivalent of the compile command [\ll in VimTeX], compilation occurs and based on the choice made, the output is student.pdf or professor.pdf.

See example (provided by the author of the plugin) below:

enter image description here

% main.tex
\begin{document}
Hello World! \person
\end{document}

% professor.tex \documentclass{minimal} \newcommand{\person}{from professor} \input{main.tex}

% student.tex \documentclass{minimal} \newcommand{\person}{from student} \input{main.tex}

Tryer
  • 177