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

257 lines
9.8 KiB
Nix

{ bibliography, chemistry, core, document, glossaries,... } @ libs:
let
inherit(core) indentation library list path string time;
formatAuthor
= author:
let
author' = "${author.forename} ${author.surname}";
matched = string.match "[BM][.]?[A-Za-z.]+" author.title;
in
if author.title or null != null
then
if matched != null
then
"${author'} (${author.title})"
else
"${author.title} ${author'}"
else
author';
libs'
= libs
// {
thesis
= let
cleardoublepage
= configuration:
if configuration.concise or false
then
"\\clearpage"
else
"\\cleardoublepage";
formatAuthorTableLine = author: "& ${formatAuthor author}\\\\";
thesisVersion
= version:
{
final = "Abgabe am";
draft = "Vorläufige Abgabe am";
revised = "Überarbeitet, Abgegeben am";
}.${version} or version;
in
{
inherit cleardoublepage formatAuthor formatAuthorTableLine thesisVersion;
};
};
renderAppendix = library.import ./appendix.nix libs';
renderBackMatter = library.import ./backMatter.nix libs';
renderBeginDocument = library.import ./beginDocument.nix libs';
renderFrontMatter = library.import ./frontMatter.nix libs';
renderMainMatter = library.import ./mainMatter.nix libs';
renderPrelude = library.import ./prelude.nix libs';
renderTitleMatter = library.import ./titleMatter.nix libs';
in
{ authors, configuration, content, date, dependencies, name, place, resources, thesis, ... } @ document:
let
style = (import ./styles libs').${thesis.style};
document' = document // { inherit style; };
toTex = libs.document.toTex { inherit configuration resources; };
#list.map (name: "\\input{${../tex/${name}.tex}}")
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;
};
titleMatter = toTex ( content.titleMatter or content.titlematter or null );
frontMatter = toTex ( content.frontMatter or content.frontmatter or null );
mainMatter = toTex ( content.mainMatter or content.body or null );
appendix = toTex ( content.appendix or null );
originalityDeclaration
= if thesis.originalityDeclaration or null != null
then
"resources/${path.getBaseName thesis.originalityDeclaration}"
else
null;
backMatter
= ( toTex ( content.backMatter or content.backmatter or null ) )
++ (
if configuration.concise or false
then
[ ]
else
[ "\\cleardoublepage" ]
)
++ (
if originalityDeclaration == null
then
[
"\\chapter*{Selbstständigkeitserklärung}{" indentation.more
"\\addcontentsline{toc}{chapter}{Selbstständigkeitserklärung}"
"\\markboth{Selbstständigkeitserklärung}{}"
]
++ ( style.originalityDeclaration document )
++ [ "\\par\\mbox{}\\\\${place}, den ${time.formatDate date "deu"}\\\\\\\\\\\\" ]
++ (
list.concatMap
(
{ forename, surname, ... } @ author:
[
"\\parbox[][][t]{0.5\\hsize}"
"{"
" \\begin{tabularx}{\\hsize}{@{}p{0.8\\hsize}@{}}"
" ~~\\,\\dotfill\\\\"
" ~~~${formatAuthor author} \\\\"
" \\end{tabularx}"
"}"
]
)
authors
)
++ [ indentation.less "}" ]
else
[
"\\addcontentsline{toc}{chapter}{Selbstständigkeitserklärung}"
"\\includepdf[pages={1}]{\\source/${originalityDeclaration}}"
]
);
content'
= indentation { initial = ""; tab = " "; }
(
[]
++ ( renderPrelude document' prelude )
++ [ "\\begin{document}" indentation.more ]
++ ( renderBeginDocument document' [] )
++ ( renderTitleMatter document' titleMatter )
++ ( renderFrontMatter document' frontMatter )
++ ( renderMainMatter document' mainMatter )
++ ( renderAppendix document' appendix )
++ ( renderBackMatter document' backMatter )
++ [ "\\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"
'';
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";
}
]
++ (
if originalityDeclaration != null
then
[ { src = thesis.originalityDeclaration; dst = originalityDeclaration; } ]
else
[]
);
}