\section{Introduction and usage}% ===> this file was generated automatically by noweave --- better not edit it

It is difficult to work openly with assessment material.
We do not want to publish the solutions to the assignment so that the students 
can find them and pass the assessment without actually learning the material.
On the other hand, we want to be able to publicly collaborate with other 
teachers, to improve the assignments and their solutions.
This include file provides some tools to achieve this.


\section{Implementation overview}

The structure is similar to other include files.
We want to prevent repeated inclusion, so we use a C-style technique to avoid 
that.
\nwfilename{transform.mk.nw}\nwbegincode{1}\sublabel{NW1FURYP-yOWSZ-1}\nwmargintag{{\nwtagstyle{}\subpageref{NW1FURYP-yOWSZ-1}}}\moddef{transform.mk~{\nwtagstyle{}\subpageref{NW1FURYP-yOWSZ-1}}}\endmoddef\nwstartdeflinemarkup\nwenddeflinemarkup
ifndef TRANSFORM_MK
TRANSFORM_MK=true

INCLUDE_MAKEFILES?=.
include $\{INCLUDE_MAKEFILES\}/portability.mk

\LA{}variables~{\nwtagstyle{}\subpageref{NW1FURYP-29jjeg-1}}\RA{}
\LA{}suffix rule for transformations~{\nwtagstyle{}\subpageref{NW1FURYP-4HC3xd-1}}\RA{}
\LA{}target generation for transformations~{\nwtagstyle{}\subpageref{NW1FURYP-3f8Q3H-1}}\RA{}
\LA{}suffix rules for camera-ready source~{\nwtagstyle{}\subpageref{NW1FURYP-4MnNOp-1}}\RA{}
\LA{}suffix rules for encrypted files~{\nwtagstyle{}\subpageref{NW1FURYP-OFRk8-1}}\RA{}

endif
\nwnotused{transform.mk}\nwendcode{}\nwbegindocs{2}We will now explore now these are implemented.


\section{A transformation mechanism}

We want to provide suffix rules for transforming files in different ways.
We will transform any file with a suffix in {\Tt{}TRANSFORM{\_}SRC\nwendquote} for which there is 
a corresponding target in {\Tt{}TRANSFORM{\_}DST\nwendquote}.
\nwenddocs{}\nwbegincode{3}\sublabel{NW1FURYP-29jjeg-1}\nwmargintag{{\nwtagstyle{}\subpageref{NW1FURYP-29jjeg-1}}}\moddef{variables~{\nwtagstyle{}\subpageref{NW1FURYP-29jjeg-1}}}\endmoddef\nwstartdeflinemarkup\nwusesondefline{\\{NW1FURYP-yOWSZ-1}}\nwprevnextdefs{\relax}{NW1FURYP-29jjeg-2}\nwenddeflinemarkup
TRANSFORM_SRC?=    .tex
TRANSFORM_DST?=    .transformed.tex
\nwalsodefined{\\{NW1FURYP-29jjeg-2}\\{NW1FURYP-29jjeg-3}\\{NW1FURYP-29jjeg-4}\\{NW1FURYP-29jjeg-5}}\nwused{\\{NW1FURYP-yOWSZ-1}}\nwendcode{}\nwbegindocs{4}Then we can form the following suffix rule, which covers all combinations of 
sources and destinations.
\nwenddocs{}\nwbegincode{5}\sublabel{NW1FURYP-4HC3xd-1}\nwmargintag{{\nwtagstyle{}\subpageref{NW1FURYP-4HC3xd-1}}}\moddef{suffix rule for transformations~{\nwtagstyle{}\subpageref{NW1FURYP-4HC3xd-1}}}\endmoddef\nwstartdeflinemarkup\nwusesondefline{\\{NW1FURYP-yOWSZ-1}}\nwenddeflinemarkup
\LA{}transformations~{\nwtagstyle{}\subpageref{NW1FURYP-1Bfzjx-1}}\RA{}
.SUFFIXES: $\{TRANSFORM_SRC\} $\{TRANSFORM_DST\}
$(foreach src,$\{TRANSFORM_SRC\},$(foreach dst,$\{TRANSFORM_DST\},$\{src\}$\{dst\})):
  \LA{}transformation recipe~{\nwtagstyle{}\subpageref{NW1FURYP-4XMbom-1}}\RA{}
\nwused{\\{NW1FURYP-yOWSZ-1}}\nwendcode{}\nwbegindocs{6}The {\Tt{}\LA{}transformations~{\nwtagstyle{}\subpageref{NW1FURYP-1Bfzjx-1}}\RA{}\nwendquote} will be covered below, we start with how they are 
applied.

We will now describe a function which makes it easier to apply a list of 
transformations.
The first argument is the input file, the second is a space separated list of 
transformations and the third is the output file.
\nwenddocs{}\nwbegincode{7}\sublabel{NW1FURYP-1Bfzjx-1}\nwmargintag{{\nwtagstyle{}\subpageref{NW1FURYP-1Bfzjx-1}}}\moddef{transformations~{\nwtagstyle{}\subpageref{NW1FURYP-1Bfzjx-1}}}\endmoddef\nwstartdeflinemarkup\nwusesondefline{\\{NW1FURYP-4HC3xd-1}}\nwprevnextdefs{\relax}{NW1FURYP-1Bfzjx-2}\nwenddeflinemarkup
define transform
cat $(1) $(foreach t,$(2),| $(call $\{t\})) > $(3)
endef
\nwalsodefined{\\{NW1FURYP-1Bfzjx-2}\\{NW1FURYP-1Bfzjx-3}\\{NW1FURYP-1Bfzjx-4}}\nwused{\\{NW1FURYP-4HC3xd-1}}\nwendcode{}\nwbegindocs{8}What we do here is to expand each transformation in the list to a pipe 
expression, so the result is a pipeline through which the file contents is 
piped.
Thus every transformation must read from standard input and write to standard 
output.

Now back to our {\Tt{}\LA{}transformation recipe~{\nwtagstyle{}\subpageref{NW1FURYP-4XMbom-1}}\RA{}\nwendquote}.
This is a suffix rule, but we want the transformation to be target-dependent.
To solve this, we will have a variable {\Tt{}TRANSFORM{\_}LIST-target\nwendquote} containing 
the space separated list of transforms to apply to the target.
We will also use {\Tt{}TRANSFORM{\_}LIST.suf\nwendquote}, where {\Tt{}.suf\nwendquote} is the suffix of the 
target file.
Thus we can just apply this list using the function above.
\nwenddocs{}\nwbegincode{9}\sublabel{NW1FURYP-4XMbom-1}\nwmargintag{{\nwtagstyle{}\subpageref{NW1FURYP-4XMbom-1}}}\moddef{transformation recipe~{\nwtagstyle{}\subpageref{NW1FURYP-4XMbom-1}}}\endmoddef\nwstartdeflinemarkup\nwusesondefline{\\{NW1FURYP-4HC3xd-1}\\{NW1FURYP-3f8Q3H-1}}\nwenddeflinemarkup
$(call transform,\\
  $$^,\\
  $$\{TRANSFORM_LIST$$(suffix $$@)\} $$\{TRANSFORM_LIST-$$@\},\\
  $$@)
\nwused{\\{NW1FURYP-4HC3xd-1}\\{NW1FURYP-3f8Q3H-1}}\nwendcode{}\nwbegindocs{10}We will let {\Tt{}TRANSFORM{\_}LIST\nwendquote} be the default list of transformations 
applied.
\nwenddocs{}\nwbegincode{11}\sublabel{NW1FURYP-29jjeg-2}\nwmargintag{{\nwtagstyle{}\subpageref{NW1FURYP-29jjeg-2}}}\moddef{variables~{\nwtagstyle{}\subpageref{NW1FURYP-29jjeg-1}}}\plusendmoddef\nwstartdeflinemarkup\nwusesondefline{\\{NW1FURYP-yOWSZ-1}}\nwprevnextdefs{NW1FURYP-29jjeg-1}{NW1FURYP-29jjeg-3}\nwenddeflinemarkup
$(foreach suf,$\{TRANSFORM_DST\},$(eval TRANSFORM_LIST$\{suf\}?=$\{TRANSFORM_LIST\}))
\nwused{\\{NW1FURYP-yOWSZ-1}}\nwendcode{}\nwbegindocs{12}\nwdocspar

This will work well for a lot of cases, however, there are cases where suffix 
rules simply will not work.
For these we must generate specific targets.
Let {\Tt{}TRANSFORM{\_}TARGETS\nwendquote} contain a space separated list of target files.
\nwenddocs{}\nwbegincode{13}\sublabel{NW1FURYP-3f8Q3H-1}\nwmargintag{{\nwtagstyle{}\subpageref{NW1FURYP-3f8Q3H-1}}}\moddef{target generation for transformations~{\nwtagstyle{}\subpageref{NW1FURYP-3f8Q3H-1}}}\endmoddef\nwstartdeflinemarkup\nwusesondefline{\\{NW1FURYP-yOWSZ-1}}\nwenddeflinemarkup
define target_recipe
$(1):
  \LA{}transformation recipe~{\nwtagstyle{}\subpageref{NW1FURYP-4XMbom-1}}\RA{}
endef
$(foreach target,$\{TRANSFORM_TARGETS\},$(eval $(call target_recipe,$\{target\})))
\nwused{\\{NW1FURYP-yOWSZ-1}}\nwendcode{}\nwbegindocs{14}Note that we use the same recipe as above.

\subsection{Removing solutions}

To remove solutions we will supply a filtering transformation.
The filter uses {\Tt{}sed\nwendquote} to remove every solution environment from the content.
\nwenddocs{}\nwbegincode{15}\sublabel{NW1FURYP-1Bfzjx-2}\nwmargintag{{\nwtagstyle{}\subpageref{NW1FURYP-1Bfzjx-2}}}\moddef{transformations~{\nwtagstyle{}\subpageref{NW1FURYP-1Bfzjx-1}}}\plusendmoddef\nwstartdeflinemarkup\nwusesondefline{\\{NW1FURYP-4HC3xd-1}}\nwprevnextdefs{NW1FURYP-1Bfzjx-1}{NW1FURYP-1Bfzjx-3}\nwenddeflinemarkup
NoSolutions?= $\{SED\} "/\\\\\\\\begin\{solution\}/,/\\\\\\\\end\{solution\}/d"
\nwused{\\{NW1FURYP-4HC3xd-1}}\nwendcode{}\nwbegindocs{16}\nwdocspar

\subsection{Removing excessive build instructions}

Sometimes we have extra build instructions in the internal repo, which are not 
necessary for the exported source code.
\nwenddocs{}\nwbegincode{17}\sublabel{NW1FURYP-1Bfzjx-3}\nwmargintag{{\nwtagstyle{}\subpageref{NW1FURYP-1Bfzjx-3}}}\moddef{transformations~{\nwtagstyle{}\subpageref{NW1FURYP-1Bfzjx-1}}}\plusendmoddef\nwstartdeflinemarkup\nwusesondefline{\\{NW1FURYP-4HC3xd-1}}\nwprevnextdefs{NW1FURYP-1Bfzjx-2}{NW1FURYP-1Bfzjx-4}\nwenddeflinemarkup
ExportFilter?=    $\{SED\} "/#export \\\\(false\\\\|no\\\\)/,/#export \\\\(true\\\\|yes\\\\)/d"
OldExportFilter?= $\{SED\} "/#export no/,/#endexport/d"
\nwused{\\{NW1FURYP-4HC3xd-1}}\nwendcode{}\nwbegindocs{18}\nwdocspar

\subsection{Handouts and solutions}

It is common that we want to produce handouts from slides and solutions for 
assignments or exams.
We do not want to do this by hand, so we add two transformations that can be 
used to do this for us.
\nwenddocs{}\nwbegincode{19}\sublabel{NW1FURYP-1Bfzjx-4}\nwmargintag{{\nwtagstyle{}\subpageref{NW1FURYP-1Bfzjx-4}}}\moddef{transformations~{\nwtagstyle{}\subpageref{NW1FURYP-1Bfzjx-1}}}\plusendmoddef\nwstartdeflinemarkup\nwusesondefline{\\{NW1FURYP-4HC3xd-1}}\nwprevnextdefs{NW1FURYP-1Bfzjx-3}{\relax}\nwenddeflinemarkup
PrintAnswers?=    $\{SED\} "$\{MATCH_PRINTANSWERS\}"
Handout?=         $\{SED\} "$\{MATCH_HANDOUT\}"
\nwused{\\{NW1FURYP-4HC3xd-1}}\nwendcode{}\nwbegindocs{20}We will need quite a few layers of escaping for these two regular 
expressions.

First we will handle the printing of solutions.
We want to add the {\Tt{}{\nwbackslash}printanswers\nwendquote} command~\cite{ExamClass} to the preamble.
What we do is to match on the exam document class, then we insert the 
{\Tt{}{\nwbackslash}printanswers\nwendquote} command directly after it.
\nwenddocs{}\nwbegincode{21}\sublabel{NW1FURYP-29jjeg-3}\nwmargintag{{\nwtagstyle{}\subpageref{NW1FURYP-29jjeg-3}}}\moddef{variables~{\nwtagstyle{}\subpageref{NW1FURYP-29jjeg-1}}}\plusendmoddef\nwstartdeflinemarkup\nwusesondefline{\\{NW1FURYP-yOWSZ-1}}\nwprevnextdefs{NW1FURYP-29jjeg-2}{NW1FURYP-29jjeg-4}\nwenddeflinemarkup
exam_class=       "(\\\\\\\\\\\\\\\\\\\\documentclass\\\\[?.*\\\\]?\{.*exam.*\})"
with_print=       "\\\\1\\\\\\\\\\\\\\\\\\\\printanswers"
SED_PRINTANSWERS= "s/$\{exam_class\}/$\{with_print\}/"
\nwused{\\{NW1FURYP-yOWSZ-1}}\nwendcode{}\nwbegindocs{22}\nwdocspar

Now we will solve the handouts.
What we want to do is to add the {\Tt{}handout\nwendquote} option to the Beamer document 
class~\cite{Beamer}.
\nwenddocs{}\nwbegincode{23}\sublabel{NW1FURYP-29jjeg-4}\nwmargintag{{\nwtagstyle{}\subpageref{NW1FURYP-29jjeg-4}}}\moddef{variables~{\nwtagstyle{}\subpageref{NW1FURYP-29jjeg-1}}}\plusendmoddef\nwstartdeflinemarkup\nwusesondefline{\\{NW1FURYP-yOWSZ-1}}\nwprevnextdefs{NW1FURYP-29jjeg-3}{NW1FURYP-29jjeg-5}\nwenddeflinemarkup
without_handout=  "\\\\\\\\\\\\\\\\\\\\documentclass\\\\[?(.*)\\\\]?\{beamer\}"
with_handout=     "\\\\\\\\\\\\\\\\\\\\documentclass\\\\[\\\\1,handout\\\\]\{beamer\}"
SED_HANDOUT=      "s/$\{without_handout\}/$\{with_handout\}/"
\nwused{\\{NW1FURYP-yOWSZ-1}}\nwendcode{}\nwbegindocs{24}\nwdocspar


\section{Preparing camera-ready source}

Sometimes we must prepare \enquote{camera-ready source}, which essentially 
means that everything must be contained in a single TeX file.
Unfortunately, this is difficult to accomplish with the transformations 
outlined above\footnote{%
  It is possible and this solution will eventually be converted to such 
  a solution.
}.
For now, we will use some functions which requires parameters --- the 
transformations above must not require any parameter --- so the outline looks 
like this:
\nwenddocs{}\nwbegincode{25}\sublabel{NW1FURYP-4MnNOp-1}\nwmargintag{{\nwtagstyle{}\subpageref{NW1FURYP-4MnNOp-1}}}\moddef{suffix rules for camera-ready source~{\nwtagstyle{}\subpageref{NW1FURYP-4MnNOp-1}}}\endmoddef\nwstartdeflinemarkup\nwusesondefline{\\{NW1FURYP-yOWSZ-1}}\nwenddeflinemarkup
\LA{}function to substitute bibliography for bbl~{\nwtagstyle{}\subpageref{NW1FURYP-4Hzr2X-1}}\RA{}
\LA{}function to fill filecontents environments~{\nwtagstyle{}\subpageref{NW1FURYP-4DKa6i-1}}\RA{}
\LA{}function to insert biblatex bbl code~{\nwtagstyle{}\subpageref{NW1FURYP-2M95V8-1}}\RA{}

.SUFFIXES: .tex .cameraready.tex
.tex.cameraready.tex:
  \LA{}camera-ready recipe~{\nwtagstyle{}\subpageref{NW1FURYP-gQss1-1}}\RA{}
\nwused{\\{NW1FURYP-yOWSZ-1}}\nwendcode{}\nwbegindocs{26}\nwdocspar

The first thing we want to do is to replace the {\Tt{}{\nwbackslash}bibliography\nwendquote} command with 
the {\Tt{}bbl\nwendquote}-code generated by {\Tt{}bibtex\nwendquote}.
This function also takes one argument, the file name of the {\Tt{}bbl\nwendquote}-file (which 
is the main document name with the {\Tt{}.tex\nwendquote} suffix replaced by {\Tt{}.bbl\nwendquote}).
\nwenddocs{}\nwbegincode{27}\sublabel{NW1FURYP-4Hzr2X-1}\nwmargintag{{\nwtagstyle{}\subpageref{NW1FURYP-4Hzr2X-1}}}\moddef{function to substitute bibliography for bbl~{\nwtagstyle{}\subpageref{NW1FURYP-4Hzr2X-1}}}\endmoddef\nwstartdeflinemarkup\nwusesondefline{\\{NW1FURYP-4MnNOp-1}}\nwenddeflinemarkup
define bibliography
$\{SED\} \\
  -e "/\\\\\\\\bibliography\{[^\}]*\}/\{s/\\\\\\\\bibliography.*//;r $(1)" \\
  -e "\}"
endef
\nwused{\\{NW1FURYP-4MnNOp-1}}\nwendcode{}\nwbegindocs{28}\nwdocspar

The {\Tt{}bibtex\nwendquote} alternative {\Tt{}biblatex\nwendquote} is becoming more popular.
So we want to provide similar functionality for {\Tt{}biblatex\nwendquote}.
To do this for {\Tt{}biblatex\nwendquote} we can use the {\Tt{}filecontents\nwendquote} package to include 
the bibliographies inline.

First we want to use is to fill {\Tt{}filecontents\nwendquote} environments with the actual 
content from the file.
We provide a function which takes the filename as an argument and then 
uncomments the environment and reads the file contents into the environment.
\nwenddocs{}\nwbegincode{29}\sublabel{NW1FURYP-4DKa6i-1}\nwmargintag{{\nwtagstyle{}\subpageref{NW1FURYP-4DKa6i-1}}}\moddef{function to fill filecontents environments~{\nwtagstyle{}\subpageref{NW1FURYP-4DKa6i-1}}}\endmoddef\nwstartdeflinemarkup\nwusesondefline{\\{NW1FURYP-4MnNOp-1}}\nwenddeflinemarkup
define filecontent
$\{SED\} "/^%\\\\\\\\begin\{filecontents\\\\*\\\\?\}\{$(1)\}/,/^%\\\\\\\\end\{filecontents\\\\*\\\\?\}/s/^%//" \\
  | $\{SED\} "/^\\\\\\\\begin\{filecontents\\\\*\\\\?\}\{$(1)\}/r $(1)"
endef
\nwused{\\{NW1FURYP-4MnNOp-1}}\nwendcode{}\nwbegindocs{30}\nwdocspar

Next, for this to work with {\Tt{}biblatex\nwendquote} we need to insert some extra code.
\nwenddocs{}\nwbegincode{31}\sublabel{NW1FURYP-2M95V8-1}\nwmargintag{{\nwtagstyle{}\subpageref{NW1FURYP-2M95V8-1}}}\moddef{function to insert biblatex bbl code~{\nwtagstyle{}\subpageref{NW1FURYP-2M95V8-1}}}\endmoddef\nwstartdeflinemarkup\nwusesondefline{\\{NW1FURYP-4MnNOp-1}}\nwenddeflinemarkup
define _the_bblcode
\\\\\\\\makeatletter\\\\\\\\def\\\\\\\\blx@bblfile@biber\{\\\\\\\\blx@secinit\\\\\\\\begingroup\\\\\\\\blx@bblstart\\\\\\\\input\{\\\\\\\\jobname.bbl\}\\\\\\\\blx@bblend\\\\\\\\endgroup\\\\\\\\csnumgdef\{blx@labelnumber@\\\\\\\\the\\\\\\\\c@refsection\}\{0\}\}\\\\\\\\makeatother
endef

define bblcode
$\{SED\} "s/^%biblatex-bbl-code/$\{_the_bblcode\}/"
endef
\nwused{\\{NW1FURYP-4MnNOp-1}}\nwendcode{}\nwbegindocs{32}\nwdocspar

Finally, with these functions we can write the following suffix rule, which 
calls the above functions one by one.
\nwenddocs{}\nwbegincode{33}\sublabel{NW1FURYP-gQss1-1}\nwmargintag{{\nwtagstyle{}\subpageref{NW1FURYP-gQss1-1}}}\moddef{camera-ready recipe~{\nwtagstyle{}\subpageref{NW1FURYP-gQss1-1}}}\endmoddef\nwstartdeflinemarkup\nwusesondefline{\\{NW1FURYP-4MnNOp-1}}\nwenddeflinemarkup
cat $< \\
  | $(call filecontent,\\
    $(shell $\{SED\} -n "s/^%\\\\\\\\begin\{filecontents\\\\*\\\\?\}\{\\\\([^\}]*\\\\)\}/\\\\1/p" \\
    $<)) \\
  | $(call bibliography,$\{<:.tex=.bbl\}) \\
  | $(call bblcode) \\
  > $@
\nwused{\\{NW1FURYP-4MnNOp-1}}\nwendcode{}\nwbegindocs{34}\nwdocspar


\section{Using encrypted files}

The idea of this approach is to encrypt the confidential data in the 
repository.
Thus the repository can be available to everyone, but only those with the 
decryption keys can read and make sensible changes in the confidential 
contents.

We will achieve this using the GNU Privacy Guard (GPG) version of Pretty Good 
Privacy (PGP).
We need a command to encrypt, the recipients and a command to decrypt.
We will use the following by default.
\nwenddocs{}\nwbegincode{35}\sublabel{NW1FURYP-29jjeg-5}\nwmargintag{{\nwtagstyle{}\subpageref{NW1FURYP-29jjeg-5}}}\moddef{variables~{\nwtagstyle{}\subpageref{NW1FURYP-29jjeg-1}}}\plusendmoddef\nwstartdeflinemarkup\nwusesondefline{\\{NW1FURYP-yOWSZ-1}}\nwprevnextdefs{NW1FURYP-29jjeg-4}{\relax}\nwenddeflinemarkup
GPG?=                 gpg
TRANSFORM_ENC?=          $\{GPG\} -aes
TRANSFORM_RECIPIENTS?=   me
TRANSFORM_DEC?=          $\{GPG\} -d
\nwused{\\{NW1FURYP-yOWSZ-1}}\nwendcode{}\nwbegindocs{36}This will yield the following suffix rules.
\nwenddocs{}\nwbegincode{37}\sublabel{NW1FURYP-OFRk8-1}\nwmargintag{{\nwtagstyle{}\subpageref{NW1FURYP-OFRk8-1}}}\moddef{suffix rules for encrypted files~{\nwtagstyle{}\subpageref{NW1FURYP-OFRk8-1}}}\endmoddef\nwstartdeflinemarkup\nwusesondefline{\\{NW1FURYP-yOWSZ-1}}\nwenddeflinemarkup
.SUFFIXES: .tex .tex.asc
.tex.tex.asc:
  $\{TRANSFORM_ENC\} $(foreach r,$\{TRANSFORM_RECIPIENTS\}, -r $r) < $< > $@

.tex.asc.tex:
  $\{TRANSFORM_DEC\} < $< > $@
\nwused{\\{NW1FURYP-yOWSZ-1}}\nwendcode{}\nwbegindocs{38}\nwdocspar

An alternative approach, probably less prone to errors, is to use Git.
We can use Git's attributes and filter functionality.
This means that we apply a filter to all files with the {\Tt{}.asc\nwendquote} suffix.
We have two alternatives: do this ourselves or use the {\Tt{}git-crypt\nwendquote} 
package\footnote{%
  Install on Ubuntu by running {\Tt{}sudo\ apt\ install\ git-crypt\nwendquote}.
}~\cite{git-crypt}.
The set up we must do for this to work is to set a Git attribute.
\nwenddocs{}\nwbegincode{39}\sublabel{NW1FURYP-36gn2U-1}\nwmargintag{{\nwtagstyle{}\subpageref{NW1FURYP-36gn2U-1}}}\moddef{gitattributes~{\nwtagstyle{}\subpageref{NW1FURYP-36gn2U-1}}}\endmoddef\nwstartdeflinemarkup\nwenddeflinemarkup
*.asc     filter=git-crypt
\nwnotused{gitattributes}\nwendcode{}

\nwixlogsorted{c}{{camera-ready recipe}{NW1FURYP-gQss1-1}{\nwixu{NW1FURYP-4MnNOp-1}\nwixd{NW1FURYP-gQss1-1}}}%
\nwixlogsorted{c}{{function to fill filecontents environments}{NW1FURYP-4DKa6i-1}{\nwixu{NW1FURYP-4MnNOp-1}\nwixd{NW1FURYP-4DKa6i-1}}}%
\nwixlogsorted{c}{{function to insert biblatex bbl code}{NW1FURYP-2M95V8-1}{\nwixu{NW1FURYP-4MnNOp-1}\nwixd{NW1FURYP-2M95V8-1}}}%
\nwixlogsorted{c}{{function to substitute bibliography for bbl}{NW1FURYP-4Hzr2X-1}{\nwixu{NW1FURYP-4MnNOp-1}\nwixd{NW1FURYP-4Hzr2X-1}}}%
\nwixlogsorted{c}{{gitattributes}{NW1FURYP-36gn2U-1}{\nwixd{NW1FURYP-36gn2U-1}}}%
\nwixlogsorted{c}{{suffix rule for transformations}{NW1FURYP-4HC3xd-1}{\nwixu{NW1FURYP-yOWSZ-1}\nwixd{NW1FURYP-4HC3xd-1}}}%
\nwixlogsorted{c}{{suffix rules for camera-ready source}{NW1FURYP-4MnNOp-1}{\nwixu{NW1FURYP-yOWSZ-1}\nwixd{NW1FURYP-4MnNOp-1}}}%
\nwixlogsorted{c}{{suffix rules for encrypted files}{NW1FURYP-OFRk8-1}{\nwixu{NW1FURYP-yOWSZ-1}\nwixd{NW1FURYP-OFRk8-1}}}%
\nwixlogsorted{c}{{target generation for transformations}{NW1FURYP-3f8Q3H-1}{\nwixu{NW1FURYP-yOWSZ-1}\nwixd{NW1FURYP-3f8Q3H-1}}}%
\nwixlogsorted{c}{{transform.mk}{NW1FURYP-yOWSZ-1}{\nwixd{NW1FURYP-yOWSZ-1}}}%
\nwixlogsorted{c}{{transformation recipe}{NW1FURYP-4XMbom-1}{\nwixu{NW1FURYP-4HC3xd-1}\nwixd{NW1FURYP-4XMbom-1}\nwixu{NW1FURYP-3f8Q3H-1}}}%
\nwixlogsorted{c}{{transformations}{NW1FURYP-1Bfzjx-1}{\nwixu{NW1FURYP-4HC3xd-1}\nwixd{NW1FURYP-1Bfzjx-1}\nwixd{NW1FURYP-1Bfzjx-2}\nwixd{NW1FURYP-1Bfzjx-3}\nwixd{NW1FURYP-1Bfzjx-4}}}%
\nwixlogsorted{c}{{variables}{NW1FURYP-29jjeg-1}{\nwixu{NW1FURYP-yOWSZ-1}\nwixd{NW1FURYP-29jjeg-1}\nwixd{NW1FURYP-29jjeg-2}\nwixd{NW1FURYP-29jjeg-3}\nwixd{NW1FURYP-29jjeg-4}\nwixd{NW1FURYP-29jjeg-5}}}%
\nwbegindocs{40}This will yield similar behaviour as with the makefile approach, except that 
many things are automated further.
\nwenddocs{}
