Sebastian Walz 860d31cee1
Tohu vaBohu
2023-04-21 00:22:52 +02:00

155 lines
6.0 KiB
Nix

{ bibliography, chemistry, core, document, glossaries,... } @ libs:
let
inherit(core) debug indentation library list path string;
libs'
= libs
// {
formatAuthor
= author:
"${author.forename} ${author.surname}";
};
renderExtra = library.import ./extra.nix libs';
renderPrelude = library.import ./prelude.nix libs';
renderSlides = library.import ./slides.nix libs';
renderTitle = library.import ./title.nix libs';
in
{ authors, configuration, content, date, dependencies, name, place, resources, disputation, ... } @ document:
let
style = (library.import ./styles libs').${disputation.style};
document' = document // { inherit style; };
toTex = libs.document.toTex { inherit configuration resources; };
packages
= [
"logging"
"dependencies"
"chemistry/chem"
"chemistry/elements"
"bibliography/citation"
"floats/floats"
"geometry"
"glossaries/glossaries"
"links"
"text/text"
"utils"
];
acronyms = glossaries.acronyms.toLua { inherit configuration resources; };
references = bibliography.toBibTeX { inherit configuration resources; } resources.references;
substances = chemistry.substances.toLua { inherit configuration resources; } resources.substances;
prelude
= {
acronyms = acronyms.dst;
assets = "assets/";
packages = list.map (name: "\\input{\\source/source/${name}.tex}") packages;
references = references.dst;
source
= {
lua = "source/lua/";
tex = "source/";
};
substances = substances.dst;
};
content'
= indentation { initial = ""; tab = " "; }
(
[]
++ ( renderPrelude document' prelude )
++ [ "\\begin{document}" indentation.more ]
++ ( renderTitle document' )
++ ( renderSlides document' ( toTex content.slides or null ) )
++ ( renderExtra document' ( toTex content.extra or null ) )
++ [ "\\directlua{commonFinal()}" ] # ToDo: Remove!
++ [ indentation.less "\\end{document}" ]
);
optimiser
= if configuration.optimise or false
then
''
# Optimise and linearise
# This removes tooltips, sorry
mv "${name}.pdf" "${name}-raw.pdf"
gs \
-dBATCH \
-dColorImageResolution=288 \
-dCompatibilityLevel=1.7 \
-dDEBUG \
-dDetectDuplicateImages \
-dDownsampleColorImages=true \
-dDownsampleGrayImages=true \
-dDownsampleMonoImages=true \
-dFastWebView \
-dGrayImageResolution=288 \
-dMonoImageResolution=288 \
-dNOPAUSE \
-dPDFSETTINGS=/ebook \
-dPrinted=false \
-sDEVICE=pdfwrite \
-sOutputFile="${name}.pdf" \
"${name}-raw.pdf" \
> "${name}.gslog" 2>&1
''
else
"";
compile
= path.toFile "compile-${name}.sh"
''
#!/usr/bin/env bash
newHash="false"
oldHash="true"
out="$1"
counter=""
while [[ "$newHash" != "$oldHash" && "$counter" != "${configuration.foo or "+++++"}" ]]
do
if lualatex \
--interaction=nonstopmode \
--halt-on-error \
--output-format=pdf \
"\def\source{$out}\def\build{.}\input{$out/${name}.tex}" #2> /dev/null > /dev/null
then
oldHash="$newHash"
newHash="$(md5sum "${name}.pdf")"
echo "$newHash"
mv "${name}.log" "$out/${name}.log"
mv "${name}.llg" "$out/${name}.llg"
biber "${name}"
counter="+$counter"
else
exit 1
fi
done
${optimiser}
# move the generated and processed document to the final-directory
mv "${name}.pdf" "$out/${name}.pdf"
exit 0
'';
texFile = path.toFile "${name}.tex" content';
in
document'
// {
content = content';
dependencies
= dependencies
++ [
acronyms
references
substances
{
src = texFile;
dst = "${name}.tex";
}
{
src = { store = compile; executable = true; };
dst = "compile-${name}.sh";
}
];
}