You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

285 lines
10 KiB
Bash

#!/bin/bash
## Process *.Rnw files
## Written May 14, 2010
## Taha Ahmed
####################################################
# For now, MAKE SURE that the argument consists of
# a complete filename, with extension, and
# in the directory of the Rnw file
####################################################
clear
echo "-----------------------------------------------------------------------"
echo "cheRTeX -- a script for processing R--Sweave/knitr--LaTeX/TikZ projects"
echo "^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^"
echo "MMXVI -- taha@chepec.se -- CHEPEC doctoral degree project"
echo "-----------------------------------------------------------------------"
## If the file .latexmkrc exists in the current directory,
## set the flag ltxmkrc=TRUE
ltxmkrc=false
echo "--- Looking for .latexmkrc"
if [ -e .latexmkrc ]; then
ltxmkrc=true
echo "+++ LaTeXMK RC file invoked"
else
echo "--- This job did not request LaTeXMK RC file"
fi
# define some commands
Rfiletype="R"
TeXfiletype="tex"
tikzfiles="*.tikz"
Rnwfiles="*.Rnw"
auxfiles="*.acn *.acr *.alg *.aux *.bbl *.bcf *.blg *.dep *.dpth *.fdb* *.figlist *.fls *.glg *.glo *.gls *.lof *.log *.lot *.out *.lox *.makefile *.map *.out *.run* *.slg *.slo *.sls *.tdo *.toc *.xdy"
# depending on number of args and their content, do different things...
if [ $# -eq 1 ]; then
# Check if the argument contains a filetype
# (assumes a complete filename was passed)
jobfilename=$1
jobfiletype=${jobfilename#*.} # File extension
jobname=${jobfilename%.*} # Filename without extension part
echo "<cheRTeX> Detected filename: " $jobname
echo "<cheRTeX> Detected extension:" $jobfiletype
# Verify that the file extension is "[Rr][Nn][Ww]"
if [[ $jobfiletype == "Rnw" || $jobfiletype == "rnw" || $jobfiletype == "RNW" ]]; then
# File extension is indeed "[Rr][Nn][Ww]"
echo "<cheRTeX> Detected *.Rnw extension"
jobfiletype="Rnw"
else
# File extension is NOT "[Rr][Nn][Ww]"
echo "<cheRTeX> This script only handles *.Rnw files"
echo "<cheRTeX> Terminating..."
exit 1
fi
# Introducing a short delay to enable on-screen reading of previous echo
simpledelay.sh 2
echo "Delay completed"
#### Special treatment for sample-matrix.Rnw
# If $jobname is sample-matrix, restart Shiny and term this script
if [[ $jobname == "sample-matrix" ]]; then
echo "<cheRTeX> -------------------------------"
echo "<cheRTeX> sample-matrix: restarting Shiny"
echo "<cheRTeX> -------------------------------"
# kill Shiny
pkill -f "shiny::runApp"
# start Shiny
bash -c "/media/bay/taha/chepec/chetex/common/bash/shiny-matrix.sh" &
# terminate this script
echo "<cheRTeX> Terminating..."
simpledelay.sh 2
exit 0
fi
## Handle knitr or pgfSweave jobs (each requires separate treatment)
## But how should we tell the difference between them?
## There is no obvious way to tell the difference (apart from reading the *.Rnw file)
## IN ALL KNITR DIRECTORIES, CREATE A FILE NAMED: .knitme
# If the file .knitme exists in the current directory,
# run knitr commands, otherwise run pgfsweave commands
echo "--- Looking for .knitme"
if [ -e .knitme ]; then
# Run knitr commands for this job
echo "<cheRTeX> -----------------------"
echo "<cheRTeX> This is a job for knitr"
echo "<cheRTeX> -----------------------"
# Knit
echo "<cheRTeX> Knitting..."
Rscript -e "library(knitr); library(methods); knit('$jobname.$jobfiletype')"
# Introduce delay to give time to read Rscript exit status
echo "<cheRTeX> -----------------------"
echo "<cheRTeX> Rscript knitr completed"
echo "<cheRTeX> -----------------------"
simpledelay.sh 2
else
# Run pgfSweave commands
echo "<cheRTeX> ---------------------------"
echo "<cheRTeX> This is a job for pgfSweave"
echo "<cheRTeX> ---------------------------"
# Tangle
echo "<cheRTeX> Tangling..."
R CMD Stangle $jobname.$jobfiletype
# Weave
echo "<cheRTeX> Weaving..."
R CMD pgfsweave --graphics-only $jobname.$jobfiletype
# Introduce delay to give time to read R CMD exit status
echo "<cheRTeX> -------------------------"
echo "<cheRTeX> R CMD pgfsweave completed"
echo "<cheRTeX> -------------------------"
simpledelay.sh 2
fi
# Run vc script if vc exists in working directory
echo "<cheRTeX> Running vc script"
if [ -f vc ]; then
./vc
fi
# Run pdflatex, bibtex, and company
if $ltxmkrc; then
echo "<cheRTeX> Calling LaTeXMK with RC file"
simpledelay.sh 2
latexmk -r .latexmkrc -pdf -bibtex $jobname
else
echo "<cheRTeX> Calling LaTeXMK"
simpledelay.sh 2
latexmk -pdf -bibtex $jobname
fi
else
# Either no arguments, or more than one argument
if [ $# -eq 0 ]; then
# Zero arguments. Present a menu of choices
echo "This is cheRTeX POST-PROCESSING" # only one choice for now
echo "<1> 'pdf-all' -- Process all .tikz files to pdf graphics"
echo "<2> 'clean-up' -- Remove all auxiliary files"
echo "<3> 'wipe-dir' -- Remove all non-essential files and subdirectories"
echo "Any other input exits the program"
read usrchoice
## Determine number of .Rnw files in current directory
#Rnwfileno=$(ls -1 $Rnwfiles | wc -l)
#echo "No of .Rnw files: $Rnwfileno"
#
## Check if number of .Rnw files larger than one
#if [ $Rnwfileno -gt 1 ]; then
# # If larger than one, ask for user input
# # Indicates more than one Rnw file in current directory.
# # This introduces a naming ambiguity.
# # Resolve by asking user for current jobname
# echo "Found $Rnwfileno .Rnw files in current directory"
# echo "Please specify the jobname"
# read jobname
# if [ -z "$jobname" ]; then
# # string is null
# echo "Specified jobname cannot be parsed. Terminating..."
# exit 1
# fi
#else
# # There is exactly one *.Rnw file is current directory
# # Fetch the jobname from the .Rnw filename by stripping off the file extension
# Rnwfilename=$(ls -1 $Rnwfiles)
# jobname=${Rnwfilename%.*}
#fi
#
#echo "Jobname set to: $jobname"
if [[ $usrchoice == "pdf-all" || $usrchoice == "1" ]]; then
echo "<1> 'pdf-all' chosen"
# This for loop ONLY USED to determine number of *.tikz files in directory
for tikzfiles in "$tikzfiles"; do tikzfilenumber=${#tikzfiles}; done
echo "cheRTeX detected $tikzfilenumber TikZ files for processing"
echo "Starting TikZ file processing..."
simpledelay.sh 2
for tikzfilename in $tikzfiles; do
# Call tikz2pdf
echo "<Executing> tikz2pdf $tikzfilename"
tikz2pdf --once $tikzfilename
done
echo "Completed TikZ file processing"
fi
if [[ $usrchoice == "clean-up" || $usrchoice == "2" ]]; then
echo "<2> 'clean-up' chosen"
rm $auxfiles
# Still, a rather crude way of cleaning up...
fi
if [[ $usrchoice == "wipe-dir" || $usrchoice == "3" ]]; then
echo "<3> 'wipe-dir' chosen"
## Remove all but non-essential files
# get the name of the current directory
currdirname=${PWD##*/}
# get a timestamp
timestamp=$(date +%s)
# create a unique tmp-dir name
tmpdirname="${timestamp}-${currdirname}"
# make a directory in chepec/tmp with the name of the current dir
mkdir /media/bay/taha/chepec/tmp/$tmpdirname
# Copy the contents of the current directory to the tmp/$currdirname directory
cp * -R /media/bay/taha/chepec/tmp/$tmpdirname
# Empty the current directory of all contents
rm * -R # note: hidden files and subdir unaffected
# Return the stuff we want to keep after wipe-dir
# (we are of course assuming that the following 4 file(type)s always exist)
# (if in fact they do not exist, use conditional statements instead (see below)
cp /media/bay/taha/chepec/tmp/$tmpdirname/*.Rnw .
cp /media/bay/taha/chepec/tmp/$tmpdirname/vc .
cp /media/bay/taha/chepec/tmp/$tmpdirname/vc.tex .
cp /media/bay/taha/chepec/tmp/$tmpdirname/vc-git.awk .
## Return stuff that may not always exist (check first...)
## The use of conditionals is mainly to avoid annoying "file does not exist" messages...
# Return *.Rproj file (removal is unnecessary and makes RStudio less useful)
Rprojfiles=`ls -1 /media/bay/taha/chepec/tmp/$tmpdirname/*.Rproj 2>/dev/null | wc -l`
if [ $Rprojfiles != 0 ]; then
cp /media/bay/taha/chepec/tmp/$tmpdirname/*.Rproj .
fi
# Return *.rda files (considering peak-data files, which "cost" a lot to create)
rdafiles=`ls -1 /media/bay/taha/chepec/tmp/$tmpdirname/*.rda 2>/dev/null | wc -l`
if [ $rdafiles != 0 ]; then
cp /media/bay/taha/chepec/tmp/$tmpdirname/*.rda .
fi
# Return *.Rmd files (R markdown source files)
Rmdfiles=`ls -1 /media/bay/taha/chepec/tmp/$tmpdirname/*.Rmd 2>/dev/null | wc -l`
if [ $Rmdfiles != 0 ]; then
cp /media/bay/taha/chepec/tmp/$tmpdirname/*.Rmd .
fi
# Return *.css files (css files) [for sample-matrix]
cssfiles=`ls -1 /media/bay/taha/chepec/tmp/$tmpdirname/*.css 2>/dev/null | wc -l`
if [ $cssfiles != 0 ]; then
cp /media/bay/taha/chepec/tmp/$tmpdirname/*.css .
fi
# Return .knitme file [empty file used to indicate knitr jobs]
knitmefile=`ls -1 /media/bay/taha/chepec/tmp/$tmpdirname/.knitme 2>/dev/null | wc -l`
if [ $knitmefile != 0 ]; then
cp /media/bay/taha/chepec/tmp/$tmpdirname/.knitme .
fi
fi
echo "Terminating..."
exit 0
fi
## Here is the wild land of more than one *.Rnw file in current directory
echo "<cheRTeX> This script can be run with one argument is process mode,"
echo "<cheRTeX> or with zero arguments in post-processing mode."
echo "<cheRTeX> Terminating..."
exit 1
fi
# Depending on whether the clock uses summer or wintertime, the date string length
# will differ by one (CEST vs CET).
# Just to be neat, we will take this into consideration when constructing the
# "job completed" block below.
cetcest=$(date +%Z)
echo "-------------------------------------"
echo "=== chertex.sh completed ==="
if [[ $cetcest == "CET" ]]; then
echo "=== $(date) ==="
else
echo "=== $(date) ==="
fi
echo "-------------------------------------"
simpledelay.sh 3
exit 0