[Tex/LaTex] Possible to have a shell script containing the whole LaTeX document

scripts

I've seen some examples where shell scripts are incorporated into LaTeX documents. However, I haven't seen any example of an entire LaTeX document being incorporated into a shell script. Does anyone have an example of what this would look like? [Not just a reference to the LaTeX file, but actually include the entire document into the script — from the opening class to the document end.]

I was thinking about having the shell script contain the command line to build the LaTeX document, followed by the entire LaTeX document (incorporated directly into the script), and then a sleep command wile the document builds, and then a latexmk -c command at the end.

Best Answer

I will assume that by shell you mean a Unix shell such as bash. You may want to look at the "here document" feature of bash. The simplest you can do is

#!/bin/bash

latex <<theend
\documentclass{article}
\begin{document}
Blah blah
\end{document}
theend
echo "Done!"

however this may lead to some problems if the latex processing needs multiple passes. It will also clutter your current directory with bunch of extra files produced by latex, such as log file, .aux file, etc., which may not be what you want.

A better option is to create a temporary directory, extract the LaTeX document into it using cat and to run LaTeX with this document as input. You may want to run LaTeX several times to make sure all cross references are resolved. At the end you just copy the generated .dvi or .pdf file back to your current directory.

An example of such script is below. It uses mktemp to create a temporary directory. As far as I know, mktemp is not available on every Unix, but it should be available on every system that has GNU coreutils.

There are probably better ways how to handle pretty much every step of the process, but this should get you started.

#!/bin/bash

# Create a temporary directory
curdir=$( pwd )
tmpdir=$( mktemp -dt "latex.XXXXXXXX" )

# Set up a trap to clean up and return back when the script ends
# for some reason
clean_up () {
    cd "$curdir"
    [ -d "$tmpdir" ] && rm -rf "$tmpdir"
    exit
}
trap 'clean_up' EXIT SIGHUP SIGINT SIGQUIT SIGTERM 

# Switch to the temp. directory and extract the .tex file
cd $tmpdir
# Quoting the 'THEEND' string prevents $-expansion.
cat > myfile.tex <<'THEEND'
\documentclass{article}
\begin{document}
Blah blah \(x^2 + 1\) or $x^2 + 1$.
\end{document}
THEEND

# If the file extracts succesfully, try to run pdflatex 3 times.
# If something fails, print a warning and exit
if [[ -f 'myfile.tex' ]]
then
   for i in {1..3}
   do
      if pdflatex myfile.tex
      then
         echo "Pdflatex run $i finished."
      else
         echo "Pdflatex run $i failed."
         exit 2
      fi
   done
else
   echo "Error extracting .tex file"
   exit 1
fi

# Copy the resulting .pdf file to original directory and exit
cp myfile.pdf $curdir
exit 0