New script to compile Markdown manuscript
parent
205c8a8afe
commit
d587da571a
@ -0,0 +1,125 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# GPL3 2023 solarchemist
|
||||||
|
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
usage() {
|
||||||
|
cat <<EOF
|
||||||
|
Usage: $(basename "${BASH_SOURCE[0]}") <flags>
|
||||||
|
|
||||||
|
Compiles Markdown manuscript and SI to PDF, and optionally converts to HTML,
|
||||||
|
ODT, or DOCX.
|
||||||
|
|
||||||
|
Available flags:
|
||||||
|
+ --help --> display this usage guide
|
||||||
|
+ --convert-all --> convert to HTML, ODT, or other formats
|
||||||
|
+ --convert-html --> convert to HTML
|
||||||
|
EOF
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
msg() {
|
||||||
|
echo >&2 -e "${1-}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Examples:
|
||||||
|
# die "some message"
|
||||||
|
# die "some message and wait 6 seconds before exiting" 6
|
||||||
|
# die "some message and exit immediately" 0
|
||||||
|
die() {
|
||||||
|
local msg=$1
|
||||||
|
msg "$msg"
|
||||||
|
# short delay to aid reading last message in case terminal closes on exit
|
||||||
|
# if $2 was provided, set it as delay
|
||||||
|
# if $2 is unset or null, use a 3 second delay
|
||||||
|
simpledelay.sh ${2:-3}
|
||||||
|
exit 0
|
||||||
|
}
|
||||||
|
|
||||||
|
parse_params() {
|
||||||
|
while :; do
|
||||||
|
case "${1-}" in
|
||||||
|
-h | --help) usage ;;
|
||||||
|
-v | --verbose) set -x ;;
|
||||||
|
--convert-all) convert_formats=true ;;
|
||||||
|
--convert-html) convert_html=true ;;
|
||||||
|
-?*) die "Unknown option: $1" ;;
|
||||||
|
*) break ;;
|
||||||
|
esac
|
||||||
|
shift
|
||||||
|
done
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
convert_formats=false
|
||||||
|
convert_html=false
|
||||||
|
parse_params "$@"
|
||||||
|
|
||||||
|
|
||||||
|
# note the colons (same function as in $PATH), they are important
|
||||||
|
export TEXINPUTS=.:${PWD}/templates/:
|
||||||
|
|
||||||
|
# these are indexed bash arrays
|
||||||
|
# https://www.cyberciti.biz/faq/bash-for-loop-array/
|
||||||
|
declare -a MANUSCRIPT_SOURCES=("paper" "si")
|
||||||
|
declare -a MANUSCRIPT_TEMPLATES=("templates/wiley.latex" "templates/wiley-si.latex")
|
||||||
|
# these are just strings
|
||||||
|
BIBLIOGRAPHIES="--bibliography ./refmngr/zotero.bib --bibliography ./references.bib"
|
||||||
|
PANDOC=pandoc
|
||||||
|
LATEXMK=latexmk
|
||||||
|
|
||||||
|
bibtex_zotero="/media/bay/taha/chepec/literature/_refmngr/_bibrep/library.bib"
|
||||||
|
if [ -f "$bibtex_zotero" ]; then
|
||||||
|
msg "Updating the local copy of Zotero library.bib"
|
||||||
|
cp $bibtex_zotero ./refmngr/zotero.bib
|
||||||
|
fi
|
||||||
|
|
||||||
|
# for some reason, *.aux file is messing up the subsequent run (but not the first run):
|
||||||
|
# /paper.aux:224: Undefined control sequence. l.224 \BibFileName[0]{paper.html}
|
||||||
|
rm -f *.aux
|
||||||
|
|
||||||
|
|
||||||
|
# note the exclamation mark in the for loop variable, makes it the loop index
|
||||||
|
# https://stackoverflow.com/a/51794732/1198249
|
||||||
|
for M in "${!MANUSCRIPT_SOURCES[@]}"; do
|
||||||
|
# manuscript value in current loop
|
||||||
|
manuscript="${MANUSCRIPT_SOURCES[M]}"
|
||||||
|
# template value in current loop
|
||||||
|
template="${MANUSCRIPT_TEMPLATES[M]}"
|
||||||
|
|
||||||
|
# The --biblatex option is not for use with the --citeproc option or with PDF output
|
||||||
|
# https://pandoc.org/MANUAL.html#citation-rendering
|
||||||
|
msg "pandoc $manuscript.md to TeX"
|
||||||
|
# https://unix.stackexchange.com/questions/278502/accessing-array-index-variable-from-bash-shell-script-loop
|
||||||
|
$PANDOC --standalone --biblatex $manuscript.md -o $manuscript.tex --template $template $BIBLIOGRAPHIES
|
||||||
|
|
||||||
|
msg "latexmk $manuscript.tex to PDF"
|
||||||
|
$LATEXMK -bibtex -pdf $manuscript
|
||||||
|
|
||||||
|
if [[ $convert_formats == "true" || $convert_html == "true" ]]; then
|
||||||
|
# TeX to HTML
|
||||||
|
# successfully produces HTML but after lots of error-like warnings and non-zero exit
|
||||||
|
msg "Converting $manuscript.tex to HTML"
|
||||||
|
# this command creates a HTML file as expected, but returns a non-zero exit code
|
||||||
|
# which causes this script to exit immediately afterwards. Circumvented by "|| true"
|
||||||
|
# --output-dir works, but also produces all the auxiliary files in the root (very weird)
|
||||||
|
make4ht --format html5 $manuscript.tex || true
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ $convert_formats == "true" ]]; then
|
||||||
|
# ODT is not too bad, better than html -> docx using pandoc
|
||||||
|
# pandoc cannot find figures or images, paths must be messed up...
|
||||||
|
msg "Converting $manuscript.html to ODT"
|
||||||
|
pandoc -s $manuscript.html -o $manuscript.odt
|
||||||
|
msg "Converting $manuscript.html to DOCX"
|
||||||
|
pandoc -s $manuscript.html -o $manuscript.docx
|
||||||
|
# to also convert to to DOC, consider abiword (works but produces broken equations and tables)
|
||||||
|
# https://stackoverflow.com/a/8384078/1198249
|
||||||
|
# if you want this, please run it on a workstation, not luxor
|
||||||
|
# (abiword is installed on workstations)
|
||||||
|
# abiword --to=doc $manuscript.odt
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
|
||||||
|
exit 0
|
Loading…
Reference in New Issue