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