Ulm University bachelor and master thesis, Institute of Software Engineering and Programming Languages
The SP institute's thesis class (Florian Sihler): configurable title page with examiners and supervisor, declaration of authenticity, glossary, listings and pseudocode modules, biblatex citations in the margin, and a sample thesis with concept, implementation and evaluation chapters.
- Category
- Thesis
- Document class
thesis(thesis.cls) — ships with TeX Live- Workflow
- Thesis / dissertation — submissions and revision rounds
- Author
- Ulm University, Institute of Software Engineering and Programming Languages (official)
- Source
- Ulm University, Institute of Software Engineering and Programming Languages (official)
- Licence
- No licence is stated in the files. Ulm University, Institute of Software Engineering and Programming Languages (official) distributes them for authors preparing a submission.
These are the publisher’s own files. This project starts from Ulm University, Institute of Software Engineering and Programming Languages (official)’s package for this publication — their manuscript, their thesis.cls, their bibliography style — so what compiles here is what they would have given you.
Ulm University, Institute of Software Engineering and Programming Languages (official) serves this exact file to Ulm University. Check Ulm University, Institute of Software Engineering and Programming Languages (official)’s author pages for the current instructions.
Where this differs from the publisher’s download.
- Note: An institute template for bachelor and master theses in computer science at Ulm; check it against your institute's current thesis rules.
What you get
LICENSE· 20 KB_config/code-link.sty· 36 KB_config/internal/authenticity.tex· 2 KB_config/internal/biblatex.tex· 4 KB_config/internal/chapter.tex· 4 KB_config/internal/codelink.tex· 221 B_config/internal/colors.tex· 95 B_config/internal/environments.tex· 2 KB_config/internal/floats.tex· 10 KB_config/internal/fonts.tex· 4 KB_config/internal/footnote.tex· 2 KB_config/internal/glossary.tex· 8 KB_config/internal/headfoot.tex· 964 B_config/internal/hyperref.tex· 7 KB_config/internal/layout.tex· 325 B_config/internal/license.tex· 3 KB_config/internal/listings.tex· 2 KB_config/internal/marginpar.tex· 3 KB_config/internal/page.tex· 703 B_config/internal/pseudocode.tex· 2 KB_config/internal/tables.tex· 101 B_config/internal/titlepage.tex· 2 KB_config/internal/translation.tex· 3 KB_config/internal/units.tex· 174 B_config/langs/pseudo_java.cfg· 0 B_config/langs/xlistings-R.cfg· 1 KB_config/langs/xlistings-aspectj.cfg· 256 B_config/langs/xlistings-bash.cfg· 1 KB_config/langs/xlistings-cpp.cfg· 1 KB_config/langs/xlistings-csharp.cfg· 567 B_config/langs/xlistings-git.cfg· 760 B_config/langs/xlistings-haskell.cfg· 761 B_config/langs/xlistings-java.cfg· 5 KB_config/langs/xlistings-javascript.cfg· 922 B_config/langs/xlistings-json.cfg· 401 B_config/langs/xlistings-lambda_calculus.cfg· 2 KB_config/langs/xlistings-latex.cfg· 5 KB_config/langs/xlistings-lua.cfg· 324 B_config/langs/xlistings-markdown.cfg· 632 B_config/langs/xlistings-mips.cfg· 3 KB_config/langs/xlistings-python.cfg· 270 B_config/langs/xlistings-regex.cfg· 2 KB_config/langs/xlistings-rubberduck.cfg· 148 B_config/langs/xlistings-sirl.cfg· 717 B_config/langs/xlistings-sql.cfg· 824 B_config/langs/xlistings-tac.cfg· 1 KB_config/langs/xlistings-ts.cfg· 1 KB_config/langs/xlistings-x86.cfg· 3 KB_config/langs/xlistings-xml.cfg· 1 KB_config/langs/xlistings-yaml.cfg· 648 B_config/profiles/uulm-sp/colors.tex· 1 KB_config/profiles/uulm-sp/defaults.tex· 100 B_config/profiles/uulm-sp/logo-eps-converted-to.pdf· 14 KB_config/profiles/uulm-sp/logo.eps· 206 KB_config/profiles/uulm-sp/titlepage.tex· 3 KB_config/xlistings.sty· 42 KBimg/example.pdf· 25 KBimg/title-banner-image.pdf· 32 KBliterature/IEEEabrv.bib· 17 KBliterature/MYabrv.bib· 3 KBliterature/literature.bib· 950 Bsegments/abstract.tex· 257 Bsegments/acknowledgements.tex· 62 Bsegments/concept.tex· 217 Bsegments/conclusion.tex· 247 Bsegments/evaluation.tex· 310 Bsegments/glossary.tex· 3 KBsegments/implementation.tex· 247 Bsegments/introduction.tex· 7 KBsegments/related-work.tex· 344 Bthesis.cls· 6 KBthesis.tex— the file that is compiled · 3 KB
These become your files. Editing them afterwards changes your project and nothing else — a project owns its files from the moment it is made.
Source
LICENSE — binary, 20 KB
_config/code-link.sty · 36 KB
% code-link.sty, part of the xlistings bundle
% Collect definitions while typesetting and link every occurrence of them in
% code listings (listings, xlistings, minted). It works without xlistings.
%
% Copyright (C) 2026 Florian Sihler
%
% This work may be distributed and/or modified under the conditions of
% the LaTeX Project Public License, either version 1.3c of this license
% or (at your option) any later version. The latest version of this
% license is in https://www.latex-project.org/lppl.txt and version 1.3c
% or later is part of all distributions of LaTeX version 2008 or later.
%
% This work has the LPPL maintenance status 'maintained'.
% The Current Maintainer of this work is Florian Sihler.
%
% This work consists of the files of the xlistings bundle, among them
% code-link.sty and the documentation code-link-doc.tex.
\NeedsTeXFormat{LaTeX2e}[2022-06-01]
\ProvidesExplPackage{code-link}{2026/11/06}{v1.1.0}
{Collect, link and typeset code definitions in listings and minted}
\RequirePackage{l3keys2e}
\ExplSyntaxOn
\msg_new:nnn { codelink } { debug } { #1 }
\msg_new:nnn { codelink } { unknown-group }
{ Unknown~group~'#1'.~Using~the~default~group. }
\msg_new:nnn { codelink } { empty-string } { Ignoring~an~empty~string. }
\msg_new:nnn { codelink } { no-backend }
{ Backend~'#1'~requested~but~the~package~is~not~loaded. }
% package options
\bool_new:N \g__codelink_debug_bool
\bool_new:N \g__codelink_underline_bool
\bool_new:N \g__codelink_hyper_bool
\bool_new:N \g__codelink_customlink_bool
\tl_new:N \g__codelink_backend_tl
\tl_new:N \g__codelink_hyper_tl
\tl_gset:Nn \g__codelink_backend_tl { auto }
\tl_gset:Nn \g__codelink_hyper_tl { auto }
\tl_new:N \g__codelink_ul_offset_tl
\tl_new:N \g__codelink_ul_thick_tl
\tl_new:N \g__codelink_ul_color_tl
\tl_gset:Nn \g__codelink_ul_offset_tl { 1.2pt }
\tl_gset:Nn \g__codelink_ul_thick_tl { .3pt }
\tl_gset:Nn \g__codelink_ul_color_tl { black!15 }
\tl_new:N \g__codelink_ul_text_color_tl
\tl_gset:Nn \g__codelink_ul_text_color_tl { black!8 }
\bool_new:N \g__codelink_ul_text_bool
\bool_gset_true:N \g__codelink_ul_text_bool
\bool_new:N \l__codelink_ul_bool % false: no underline for this link
\bool_set_true:N \l__codelink_ul_bool
\keys_define:nn { codelink / package }
{
backend .choices:nn = { auto, listings, minted, none }
{ \tl_gset_eq:NN \g__codelink_backend_tl \l_keys_choice_tl },
backend .default:n = auto,
hyper .choices:nn = { auto, true, false }
{ \tl_gset_eq:NN \g__codelink_hyper_tl \l_keys_choice_tl },
hyper .default:n = true,
underline .bool_gset:N = \g__codelink_underline_bool,
underline .default:n = true,
underline-offset .tl_gset:N = \g__codelink_ul_offset_tl,
underline-thickness .tl_gset:N = \g__codelink_ul_thick_tl,
underline-color .tl_gset:N = \g__codelink_ul_color_tl,
underline-text-color .tl_gset:N = \g__codelink_ul_text_color_tl,
underline-text .bool_gset:N = \g__codelink_ul_text_bool,
underline-text .default:n = true,
debug .bool_gset:N = \g__codelink_debug_bool,
debug .default:n = true,
}
\ProcessKeysOptions { codelink / package }
\NewDocumentCommand \CodeLinkSetup { m } { \keys_set:nn { codelink / package } {#1} }
% The .aux file is tokenized again, so a string cannot be written as it is:
% every character becomes \codelink@c{<charcode>}, which expands to it again.
\cs_new:Npn \__codelink_enc:n #1
{ \str_map_function:nN {#1} \__codelink_enc_char:N }
\cs_new:Npn \__codelink_enc_char:N #1
{ \exp_not:N \codelink@c { \int_eval:n { `#1 } } }
\cs_generate_variant:Nn \__codelink_enc:n { V }
\cs_new_protected:cpn { codelink@c } #1 { \char_generate:nn {#1} { 12 } }
% Character renderers. listings replace the matched characters by what we give
% them, so each one is typeset literally. The same shape serves the spelling of
% a string for listings (spec), for Pygments (pyg) and in labels (sanitize).
% A table holds one control sequence per special character, which is much
% faster than a case distinction per character.
% #1 table, then pairs of a character code and its replacement
\cs_new_protected:Npn \__codelink_table:nnn #1#2#3
{
\quark_if_recursion_tail_stop:n {#2}
\cs_gset:cpn { c__codelink_ #1 _ \char_generate:nn {#2} { 12 } } { \exp_not:n {#3} }
\__codelink_table:nnn {#1}
}
% the character is passed in braces: an undelimited argument would skip a space
\cs_new:Npn \__codelink_lookup:nn #1#2 { \cs_if_exist_use:cF { c__codelink_ #1 _ #2 } {#2} }
\__codelink_table:nnn { disp }
{ 92 } { \textbackslash { } } { 95 } { \_ } { 123 } { \{ } { 125 } { \} }
{ 36 } { \$ } { 35 } { \# } { 37 } { \% } { 38 } { \& }
{ 126 } { \textasciitilde { } } { 94 } { \textasciicircum { } }
{ 60 } { \textless { } } { 62 } { \textgreater { } }
{ 34 } { \textquotedbl { } } { 124 } { \textbar { } } { 32 } { \ }
{ 45 } { {-} } { 39 } { {'} } { 96 } { {`} } { 44 } { {,} } { 33 } { {!} } { 63 } { {?} }
\q_recursion_tail { } \q_recursion_stop
\__codelink_table:nnn { spec } { 92 } { \\ } { 32 } { \ } \q_recursion_tail { } \q_recursion_stop
\__codelink_table:nnn { pyg }
{ 92 } { \PYGZbs { } } { 123 } { \PYGZob { } } { 125 } { \PYGZcb { } } { 94 } { \PYGZca { } }
{ 95 } { \PYGZus { } } { 38 } { \PYGZam { } } { 60 } { \PYGZlt { } } { 62 } { \PYGZgt { } }
{ 35 } { \PYGZsh { } } { 37 } { \PYGZpc { } } { 36 } { \PYGZdl { } } { 45 } { \PYGZhy { } }
{ 39 } { \PYGZsq { } } { 34 } { \PYGZdq { } } { 126 } { \PYGZti { } }
\q_recursion_tail { } \q_recursion_stop
\__codelink_table:nnn { san }
{ 92 } { :bs: } { 32 } { - } { 37 } { :pc: } { 35 } { :hs: } { 126 } { :ti: } { 123 } { :ob: }
{ 125 } { :cb: } { 94 } { :ca: } { 38 } { :am: } { 36 } { :dl: } { 34 } { :dq: }
\q_recursion_tail { } \q_recursion_stop
\cs_new:Npn \__codelink_disp:n #1 { \str_map_function:nN {#1} \__codelink_disp_char:N }
\cs_new:Npn \__codelink_disp_char:N #1 { \__codelink_lookup:nn { disp } {#1} }
\cs_new:Npn \__codelink_spec:n #1 { \str_map_function:nN {#1} \__codelink_spec_char:N }
\cs_new:Npn \__codelink_spec_char:N #1 { \__codelink_lookup:nn { spec } {#1} }
\cs_new:Npn \__codelink_pyg:n #1 { \str_map_function:nN {#1} \__codelink_pyg_char:N }
\cs_new:Npn \__codelink_pyg_char:N #1 { \__codelink_lookup:nn { pyg } {#1} }
\cs_new:Npn \__codelink_sanitize:n #1 { \str_map_function:nN {#1} \__codelink_sanitize_char:N }
\cs_generate_variant:Nn \__codelink_sanitize:n { V, e }
\cs_new:Npn \__codelink_sanitize_char:N #1 { \__codelink_lookup:nn { san } {#1} }
% Languages are compared lowercased and without the dialect, like listings
% stores \lst@language.
% Results are cached, as this runs for every string and every minted environment.
\regex_const:Nn \c__codelink_dialect_regex { \A \[ [^\]]* \] }
\cs_new_protected:Npn \__codelink_scope:Nn #1#2
{
\str_set:Nx #1 {#2}
\cs_if_exist:cTF { g__codelink_sc_ #1 }
{ \tl_set_eq:Nc #1 { g__codelink_sc_ #1 } }
{
\str_set_eq:NN \l__codelink_scope_in_str #1
\str_set:Nx #1 { \str_foldcase:V #1 }
\str_if_eq:eeT { \str_head:N #1 } { [ }
{ \regex_replace_once:NnN \c__codelink_dialect_regex { } #1 }
\tl_gset_eq:cN { g__codelink_sc_ \l__codelink_scope_in_str } #1
}
}
\str_new:N \l__codelink_scope_in_str
% Is #1 a name of letters, with an optional backslash in front? (l3regex is too
% slow for a test that runs once per string)
\bool_new:N \l__codelink_isword_bool
\cs_new_protected:Npn \__codelink_if_word:nT #1#2
{
\str_set:Nn \l_tmpb_str {#1}
\str_if_eq:eeT { \str_head:N \l_tmpb_str } { \c_backslash_str }
{ \str_set:Nx \l_tmpb_str { \str_tail:N \l_tmpb_str } }
\bool_set:Nn \l__codelink_isword_bool { ! \str_if_empty_p:N \l_tmpb_str }
\str_map_inline:Nn \l_tmpb_str
{
\__codelink_if_letter:nF {##1}
{ \bool_set_false:N \l__codelink_isword_bool \str_map_break: }
}
\bool_if:NT \l__codelink_isword_bool {#2}
}
\prg_new_conditional:Npnn \__codelink_if_letter:n #1 { F }
{
\bool_lazy_or:nnTF
{ \int_compare_p:n { `A <= `#1 <= `Z } }
{ \int_compare_p:n { `a <= `#1 <= `z } }
\prg_return_true: \prg_return_false:
}
% Does #1 end with a letter, a digit or an underscore?
\cs_new_protected:Npn \__codelink_if_wordend:nT #1
{ \exp_args:Nx \__codelink_if_wordchar:nT { \str_item:nn {#1} { -1 } } }
\cs_new_protected:Npn \__codelink_if_wordchar:nT #1#2
{
\bool_lazy_any:nT
{
{ \int_compare_p:n { `A <= `#1 <= `Z } }
{ \int_compare_p:n { `a <= `#1 <= `z } }
{ \int_compare_p:n { `0 <= `#1 <= `9 } }
{ \int_compare_p:nNn { `#1 } = { `_ } }
}
{#2}
}
% Styles are code which runs in the group that typesets a link.
\NewDocumentCommand \CodeLinkStyle { m m }
{ \cs_set_protected:cpn { codelink@style@ \tl_to_str:n {#1} } {#2} }
\CodeLinkStyle { none } { }
% Options of a string: its own, else those of its group, else the defaults.
% A group is the entries "<name>/<key>" of one property list.
\prop_new:N \g__codelink_groups_prop
\cs_generate_variant:Nn \prop_get:NnNTF { Nx }
\cs_generate_variant:Nn \prop_if_in:NnTF { Nx }
\prop_new:N \l__codelink_opts_prop
\prop_const_from_keyval:Nn \c__codelink_defaults_prop
{ prefix = cl:, style = none, language = , links = true, highlight = true, boundary = true }
\tl_new:N \l__codelink_group_tl
\tl_new:N \l__codelink_label_tl
\tl_new:N \l__codelink_display_tl
\tl_new:N \l__codelink_style_tl
\tl_new:N \l__codelink_astyle_tl % written to the .aux file
\tl_new:N \l__codelink_prefix_tl
\tl_new:N \l__codelink_lang_tl
\tl_new:N \l__codelink_links_tl
\tl_new:N \l__codelink_hl_tl
\tl_new:N \l__codelink_bd_tl
\str_new:N \l__codelink_str % the string, with the backslash of a command
\str_new:N \l__codelink_scope_str
\bool_new:N \l__codelink_command_bool
\bool_new:N \l__codelink_links_bool
\keys_define:nn { codelink / entry }
{
group .tl_set:N = \l__codelink_group_tl,
label .tl_set:N = \l__codelink_label_tl,
display .tl_set:N = \l__codelink_display_tl,
command .bool_set:N = \l__codelink_command_bool,
command .default:n = true,
prefix .code:n = { \prop_put:Nnn \l__codelink_opts_prop { prefix } {#1} },
style .code:n = { \prop_put:Nnn \l__codelink_opts_prop { style } {#1} },
language .code:n = { \prop_put:Nnn \l__codelink_opts_prop { language } {#1} },
links .code:n = { \prop_put:Nnn \l__codelink_opts_prop { links } {#1} },
highlight .code:n = { \prop_put:Nnn \l__codelink_opts_prop { highlight } {#1} },
boundary .code:n = { \prop_put:Nnn \l__codelink_opts_prop { boundary } {#1} },
}
\NewDocumentCommand \CodeLinkGroup { m m }
{
\group_begin:
\prop_clear:N \l__codelink_opts_prop
\keys_set:nn { codelink / entry } {#2}
\prop_map_inline:Nn \l__codelink_opts_prop
{ \prop_gput:Nnn \g__codelink_groups_prop { #1 / ##1 } {##2} }
\group_end:
\prop_gput:Nnn \g__codelink_groups_prop { #1 / } { }
\cs_undefine:c { g__codelink_gc_ #1 }
}
\CodeLinkGroup { default } { }
\cs_new_protected:Npn \__codelink_opt:nN #1#2
{
\prop_get:NnNTF \l__codelink_opts_prop {#1} #2 { }
{
\prop_get:NxNTF \g__codelink_groups_prop { \l__codelink_group_tl / #1 } #2 { }
{ \prop_get:NnN \c__codelink_defaults_prop {#1} #2 }
}
}
\cs_new_protected:Npn \__codelink_resolve:
{
\__codelink_opt:nN { prefix } \l__codelink_prefix_tl
\__codelink_opt:nN { style } \l__codelink_style_tl
\__codelink_opt:nN { language } \l__codelink_lang_tl
\__codelink_opt:nN { links } \l__codelink_links_tl
\__codelink_opt:nN { highlight } \l__codelink_hl_tl
\__codelink_opt:nN { boundary } \l__codelink_bd_tl
}
% Resolves the options of the string #2 given #1.
\cs_new_protected:Npn \__codelink_prepare:nn #1#2
{
\tl_set:Nn \l__codelink_group_tl { default }
\tl_clear:N \l__codelink_label_tl
\tl_clear:N \l__codelink_display_tl
\bool_set_false:N \l__codelink_command_bool
\prop_clear:N \l__codelink_opts_prop
\keys_set:nn { codelink / entry } {#1}
\prop_if_in:NxTF \g__codelink_groups_prop { \l__codelink_group_tl / } { }
{
\msg_warning:nnx { codelink } { unknown-group } { \l__codelink_group_tl }
\tl_set:Nn \l__codelink_group_tl { default }
}
\str_set:Nx \l__codelink_str
{ \bool_if:NT \l__codelink_command_bool { \c_backslash_str } \tl_to_str:n {#2} }
% without keys of its own, a string takes the options of its group, which
% are resolved once (\CodeLinkGroup drops the cache)
\prop_if_empty:NTF \l__codelink_opts_prop
{
\cs_if_exist:cF { g__codelink_gc_ \l__codelink_group_tl }
{
\__codelink_resolve:
\cs_gset:cpx { g__codelink_gc_ \l__codelink_group_tl }
{
\tl_set:Nn \exp_not:N \l__codelink_prefix_tl { \exp_not:V \l__codelink_prefix_tl }
\tl_set:Nn \exp_not:N \l__codelink_style_tl { \exp_not:V \l__codelink_style_tl }
\tl_set:Nn \exp_not:N \l__codelink_lang_tl { \exp_not:V \l__codelink_lang_tl }
\tl_set:Nn \exp_not:N \l__codelink_links_tl { \exp_not:V \l__codelink_links_tl }
\tl_set:Nn \exp_not:N \l__codelink_hl_tl { \exp_not:V \l__codelink_hl_tl }
\tl_set:Nn \exp_not:N \l__codelink_bd_tl { \exp_not:V \l__codelink_bd_tl }
}
}
\use:c { g__codelink_gc_ \l__codelink_group_tl }
}
{ \__codelink_resolve: }
\bool_set:Nn \l__codelink_links_bool { ! \str_if_eq_p:ee { \l__codelink_links_tl } { false } }
% highlight=false: listings keep the colors of their own highlighting
\tl_set_eq:NN \l__codelink_astyle_tl \l__codelink_style_tl
\str_if_eq:eeT { \l__codelink_hl_tl } { false } { \tl_set:Nn \l__codelink_astyle_tl { none } }
\tl_if_empty:NT \l__codelink_label_tl
{ \tl_set:Nx \l__codelink_label_tl { \l__codelink_prefix_tl \__codelink_sanitize:V \l__codelink_str } }
\tl_if_empty:NT \l__codelink_display_tl
{ \tl_set:Nx \l__codelink_display_tl { \l__codelink_str } }
\__codelink_scope:Nn \l__codelink_scope_str { \l__codelink_lang_tl }
}
% Registering: one line per string in the .aux file; before \begin{document}
% they wait, as the file is only open then. A group with links=false registers
% nothing, its strings are plain text.
\seq_new:N \g__codelink_pending_seq
\bool_new:N \g__codelink_document_bool
\cs_new_protected:Npn \__codelink_write:n #1 { \iow_now:Nx \@mainaux {#1} }
\cs_generate_variant:Nn \__codelink_write:n { V }
\cs_generate_variant:Nn \seq_gput_right:Nn { NV }
\cs_new_protected:Npn \__codelink_register:n #1
{
\bool_if:NT \l__codelink_links_bool
{
\str_if_empty:NTF \l__codelink_str
{ \msg_warning:nn { codelink } { empty-string } }
{
\str_set:Nx \l_tmpa_str
{ g__codelink_w_ #1 / \l__codelink_scope_str / \__codelink_enc:V \l__codelink_str }
\cs_if_exist:cF { \l_tmpa_str }
{
\cs_gset_nopar:cpn { \l_tmpa_str } { }
\tl_set:Nx \l_tmpa_tl
{
\exp_not:N \codelink@in
{ \__codelink_enc:V \l__codelink_str }
{ \__codelink_enc:V \l__codelink_label_tl }
{ \__codelink_enc:V \l__codelink_display_tl }
{ \tl_to_str:N \l__codelink_astyle_tl }
{ \__codelink_enc:V \l__codelink_scope_str }
{#1}
{ \l__codelink_bd_tl }
}
\bool_if:NTF \g__codelink_document_bool
{ \__codelink_write:V \l_tmpa_tl }
{ \seq_gput_right:NV \g__codelink_pending_seq \l_tmpa_tl }
}
}
}
}
\cs_new_protected:Npn \__codelink_anchor_hook:nn #1#2 { }
\cs_generate_variant:Nn \__codelink_anchor_hook:nn { VV }
\NewDocumentCommand \CodeLinkAnchorHook { m }
{ \cs_set_protected:Npn \__codelink_anchor_hook:nn ##1##2 {#1} }
\NewDocumentCommand \CodeLinkAnchor { O{} m }
{
\group_begin:
\__codelink_prepare:nn {#1} {#2}
\__codelink_register:n { link }
\cs_if_exist:NT \phantomsection { \phantomsection }
\exp_args:NV \label \l__codelink_label_tl
\__codelink_anchor_hook:VV \l__codelink_str \l__codelink_label_tl
\group_end:
}
\NewDocumentCommand \CodeLinkRegister { O{} m }
{ \group_begin: \__codelink_prepare:nn {#1} {#2} \__codelink_register:n { link } \group_end: }
\NewDocumentCommand \CodeLinkBlock { O{} m }
{ \group_begin: \__codelink_prepare:nn {#1} {#2} \__codelink_register:n { block } \group_end: }
% Typesetting a link. The underline is a light rule at a fixed distance below
% the baseline, whatever the depth of the text is.
\box_new:N \l__codelink_ul_box
\box_new:N \l__codelink_ul_out_box
\tl_new:N \l__codelink_ul_color_tl % the color of the line in a listing or in the text
\tl_set_eq:NN \l__codelink_ul_color_tl \g__codelink_ul_color_tl
\bool_new:N \l__codelink_hook_bool % set inside of the Output hook of listings
\cs_new_protected:Npn \__codelink_ul_draw:N #1
{
\hbox_set:Nn \l__codelink_ul_out_box
{
\box_use:N #1
\skip_horizontal:n { - \box_wd:N #1 }
\tl_if_empty:NF \l__codelink_ul_color_tl
{ \@ifpackageloaded { xcolor } { \exp_args:NV \color \l__codelink_ul_color_tl } { } }
\vrule width \box_wd:N #1
height \dim_eval:n { \g__codelink_ul_thick_tl - \g__codelink_ul_offset_tl }
depth \dim_eval:n { \g__codelink_ul_offset_tl } \scan_stop:
}
\box_set_dp:Nn \l__codelink_ul_out_box { \box_dp:N #1 }
\box_use_drop:N \l__codelink_ul_out_box
}
% #1 label (empty: no link), #2 style name, #3 text
\cs_new_protected:Npn \__codelink_format:nnn #1#2#3
{
\group_begin:
\cs_if_exist_use:c { codelink@style@ #2 }
\bool_lazy_all:nTF { { \g__codelink_underline_bool } { \l__codelink_ul_bool } { ! \tl_if_empty_p:n {#1} } }
{
% in the Output hook, #3 is the output of the whole token: the box
% is only known once listings has made it
\bool_if:NTF \l__codelink_hook_bool
{ \cs_set_protected:Npn \lst@OutputBox ##1 { \__codelink_ul_draw:N ##1 } #3 }
{ \hbox_set:Nn \l__codelink_ul_box {#3} \__codelink_ul_draw:N \l__codelink_ul_box }
}
{#3}
\group_end:
}
% How a text becomes a link to a label (#1 label, #2 text): hyperref, or any
% package which provides \hyperref, or the command of the user.
\cs_new_protected:Npn \__codelink_linkcmd:nn #1#2 { \hyperref [#1] {#2} }
\NewDocumentCommand \CodeLinkLinkCommand { m }
{
\cs_set_protected:Npn \__codelink_linkcmd:nn ##1##2 {#1}
\bool_gset_true:N \g__codelink_customlink_bool
}
\NewDocumentCommand \CodeLinkFormat { m m m }
{
\bool_lazy_and:nnTF { \g__codelink_hyper_bool } { ! \tl_if_empty_p:n {#1} }
{ \__codelink_linkcmd:nn {#1} { \__codelink_format:nnn {#1} {#2} {#3} } }
{ \__codelink_format:nnn {#1} {#2} {#3} }
}
\NewDocumentCommand \CodeLinkTextFont { } { \ttfamily }
\NewDocumentCommand \CodeLinkRef { O{} m }
{
\group_begin:
\__codelink_prepare:nn {#1} {#2}
\tl_set_eq:NN \l__codelink_ul_color_tl \g__codelink_ul_text_color_tl
\bool_set_eq:NN \l__codelink_ul_bool \g__codelink_ul_text_bool
\bool_if:NF \l__codelink_links_bool { \tl_clear:N \l__codelink_label_tl }
\use:e
{
\exp_not:N \CodeLinkTextFont
\exp_not:N \CodeLinkFormat
{ \exp_not:V \l__codelink_label_tl }
{ \exp_not:V \l__codelink_style_tl }
{ \__codelink_disp:V \l__codelink_display_tl }
}
\group_end:
}
\cs_generate_variant:Nn \__codelink_disp:n { V }
% the label of a string, to be used in \ref and \pageref (starred: a command)
\NewExpandableDocumentCommand \CodeLinkLabel { s O{default} m }
{
\prop_if_in:NnTF \g__codelink_groups_prop { #2 / prefix }
{ \prop_item:Nn \g__codelink_groups_prop { #2 / prefix } }
{ \prop_item:Nn \c__codelink_defaults_prop { prefix } }
\__codelink_sanitize:e { \IfBooleanT {#1} { \c_backslash_str } \tl_to_str:n {#3} }
}
% Reading the .aux file: the entries wait until a listing needs them.
% #1 string, #2 label, #3 display, #4 style, #5 language, #6 kind, #7 boundary
\seq_new:N \g__codelink_new_seq
\bool_new:N \g__codelink_dirty_bool
\cs_new_protected:Npn \__codelink_in:nnnnnnn #1#2#3#4#5#6#7
{
\group_begin:
\cs_set:cpn { codelink@c } ##1 { \char_generate:nn {##1} { 12 } }
\seq_gput_right:Nx \g__codelink_new_seq
{ { #1 } { #2 } { #3 } { \tl_to_str:n {#4} } { #5 } { \tl_to_str:n {#6} } { \tl_to_str:n {#7} } }
\group_end:
\bool_gset_true:N \g__codelink_dirty_bool
}
\cs_set_eq:cN { codelink@in } \__codelink_in:nnnnnnn
% Assembling: entries which have not been seen yet become rules. The first one
% of a string (per kind and language) counts.
\bool_new:N \g__codelink_listings_bool
\bool_new:N \g__codelink_minted_bool
\cs_new_protected:Npn \__codelink_assemble:
{
\bool_gset_false:N \g__codelink_dirty_bool
\seq_map_inline:Nn \g__codelink_new_seq { \__codelink_assemble_entry:nnnnnnn ##1 }
\seq_gclear:N \g__codelink_new_seq
\bool_if:NT \g__codelink_listings_bool { \__codelink_lst_sort: }
}
% #1 string, #2 label, #3 display, #4 style, #5 language, #6 kind, #7 boundary
\cs_new_protected:Npn \__codelink_assemble_entry:nnnnnnn #1#2#3#4#5#6#7
{
\cs_if_exist:cF { g__codelink_s_ #6 / #5 / #1 }
{
\cs_gset_nopar:cpn { g__codelink_s_ #6 / #5 / #1 } { }
\str_if_eq:nnTF {#6} { block }
{ \tl_clear:N \l__codelink_label_tl }
{ \tl_set:Nn \l__codelink_label_tl {#2} }
\tl_set:Nn \l__codelink_style_tl {#4}
\str_if_empty:nTF {#3}
{ \tl_set:Nn \l__codelink_display_tl {#1} }
{ \tl_set:Nn \l__codelink_display_tl {#3} }
\bool_if:NT \g__codelink_listings_bool
{
% a single word is matched by the Output hook as a whole: cheaper
% than a rule, and never found inside of a longer word
\bool_set_false:N \l__codelink_word_bool
\str_if_eq:nnT {#6} { link }
{
\str_if_eq:nnT {#1} {#3}
{
\__codelink_if_word:nT {#1}
{ \bool_set_true:N \l__codelink_word_bool }
}
}
\bool_if:NTF \l__codelink_word_bool
{ \__codelink_lst_word:nn {#5} {#1} }
{ \__codelink_lst_rule:nnn {#5} {#1} {#7} }
}
\bool_if:NT \g__codelink_minted_bool
{
\__codelink_mt_rule:nn {#5} {#1}
\str_if_eq:nnT {#6} { block } { \__codelink_mt_block:nn {#5} {#1} }
}
}
}
% listings: a word is looked up when listings outputs an identifier. All other
% strings are 'literate' rules, sorted by language and length (longest first).
\clist_new:N \g__codelink_scopes_clist
\int_new:N \g__codelink_minlen_int
\int_new:N \g__codelink_maxlen_int
\int_gset:Nn \g__codelink_minlen_int { 1000000 }
\bool_new:N \g__codelink_words_bool
\bool_new:N \l__codelink_word_bool
\cs_new_protected:Npn \__codelink_lst_word:nn #1#2
{
\tl_gset:cx { g__codelink_h_ x #1 _ #2 }
{ { \exp_not:V \l__codelink_label_tl } { \exp_not:V \l__codelink_style_tl } }
\bool_gset_true:N \g__codelink_words_bool
\str_if_eq:eeT { \str_item:nn {#2} { 1 } } { \c_backslash_str } { \bool_gset_true:N \g__codelink_cmdwords_bool }
}
% stores one literate rule: #1 language, #2 what to find, #3 the replacement
\cs_new_protected:Npn \__codelink_lst_put:nnn #1#2#3
{
\int_gincr:N \g__codelink_rule_int
\tl_gset:cx { g__codelink_r_ \int_use:N \g__codelink_rule_int _tl }
{ { \__codelink_spec:n {#2} } { {#3} } { \str_count:n {#2} } }
\int_gset:Nn \g__codelink_minlen_int { \int_min:nn { \g__codelink_minlen_int } { \str_count:n {#2} } }
\int_gset:Nn \g__codelink_maxlen_int { \int_max:nn { \g__codelink_maxlen_int } { \str_count:n {#2} } }
\clist_if_in:NnF \g__codelink_scopes_clist { x #1 }
{ \clist_gput_right:Nn \g__codelink_scopes_clist { x #1 } }
\clist_if_exist:cF { g__codelink_b_ x #1 _ \str_count:n {#2} _clist }
{ \clist_new:c { g__codelink_b_ x #1 _ \str_count:n {#2} _clist } }
\clist_gput_right:cx { g__codelink_b_ x #1 _ \str_count:n {#2} _clist }
{ \int_use:N \g__codelink_rule_int }
}
\int_new:N \g__codelink_rule_int
% A rule matches characters, so it also fires inside of a longer word. With a
% boundary, the string followed by a word character is a rule of its own which
% keeps the text as it is, and the longer rule wins.
\cs_new_protected:Npn \__codelink_lst_rule:nnn #1#2#3
{
\__codelink_lst_put:nnn {#1} {#2}
{
\exp_not:N \CodeLinkFormat
{ \exp_not:V \l__codelink_label_tl } { \exp_not:V \l__codelink_style_tl }
{ \__codelink_disp:V \l__codelink_display_tl }
}
\str_if_eq:nnF {#3} { false }
{
\__codelink_if_wordend:nT {#2}
{
\str_map_inline:nn { abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_ }
{ \__codelink_lst_put:nnn {#1} { #2 ##1 } { \__codelink_disp:n { #2 ##1 } } }
}
}
}
\cs_new_protected:Npn \__codelink_lst_sort:
{
\clist_map_inline:Nn \g__codelink_scopes_clist
{
\str_set:Nn \l__codelink_bucket_str {##1}
\tl_gset:cx { g__codelink_lit_ ##1 _tl }
{
\int_step_function:nnN { \g__codelink_minlen_int } { \g__codelink_maxlen_int }
\__codelink_lst_bucket:n
}
}
}
% the rules of one length in the scope ##1 of \__codelink_lst_sort:
\cs_new:Npn \__codelink_lst_bucket:n #1
{
\clist_if_exist:cT { g__codelink_b_ \l__codelink_bucket_str _ #1 _clist }
{ \clist_map_function:cN { g__codelink_b_ \l__codelink_bucket_str _ #1 _clist } \__codelink_lst_id:n }
}
\cs_new:Npn \__codelink_lst_id:n #1 { \exp_not:v { g__codelink_r_ #1 _tl } }
\str_new:N \l__codelink_bucket_str
% Word lookup, just before listings outputs an identifier: the style of the
% token is wrapped into the link.
\cs_new_protected:Npn \__codelink_lst_found:N #1
{
\cs_set_eq:NN \__codelink_old_style:n \lst@thestyle
\exp_after:wN \__codelink_lst_found:nn #1
}
\cs_new_protected:Npn \__codelink_lst_found:nn #1#2
{
\cs_set:Npx \lst@thestyle ##1
{
\exp_not:N \bool_set_true:N \exp_not:N \l__codelink_hook_bool
\exp_not:N \CodeLinkFormat {#1} {#2} { \exp_not:N \__codelink_old_style:n { ##1 } }
}
}
\cs_new_protected:Npn \__codelink_lst_try:n #1
{
\cs_if_exist:cT { g__codelink_h_ x #1 _ \l_tmpa_str }
{
\exp_args:Nc \__codelink_lst_found:N { g__codelink_h_ x #1 _ \l_tmpa_str }
\bool_set_true:N \l__codelink_word_bool
}
}
% Did the last non-letter token end with a backslash? Then a command word is
% looked up with the backslash in front of it. (listings spells the character
% as the control sequence \lst@um\ , hence the second test.)
\bool_new:N \g__codelink_afterbs_bool
\bool_new:N \g__codelink_cmdwords_bool
\tl_new:N \l__codelink_last_tl
% the end of the token, followed by a marker: a delimited search is much faster
% than taking the last characters of a string
\tl_const:Nx \c__codelink_bs_tl { \c_backslash_str \exp_not:N \q_mark }
\tl_const:Nx \c__codelink_bssp_tl { \c_backslash_str \c_space_tl \exp_not:N \q_mark }
\cs_generate_variant:Nn \tl_if_in:nnTF { Vo }
\cs_new_protected:Npn \__codelink_lst_other:
{
\bool_if:NT \g__codelink_cmdwords_bool
{
\tl_set:Nx \l__codelink_last_tl { \tl_to_str:o { \the \lst@token } \exp_not:N \q_mark }
\tl_if_in:VoTF \l__codelink_last_tl { \c__codelink_bs_tl }
{ \bool_gset_true:N \g__codelink_afterbs_bool }
{
\tl_if_in:VoTF \l__codelink_last_tl { \c__codelink_bssp_tl }
{ \bool_gset_true:N \g__codelink_afterbs_bool }
{ \bool_gset_false:N \g__codelink_afterbs_bool }
}
}
}
\NewDocumentCommand \CodeLinkMarkBackslash { } { \bool_gset_true:N \g__codelink_afterbs_bool }
\cs_new_protected:Npn \__codelink_lst_lookup:
{
\bool_set_false:N \l__codelink_word_bool
\cs_if_exist:NT \lst@language { \exp_args:NV \__codelink_lst_try:n \lst@language }
\bool_if:NF \l__codelink_word_bool { \__codelink_lst_try:n { } }
}
% A language that makes the backslash a letter (as the LaTeX one of xlistings)
% spells it \lst@um\ inside of the word: that is a backslash again.
% (\tl_to_str:n puts a space behind a control sequence, \token_to_str:N does not)
\str_const:Nx \c__codelink_um_str { \exp_args:Nc \token_to_str:N { lst@um \c_backslash_str } \c_space_tl }
\cs_new_protected:Npn \__codelink_lst_um_define:n #1
{
\cs_new_protected:Npn \__codelink_lst_um:w ##1 #1 ##2 \q_mark ##3 \q_stop
{ \tl_if_empty:nT {##1} { \str_set:Nx \l_tmpa_str { \c_backslash_str ##2 } } }
}
\exp_args:NV \__codelink_lst_um_define:n \c__codelink_um_str
\cs_new_protected:Npn \__codelink_lst_output:
{
\bool_lazy_and:nnT { \g__codelink_words_bool } { ! \str_if_eq_p:Vn \lst@codelink { false } }
{
\str_set:Nx \l_tmpa_str { \tl_to_str:o { \the \lst@token } }
\use:x
{
\exp_not:N \__codelink_lst_um:w \l_tmpa_str
\exp_not:N \q_mark \c__codelink_um_str \exp_not:N \q_mark \exp_not:N \q_stop
}
\__codelink_lst_lookup:
\bool_if:NF \l__codelink_word_bool
{
\bool_if:NT \g__codelink_afterbs_bool
{
\str_put_left:Nx \l_tmpa_str { \c_backslash_str }
\__codelink_lst_lookup:
}
}
\bool_gset_false:N \g__codelink_afterbs_bool
}
}
% The rules, handed to listings when it selects its character table.
\cs_new_protected:Npn \__codelink_lst_run:N #1
{ \exp_after:wN \lst@Literate #1 { } \relax \z@ }
\cs_new_protected:Npn \__codelink_lst_run:n #1
{ \cs_if_exist:cT { g__codelink_lit_ x #1 _tl } { \exp_args:Nc \__codelink_lst_run:N { g__codelink_lit_ x #1 _tl } } }
\cs_new_protected:Npn \__codelink_lst_hook:
{
\str_if_eq:VnF \lst@codelink { false }
{
\bool_if:NT \g__codelink_dirty_bool { \__codelink_assemble: }
\__codelink_lst_run:n { }
\cs_if_exist:NT \lst@language { \tl_if_empty:NF \lst@language { \exp_args:NV \__codelink_lst_run:n \lst@language } }
}
}
% minted: one control sequence per string, named like Pygments writes it
\str_new:N \l__codelink_lexer_str
\cs_new_protected:Npn \__codelink_mt_rule:nn #1#2
{
\tl_set:Nx \l_tmpa_tl { \__codelink_pyg:n {#2} }
\cs_gset_nopar:cpx { codelink@mt@ #1 @ \tl_to_str:N \l_tmpa_tl }
{ { \exp_not:V \l__codelink_label_tl } { \exp_not:V \l__codelink_style_tl } }
}
\cs_new_protected:Npn \__codelink_PYG_orig:nn #1#2 { }
\cs_new_protected:Npn \__codelink_mt_found:nnn #1#2#3
{ \__codelink_mt_found:nnnnn #1 {#2} {#3} }
\cs_new_protected:Npn \__codelink_mt_found:nnnnn #1#2#3#4
{ \CodeLinkFormat {#1} {#2} { \__codelink_PYG_orig:nn {#3} {#4} } }
% A block of several tokens, such as System.out: the text of the last tokens is
% kept, and a token that would be linked stays plain if this text ends with a block.
\bool_new:N \g__codelink_mtblock_bool
\bool_new:N \l__codelink_mtblocked_bool
\int_new:N \g__codelink_mtblock_int
\str_new:N \g__codelink_mt_tail_str
\cs_new_protected:Npn \__codelink_mt_block:nn #1#2
{
\str_set:Nx \l_tmpa_str { \__codelink_pyg:n {#2} }
\seq_if_exist:cF { g__codelink_mtb_ #1 _seq } { \seq_new:c { g__codelink_mtb_ #1 _seq } }
\seq_gput_right:cV { g__codelink_mtb_ #1 _seq } \l_tmpa_str
\int_gset:Nn \g__codelink_mtblock_int
{ \int_max:nn { \g__codelink_mtblock_int } { \str_count:N \l_tmpa_str } }
\bool_gset_true:N \g__codelink_mtblock_bool
}
\cs_new_protected:Npn \__codelink_mt_blocked:n #1
{
\seq_if_exist:cT { g__codelink_mtb_ #1 _seq }
{
\seq_map_inline:cn { g__codelink_mtb_ #1 _seq }
{
\str_if_eq:eeT
{ \str_range:Nnn \g__codelink_mt_tail_str { - \str_count:n {##1} } { -1 } } {##1}
{ \bool_set_true:N \l__codelink_mtblocked_bool \seq_map_break: }
}
}
}
\cs_generate_variant:Nn \__codelink_mt_blocked:n { V }
% #1 the control sequence that holds label and style, #2 and #3 the arguments of \PYG
\cs_new_protected:Npn \__codelink_mt_link:nnn #1#2#3
{
\bool_set_false:N \l__codelink_mtblocked_bool
\bool_if:NT \g__codelink_mtblock_bool
{
\__codelink_mt_blocked:V \l__codelink_lexer_str
\bool_if:NF \l__codelink_mtblocked_bool { \__codelink_mt_blocked:n { } }
}
\bool_if:NTF \l__codelink_mtblocked_bool
{ \__codelink_PYG_orig:nn {#2} {#3} }
{ \exp_args:Nv \__codelink_mt_found:nnn {#1} {#2} {#3} }
}
\cs_new_protected:Npn \__codelink_PYG:nn #1#2
{
\bool_if:NT \g__codelink_mtblock_bool
{
\str_gput_right:Nx \g__codelink_mt_tail_str { \detokenize {#2} }
\int_compare:nNnT { \str_count:N \g__codelink_mt_tail_str } > { 2 * \g__codelink_mtblock_int }
{
\str_gset:Nx \g__codelink_mt_tail_str
{ \str_range:Nnn \g__codelink_mt_tail_str { - \g__codelink_mtblock_int } { -1 } }
}
}
\cs_if_exist:cTF { codelink@mt@ \l__codelink_lexer_str @ \detokenize {#2} }
{ \__codelink_mt_link:nnn { codelink@mt@ \l__codelink_lexer_str @ \detokenize {#2} } {#1} {#2} }
{
\cs_if_exist:cTF { codelink@mt@ @ \detokenize {#2} }
{ \__codelink_mt_link:nnn { codelink@mt@ @ \detokenize {#2} } {#1} {#2} }
{ \__codelink_PYG_orig:nn {#1} {#2} }
}
}
% at the start of every minted environment
\cs_new_protected:Npn \__codelink_minted_patch:
{
\bool_if:NT \g__codelink_dirty_bool { \__codelink_assemble: }
\cs_if_exist:NT \PYG
{
\cs_if_eq:NNF \PYG \__codelink_PYG:nn
{
\cs_set_eq:NN \__codelink_PYG_orig:nn \PYG
\cs_set_eq:NN \PYG \__codelink_PYG:nn
}
}
\__codelink_scope:Nn \l__codelink_lexer_str { \minted@lexer }
\str_gclear:N \g__codelink_mt_tail_str
}
% what is loaded decides about the backends
\cs_new_protected:Npn \__codelink_begin_document:
{
\bool_gset_true:N \g__codelink_document_bool
\iow_now:Nx \@mainaux { \exp_not:N \providecommand \exp_not:N \codelink@in [7] { } }
\seq_map_function:NN \g__codelink_pending_seq \__codelink_write:n
\seq_gclear:N \g__codelink_pending_seq
\bool_gset:Nn \g__codelink_hyper_bool
{
\str_if_eq_p:Vn \g__codelink_hyper_tl { true }
|| ( \str_if_eq_p:Vn \g__codelink_hyper_tl { auto }
&& ( \cs_if_exist_p:N \hyperref || \g__codelink_customlink_bool ) )
}
\str_if_in:nVT { auto listings } \g__codelink_backend_tl
{
\@ifpackageloaded { listings }
{
\bool_gset_true:N \g__codelink_listings_bool
\def \lst@codelink { true }
\lst@Key { codelink } { true } { \def \lst@codelink { ##1 } }
\lst@AddToHook { SelectCharTable } { \__codelink_lst_hook: }
\lst@AddToHook { Output } { \__codelink_lst_output: }
\lst@AddToHook { OutputOther } { \__codelink_lst_other: }
}
{
\str_if_eq:VnT \g__codelink_backend_tl { listings }
{ \msg_warning:nnn { codelink } { no-backend } { listings } }
}
}
\str_if_in:nVT { auto minted } \g__codelink_backend_tl
{
\@ifpackageloaded { minted }
{
\bool_gset_true:N \g__codelink_minted_bool
\AddToHook { env/MintedVerbatim/begin } { \__codelink_minted_patch: }
}
{
\str_if_eq:VnT \g__codelink_backend_tl { minted }
{ \msg_warning:nnn { codelink } { no-backend } { minted } }
}
}
\bool_if:NT \g__codelink_debug_bool
{
\msg_term:nnx { codelink } { debug }
{ listings=\bool_to_str:N \g__codelink_listings_bool,~
minted=\bool_to_str:N \g__codelink_minted_bool,~
links=\bool_to_str:N \g__codelink_hyper_bool }
}
}
\cs_generate_variant:Nn \str_if_in:nnT { nV }
\cs_generate_variant:Nn \str_if_eq:nnT { V }
\AddToHook { begindocument } [ code-link ] { \__codelink_begin_document: }
\ExplSyntaxOff
_config/internal/authenticity.tex · 2 KB
\RequirePackage{tikz}
\PassOptionsToPackage{calc, en-US}{datetime2}
\RequirePackage{datetime2}
\tikzset{sigshift/.style={}}
\newcommand*\signature[2][]{\def\@signature{#2}\tikzset{sigshift/.style={#1}}}
\newcommand*\signaturelocation[1]{\def\@location{#1}} \let\@location\@empty
\newcommand*\signaturedate[1]{\DTMsavedate{submissiondate}{#1}\DTMmakeglobal{submissiondate}}
\def\@signarea{\def\lw{1.1pt}%
\tikzset{inline/.style={inner sep=0pt,outer sep=0pt},
lcr/.style={line cap=round},lw/.style={line width=\lw},
name/.style={anchor=north west,inline,yshift=-5pt},
content/.style={anchor=base west,baseline,inline,yshift=\lw/2+.5pt}}%
\begin{minipage}[b]{.5\textwidth-5mm}
\begin{tikzpicture}
\draw[lcr,lw] (0,0) -- (\textwidth,0);
\node[name] at (0,0) {\strut\translate{location}, \translate{date}};
\node[content,sigshift, yshift=\lw/2+3.5pt] at (0,0) {\LiningFigures\large\itshape\@location\ifx\@location\@empty\else\DTMifsaveddate{submissiondate}{,}{}\fi \quad \DTMifsaveddate{submissiondate}{\DTMusedate{submissiondate}}{}};
\end{tikzpicture}
\end{minipage}\hfill
\begin{minipage}[b]{.5\textwidth-5mm}
\begin{tikzpicture}
\draw[lcr,lw] (0,0) -- (\textwidth,0);
\node[name] at (0,0) {\strut\@author};
\@ifundefined{@signature}{}{\node[content,sigshift] at (0,0) {\includegraphics[width=4cm]{\@signature}};}
\end{tikzpicture}
\end{minipage}
}
\def\@sigskip{\vskip32\p@ plus 7\p@ minus 7\p@}
\newenvironment{declarationofauthenticity}
{\cleardoublepage\thispagestyle{plain}\begingroup\section*{\translate{authenticity}}}
{\par\@sigskip\@signarea\thesis@voidpar\endgroup\bigskip\thesis@voidpar}
\def\makedeclarationofauthenticity{\AtEndDocument{\begin{declarationofauthenticity}
\translate{declaration-of-authenticity}
\end{declarationofauthenticity}}}
_config/internal/biblatex.tex · 4 KB
\PassOptionsToPackage{threshold=1}{csquotes}
\RequirePackage{csquotes}
\PassOptionsToPackage{
backend=biber,
backref=true,
sorting=nyvt,
style=numeric,
backreffloats=true,
}{biblatex}
\RequirePackage{biblatex}
\defbibheading{bibliography}[\bibname]{\chapter{#1}}
\DefineBibliographyStrings{english}{backrefpage={On page}, backrefpages={On pages}}
\DefineBibliographyStrings{german}{backrefpage={Seite:}, backrefpages={Seiten:}}
% page back ref in margin based on default implementation
\ifthesis@marginpar
\pretocmd\printbibliography{\begingroup
\xapptobibmacro{begentry}{%
\def\margincontent{}%
\iflistundef{pageref}{}%
{\appto\margincontent{\printtext{%
\ifnumgreater{\value{pageref}}{1}%
{\bibstring{backrefpages}\ppspace}%
{\bibstring{backrefpage}\ppspace}%
\printlist[pageref][-\value{listtotal}]{pageref}.}}}%
\iffieldundef{url}{}{\iffieldundef{urlyear}{}%
{\ifx\margincontent\@empty\else\appto\margincontent{\endgraf}\fi\appto\margincontent{\setunit*{\addspace}%
\usebibmacro{urldate}}}}%
\marginpar{\vspace{\dimexpr-\ht\strutbox+\dp\strutbox}\thesis@marginpar@font\footnotesize\nohyper{\margincontent}}%
}{}{}}\relax\relax
\apptocmd\printbibliography{\endgroup}\relax\relax
% kill the original macros as we moved them to the margin
\renewbibmacro*{url+urldate}{\usebibmacro{url}}
\renewbibmacro*{pageref}{}
\fi
% lockcites in the sidebar inspired by my bachelor's thesis; a citation appears
% at most once per scope, the scope is chosen by the citeMarginparScope option
\def\thesis@sidecite@scope{\csname thesis@citescope@\thesis@citeMarginparScope\endcsname}
\def\thesis@sidecite@do#1{\tiny\color{darkgray}\plaincite{#1}~\thesis@sidecite{#1}}
\def\@locksidecite{%
\expandafter\expandafter\expandafter\xdef\expandafter\csname mcited\etry\endcsname{\thesis@sidecite@scope}%
\expandsidenote[\z@]{\protect\thesis@sidecite@do{\etry}}%
}
\newif\if@sidecite@doreset@
\def\forcecite#1{{\@sidecite@doreset@true\sidecite{#1}\plaincite{#1}}}
\def\sidecite#1{%
\edef\@chk{\detokenize{#1}}%
\ifx\@chk\@empty\else
\@for\etry:=\@chk\do{%
\if@sidecite@doreset@
\csundef{mcited\etry}%
\fi
\ifthesis@citescope@always
\@locksidecite
\else
\expandafter\ifcsname mcited\etry\endcsname\xdef\@tmp{\thesis@sidecite@scope}%
\expandafter\expandafter\expandafter\ifx\expandafter\csname mcited\etry\endcsname
\@tmp
\else
\@locksidecite
\fi
\else
\@locksidecite
\fi
\fi
}\fi%
}
\NewDocumentCommand\plaincite{oom}{}
% \ifthesis@print\else
\AfterEndPreamble{%
\ifthesis@citeInMarginpar
\DeclareCommandCopy\plaincite\cite
% \cite carries two optional arguments (prenote and postnote) in biblatex, so we
% have to hand both of them through to the original macro
\RenewDocumentCommand\cite{oom}{%
\ifdisableside\else\sidecite{#3}\fi
\IfNoValueTF{#1}{\plaincite{#3}}%
{\IfNoValueTF{#2}{\plaincite[#1]{#3}}{\plaincite[#1][#2]{#3}}}%
}
\fi% \fi
}
\DeclareFieldFormat{thesis@mp@author}{x#1x}
\DeclareLabeltitle{\field{shorttitle}\field{title}}
\DeclareFieldFormat{thesis@mp@title}{\normalfont#1}
\def\thesis@lhook@hr#1{\thesis@disablehyper{\href{\thefield{url}}{#1}}}%
\def\thesis@lhook@doi#1{\thesis@disablehyper{\href{https://doi.org/\thefield{doi}}{#1}}}%
\def\thesis@hook@do{%
\gdef\@tmp##1{##1}%
\ifhyperref{\iffieldundef{url}{%
\iffieldundef{doi}{}{%
\gdef\@tmp{\thesis@lhook@doi}%
}%
}{\gdef\@tmp{\thesis@lhook@hr}}}{}}
\DeclareCiteCommand{\thesis@sidecite}{}
{%
\usebibmacro{bibindex}%
\usebibmacro{begentry}%
\printnames[labelname][1-1]{author} (\printfield{year}),%
\setunit{\space}\newblock
\printtext{\thesis@hook@do}%
\@tmp{\printfield{labeltitle}}\newunit\newblock
\usebibmacro{finentry}%
}{}{}
\DefineBibliographyStrings{english}{andothers={et~al\adddot}}
\DefineBibliographyStrings{german}{andothers={et~al\adddot}}_config/internal/chapter.tex · 4 KB
\ifthesis@marginpar
\newsavebox\thesis@chapternum
\ifthesis@sftitle
\def\thesis@chapternumber@format#1{\centering{\color{@chapternumber}\itshape\firabook\fontsize{72pt}{72pt}\selectfont#1\autodot}}
\else
\def\thesis@chapternumber@format#1{\centering{\color{@chapternumber}\upshape\fontsize{72pt}{72pt}\thesis@liningnumbers#1\autodot}}
\fi
\renewcommand*{\chapterformat}{%
\IfChapterUsesPrefixLine{%
\setbox\thesis@chapternum=\hbox{\thesis@chapternumber@format{\thechapter}}%
\edef\shift{\the\dimexpr-.5\dp\[email protected]\ht\thesis@chapternum+.5\baselineskip+1.15pt}%
\expandsidenote[\shift]{\protect\thesis@chapternumber@format{\thechapter}}%
}{}%
}
\let\thesis@chapterformat\chapterformat
\def\appendixmore{\let\chapterformat\thesis@chapterformat}
\let\thesis@beforechapter\@empty
\def\thesis@afterchapter{}%\rule[.5\baselineskip]{\linewidth}{1pt}\par\nobreak}
\def\chapterlinesformat#1#2#3{\thesis@beforechapter\@hangfrom{#2}{#3}\thesis@afterchapter}
\def\chapterlineswithprefixformat#1#2#3{\thesis@beforechapter#2#3\thesis@afterchapter}
\fi
% chapter toc without minitoc, based on https://tex.stackexchange.com/a/517754
\def\@gobbleignore#1{\ignorespaces}
\def\@gobbleignoretwo#1#2{\ignorespaces}
\def\thesis@marginpar@chaptertoc@do#1{%
\parbox\marginparwidth{%
\parskip\z@\relax
\parindent\z@\relax
\footnotesize
\let\scr@numberline\@gobbleignore
\let\addvspace\@gobbleignore
\let\babel@toc\@gobbleignoretwo
\vspace*{\dimexpr\bigskipamount+2.5pt}\noindent
\value{tocdepth}=\sectiontocdepth
\noindent\ignorespaces\noside{\listoftoc*{#1}}%
\bigskip\endgraf
}
}
\def\thesis@chaptertoc@install{%
\setchapterpreamble{%
\ifthesis@marginpar
\expandsidenote{\protect\thesis@marginpar@chaptertoc@do{\thesis@ext@current@chaptoc}}%
\else
\begin{minipage}{\linewidth}
\value{tocdepth}=\sectiontocdepth% we want entries down to subsection
\noside{\listoftoc*{\thesis@ext@current@chaptoc}}% show the toc without header
\end{minipage}%
\bigskip\noindent\ignorespaces% add some vertical space after the toc and do not indent the following text
\fi
}%
}
\CloneTOCEntryStyle{tocline}{minitocline}
\def\thesis@pagebox#1{\hbox{\footnotesize#1}}
\def\thesis@minitoc@secondpart@numberline#1.#2\@nil{$#2\relax$}
\def\thesis@minitoc@numberline#1{\thesis@minitoc@secondpart@numberline#1\@nil.\space}
\newcommand*\thesis@minitoc@entry[1]{\bgroup\thesis@@disablehyper\let\numberline\thesis@minitoc@numberline #1\egroup}
\DeclareTOCStyleEntry[
entrynumberformat=\@gobble,
breakafternumber=true,
entryformat=\thesis@minitoc@entry,
level=0,
indent=0pt,
beforeskip=4pt,
dynnumwidth=false,
dynindent=false,
numwidth=0pt,
numsep=0pt,
pagenumberformat=\thesis@toc@pagenumber,
pagenumberbox=\thesis@pagebox,
linefill={,\null\nobreak\hfill},
raggedpagenumber=false,
raggedentrytext=true
]{minitocline}{minitocelement}
\def\thesis@chaptertoc@style{%
\DeclareNewTOC[%
tocentrystyle=minitocline,
% type=minitocelement,
setup={%
noprotrusion,
noindent
}%
]{\thesis@ext@current@chaptoc}%
}
\newif\ifusechaptertoc
\newcommand*{\chaptertoc}[2][\thechapter]{%
\usechaptertoctrue
\edef\thesis@ext@current@chaptoc{tcc#1}%
\thesis@chaptertoc@style
\thesis@chaptertoc@install
}
\RequirePackage{xpatch}
\xapptocmd\addtocentrydefault{%
\ifusechaptertoc%
\Ifstr{#1}{section}% only do for sections
{\expandafter\tocbasic@addxcontentsline\expandafter{\thesis@ext@current@chaptoc}{minitocelement}{#2}{#3}}{}%
\fi
}{}{}
\xpretocmd\chapter{\usechaptertocfalse}{}{}%
% TODO: optimize the minitoc and make for all, maybe something like
\newcommand\setchaptertoc[1][]{%
\Ifstr{#1}{}
{\AddtoOneTimeDoHook{heading/preinit/chapter}{\chaptertoc}}
{\AddtoOneTimeDoHook{heading/preinit/chapter}{\chaptertoc[#1]}}%
}
\def\csumnext{\\[.4ex]}
\def\csummary#1{\addtocontents{toc}{\protect\sidenote{\itshape\chapapp~\thechapter:\\[.5ex]#1}}}
\newenvironment{summary}{\vspace*{-.65\medskipamount}\begingroup
\DeclareCommandCopy\Cref\basicCref % just avoid side markers in the summary
\DeclareCommandCopy\cref\basiccref
\hypersetup{allcolors=.,citecolor=@cite}\thesisglsinsidefalse
}%
{\thesis@voidpar\endgroup\smallskip\thesis@voidpar}
\setcounter{tocdepth}{\sectiontocdepth}_config/internal/codelink.tex · 221 B
\makeatletter
% code-link works with any listings backend, the listings module is the natural one
\@ifpackageloaded{xlistings}{}{\thesis@internal@load{listings}}
\RequirePackage[underline]{_config/code-link}
\makeatother
_config/internal/colors.tex · 95 B
\PassOptionsToPackage{dvipsnames}{xcolor}
\RequirePackage{xcolor}
\thesis@load@profile{colors}
_config/internal/environments.tex · 2 KB
% TODO: add to toc but disable number more elegantly
\newenvironment{abstract}{\cleardoublepage\begingroup\section*{\translate{abstract}}\addcontentsline{toc}{chapter}{Abstract}}{\thesis@voidpar\endgroup\bigskip\thesis@voidpar}
\newenvironment{acknowledgements}{\cleardoublepage\begingroup\section*{\translate{acknowledgements}}}{\thesis@voidpar\endgroup\bigskip\thesis@voidpar}
% \addcontentsline{toc}{chapter}{Acknowledgements}
% \addcontentsline{toc}{chapter}{Conventions}
\newenvironment{conventions}{\cleardoublepage\begingroup\section*{\translate{conventions}}}{\thesis@voidpar\endgroup\bigskip\thesis@voidpar}
\RequirePackage{enumitem}
\appto\extrasngerman{%
\Crefname{rqsi}{Forschungsfrage}{Forschungsfragen}
\Crefname{rqsii}{Forschungsfrage}{Forschungsfragen}
\Crefname{contributionsi}{Beitrag}{Beiträge}
\Crefname{contributionsii}{Beitrag}{Beiträge}
\Crefname{enumi}{}{}\Crefname{enumii}{}{}\Crefname{enumiii}{}{}
\Crefname{itemizei}{}{}\Crefname{itemizeii}{}{}\Crefname{itemizeiii}{}{}
}
\appto\extrasenglish{%
\Crefname{rqsi}{Research Question}{Research Questions}
\Crefname{rqsii}{Research Question}{Research Questions}
\Crefname{contributionsi}{Contribution}{Contributions}
\Crefname{contributionsii}{Contribution}{Contributions}
\Crefname{enumi}{}{}\Crefname{enumii}{}{}\Crefname{enumiii}{}{}
\Crefname{itemizei}{}{}\Crefname{itemizeii}{}{}\Crefname{itemizeiii}{}{}
}
\newlist{rqs}{enumerate}{5}
\setlist[rqs]{leftmargin=*,label*={.\arabic*}}
\setlist[rqs,1]{label={\textsc{rq}\arabic*}}
\newlist{contributions}{enumerate}{5}
\setlist[contributions]{leftmargin=*,label*={.\arabic*}}
\setlist[contributions,1]{label={\textsc{c}\arabic*}}
_config/internal/floats.tex · 10 KB
\RequirePackage{caption}
\RequirePackage{subcaption}
\def\thesis@fig@style@nonbold#1{% \color{@primary}
{\hypersetup{allcolors=@primary}#1}%
}
\def\thesis@fig@style#1{\thesis@fig@style@nonbold{{\bfseries#1}}}
\DeclareCaptionLabelFormat{thesis-caption}{\thesis@fig@style{\itshape#1~#2:\space\space}}
\DeclareCaptionLabelFormat{thesis-caption-theorems}{\thesis@fig@style{\itshape#1~#2\space\space}}
\captionsetup{
format=plain,
indention=0ex,
textfont={color=black,rm,sl,footnotesize},
labelformat=thesis-caption,
labelsep=none,
hypcapspace=.66\baselineskip,
aboveskip=.5\baselineskip,
justification=RaggedRight,
singlelinecheck=false,
font={footnotesize}
}
\renewcommand*\captionformat{~~}
% we will use this to get unique number for each still #1@lb is placeholder for first run
\def\InitPageCounter#1{\newcounter{c@@#1@@lb}\csdef{c@#1@lb}{0}}
% we no longer do that but instead use a macro for each page
\InitPageCounter{figure}\InitPageCounter{table}\InitPageCounter{lstlisting}
% #1 type like figure | table | ..., #2 counter
\def\CountThisPageWrite#1#2{%
\expandafter\providecommand\csname c@#1@#2\endcsname{0}% a default value
\protected@write\@auxout{}{% {\csname ext@#1\endcsname}
\csxdef{c@#1@#2}{\thepage}%
}%
}
\def\curpgnum{0}
\def\CountThisPage#1#2{%
% set counter for unique counting
\stepcounter{c@@#1@@lb}%
% write similar to label, but use the unique counter
\CountThisPageWrite{#1}{\arabic{c@@#1@@lb}}%
% now, count the number of occurrences on the given page
\xdef\curpgnum{\csname c@#1@\arabic{c@@#1@@lb}\endcsname}%
\ifcsname c@\curpgnum @#1@lb\endcsname\else\csxdef{c@\curpgnum @#1@lb}{0}\fi
% increment the counter for the given page
\csxdef{c@\curpgnum @#1@lb}{\the\numexpr\csname c@\curpgnum @#1@lb\endcsname+1}%
% store the counter to the uniquely identified macro
% \typeout{Counting c@\curpgnum @#1@lb to #2 with \csname c@\curpgnum @#1@lb\endcsname (\csuse{c@#1@\arabic{c@@#1@@lb}})}%
\csxdef{#2}{\csname c@\curpgnum @#1@lb\endcsname}%
% \typeout{Counting for \arabic{c@@#1@@lb} (\csname ext@#1\endcsname, pgnum: \curpgnum, tar: \csuse{#2})}%
}
\robustify\CountThisPage
\def\thesissetfig{\CountThisPage{figure}{c@figure@lb}}
\def\thesissettbl{\CountThisPage{table}{c@table@lb}}
\def\thesissetlst{\CountThisPage{lstlisting}{c@lstlisting@lb}}
\ifthesis@pageInFloatRef
\def\thesis@figure{figure}\def\thesis@table{table}\def\thesis@lstlisting{lstlisting}
\def\thesis@subfigure{subfigure}
\newif\ifthesis@floatcounted
% a float claims its number as soon as it starts (so that subcaptions can refer to it),
% but a float without any caption must not consume one -- we therefore remember what the
% float claimed and roll the claim back if no caption ever used it (this also covers
% captions which are deferred out of the float, e.g. into the margin with \sidenote)
\def\thesis@rb@name{}\def\thesis@rb@val{}
\def\thesis@floatclaim#1#2{%
#1% assigns the number and updates \curpgnum
\xdef\thesis@rb@name{c@\curpgnum @#2@lb}%
\expandafter\xdef\expandafter\thesis@rb@val\expandafter{\csname\thesis@rb@name\endcsname}%
\global\thesis@floatcountedtrue
}
\def\thesis@floatrollback{%
\ifthesis@floatcounted% the claim was never used by a caption
\expandafter\ifx\csname\thesis@rb@name\endcsname\thesis@rb@val% and nothing claimed after it
\expandafter\xdef\csname\thesis@rb@name\endcsname{\the\numexpr\thesis@rb@val-1\relax}%
\fi
\fi
\global\thesis@floatcountedfalse
}
\apptocmd\@xfloat{%
\ifx\@captype\thesis@figure\thesis@floatclaim\thesissetfig{figure}\fi
\ifx\@captype\thesis@table\thesis@floatclaim\thesissettbl{table}\fi
}{}{}
\apptocmd\end@float{\thesis@floatrollback}{}{}
\apptocmd\end@dblfloat{\thesis@floatrollback}{}{}
\def\thesisfloatcount#1{\ifthesis@floatcounted\global\thesis@floatcountedfalse\else#1\fi}
\def\thesisfloathooks{%
\ifx\@captype\thesis@figure\thesisfloatcount\thesissetfig\fi
\ifx\@captype\thesis@table\thesisfloatcount\thesissettbl\fi
}
\def\thesisfigurehooks{%
\ifx\@captype\thesis@lstlisting\thesissetlst\fi
}
% longtable is no float: it steps its counter in \LT@array and never reaches
% \caption@refstepcounter, so we claim the number there (and roll it back again if
% the table carries no caption at all)
\AddToHook{package/longtable/after}{%
\pretocmd\LT@array{%
\edef\thesis@lt@type{\LTcaptype}%
\ifx\thesis@lt@type\thesis@table\thesis@floatclaim\thesissettbl{table}\fi
}{}{}%
% the assignment has to happen within the \noalign group of the caption, as we are
% in the middle of an alignment here
\patchcmd\LT@caption{\noalign\bgroup}{\noalign\bgroup\global\thesis@floatcountedfalse}{}{}%
\apptocmd\endlongtable{\thesis@floatrollback}{}{}%
}
\AddToHook{begindocument/end}{%
\pretocmd\caption@refstepcounter{\thesisfloathooks}{}{}%
\def\p@subfigure{\thefigure/}%
\def\p@subtable{\thetable/}%
}
\AddToHook{cmd/caption/before}{%
\thesisfigurehooks
}%
\def\HookCustomEnvCount#1#2{\pretocmd\caption@iftype{#2}\relax\relax}
\fi
\appto\captionsngerman{\def\figurename{Abbildung}\def\figureautorefname{\figurename}\def\tablename{Tabelle}\def\tableautorefname{\tablename}}
\appto\captionsenglish{\def\figurename{Figure}\def\figureautorefname{\figurename}\def\tablename{Table}\def\tableautorefname{\tablename}}
% \global\c@exa@lb0 \global\c@nts@lb0
% \AddToHook{shipout/after}{\global\c@figure@lb0 \global\c@table@lb0}
\def\thesis@sn@setup{\insidenotetrue\let\label\creflbl\thesis@ragged\thesissidebarhook}
\long\def\thesis@sn@gd@#1{\parbox\linewidth{\thesis@sn@setup#1\vskip2.25pt}}
% patch faulty cref restoration in notecolumn
\def\creflbl#1{\cref@old@label{#1}\@bsphack\edef\@tempa{{page}{\the\c@page}}\setcounter{page}{1}\edef\@tempb{\thepage}\expandafter\setcounter\@tempa\cref@constructprefix{page}{\cref@result}\protected@write\@auxout{}{\string\newlabel{#1@cref}{{\cref@currentlabel}{[\@tempb][\arabic{page}][\cref@result]\thepage}{}{}{}}}\@esphack}
\RequirePackage{alphalph}
% i do not like italic small caps, furthermore, most fonts do not support them
\def\@@formatcounter#1#2{%
\smash{\textit{\LiningFigures% use lining figures for references
#1}%
%/
%\kern-.33pt i am no fan of modified small caps
\textup{\textsc{\alphalph#2}}%
}%
}%
\robustify{\@@formatcounter}%
\def\@formatcounter#1#2{%
\@@formatcounter{\curpgnum}{#2}%
}
\ifthesis@pageInFloatRef
\def\thefigure{\@formatcounter f{\c@figure@lb}}
\def\thetable{\@formatcounter t{\c@table@lb}}
% this has to happen very late because... well... thank you listings
\AddToHook{begindocument/end}{%
\def\thelstlisting{\@formatcounter l{\c@lstlisting@lb}}%
\let\thesis@orig@lstmakecaption\lst@MakeCaption
\def\lst@MakeCaption#1{%
\ifx #1t\ifx\lst@@caption\@empty\else\thesissetlst\fi\fi
\thesis@orig@lstmakecaption{#1}%
}%
}
\fi
\def\makelongrefs{%
\ifthesis@pageInFloatRef
\def\thefigure{Figure~\@formatcounter f{\c@figure@lb}}%
\def\thetable{Table~\@formatcounter t{\c@table@lb}}%
\def\thelstlisting{Listing~\@formatcounter l{\c@lstlisting@lb}}%
\fi
% \def\thesubfigure{Subfigure~\@formatcounter f{\c@figure@lb/\alph{subfigure}}}%
% \def\theexa{Example~\@formatcounter e{\c@exa@lb}}%
% \def\thents{Note~\@formatcounter n{\c@nts@lb}}%
}
\ifthesis@pageInFloatRef
\DeclareCaptionLabelFormat{noprefix}{\thesis@fig@style{\itshape\makelongrefs#2:~~}}
\captionsetup{labelformat=noprefix}
\fi
% region margin floats
\RequirePackage{environ}
\newcounter{thesis@sidefloat@n}
\def\thesissidefloathook{\captionsetup{font=scriptsize,textfont={color=black,rm,sl,scriptsize}}}
\ifthesis@marginpar
\RequirePackage{fancyvrb}
\long\def\thesis@sidefloat#1#2#3{\sidenote[#3]{\captionsetup{type=#2}\thesissidefloathook#1}}
\def\thesis@sidefloat@open#1{%
\stepcounter{thesis@sidefloat@n}%
\def\thesis@sidefloat@type{#1}%
\VerbatimEnvironment
\edef\thesis@sidefloat@file{\jobname.sfl\arabic{thesis@sidefloat@n}}%
\expandafter\VerbatimOut\expandafter{\thesis@sidefloat@file}%
}
\def\thesis@sidefloat@close{%
\endVerbatimOut
\edef\thesis@sidefloat@args{%
{\noexpand\input{\thesis@sidefloat@file}}{\thesis@sidefloat@type}{\z@}%
}%
\expandafter\thesis@sidefloat\thesis@sidefloat@args
}
\else
\long\def\thesis@sidefloat#1#2#3{\@float{#2}[htbp]#1\end@float}
\def\thesis@sidefloat@open#1{\@float{#1}[htbp]}
\def\thesis@sidefloat@close{\end@float}
\fi
\NewEnviron{sidefloat}[2][\z@]{\expandafter\thesis@sidefloat\expandafter{\BODY}{#2}{#1}}
\NewEnviron{sidefig}[1][\z@]{\expandafter\thesis@sidefloat\expandafter{\BODY}{figure}{#1}}
\NewEnviron{sidetbl}[1][\z@]{\expandafter\thesis@sidefloat\expandafter{\BODY}{table}{#1}}
\newenvironment{sidefloat*}[1]{\thesis@sidefloat@open{#1}}{\thesis@sidefloat@close}
\newenvironment{sidefig*}{\thesis@sidefloat@open{figure}}{\thesis@sidefloat@close}
\newenvironment{sidetbl*}{\thesis@sidefloat@open{table}}{\thesis@sidefloat@close}
% endregion
% region empty lists
\newif\ifthesis@toc@complete
\def\thesis@toc@complete{\global\thesis@toc@completetrue}
\def\thesis@toc@register#1{\csgdef{thesis@toc@used@#1}{}}
\def\thesis@toc@note#1{%
\ifcsname thesis@toc@seen@#1\endcsname\else
\csgdef{thesis@toc@seen@#1}{}%
\if@filesw\protected@write\@mainaux{}{\string\thesis@toc@register{#1}}\fi
\ifcsname thesis@toc@hidden@#1\endcsname
\thesis@warn{The list of '#1' was omitted as it was empty, it will appear with the next LaTeX pass}%
\fi
\fi
}
\long\def\thesis@addcontentsline#1#2#3{%
\thesis@toc@note{#1}\thesis@orig@addcontentsline{#1}{#2}{#3}%
}
\def\thesisHideEmptyList#1#2{%
\ifthesis@toc@complete
\ifcsname thesis@toc@used@#1\endcsname\else
\ifcsname #2\endcsname\csgdef{thesis@toc@hidden@#1}{}\csdef{#2}{}\fi
\fi
\fi
}
\ifthesis@hideEmptyLists
\AddToHook{enddocument/afterlastpage}{%
\if@filesw\immediate\write\@mainaux{\string\thesis@toc@complete}\fi
}
\AddToHook{begindocument/end}{%
\let\thesis@orig@addcontentsline\addcontentsline
\let\addcontentsline\thesis@addcontentsline
\thesisHideEmptyList{lof}{listoffigures}%
\thesisHideEmptyList{lot}{listoftables}%
\thesisHideEmptyList{lol}{lstlistoflistings}%
\thesisHideEmptyList{lop}{listofpseudo}%
}
\fi
% endregion
% just my likings
\AtBeginDocument{%
\def\fps@figure{tbp}\let\fps@table\fps@figure
\c@topnumber\tw@
\c@bottomnumber\@ne
\c@totalnumber\thr@@
\def\floatpagefraction{.7}% 0.2
\def\topfraction{.7}% 0.7
\g@addto@macro\end@float{%
\ifnum\@floatpenalty<0 \ifnum\@floatpenalty<-\@Mii
\else\ifhmode\if@ignore\penalty\@M \hskip\z@skip\fi\fi
\fi\fi}%
}_config/internal/fonts.tex · 4 KB
\RequirePackage[T1]{fontenc}
\PassOptionsToPackage{protrusion=true,expansion=true,tracking=true,nopatch=toc}{microtype}
\RequirePackage{microtype}
\ifluatex
\thesis@debug{Loading fontspec for LuaLaTeX fonts}
\RequirePackage{fontspec}
\ifthesis@palatino
\thesis@debug{Loading Palatino font}
\setmainfont[Ligatures=TeX,Numbers=OldStyle]{TeX Gyre Pagella}
\fi
\ifthesis@beramono
\thesis@debug{Loading Beramono font}% used by classicthesis
\setmonofont[Scale=0.85]{DejaVu Sans Mono}
\fi
\else
\RequirePackage[utf8]{inputenc}
\ifthesis@palatino
\thesis@debug{Loading Palatino font}
\RequirePackage{tgpagella}
\fi
\ifthesis@notomath
\thesis@debug{Setup Noto Math font}
\RequirePackage[vvarbb]{notomath}
\else
% \PassOptionsToPackage{}{mathpazo}
\RequirePackage[osf]{mathpazo}
% bold small caps definition by https://tex.stackexchange.com/a/418097
\AtBeginDocument{%
\DeclareFontShape{T1}{pplj}{b}{sc}{<-> ec-qplb-sc}{}
\DeclareFontShape{T1}{pplj}{bx}{sc}{<->ssub * qpl/b/sc}{}
}
\fi
\ifthesis@beramono
\thesis@debug{Loading Beramono font}
\PassOptionsToPackage{scaled=.85}{beramono}
\RequirePackage{beramono}
\fi
\fi
\ifthesis@enhanceMath
% under LuaLaTeX unicode-math (loaded below) supplies the script alphabets
% itself and would overwrite this declaration anyway
\ifluatex\else
\thesis@debug{Enhancing mat typesetting}
\DeclareMathAlphabet{\mathcal}{OMS}{cmsy}{m}{n}
\fi
\fi
\ifthesis@fira
\thesis@debug{Loading fira sans-serif font}%
\RequirePackage{FiraSans}
\fi
% % use lining figures in tables
\ifluatex
% mathtools wants to see the legacy math setup, so it has to come first (the
% class requires it again later on, which is a no-op by then)
\RequirePackage{mathtools}
\RequirePackage{unicode-math}\def\LiningFigures{\addfontfeatures{Numbers=Lining}\sisetup{text-font-command=\addfontfeatures{Numbers=Lining}}}
% notomath is a pdfLaTeX-only package: loading it on top of unicode-math clashes
% over the delimiters ('Command \arrowvert already defined'), so we ask
% unicode-math for the matching OpenType face instead
\ifthesis@notomath
\IfFontExistsTF{Noto Sans Math}{%
\thesis@debug{Setup Noto Math font}%
\setmathfont{Noto Sans Math}%
}{%
\thesis@warn{The font 'Noto Sans Math' is not installed, falling back
to 'TeX Gyre Pagella Math'. Install the Noto fonts or pass
'notomath=false' to silence this warning}%
\setmathfont{texgyrepagella-math.otf}%
}
\else
\thesis@debug{Setup TeX Gyre Pagella Math font}
\setmathfont{texgyrepagella-math.otf}
\fi
\else
\def\LiningFigures{\figureversion{lf}\selectfont\sisetup{text-font-command=\figureversion{lf}\selectfont}}
\fi
\AtBeginEnvironment{tabular}{\LiningFigures}
\AtBeginEnvironment{tabularx}{\LiningFigures}
\AtBeginEnvironment{longtable}{\LiningFigures}
% more space to breathe
\DeclareRobustCommand{\scshapespaced}{\SetTracking{encoding=*}{95}\scshape}
% TODO: make customizable
% \addtokomafont{disposition}{\rmfamily\scshapespaced}
% \SetTracking{encoding=*}{125}\fontseries{sb}\selectfont
\ifthesis@sftitle
\addtokomafont{disposition}{\normalfont\sffamily\itshape}
\else
\addtokomafont{disposition}{\normalfont\itshape}
\fi
\RedeclareSectionCommand[font=\usekomafont{disposition}\huge]{chapter}
\RedeclareSectionCommand[afterskip=\medskipamount,beforeskip=1.75em]{section}
\RedeclareSectionCommand[afterskip=\smallskipamount,beforeskip=\bigskipamount]{subsection}
\RedeclareSectionCommand[afterskip=\smallskipamount,beforeskip=\medskipamount]{subsubsection}
\setkomafont{partentry}{\rmfamily}
\setkomafont{chapterentry}{\rmfamily}
\setkomafont{descriptionlabel}{\normalfont\bfseries}
% \setkomafont{sectionentry}{\rmfamily}
\def\sbseries{\fontseries{sb}\selectfont}
\def\textsb#1{\begingroup\sbseries#1\endgroup}
% 'ppl' is the Type1 Palatino with lining figures; under LuaLaTeX the main font
% comes from fontspec and only knows the corresponding OpenType feature
\ifluatex
\def\thesis@liningnumbers{\addfontfeatures{Numbers=Lining}}
\else
\def\thesis@liningnumbers{\fontfamily{ppl}\selectfont}
\fi_config/internal/footnote.tex · 2 KB
\def\thesis@footnote@symbol@#1{%
% $\langle$
#1% $\rangle$%
}
\thesis@info{Apply footnote patch}
\DeclareCommandCopy\footnote\thesis@oldfootnote
\newcounter{thesis@side@footnote}[chapter]
\def\thesis@footnote@symbol{%
\label{thesis@side@footnote@tar:\thesection:\arabic{thesis@side@footnote}}%
\smash{\textsuperscript{%
\thesis@footnote@symbol@{%
\raisebox{-2pt}{\hyperref[thesis@side@footnote@side:\thesection:\arabic{thesis@side@footnote}]{\@arabic\c@thesis@side@footnote}}%
}%
}}%
}
\def\thesis@footnote@side#1{%
\expandsidenote{%
\protect\thesis@fnte{\thesection}{\arabic{thesis@side@footnote}}{#1}%
}%
}
\ifthesis@marginpar
% TODO: optional argument...
\long\def\footnote#1{%
\phantomsection
\stepcounter{thesis@side@footnote}%
\thesis@footnote@symbol
\thesis@footnote@side{#1}%
}
\else
\thesis@info{No footnote patch for marginpar as marginpar is disabled. Only apply style.}
\AtEndPreamble{% load after hyperref
\def\thesis@footnoteref@footnote{fn@\arabic{footnote}}
\def\thesis@footnoteref@mpfootnote{fn@\alph{mpfootnote}}
\def\thefootnote{\thesis@footnote@symbol@{\@arabic\c@footnote}}
\def\thempfootnote{\thesis@footnote@symbol@{\@alph\c@mpfootnote}}
\preto\@footnotemark{\phantomsection\label{thesis@fn:\thesection:\csname thesis@footnoteref@\@mpfn\endcsname}}
\deffootnote{2em}{1em}{%\nohyper{
\makebox[2em][r]{\thesis@disablehyper{\hyperref[thesis@fn:\thesection:\csname thesis@footnoteref@\@mpfn\endcsname]{\thefootnotemark}}}~}
}
\endinput
\fi
% #1 section; #2 fn; #3 text
\def\thesis@fnte#1#2#3{%
\strut\phantomsection
\label{thesis@side@footnote@side:#1:#2}%
\thesis@disablehyper{%
\hyperref[thesis@side@footnote@tar:#1:#2]{%
\thesis@footnote@symbol@{{\color{@link}#2}}.%
}\!~%
}
\hyphenpenalty1000\relax
\exhyphenpenalty1000\relax
\thesis@disablehyper{#3}\strut
}
\PassOptionsToPackage{calc, en-US}{datetime2}
\RequirePackage{datetime2}
\def\FootUrlDateFormat#1{\space\strut\mbox{(\DTMdate{#1})}}
\newcommand*\footrawurl[3][]{\footnote{#1#2\protect\FootUrlDateFormat{#3}}}
\newcommand*\footurl[3][]{\footrawurl[#1]{\url{#2}}{#3}}
\newcommand*\foothref[4][]{\footrawurl[#1]{\href{#2}{#3}}{#4}}_config/internal/glossary.tex · 8 KB
% TODO: clean up, heavily based on my bachelor thesis configuration
\RequirePackage[
acronym,
nopostdot,
numberedsection=nameref,
section,
noglossaryindex,
translate=babel
]{glossaries-accsupp}
% \noist % disable index style file
\RequirePackage{glossary-longragged}
\newif\if@lglos@atinit@glossary@
% single- and plural-page
% this is a hack. i check if 'delimN' or 'delimR' are in the page def
% therefore i execute the page-commands but gobble all of their outputs
\newsavebox\@lglos@la@void
\def\@lglos@hide@in@da@void#1{\sbox\@lglos@la@void{#1}}
% TODO: translate
\newif\iflglos@thispage@issingle@
\let\lglos@legacy@delimN\delimN
\let\lglos@legacy@delimR\delimR
\def\lglos@delimN{%
\global\lglos@thispage@issingle@false\lglos@legacy@delimN
}
\def\lglos@delimR{%
\global\lglos@thispage@issingle@false\lglos@legacy@delimN
}
% #1 if lglos@spage or @ppage, #2 content
\def\@glos@strutinit{\vspace{\dimexpr-\ht\strutbox+\dp\strutbox}\thesis@marginpar@font\scriptsize}
\def\@@lglos@printpages#1#2{%
\sidenote*{\@glos@strutinit#1:~\nohyper{#2.}%
}%
}
\def\@lglos@printpages#1{%
\protected@edef\@tmp@curpage@pagename{\iflglos@thispage@issingle@\lglos@spage\else\lglos@ppage\fi}%
\expandafter\@@lglos@printpages\expandafter{\@tmp@curpage@pagename}{#1}%
}
\def\lglos@printpages#1{%
\let\delimN\lglos@delimN\let\delimR\lglos@delimR
\lglos@thispage@issingle@true\@lglos@hide@in@da@void{#1}%
\@lglos@printpages{#1}%
}
\long\def\SetTheGlossaryStyle#1{%
\long\gdef\lglos@headingstyle##1{#1{##1}}%
}
\def\lglos@default@headingstyle#1{%
\begin{center}%
\strut\emph{#1}%
\end{center}%
}
\def\lglos@default@headingstyle@short#1{\medskip}
\def\lglos@desc@options{}
\newglossarystyle{lecture@glossary}{%
\setglossarystyle{tree}%
\renewcommand\glsgroupheading[1]{%
\if@lglos@atinit@glossary@\else
\def\lglos@enddesc{\end{description}}%
\expandafter\lglos@enddesc
\fi
\global\@lglos@atinit@glossary@false
\lglos@headingstyle{\glsgetgrouptitle{##1}}%
\protected@edef\lglos@curdesc{\noexpand\begin{description}[\lglos@desc@options]}\expandafter\lglos@curdesc
}%
\renewenvironment{theglossary}{%
\parindent\z@ \parskip\z@
\global\@lglos@atinit@glossary@true
}{\end{description}}%#
\renewcommand\glossentry[2]{%reset of tree to pad pagenumbers
\hangindent\z@ \parindent\z@
\item[\glsentryitem{##1}\glstreenamefmt{\glstarget{##1}{\glossentryname{##1}}}]%
\strut\lglos@printpages{##2}\ifglshassymbol{##1}{\space(\glossentrysymbol{##1})}{}%
\glstreepredesc\glossentrydesc{##1}\glspostdescription{}\par
}%
}
\setglossarystyle{lecture@glossary}
\AtEndPreamble{\makeglossaries}% so we can have new types etc.
\preto\printglossaries{\begingroup\thesisglsinsidefalse\interlinepenalty\@M}
\appto\printglossaries{\endgroup}
\newrobustcmd*\glslong[1]{{\glsreset{#1}\gls{#1}}}\newrobustcmd*\glspllong[1]{{\glsreset{#1}\glspl{#1}}}
\newrobustcmd*\glsshort[1]{{\glsunset{#1}\gls{#1}}}\newrobustcmd*\glsplshort[1]{{\glsunset{#1}\glspl{#1}}}
\newrobustcmd*\Glslong[1]{{\glsreset{#1}\Gls{#1}}}\newrobustcmd*\Glspllong[1]{{\glsreset{#1}\Glspl{#1}}}
\newrobustcmd*\Glsshort[1]{{\glsunset{#1}\Gls{#1}}}\newrobustcmd*\Glsplshort[1]{{\glsunset{#1}\Glspl{#1}}}
% will be used in sidebar notes
\glsaddstoragekey{shortdesc}{\glsentrydesc{\glslabel}}{\glsshortentrydesc}
\def\thesis@shortgls{\protect\glsshortentrydesc{\glslabel}}
% change gls base; does never print long for ac;
\newif\ifglsshouldbeit \glsshouldbeittrue% falses are all in group
\def\thesis@gls@repeated@use{\glsentrytext}
\def\thesis@Gls@repeated@use{\Glsentrytext}
\def\@thesis@gls#1#2#3{\@insertchk{\ifglsused{#1}{#3{#1}}{#2{#1}}}}
\def\@insertchk#1{\ifx\glsinsert\@empty#1\else\glsinsert\fi}%
\def\thesissidenotebase{% \ifglsshouldbeit\expandafter\textit\fi
% !\glsinsert!\glslabel!\glstype @\@insertchk{\@gls@link[]{\glslabel}{x}}%
% \glsifplural{\glslabel}{\glslink{\glslabel}{\ifglsused{\glslabel}{\glsentryplural{\glslabel}}{\glsentryfirst{\glslabel}}}}{\glslink{\glslabel}{\ifglsused{\glslabel}{\glsentryname{\glslabel}}{\glsentryfirst{\glslabel}}}%
\ifdefempty\glscustomtext{%
\glsifplural{%
\glscapscase{%
\@thesis@gls\glslabel\glsentryfirstplural\glsentryplural
}{%
\@thesis@gls\glslabel\Glsentryfirstplural\Glsentryplural
}{%
\mfirstucMakeUppercase{\@thesis@gls\glslabel\glsentryfirstplural\glsentryplural}%
}%
}{%
\glscapscase{%
\@thesis@gls\glslabel\glsentryfirst\thesis@gls@repeated@use
}{%
\@thesis@gls\glslabel\Glsentryfirst\thesis@Gls@repeated@use
}{%
\mfirstucMakeUppercase{\@thesis@gls\glslabel\glsentryfirst\thesis@gls@repeated@use}%
}%
}%
}{\glslink{\glslabel}{\@insertchk{\glscustomtext}}}}%
\def\thesissidenotesymbol{%
\ifglsshouldbeit\expandafter\textsl\fi{\@insertchk{\glssymbol{\glslabel}}}%
}
\def\thesis@sidesymbol#1{%
\disablesidefalse\glslink{#1}{\textbf{\glsentrytext{#1}}}:\disablesidetrue\space\thesis@shortgls
}
\robustify\thesis@sidesymbol
\newif\ifthesisglsinside \thesisglsinsidetrue
\def\GlsResetSide#1{\checkoddpage\csundef{gls@lock@#1@\number\oddpage@page}}
% #1 will only be executed if not locked; #2 is the label; #3 is else
\def\thesisgls@lockForPage#1#2#3{\ifthesisglsinside% we identify the exact page:
\checkoddpage% used so i do not have to fiddle with page label
% we lock the current label for the page;
\ifcsname gls@lock@#2@\number\oddpage@page\endcsname
{#3}%
\else
\expandafter\gdef\csname gls@lock@#2@\number\oddpage@page\endcsname{}\relax
#1\fi
\else
#3%
\fi}
\def\thesissidenotegls{\ifinsidenote\else
\global\glsshouldbeittrue
% disableside to restrict (may-be infinite) propagation
\thesisgls@lockForPage{\thesissidenotebase\expandsidenote{\protect\thesis@sidesymbol{\glslabel}}}{\glslabel}{\global\glsshouldbeitfalse\thesissidenotebase}%
\fi
}
\robustify\thesissidenotegls
\def\thesissidenoteGls{%
\global\glsshouldbeittrue\thesisgls@lockForPage{\thesissidenotebase\expandsidenote{\protect\disablesidefalse\protect\glslink{\glslabel}{\textbf{\capitalisewords{\glsentrytext{\glslabel}}}:\protect\disablesidetrue\protect\space\thesis@shortgls}}}{\glslabel}{\global\glsshouldbeitfalse\thesissidenotebase}%
}
\robustify\thesissidenoteGls
\def\thesissidenoteSymbol{%
\ifmmode\thesissidenotesymbol\else\global\glsshouldbeittrue\thesisgls@lockForPage{\thesissidenotesymbol\expandsidenote{\protect\disablesidefalse\protect\glslink{\glslabel}{\textbf{{\glssymbol{\glslabel}}}}:\protect\disablesidetrue\protect\space\thesis@shortgls}}{\glslabel}{\global\glsshouldbeitfalse\thesissidenotesymbol}\fi%
}
\robustify\thesissidenoteSymbol
% thesissidenotebase deals with proper plural handling :)
\AtBeginDocument{\defglsentryfmt[\acronymtype]{%
{\ifdisableside\global\glsshouldbeitfalse\thesissidenotebase\else\thesissidenotegls\fi}%
}
\defglsentryfmt{%
{\ifdisableside\global\glsshouldbeitfalse\thesissidenotebase\else\thesissidenoteGls\fi}%
}}
\newglossary[ntsl]{notation}{nts}{nto}{Notations}
\defglsentryfmt[notation]{%
\ifdisableside\global\glsshouldbeitfalse\thesissidenotesymbol\else\thesissidenoteSymbol\fi
}
\def\sidesymbol#1{%
\begingroup\def\glslabel{#1}\ifdisableside\else
\global\glsshouldbeittrue\thesisgls@lockForPage{\expandsidenote{\protect\disablesidefalse\protect\glslink{\glslabel}{\textbf{{\glssymbol{\glslabel}}}}:\protect\disablesidetrue\protect\space\thesis@shortgls}}{\glslabel}{}%
\fi\endgroup
}
\RequirePackage{pgffor}
\def\showsymbols{\@ifstar\@showsymbols\@sh@wsymbols}
\def\@showsymbols#1{\smash{\clap{\foreach \x in {#1}{\GlsResetSide{\x}\sidesymbol{\x}}}}}
\def\@sh@wsymbols#1{\smash{\clap{\foreach \x in {#1}{\sidesymbol{\x}}}}}%
\def\glsac#1{\glsentrylong{#1} (\gls{#1})}
\def\glsplac#1{\glsentrylongpl{#1} (\glspl{#1})}
\renewcommand*\glsdohyperlink[2]{%
\@glsshowtarget{#1}\thesis@disablehyper{\hyperlink{#1}{#2}}%
}
\glsenablehyper
\def\lglos@spage{\translate{on-page}}\def\lglos@ppage{\translate{on-pages}}
% \paletteA
\RequirePackage{needspace}
\def\thesisstyle#1{%
\par\needspace{2.25\baselineskip}\strut{%
% \raisebox{\dimexpr.5\ht\strutbox-.5pt}
\large\textrm{#1}\thinspace{\raisebox{.5\height}{\tikz{\draw[thick,line cap=round] (0,0) -- (1,0);}}}%
}%
\smallskip\par
}
\SetTheGlossaryStyle{\thesisstyle}_config/internal/headfoot.tex · 964 B
\PassOptionsToPackage{automark}{scrlayer-scrpage}
\ifthesis@oneside
\PassOptionsToPackage{autooneside=false}{scrlayer-scrpage}
\fi
\RequirePackage{scrlayer-scrpage}
\pagestyle{scrheadings}
\clearpairofpagestyles
% \cfoot{[\today]}
\renewcommand*{\chaptermark}[1]{%
\markboth% do not use markright for single page layouts, as i show both marks on each page
{\MakeMarkcase{\Ifnumbered{chapter}{%
\thechapter\autodot\enskip
}{}#1}%
}{}%
}%
\addtokomafont{pagenumber}{\thesis@liningnumbers}
\ifthesis@marginpar
\ifthesis@oneside
\ohead{\rightmark}
\ihead{\leftmark}
\ofoot*{\null\rlap{\hskip\marginparsep\hb@xt@\marginparwidth{\null\hfill\pagemark\hfill}}}
\else
\lehead{\headmark}
\lefoot*{\llap{\hb@xt@\marginparwidth{\null\hfill\pagemark\hfill}\hskip\marginparsep}}
\rohead{\headmark}
\rofoot*{\rlap{\hskip\marginparsep\hb@xt@\marginparwidth{\null\hfill\pagemark\hfill}}}
\fi
\else
% TODO
\fi
% TODO: configure if in head or foot, but maybe with author?_config/internal/hyperref.tex · 7 KB
\ifthesis@hyperref\else
\thesis@info{Disable automatic hyperref configuration (disabled)}
\endinput
\fi
\thesis@info{Apply hyperref configuration}
\PassOptionsToPackage{
unicode=true,
draft=false,
backref,
pagebackref=false,
bookmarks=true,
bookmarksopen=false,
bookmarksdepth=5,
pdfdisplaydoctitle,
pdfborder={0 0 0},
% breaklinks,
colorlinks,
hyperindex,%
% linktocpage=true,
urlcolor=@url,
linkcolor=@link,
citecolor=@cite
}{hyperref}
% TODO: custom toc colors so that name has none but page has
\PassOptionsToPackage{hyphens}{url}
\RequirePackage{hyperref}
\RequirePackage{bookmark}
\ifthesis@draft\else\PassOptionsToPackage{all}{hypcap}\RequirePackage{hypcap}\fi
\def\thesis@@disablehyper{\hypersetup{allcolors=.}}
\def\thesis@disablehyper#1{\begingroup\thesis@@disablehyper#1\endgroup}
\let\nohyper\thesis@disablehyper
\ifthesis@draft\else
\AtBeginDocument{%
% \translate is robust and would survive into the PDF string unexpanded,
% \translatelet hands us the plain replacement text instead
{\translatelet\@subject{\thesis@type}\def\nl{\space}%
\hypersetup{%
pdftitle={\@title},
pdfauthor={\@author},
pdfsubject={\@subject}
}}%
}
\fi
% set hyperlinks in tableofcontents, based on https://tex.stackexchange.com/a/588878
\newcommand*\thesis@toc@entrynumber[1]{\bgroup
\thesis@@disablehyper\itshape\ifx\Hy@tocdestname\ltx@empty #1\else
\hyper@linkstart{link}{\Hy@tocdestname}#1\hyper@linkend
\fi\egroup
}
% linked by configuration
\newcommand*\thesis@toc@entry[1]{\bgroup\thesis@@disablehyper#1\egroup}
\newcommand*\thesis@toc@pagenumber[1]{%
\ifx\Hy@tocdestname\ltx@empty #1\else
\hypersetup{linkcolor=@link}\hyper@linkstart{link}{\Hy@tocdestname}#1\hyper@linkend
\fi
}
\DeclareTOCStyleEntries[
entrynumberformat=\thesis@toc@entrynumber,
entryformat=\thesis@toc@entry,
pagenumberformat=\thesis@toc@pagenumber
]{tocline}{part,chapter,section,subsection,subsubsection,paragraph,subparagraph,figure,table}
\newcommand*\thesis@toc@chap@entry[1]{\bgroup\thesis@@disablehyper\textit{#1}\egroup}
\DeclareTOCStyleEntries[
entrynumberformat=\thesis@toc@entrynumber,
entryformat=\thesis@toc@chap@entry,
pagenumberformat=\thesis@toc@pagenumber,
beforeskip=.5em plus 1pt
]{tocline}{chapter}
\RequirePackage{varioref}
\RequirePackage[capitalise,noabbrev,nameinlink]{cleveref}
\RequirePackage{fontawesome}
% append the format so that it produces something in the margin
\DeclareCommandCopy\basicCref\Cref% NOTE: i capitalize this way, so varioref is not affected.
\DeclareCommandCopy\basiccref\cref
\def\cref{\@ifstar\basicCref\modifiedcref} \robustify\cref
\def\Cref{\cref} \robustify\Cref% brrrh -- but as we capitalise anyway with calling basicCref
\newcount\crefsidebarcounter
\newif\ifcrefsidebarfirst
\def\hyperlinksymbol{\smash{\scalebox{-.75}[.75]{\faLink}}}
% #1 is link #2 potential override mark, #3 is first prefix, #4 is afterward
\def\crefmultipleref#1#2#3#4{%
\crefsidebarcounter0\relax
\@for\lnk:={#1}\do{\global\advance\crefsidebarcounter1}%
\crefsidebarfirsttrue\hyperlinksymbol~%
\@for\lnk:={#1}\do{%
\thesis@disablehyper{%
\global\advance\crefsidebarcounter-1%
\ifcsname r@\lnk\endcsname
\ifcrefsidebarfirst
\crefsidebarfirstfalse
\smash{#3}%
\else
\smash{#4}%
\fi
\smash{~}%
\ifx!#2!\relax%
\vpageref{\lnk}%
\else
\vpageref[#2]{\lnk}%
\fi
\fi
\smash{%
\ifnum\crefsidebarcounter>0\relax
\ifnum\crefsidebarcounter=1\relax
\smash{,~and }%
\else
\smash{,~}%
\fi
\else.\fi
}%
}%
}%
}
% hide 'on page' refs for floats whose number already contains the page
\newif\ifthesis@allfloatrefs
\ifthesis@floatRefSidenotes
\def\thesis@checkallfloatrefs#1{\thesis@allfloatrefsfalse}
\else
\@for\thesis@@type:={figure,subfigure,table,lstlisting,pseudo}\do{%
\csedef{thesis@hidepgref@\thesis@@type}{}%
}
\def\thesis@checkallfloatrefs#1{%
\thesis@allfloatrefstrue
\@for\thesis@@lbl:={#1}\do{%
\ifcsname r@\thesis@@lbl @cref\endcsname
\cref@gettype{\thesis@@lbl}{\thesis@@reftype}%
\ifcsname thesis@hidepgref@\thesis@@reftype\endcsname\else\thesis@allfloatrefsfalse\fi
\else
\thesis@allfloatrefsfalse
\fi
}%
}
\fi
% optional argument is ONLY for varioref in case of the same page
\newcommand*\modifiedcref[2][\reftextcurrent]{%
\thesis@disablehyper{%
\hyperref[#2]{\basicCref*{#2}}%
\thesis@checkallfloatrefs{#2}%
\ifthesis@allfloatrefs\else
\ifinsidenote
\space(\vpageref[#1]{#2})%
\else
\sideref[#1]{#2}%
\fi
\fi
}%
}
\newcommand*\sideref[2][]{\protect\siderefhelper{#2}{#1}}
\def\siderefhelperDo#1#2{\vskip-2.25pt\strut\crefmultipleref{#1}{#2}{\basicCref{\lnk}}{\basiccref{\lnk}}\strut}
\def\siderefhelper#1#2{\smash{\sidenote*[-5\p@]{\siderefhelperDo{#1}{#2}}}}
% focuses on single #3 is text
\newcommand*\customref[3][]{\protect\customrefhelper{#2}{#1}{#3}\thesis@disablehyper{\hyperref[#2]{#3}}}
\newcommand*\customsideref[3][]{\protect\customrefhelper{#2}{#1}{#3}}
\def\sidewordis{}
\def\customrefhelper#1#2#3{\smash{\sidenote*[-5\p@]{\vskip-2.25pt\crefmultipleref{#1}{#2}{\MakeUppercase#3\sidewordis}{#3\sidewordis}}}}
\robustify\sideref
% #3 guard
\newcommand*\guardedSideref[3][]{\protect\guardedSiderefhelper{#2}{#1}{#3}}
\def\guardedSiderefDo#1#2#3{%
\checkoddpage % for the guard TODO: deal with spaces if not present?
\ifcsname#3\endcsname\vskip\dimexpr-\baselineskip-3pt\relax\else
\thesis@sn@gd{-3\p@}{\csxdef{#3}{}%
\crefmultipleref{#1}{#2}{\basicCref{\lnk}}{\basiccref{\lnk}}%
}%
\fi
}
\def\guardedSiderefhelper#1#2#3{\smash{%
\makenote*{\guardedSiderefDo{#1}{#2}{#3}}%
}}
\robustify\guardedSideref
\def\plainlink#1#2{\thesis@disablehyper{\hyperref[#1]{\itshape#2}}}
\newcommand\sidelink[3][]{\smash{\sidenote*{\crefmultipleref{#2}{#1}{\MakeUppercase #3}{#3}}}\plainlink{#2}{#3}}
\def\link{\@ifstar\plainlink\sidelink}
% TODO: join, like 'section 1.5 and 2.3 can be found on pages 31 and 52.
% TODO: add flags for notation glossary that is used for e.g. E_A etc.
\PassOptionsToPackage{super}{nth}
\RequirePackage{nth}
% the raise is wayyy to much:
\def\nthscript#1{\smash{\textsuperscript{\raisebox{-2pt}{#1}}}}
\def\nthpagelink#1{\hyperlink{page.#1}{\nth{#1}}}
\hypersetup{pageanchor=true}
% TODO: german
\vref@addto\extrasenglish{%
\def\reftextcurrent{on this page}%
\def\reftextfaraway#1{on page\smash{~\pageref{#1}}}%
\def\reftextfaceafter{on the \reftextvario{next}{facing} page}%
\def\reftextfacebefore{on the previous page}%
\def\reftextafter{on \reftextvario{page~\smash{\hyperpage{\thevpagerefnum}}}{page~\smash{\hyperpage{\thevpagerefnum}}}}% the~\smash{\nthpagelink{\thevpagerefnum}} page
\def\reftextbefore{on \reftextvario{page~\smash{\hyperpage{\thevpagerefnum}}}{page~\smash{\hyperpage{\thevpagerefnum}}}}% the~\smash{\nthpagelink{\thevpagerefnum}} page
\def\reftextpagerange#1#2{pages~\smash{\pageref{#1}}--\smash{\pageref{#2}}}%
\def\reftextlabelrange#1#2{\smash{\ref{#1}} to~\smash{\ref{#2}}}%
}
\appto\extrasngerman{%
\Crefname{eq}{Gleichung}{Gleichungen}%
\Crefname{algocfline}{Zeile}{Zeilen}%
}
\appto\extrasenglish{%
\Crefname{eq}{Equation}{Equations}%
\Crefname{algocfline}{Line}{Lines}%
}
_config/internal/layout.tex · 325 B
\IfFileExists{widows-and-orphans.sty}{
\thesis@info{Loading widows-and-orphans to improve layout}
\RequirePackage[check=warning,avoid-all]{widows-and-orphans}
}{
\thesis@warn{Could not find widows-and-orphans, using nowidow}
\RequirePackage[defaultlines=3,all]{nowidow}
}
\parskip\medskipamount
\parindent\z@_config/internal/license.tex · 3 KB
\RequirePackage{ccicons}
\def\thesis@license@CCBY{
\deftranslation[to=German]{license}{%
Dieses Werk ist lizenziert unter einer \textit{Creative Commons Attribution~4.0} Lizenz.
Um eine Kopie dieser Lizenz zu sehen, besuchen Sie \url{https://creativecommons.org/licenses/by/4.0/} oder schreiben Sie einen Brief an Creative Commons, PO Box 1866, Mountain View, CA 94042, USA.
}
\deftranslation[to=English]{license}{%
This work is licenced under the \textit{Creative Commons Attribution~4.0} license.
To view a copy of this license, visit \url{https://creativecommons.org/licenses/by/4.0/} or send a letter to Creative Commons, PO Box 1866, Mountain View, CA 94042, USA.
}
\def\thesis@license@symbols{\ccby}
}
\def\thesis@license@CCBYSA{
\deftranslation[to=German]{license}{%
Dieses Werk ist lizenziert unter einer \textit{Creative Commons Attribution Share-Alike~4.0} Lizenz.
Um eine Kopie dieser Lizenz zu sehen, besuchen Sie \url{https://creativecommons.org/licenses/by-sa/4.0/} oder schreiben Sie einen Brief an Creative Commons, PO Box 1866, Mountain View, CA 94042, USA.
}
\deftranslation[to=English]{license}{%
This work is licenced under the \textit{Creative Commons Attribution Share-Alike~4.0} license.
To view a copy of this license, visit \url{https://creativecommons.org/licenses/by-sa/4.0/} or send a letter to Creative Commons, PO Box 1866, Mountain View, CA 94042, USA.
}
\def\thesis@license@symbols{\ccbysa}
}
\def\thesis@license@CCBYNC{
\deftranslation[to=German]{license}{%
Dieses Werk ist lizenziert unter einer \textit{Creative Commons Attribution Non-Commercial~4.0} Lizenz.
Um eine Kopie dieser Lizenz zu sehen, besuchen Sie \url{https://creativecommons.org/licenses/by-nc/4.0/} oder schreiben Sie einen Brief an Creative Commons, PO Box 1866, Mountain View, CA 94042, USA.
}
\deftranslation[to=English]{license}{%
This work is licenced under the \textit{Creative Commons Attribution Non-Commercial~4.0} license.
To view a copy of this license, visit \url{https://creativecommons.org/licenses/by-nc/4.0/} or send a letter to Creative Commons, PO Box 1866, Mountain View, CA 94042, USA.
}
\def\thesis@license@symbols{\ccbync}
}
\def\thesis@license@CCBYNCSA{
\deftranslation[to=German]{license}{%
Dieses Werk ist lizenziert unter einer \textit{Creative Commons Attribution Non-Commercial Share-Alike~4.0} Lizenz.
Um eine Kopie dieser Lizenz zu sehen, besuchen Sie \url{https://creativecommons.org/licenses/by-nc-sa/4.0/} oder schreiben Sie einen Brief an Creative Commons, PO Box 1866, Mountain View, CA 94042, USA.
}
\deftranslation[to=English]{license}{%
This work is licenced under the \textit{Creative Commons Attribution Non-Commercial Share-Alike~4.0} license.
To view a copy of this license, visit \url{https://creativecommons.org/licenses/by-nc-sa/4.0/} or send a letter to Creative Commons, PO Box 1866, Mountain View, CA 94042, USA.
}
\def\thesis@license@symbols{\ccbyncsa}
}
\ifcsname thesis@license@\thesis@license\endcsname
\csname thesis@license@\thesis@license\endcsname
\else
\thesis@error{Unknown license '\thesis@license'}{%
Please specify a valid license with \texttt{license=CCBY} or similar.
}
\fi_config/internal/listings.tex · 2 KB
\makeatletter
\RequirePackage[fakeminted=true,extendednums,style={plain number}]{_config/xlistings}
\appto\xlstLanguageSearchPath{,_config/,_config/internal/,_config/langs/}
\ifluatex\else\RequirePackage{mdsymbol}\fi
\def\LeftArrow{\text{\BeginAccSupp{method=escape,ActualText={<-}}\(\leftarrow\)\EndAccSupp{}}}
\def\RightArrow{\text{\BeginAccSupp{method=escape,ActualText={->}}\(\rightarrow\)\EndAccSupp{}}}
\def\DoubleLeftArrow{\text{\BeginAccSupp{method=escape,ActualText={<<-}}\(\twoheadleftarrow\)\EndAccSupp{}}}
\def\DoubleRightArrow{\text{\BeginAccSupp{method=escape,ActualText={->>}}\(\twoheadrightarrow\)\EndAccSupp{}}}
\lstset{add to literate={<-}{{{\!\LeftArrow\!}}}2
{<<-}{{{\!\DoubleLeftArrow\!}}}2
{->}{{{\!\RightArrow\!}}}2
{->>}{{{\!\DoubleRightArrow\!}}}2
}
\definecolor{@numcolor@base}{RGB}{0,57,97}
\colorlet{@numcolor}{gray!80!@numcolor@base!96!black}
\xlstDefineStyles{%
{keywordA: \@declaredcolor{black}\bfseries},% % sb for code not present and this calls so many font errors
{keywordB: \@declaredcolor{black}},%
{keywordC: \@declaredcolor{black}},%
{keywordD: \@declaredcolor{black}\bfseries},%
{literals: \itshape},%
{numbers: \@declaredcolor{@numcolor}}%
}
\lstset{
aboveskip=\z@,belowskip=\z@,
% xlistings sets the basicstyle only within its own styles, so a bare
% \lstinline or lstlisting would inherit the serif body font
basicstyle=\ttfamily
}
\crefname{lstlisting}{Listing}{Listings}%
\Crefname{lstlisting}{Listing}{Listings}%
\crefname{lstnumber}{line}{lines}%
\Crefname{lstnumber}{Line}{Lines}%
\ifthesis@hyperref\@ifundefined{thesis@toc@entry}{}{%
\DeclareTOCStyleEntries[
entrynumberformat=\thesis@toc@entrynumber,
entryformat=\thesis@toc@entry,
pagenumberformat=\thesis@toc@pagenumber
]{tocline}{lstlisting}}\fi
\DeclareCommandCopy\thesis@lstlistoflistings\lstlistoflistings
\def\lstlistoflistings{\bgroup\hypersetup{allcolors=.}\noside{\thesis@lstlistoflistings}\egroup}
\appto\captionsngerman{\def\lstlistlistingname{Liste an Code}}
\appto\captionsenglish{\def\lstlistlistingname{List of Listings}}
\preto\tableofcontents{\disablesidetrue}\appto\tableofcontents{\disablesidefalse}
\preto\listoffigures{\disablesidetrue}\appto\listoffigures{\disablesidefalse}
\preto\listoftables{\disablesidetrue}\appto\listoftables{\disablesidefalse}
\makeatother
_config/internal/marginpar.tex · 3 KB
% has to be available even without the glossary module, as the listings, the
% bibliography, and the margin itself rely on it
\newif\ifdisableside
\ifthesis@marginpar
\thesis@info{Enable marginpar support}
\RequirePackage{mparhack}
\thesis@info{Providing \string\sidenote\space macro for \string\marginpar.}
\RequirePackage{ragged2e}
\def\thesis@marginpar@font{\scriptsize\color{black}}
\def\setmarginfont#1{\def\thesis@marginpar@font{#1}}
\def\marginfont{\thesis@marginpar@font}
\ifthesis@draft
\PassOptionsToPackage{fulladjust,parboxrestore}{marginnote}
\RequirePackage{marginnote}
% safety override
\def\marginfont{\thesis@marginpar@font}
\else
\RequirePackage[draft=false,autoclearnotecolumns]{scrlayer-notecolumn}
\setkomafont{notecolumn.marginpar}{\thesis@marginpar@font}
\fi
\RequirePackage{ifoddpage}
\newcommand*\sidenote{\@ifstar\@sidenote\@@sidenote}
% \expandsidenote expands its content while the note is written, which captures
% transient values (\glslabel, \thechapter, ...) but breaks fragile commands -- it is
% meant for the internals of this class, documents should stick to \sidenote
\newcommand*\expandsidenote{\@ifnextchar[{\s@xsidenote}{\s@xsidenote[\z@]}}
\newif\ifinsidenote
\ifthesis@oneside
\def\thesis@ragged@do#1#2{#1}
\else
\def\thesis@ragged@do#1#2{\checkoddpage\ifoddpage#1\else#2\fi}
\fi
\let\thesisifodd\thesis@ragged@do
\def\thesis@ragged{\thesis@ragged@do{\RaggedRight}{\RaggedLeft}}% \captionsetup{justification=RaggedLeft}
\def\thesisinverseragged{\thesis@ragged@do{\RaggedLeft}{\RaggedRight}}
\def\thesissidebarhook{\urlstyle{rm}}
\long\def\thesis@sn@gd#1#2{\raisebox{#1}{\thesis@sn@gd@{#2}}}
\long\def\thesis@sn@gd@#1{\parbox\linewidth{\insidenotetrue\thesis@ragged\thesissidebarhook#1\vskip2.25pt}}
\def\@sidenote{\@ifnextchar[{\s@sidenote}{\s@sidenote[\z@]}}
\def\@@sidenote{\@ifnextchar[{\s@@sidenote}{\s@@sidenote[\z@]}}
\def\noside#1{\begingroup\disablesidetrue#1\endgroup}
% We want nested sidenotes to appear exactly where they should be and not in a second or third run. Currently i will not do this recursively but just for one level at a time.
\ifthesis@draft
\long\def\s@sidenote[#1]#2{\marginnote{\normalfont\scriptsize\itshape\thesis@sn@gd{#1}{#2}}}
\long\def\s@@sidenote[#1]#2{\marginnote{\normalfont\scriptsize\itshape\thesis@sn@gd{#1}{#2}}}
\let\s@xsidenote\s@@sidenote
\else
\long\def\s@sidenote[#1]#2{\ifx#1\z@ \makenote*{\thesis@sn@gd@{#2}}\else\makenote*{\thesis@sn@gd{#1}{#2}}\fi}
\let\s@@sidenote\s@sidenote
% the expanding variant: \makenote expands its argument when writing the note, which
% silently swallows \label and lets fragile commands like \captionsetup loop forever
\long\def\s@xsidenote[#1]#2{\ifx#1\z@ \makenote{\protect\thesis@sn@gd@{#2}}\else\makenote{\protect\thesis@sn@gd{#1}{#2}}\fi}
\fi
\else
\thesis@info{Disable marginpar support, still supplying sidenote foots}
\long\def\s@sidenote[#1]#2{\footnote{#2}}
\long\def\s@@sidenote[#1]#2{\footnote{#2}}
\let\s@xsidenote\s@@sidenote
\fi_config/internal/page.tex · 703 B
% TODO: configure
\newdimen\thesis@page@margin \thesis@page@margin=2cm
\newdimen\thesis@marginpar@width \thesis@marginpar@width=9.5em
\newdimen\thesis@marginpar@sep \thesis@marginpar@sep=2em
\newdimen\thesis@bcor \thesis@bcor=1.5cm
% always include bcor to avoid problems with layout when switching
\PassOptionsToPackage{
includeheadfoot,
margin=\thesis@page@margin,
a4paper,
bindingoffset=\thesis@bcor
}{geometry}
\ifthesis@marginpar
\PassOptionsToPackage{
includemp,
marginparwidth=\thesis@marginpar@width,
marginparsep=\thesis@marginpar@sep
}{geometry}
\else
\PassOptionsToPackage{
nomarginpar
}{geometry}
\fi
\RequirePackage{geometry}
\flushbottom_config/internal/pseudocode.tex · 2 KB
\makeatletter
\PassOptionsToPackage{vlined,algochapter,tworuled,linesnumbered}{algorithm2e}
\RequirePackage{algorithm2e}
\RequirePackage{float}
\RequirePackage{newfloat}
\DeclareFloatingEnvironment[
fileext=lop,
listname=List of Algorithms,
name=Algorithm,
placement=tp,
]{pseudo}
\ifthesis@pageInFloatRef
\InitPageCounter{pseudo}
\def\thesissetalg{\CountThisPage{pseudo}{c@pseudo@lb}}
\def\thepseudo{\@formatcounter p{\c@pseudo@lb}}
\appto\makelongrefs{%
\def\thepseudo{Algorithm~\@formatcounter p{\c@pseudo@lb}}%
}
\AtBeginEnvironment{pseudo}{\HookCustomEnvCount{lop}{\thesissetalg}}
\fi
% \AddToHook{shipout/after}{\global\c@pseudo@lb0}
\algoheightrule=1.15\p@ \algotitleheightrule=.8\p@
\let\Comment\tcp
\SetKwComment{tcp}{\#~}{}
\long\def\@thesis@algo@cmtfrmt#1{{\color{gray!90!black}\footnotesize\sffamily#1}}
\SetCommentSty{@thesis@algo@cmtfrmt}
\SetNoFillComment \algoskipindent.5em
\def\thesisalgoindent{1.75em}%
\SetKwSty{textbf}
\def\PreCode{\Indm}\def\StartCode{\Indp\vspace*{-\parskip}\par}\def\EndCode{\Indm}
\SetKw{KwOr}{or}\SetKw{KwAnd}{and}\SetKw{KwIs}{is}
\SetKw{KwBreak}{break}\SetKw{KwContinue}{continue}\SetKw{KwNot}{not}\SetKw{KwStep}{step}
\def\@thesis@algo@def@style{\rmfamily\upshape}
\def\@thesisalgo@init{%
\IncMargin{\thesisalgoindent}\def\Int{{\@thesis@algo@def@style int}}\def\Matrix{{\@thesis@algo@def@style 2DMatrix}}\def\True{{\@thesis@algo@def@style true}}\def\False{{\@thesis@algo@def@style false}}%
}
\def\@thesisalgo@exit{\DecMargin{\thesisalgoindent}}
\preto\algocf@algorithm{\@thesisalgo@init}
\preto\endalgocf@algorithm{\@thesisalgo@exit}
\SetKwFor{ForAll}{for all}{do}{endfa}
\SetAlFnt{\small}
\DontPrintSemicolon
\appto\captionsngerman{\def\pseudoname{Algorithmus}\def\pseudoautorefname{\pseudoname}}
\appto\captionsenglish{\def\pseudoname{Algorithm}\def\pseudoautorefname{\pseudoname}}
\crefname{pseudo}{Alg.}{Alg.}
% i do not like InOut
\SetKwInput{Input}{In}
\SetKwInput{Output}{Out}
\SetArgSty{}
\SetAlgoHangIndent{2.5em}
\newcommand*\AlgoLineRef[2][line]{#1~\thesis@disablehyper{\ref{#2}}}_config/internal/tables.tex · 101 B
\RequirePackage{array}
\RequirePackage{tabularx}
\RequirePackage{booktabs}
\RequirePackage{longtable}_config/internal/titlepage.tex · 2 KB
\newcommand*\titleimage[2][width=\linewidth]{\def\@titleimage{#2}\def\@titleimageoptions{#1}}
\def\thesisinserttitleimage{%
\ifcsname @titleimage\endcsname
% expand the options before includegraphics
\expandafter\includegraphics\expandafter[\@titleimageoptions]{\@titleimage}%
\else
\begin{minipage}[c][7cm][c]{\linewidth}%
\centering\textcolor{purple}{\textbf{Please specify a title image with \texttt{\textbackslash titleimage}}}%
\end{minipage}
\fi
}
\def\institute#1{\def\@institute{#1}}
\def\studentnumber#1{\def\@studentnumber{[#1]}}
\def\@studentnumber{}
\def\@institute{\textcolor{purple}{\textbf{Please specify an institute with \texttt{\textbackslash institute}}}}
\newcounter{thesis@examiners}
\newcounter{thesis@supervisors}
% name | university
\def\examiner#1#2{\stepcounter{thesis@examiners}\appto\@examiners{\item #1\\\textit{#2}}}
\def\supervisor#1#2{\stepcounter{thesis@supervisors}\appto\@supervisors{\item #1\\\textit{#2}}}
\def\university#1{\def\@university{#1}}
\def\thesisYear#1{\def\@year{#1}}
\thesisYear{\the\year}
\RequirePackage{graphicx,ragged2e,enumitem,tabularx}
\newenvironment{full-titlepage}{\begingroup
% manually reconstructed initialization of koma script
% if twoside
\if@twoside
\setcounter{page}{-1}%
\thispdfpagelabel{Coverpage}%
\fi
\thispagestyle{empty}%
\edef\titlepage@restore{%
\noexpand\endgroup
\noexpand\global\noexpand\@colht\the\@colht
\noexpand\global\noexpand\@colroom\the\@colroom
\noexpand\global\vsize\the\vsize
\noexpand\let\noexpand\titlepage@restore\noexpand\relax
}%
% newgeometry fails currently with the next page :/
\topmargin=-1in\relax
\oddsidemargin=-1in\relax
\evensidemargin=-1in\relax
\textwidth=\paperwidth\relax
\textheight=\paperheight\relax
\headheight=0pt\relax
\headsep=0pt\relax
\footskip=0pt\relax
\@colht=\textheight\relax
\@colroom=\textheight\relax
\columnwidth=\textwidth\relax
\vsize=\textheight\relax
\hsize=\columnwidth\relax
\linewidth=\hsize
}{%
\clearpage\titlepage@restore
}
\ifthesis@draft
\renewcommand*{\maketitle}[1][-1]{}
\else
\renewcommand*{\maketitle}[1][0]{\begingroup
\setcounter{page}{#1}\thispdfpagelabel{Cover}%
\thesis@load@profile{titlepage}%
\endgroup}
\fi_config/internal/translation.tex · 3 KB
\RequirePackage{translator}
\languagealias{ngerman}{German}
\deftranslation[to=German]{bachelor-thesis}{Bachelorarbeit}
\deftranslation[to=English]{bachelor-thesis}{Bachelor's Thesis}
\deftranslation[to=German]{bachelor-thesis-single}{Bachelorarbeit}
\deftranslation[to=English]{bachelor-thesis-single}{bachelor thesis}
\deftranslation[to=German]{master-thesis}{Masterarbeit}
\deftranslation[to=English]{master-thesis}{Master's Thesis}
\deftranslation[to=German]{master-thesis-single}{Masterarbeit}
\deftranslation[to=English]{master-thesis-single}{master thesis}
\deftranslation[to=German]{computer-science}{Informatik}
\deftranslation[to=English]{computer-science}{Computer Science}
\deftranslation[to=German]{date}{Datum}
\deftranslation[to=English]{date}{Date}
\deftranslation[to=German]{location}{Ort}
\deftranslation[to=English]{location}{Location}
\deftranslation[to=German]{date-of-submission}{Einreichungsdatum}
\deftranslation[to=English]{date-of-submission}{Date of Submission}
\deftranslation[to=German]{institution}{Institution}
\deftranslation[to=English]{institution}{Institution}
\deftranslation[to=German]{on-page}{Auf Seite}
\deftranslation[to=English]{on-page}{On page}
\deftranslation[to=German]{on-pages}{Auf Seiten}
\deftranslation[to=English]{on-pages}{On pages}
\deftranslation[to=German]{advisor-singular}{Gutachter}
\deftranslation[to=German]{advisor-plural}{Gutachter}
\deftranslation[to=English]{advisor-singular}{Examiner}
\deftranslation[to=English]{advisor-plural}{Examiners}
\deftranslation[to=German]{supervisor-singular}{Betreuer}
\deftranslation[to=German]{supervisor-plural}{Betreuer}
\deftranslation[to=English]{supervisor-singular}{Supervisor}
\deftranslation[to=English]{supervisor-plural}{Supervisors}
\deftranslation[to=German]{abstract}{Zusammenfassung}
\deftranslation[to=English]{abstract}{Abstract}
\deftranslation[to=German]{acknowledgements}{Danksagungen}
\deftranslation[to=English]{acknowledgements}{Acknowledgements}
\deftranslation[to=German]{conventions}{Konventionen}
\deftranslation[to=English]{conventions}{Conventions}
\deftranslation[to=German]{type-and-field}{\translate{\thesis@type}\space in \thesis@field}
\deftranslation[to=English]{type-and-field}{\translate{\thesis@type}\space in \thesis@field}
\deftranslation[to=German]{authenticity}{Eigenständigkeitserklärung}
\deftranslation[to=English]{authenticity}{Declaration of Authenticity}
\deftranslation[to=German]{declaration-of-authenticity}{%
Ich, \@author, versichere hiermit, dass ich diese \expandafter\MakeLowercase\expandafter{\translate{\thesis@type-single}} selbstständig verfasst habe. Alle verwendeten Quellen sind angegeben und zitiert. Diese \expandafter\MakeLowercase\expandafter{\translate{\thesis@type-single}} wurde bisher keiner anderen Prüfungsbehörde vorgelegt und ist auch noch nicht veröffentlicht.%
}
\deftranslation[to=English]{declaration-of-authenticity}{I, \@author, hereby declare that this \expandafter\MakeLowercase\expandafter{\translate{\thesis@type-single}} is my own unaided work. All
direct or indirect sources used are acknowledged and referenced. This \expandafter\MakeLowercase\expandafter{\translate{\thesis@type-single}}
was not previously presented to another examination board and has not been published
as of yet.}_config/internal/units.tex · 174 B
\RequirePackage{siunitx}
\sisetup{
number-mode=match,
round-mode=places,
round-pad=false,
group-minimum-digits=4,
group-separator={,},
round-precision=2
}%
_config/langs/pseudo_java.cfg — binary, 0 B
_config/langs/xlistings-R.cfg — binary, 1 KB
_config/langs/xlistings-aspectj.cfg — binary, 256 B
_config/langs/xlistings-bash.cfg — binary, 1 KB
_config/langs/xlistings-cpp.cfg — binary, 1 KB
_config/langs/xlistings-csharp.cfg — binary, 567 B
_config/langs/xlistings-git.cfg — binary, 760 B
_config/langs/xlistings-haskell.cfg — binary, 761 B
_config/langs/xlistings-java.cfg — binary, 5 KB
_config/langs/xlistings-javascript.cfg — binary, 922 B
_config/langs/xlistings-json.cfg — binary, 401 B
_config/langs/xlistings-lambda_calculus.cfg — binary, 2 KB
_config/langs/xlistings-latex.cfg — binary, 5 KB
_config/langs/xlistings-lua.cfg — binary, 324 B
_config/langs/xlistings-markdown.cfg — binary, 632 B
_config/langs/xlistings-mips.cfg — binary, 3 KB
_config/langs/xlistings-python.cfg — binary, 270 B
_config/langs/xlistings-regex.cfg — binary, 2 KB
_config/langs/xlistings-rubberduck.cfg — binary, 148 B
_config/langs/xlistings-sirl.cfg — binary, 717 B
_config/langs/xlistings-sql.cfg — binary, 824 B
_config/langs/xlistings-tac.cfg — binary, 1 KB
_config/langs/xlistings-ts.cfg — binary, 1 KB
_config/langs/xlistings-x86.cfg — binary, 3 KB
_config/langs/xlistings-xml.cfg — binary, 1 KB
_config/langs/xlistings-yaml.cfg — binary, 648 B
_config/profiles/uulm-sp/colors.tex · 1 KB
% must define all of these colors
\definecolor{@text}{gray}{0}%
% Color Scheme http://colorschemedesigner.com/#3w40I--ALK-K- similar to that of the old template
\definecolor{blue1}{RGB}{0,105,180} % gray 95
\definecolor{blue2}{RGB}{40,87,121}
\definecolor{blue3}{RGB}{0,57,97}
\definecolor{blue4}{RGB}{76,166,230}
\definecolor{blue5}{RGB}{136,191,230}
\definecolor{orange1}{RGB}{255,144,0} % gray 133
\definecolor{orange2}{RGB}{171,121,56}
\definecolor{orange3}{RGB}{137,78,0}
\definecolor{orange4}{RGB}{255,181,84}
\definecolor{orange5}{RGB}{255,210,151}
\definecolor{green1}{RGB}{11,215,0} % gray 75
\definecolor{green2}{RGB}{52,144,48}
\definecolor{green3}{RGB}{6,116,0}
\definecolor{green4}{RGB}{88,241,80}
\definecolor{green5}{RGB}{148,241,143}
\definecolor{red1}{RGB}{253,0,6} % gray 86
\definecolor{red2}{RGB}{170,56,59}
\definecolor{red3}{RGB}{136,0,3}
\definecolor{red4}{RGB}{254,84,88}
\definecolor{red5}{RGB}{254,151,154}
\definecolor{blue}{named}{blue1}
\definecolor{green}{named}{green1}
\definecolor{red}{named}{red1}
\definecolor{orange}{named}{orange1}
\definecolor{@primary}{RGB}{163,38,56}
% \definecolor{@secondary}{RGB}{34,102,102}
% \definecolor{@tertiary}{RGB}{122,159,53}
\definecolor{@chapternumber}{gray}{0.55}
\colorlet{@link}{blue3}
\colorlet{@url}{blue3!85!black}
\colorlet{@cite}{green3!70!black}
\colorlet{titleimage@background}{lightgray!25}
\definecolor{handwritingblue}{rgb}{0.0,0.13,0.28}
_config/profiles/uulm-sp/defaults.tex · 100 B
\institute{Institute of Software Engineering and Programming Languages}
\university{Ulm University}
_config/profiles/uulm-sp/logo-eps-converted-to.pdf — binary, 14 KB
_config/profiles/uulm-sp/logo.eps — binary, 206 KB
_config/profiles/uulm-sp/titlepage.tex · 3 KB
% this titlepage does not use tikz for speed reason
\begin{full-titlepage}%
\makeatletter\ifthesis@fira\firabook\else\sffamily\fi\def\margin{1.5cm}%
\parskip\z@\relax\parindent\z@\relax
\fboxsep\z@\relax\fboxrule\z@\relax
\vspace*{\margin}\par% upper space
\strut\hfill\includegraphics[width=73mm]{\thesisProfilesPath/logo}\hskip\margin\null% left space
\vskip\margin% space to logo
{% titleimage
% TODO: titleimage attribution
\colorbox{titleimage@background}{\parbox{\paperwidth}{\hfil
\thesisinserttitleimage
\hfil}}%
}%
\vskip-1pt\par{% separator line
\color{@primary}\rule{\paperwidth}{28pt}%
}%
\vskip-1pt\par{% the title
\fboxsep=5mm\relax
\setbox0=\hbox{\hspace*{-\fboxsep}\parbox{\dimexpr\paperwidth}{\hfill
\parbox{\dimexpr.8\linewidth-\margin}{\RaggedLeft
% TODO: titlefont
\huge\strut\def\nl{\\[1.5pt]}\@title\strut
}\null%
\hskip\margin\null}}%
% we use the box to set the minimum width accordingly
\ifdim72pt>\dimexpr\ht0+\dp0\relax
\colorbox{lightgray!25}{\vbox to 72pt{\vfill\box0\vfill}}%
\else
\colorbox{lightgray!25}{\box0}%
\fi
}%
\vskip\margin
\par{% author name
% TODO: authorfont
\null\hfill\parbox{\dimexpr.8\linewidth-\margin}{%
\RaggedLeft\LARGE\itshape\strut\@author\strut
}\hskip\margin\null%
}
\vfill% space to bottom
\par{% footer
\colorbox{lightgray!25}{\parbox[t][90pt][c]{\paperwidth}{%
\null\hfill\parbox{\dimexpr.8\linewidth-\margin}{%
\RaggedLeft\large\strut\@institute\strut
}\hskip\margin\null
}}%
}%
\vskip-\baselineskip\par{% thesis type
\fboxsep=3mm\relax
\null\hfill\smash{\raisebox{\dimexpr\thesis@marginpar@width+\fboxsep-.5\height-.5\depth}{\colorbox{@primary}{\hskip\dimexpr\margin-\fboxsep\relax
\color{white}\Large\translate{\thesis@type}%
\hskip\dimexpr\margin-\fboxsep\relax}}}\null
}%
% \node [above left = of banner.south east, anchor=south east, inner sep=2pt] {
% \ifx\titleBannerImageAttribution\undefined
% %
% \else
% \titleBannerImageAttribution
% \fi
% };
% \end{scope}
\end{full-titlepage}\relax
\cleardoublepage
{\makeatletter
\thispagestyle{empty}%
\parskip\z@\relax\parindent\z@\relax
\vspace*{\fill}%
\textbf{\translate{type-and-field}}\par\relax
\begin{tabular}{@{}ll@{}}
\translate{date-of-submission}:&\@date\\
\translate{institution}:&\@university
\end{tabular}\vskip1.25cm\par
{\bfseries\ifnum\value{thesis@examiners}=1
\translate{advisor-singular}%
\else\ifnum\value{thesis@examiners}>1
\translate{advisor-plural}%
\fi\fi\smallskip}
\ifnum\value{thesis@examiners}>0
\begin{itemize}[leftmargin=*,nosep,itemsep=\smallskipamount]
\@examiners
\end{itemize}
\fi
\vskip.5cm
{\bfseries\ifnum\value{thesis@supervisors}=1
\translate{supervisor-singular}%
\else\ifnum\value{thesis@supervisors}>1
\translate{supervisor-plural}%
\fi\fi\smallskip}
\ifnum\value{thesis@supervisors}>0
\begin{itemize}[leftmargin=*,nosep,itemsep=\smallskipamount]
\@supervisors
\end{itemize}
\fi
\vfill\vfill\vfill
% \dimexpr\linewidth+\marginparsep+\marginparwidth
{\footnotesize\begin{tabularx}{\linewidth}{@{}lX@{}}
\textcopyright\;\@year&\@author\quad\@studentnumber\\
& \textit{\def\nl{\space}\@title}\bigskip\\
\thesis@license@symbols &\translate{license}
\end{tabularx}}
}
\clearpage_config/xlistings.sty · 42 KB
42 KB — too long to show here. It arrives with the project.
img/example.pdf — binary, 25 KB
img/title-banner-image.pdf — binary, 32 KB
literature/IEEEabrv.bib · 17 KB
IEEEabrv.bib
V1.13 (2008/09/30)
Copyright (c) 2002-2008 by Michael Shell
See: http://www.michaelshell.org/
for current contact information.
BibTeX bibliography string definitions of the ABBREVIATED titles of
IEEE journals and magazines and online publications.
This file is designed for bibliography styles that require
abbreviated titles and is not for use in bibliographies that
require full-length titles.
Support sites:
http://www.michaelshell.org/tex/ieeetran/
http://www.ctan.org/tex-archive/macros/latex/contrib/IEEEtran/
and/or
http://www.ieee.org/
Special thanks to Laura Hyslop and ken Rawson of IEEE for their help
in obtaining the information needed to compile this file. Also,
Volker Kuhlmann and Moritz Borgmann kindly provided some corrections
and additions.
*************************************************************************
Legal Notice:
This code is offered as-is without any warranty either expressed or
implied; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE!
User assumes all risk.
In no event shall IEEE or any contributor to this code be liable for
any damages or losses, including, but not limited to, incidental,
consequential, or any other damages, resulting from the use or misuse
of any information contained here.
All comments are the opinions of their respective authors and are not
necessarily endorsed by the IEEE.
This work is distributed under the LaTeX Project Public License (LPPL)
( http://www.latex-project.org/ ) version 1.3, and may be freely used,
distributed and modified. A copy of the LPPL, version 1.3, is included
in the base LaTeX documentation of all distributions of LaTeX released
2003/12/01 or later.
Retain all contribution notices and credits.
** Modified files should be clearly indicated as such, including **
** renaming them and changing author support contact information. **
File list of work: IEEEabrv.bib, IEEEfull.bib, IEEEexample.bib,
IEEEtran.bst, IEEEtranS.bst, IEEEtranSA.bst,
IEEEtranN.bst, IEEEtranSN.bst, IEEEtran_bst_HOWTO.pdf
*************************************************************************
USAGE:
\bibliographystyle{mybstfile}
\bibliography{IEEEabrv,mybibfile}
where the IEEE titles in the .bib database entries use the strings
defined here. e.g.,
journal = IEEE_J_AC,
to yield "{IEEE} Trans. Automat. Contr."
IEEE uses abbreviated journal titles in their bibliographies -
this file is suitable for work that is to be submitted to the IEEE.
For work that requires full-length titles, you should use the full
titles provided in the companion file, IEEEfull.bib.
** NOTES **
1. Journals have been grouped according to subject in order to make it
easier to locate and extract the definitions for related journals -
as most works use references that are confined to a single topic.
Magazines are listed in straight alphabetical order.
2. String names are closely based on IEEE's own internal acronyms.
3. Abbreviations follow IEEE's style.
4. Older, out-of-print IEEE titles are included (but not including titles
dating prior to IEEE's formation from the IRE and AIEE in 1963).
5. The following string definitions have been disabled because their
abbreviations have not yet been verified:
STRING{IEEE_J_LT = "{IEEE} Trans. Learning Technol."}
STRING{IEEE_J_NSM = "{IEEE} Trans. Netw. Service Manag."}
STRING{IEEE_J_SC = "{IEEE} Trans. Services Comput."}
STRING{IEEE_J_STARS = "{IEEE} J. Sel. Topics Appl. Earth Observations Remote Sens."}
If you know what the proper abbreviation is for a string above,
email me and I will correct them in the next release.
IEEE Journals
aerospace and military
@STRING{IEEE_J_AES = "{IEEE} Trans. Aerosp. Electron. Syst."}
@STRING{IEEE_J_ANE = "{IEEE} Trans. Aerosp. Navig. Electron."}
@STRING{IEEE_J_ANNE = "{IEEE} Trans. Aeronaut. Navig. Electron."}
@STRING{IEEE_J_AS = "{IEEE} Trans. Aerosp."}
@STRING{IEEE_J_AIRE = "{IEEE} Trans. Airborne Electron."}
@STRING{IEEE_J_MIL = "{IEEE} Trans. Mil. Electron."}
autos, transportation and vehicles (non-aerospace)
@STRING{IEEE_J_ITS = "{IEEE} Trans. Intell. Transp. Syst."}
@STRING{IEEE_J_VT = "{IEEE} Trans. Veh. Technol."}
@STRING{IEEE_J_VC = "{IEEE} Trans. Veh. Commun."}
circuits, signals, systems, audio and controls
@STRING{IEEE_J_SPL = "{IEEE} Signal Process. Lett."}
@STRING{IEEE_J_ASSP = "{IEEE} Trans. Acoust., Speech, Signal Process."}
@STRING{IEEE_J_AU = "{IEEE} Trans. Audio"}
@STRING{IEEE_J_AUEA = "{IEEE} Trans. Audio Electroacoust."}
@STRING{IEEE_J_AC = "{IEEE} Trans. Autom. Control"}
@STRING{IEEE_J_CAS = "{IEEE} Trans. Circuits Syst."}
@STRING{IEEE_J_CASVT = "{IEEE} Trans. Circuits Syst. Video Technol."}
@STRING{IEEE_J_CASI = "{IEEE} Trans. Circuits Syst. {I}"}
@STRING{IEEE_J_CASII = "{IEEE} Trans. Circuits Syst. {II}"}
in 2004 CASI and CASII renamed part title to CASI_RP and CASII_EB, respectively.
@STRING{IEEE_J_CASI_RP = "{IEEE} Trans. Circuits Syst. {I}"}
@STRING{IEEE_J_CASII_EB = "{IEEE} Trans. Circuits Syst. {II}"}
@STRING{IEEE_J_CT = "{IEEE} Trans. Circuit Theory"}
@STRING{IEEE_J_CST = "{IEEE} Trans. Control Syst. Technol."}
@STRING{IEEE_J_SP = "{IEEE} Trans. Signal Process."}
@STRING{IEEE_J_SU = "{IEEE} Trans. Sonics Ultrason."}
@STRING{IEEE_J_SAP = "{IEEE} Trans. Speech Audio Process."}
@STRING{IEEE_J_STSP = "{IEEE} J. Sel. Topics Signal Process."}
@STRING{IEEE_J_SYST = "{IEEE} Syst. J."}
@STRING{IEEE_J_UE = "{IEEE} Trans. Ultrason. Eng."}
@STRING{IEEE_J_UFFC = "{IEEE} Trans. Ultrason., Ferroelectr., Freq. Control"}
communications
@STRING{IEEE_J_COML = "{IEEE} Commun. Lett."}
@STRING{IEEE_J_JSAC = "{IEEE} J. Sel. Areas Commun."}
@STRING{IEEE_J_COM = "{IEEE} Trans. Commun."}
@STRING{IEEE_J_COMT = "{IEEE} Trans. Commun. Technol."}
@STRING{IEEE_J_WCOM = "{IEEE} Trans. Wireless Commun."}
components, packaging and manufacturing
@STRING{IEEE_J_ADVP = "{IEEE} Trans. Adv. Packag."}
@STRING{IEEE_J_CHMT = "{IEEE} Trans. Compon., Hybrids, Manuf. Technol."}
@STRING{IEEE_J_CPMTA = "{IEEE} Trans. Compon., Packag., Manuf. Technol. {A}"}
@STRING{IEEE_J_CPMTB = "{IEEE} Trans. Compon., Packag., Manuf. Technol. {B}"}
@STRING{IEEE_J_CPMTC = "{IEEE} Trans. Compon., Packag., Manuf. Technol. {C}"}
@STRING{IEEE_J_CAPT = "{IEEE} Trans. Compon. Packag. Technol."}
@STRING{IEEE_J_CAPTS = "{IEEE} Trans. Compon. Packag. Technol."}
@STRING{IEEE_J_CPART = "{IEEE} Trans. Compon. Parts"}
@STRING{IEEE_J_EPM = "{IEEE} Trans. Electron. Packag. Manuf."}
@STRING{IEEE_J_MFT = "{IEEE} Trans. Manuf. Technol."}
@STRING{IEEE_J_PHP = "{IEEE} Trans. Parts, Hybrids, Packag."}
@STRING{IEEE_J_PMP = "{IEEE} Trans. Parts, Mater., Packag."}
CAD
@STRING{IEEE_J_TCAD = "{IEEE} J. Technol. Comput. Aided Design"}
@STRING{IEEE_J_CAD = "{IEEE} Trans. Comput.-Aided Design Integr. Circuits Syst."}
coding, data, information, knowledge
@STRING{IEEE_J_IT = "{IEEE} Trans. Inf. Theory"}
@STRING{IEEE_J_KDE = "{IEEE} Trans. Knowl. Data Eng."}
computers, computation, networking and software
@STRING{IEEE_J_C = "{IEEE} Trans. Comput."}
@STRING{IEEE_J_CAL = "{IEEE} Comput. Archit. Lett."}
@STRING{IEEE_J_DSC = "{IEEE} Trans. Dependable Secure Comput."}
@STRING{IEEE_J_ECOMP = "{IEEE} Trans. Electron. Comput."}
@STRING{IEEE_J_EVC = "{IEEE} Trans. Evol. Comput."}
@STRING{IEEE_J_FUZZ = "{IEEE} Trans. Fuzzy Syst."}
@STRING{IEEE_J_IFS = "{IEEE} Trans. Inf. Forensics Security"}
@STRING{IEEE_J_MC = "{IEEE} Trans. Mobile Comput."}
@STRING{IEEE_J_NET = "{IEEE/ACM} Trans. Netw."}
@STRING{IEEE_J_NN = "{IEEE} Trans. Neural Netw."}
disabled until abbreviation verified
STRING{IEEE_J_NSM = "{IEEE} Trans. Netw. Service Manag."}
@STRING{IEEE_J_PDS = "{IEEE} Trans. Parallel Distrib. Syst."}
disabled until abbreviation verified
STRING{IEEE_J_SC = "{IEEE} Trans. Services Comput."}
@STRING{IEEE_J_SE = "{IEEE} Trans. Softw. Eng."}
computer graphics, imaging, and multimedia
@STRING{IEEE_J_JDT = "{IEEE/OSA} J. Display Technol."}
@STRING{IEEE_J_IP = "{IEEE} Trans. Image Process."}
@STRING{IEEE_J_MM = "{IEEE} Trans. Multimedia"}
@STRING{IEEE_J_VCG = "{IEEE} Trans. Vis. Comput. Graphics"}
cybernetics, ergonomics, robots, man-machine, and automation
@STRING{IEEE_J_ASE = "{IEEE} Trans. Autom. Sci. Eng."}
@STRING{IEEE_J_JRA = "{IEEE} J. Robot. Autom."}
@STRING{IEEE_J_H = "{IEEE} Trans. Haptics"}
@STRING{IEEE_J_HFE = "{IEEE} Trans. Hum. Factors Electron."}
@STRING{IEEE_J_MMS = "{IEEE} Trans. Man-Mach. Syst."}
@STRING{IEEE_J_PAMI = "{IEEE} Trans. Pattern Anal. Mach. Intell."}
in 1989 JRA became RA
in August 2004, RA split into ASE and RO
@STRING{IEEE_J_RA = "{IEEE} Trans. Robot. Autom."}
@STRING{IEEE_J_RO = "{IEEE} Trans. Robot."}
@STRING{IEEE_J_SMC = "{IEEE} Trans. Syst., Man, Cybern."}
@STRING{IEEE_J_SMCA = "{IEEE} Trans. Syst., Man, Cybern. {A}"}
@STRING{IEEE_J_SMCB = "{IEEE} Trans. Syst., Man, Cybern. {B}"}
@STRING{IEEE_J_SMCC = "{IEEE} Trans. Syst., Man, Cybern. {C}"}
@STRING{IEEE_J_SSC = "{IEEE} Trans. Syst. Sci. Cybern."}
earth, wind, fire and water
@STRING{IEEE_J_GE = "{IEEE} Trans. Geosci. Electron."}
@STRING{IEEE_J_GRS = "{IEEE} Trans. Geosci. Remote Sens."}
@STRING{IEEE_J_GRSL = "{IEEE} Geosci. Remote Sens. Lett."}
@STRING{IEEE_J_OE = "{IEEE} J. Ocean. Eng."}
disabled until abbreviation verified
STRING{IEEE_J_STARS = "{IEEE} J. Sel. Topics Appl. Earth Observations Remote Sens."}
education, engineering, history, IEEE, professional
@STRING{IEEE_J_CJECE = "Canadian J. Elect. Comput. Eng."}
@STRING{IEEE_J_PROC = "Proc. {IEEE}"}
@STRING{IEEE_J_EDU = "{IEEE} Trans. Educ."}
@STRING{IEEE_J_EM = "{IEEE} Trans. Eng. Manag."}
@STRING{IEEE_J_EWS = "{IEEE} Trans. Eng. Writing Speech"}
disabled until abbreviation verified
STRING{IEEE_J_LT = "{IEEE} Trans. Learning Technol."}
@STRING{IEEE_J_PC = "{IEEE} Trans. Prof. Commun."}
electromagnetics, antennas, EMI, magnetics and microwave
@STRING{IEEE_J_AWPL = "{IEEE} Antennas Wireless Propag. Lett."}
@STRING{IEEE_J_MGWL = "{IEEE} Microw. Guided Wave Lett."}
IEEE seems to want "Compon." here, not "Comp."
@STRING{IEEE_J_MWCL = "{IEEE} Microw. Wireless Compon. Lett."}
@STRING{IEEE_J_AP = "{IEEE} Trans. Antennas Propag."}
@STRING{IEEE_J_EMC = "{IEEE} Trans. Electromagn. Compat."}
@STRING{IEEE_J_MAG = "{IEEE} Trans. Magn."}
@STRING{IEEE_J_MTT = "{IEEE} Trans. Microw. Theory Tech."}
@STRING{IEEE_J_RFI = "{IEEE} Trans. Radio Freq. Interference"}
@STRING{IEEE_J_TJMJ = "{IEEE} Transl. J. Magn. Jpn."}
energy and power
@STRING{IEEE_J_EC = "{IEEE} Trans. Energy Convers."}
@STRING{IEEE_J_PEL = "{IEEE} Power Electron. Lett."}
@STRING{IEEE_J_PWRAS = "{IEEE} Trans. Power App. Syst."}
@STRING{IEEE_J_PWRD = "{IEEE} Trans. Power Del."}
@STRING{IEEE_J_PWRE = "{IEEE} Trans. Power Electron."}
@STRING{IEEE_J_PWRS = "{IEEE} Trans. Power Syst."}
industrial, commercial and consumer
@STRING{IEEE_J_APPIND = "{IEEE} Trans. Appl. Ind."}
@STRING{IEEE_J_BC = "{IEEE} Trans. Broadcast."}
@STRING{IEEE_J_BCTV = "{IEEE} Trans. Broadcast Television Receivers"}
@STRING{IEEE_J_CE = "{IEEE} Trans. Consum. Electron."}
@STRING{IEEE_J_IE = "{IEEE} Trans. Ind. Electron."}
@STRING{IEEE_J_IECI = "{IEEE} Trans. Ind. Electron. Contr. Instrum."}
@STRING{IEEE_J_IA = "{IEEE} Trans. Ind. Appl."}
@STRING{IEEE_J_IGA = "{IEEE} Trans. Ind. Gen. Appl."}
@STRING{IEEE_J_IINF = "{IEEE} Trans. Ind. Informat."}
@STRING{IEEE_J_PSE = "{IEEE} J. Product Safety Eng."}
instrumentation and measurement
@STRING{IEEE_J_IM = "{IEEE} Trans. Instrum. Meas."}
insulation and materials
@STRING{IEEE_J_JEM = "{IEEE/TMS} J. Electron. Mater."}
@STRING{IEEE_J_DEI = "{IEEE} Trans. Dielectr. Electr. Insul."}
@STRING{IEEE_J_EI = "{IEEE} Trans. Electr. Insul."}
mechanical
@STRING{IEEE_J_MECH = "{IEEE/ASME} Trans. Mechatronics"}
@STRING{IEEE_J_MEMS = "J. Microelectromech. Syst."}
medical and biological
@STRING{IEEE_J_BCAS = "{IEEE} Trans. Biomed. Circuits Syst."}
@STRING{IEEE_J_BME = "{IEEE} Trans. Biomed. Eng."}
Note: The B-ME journal later dropped the hyphen and became the BME.
@STRING{IEEE_J_B-ME = "{IEEE} Trans. Bio-Med. Eng."}
@STRING{IEEE_J_BMELC = "{IEEE} Trans. Bio-Med. Electron."}
@STRING{IEEE_J_CBB = "{IEEE/ACM} Trans. Comput. Biol. Bioinformatics"}
@STRING{IEEE_J_ITBM = "{IEEE} Trans. Inf. Technol. Biomed."}
@STRING{IEEE_J_ME = "{IEEE} Trans. Med. Electron."}
@STRING{IEEE_J_MI = "{IEEE} Trans. Med. Imag."}
@STRING{IEEE_J_NB = "{IEEE} Trans. Nanobiosci."}
@STRING{IEEE_J_NSRE = "{IEEE} Trans. Neural Syst. Rehabil. Eng."}
@STRING{IEEE_J_RBME = "{IEEE} Rev. Biomed. Eng."}
@STRING{IEEE_J_RE = "{IEEE} Trans. Rehabil. Eng."}
optics, lightwave and photonics
@STRING{IEEE_J_PTL = "{IEEE} Photon. Technol. Lett."}
@STRING{IEEE_J_JLT = "J. Lightw. Technol."}
physics, electrons, nanotechnology, nuclear and quantum electronics
@STRING{IEEE_J_EDL = "{IEEE} Electron Device Lett."}
@STRING{IEEE_J_JQE = "{IEEE} J. Quantum Electron."}
@STRING{IEEE_J_JSTQE = "{IEEE} J. Sel. Topics Quantum Electron."}
@STRING{IEEE_J_ED = "{IEEE} Trans. Electron Devices"}
@STRING{IEEE_J_NANO = "{IEEE} Trans. Nanotechnol."}
@STRING{IEEE_J_NS = "{IEEE} Trans. Nucl. Sci."}
@STRING{IEEE_J_PS = "{IEEE} Trans. Plasma Sci."}
reliability
IEEE seems to want "Mat." here, not "Mater."
@STRING{IEEE_J_DMR = "{IEEE} Trans. Device Mater. Rel."}
@STRING{IEEE_J_R = "{IEEE} Trans. Rel."}
semiconductors, superconductors, electrochemical and solid state
@STRING{IEEE_J_ESSL = "{IEEE/ECS} Electrochem. Solid-State Lett."}
@STRING{IEEE_J_JSSC = "{IEEE} J. Solid-State Circuits"}
@STRING{IEEE_J_ASC = "{IEEE} Trans. Appl. Supercond."}
@STRING{IEEE_J_SM = "{IEEE} Trans. Semicond. Manuf."}
sensors
@STRING{IEEE_J_SENSOR = "{IEEE} Sensors J."}
VLSI
@STRING{IEEE_J_VLSI = "{IEEE} Trans. {VLSI} Syst."}
IEEE Magazines
@STRING{IEEE_M_AES = "{IEEE} Aerosp. Electron. Syst. Mag."}
@STRING{IEEE_M_HIST = "{IEEE} Ann. Hist. Comput."}
@STRING{IEEE_M_AP = "{IEEE} Antennas Propag. Mag."}
@STRING{IEEE_M_ASSP = "{IEEE} {ASSP} Mag."}
@STRING{IEEE_M_CD = "{IEEE} Circuits Devices Mag."}
@STRING{IEEE_M_CAS = "{IEEE} Circuits Syst. Mag."}
@STRING{IEEE_M_COM = "{IEEE} Commun. Mag."}
@STRING{IEEE_M_COMSOC = "{IEEE} Commun. Soc. Mag."}
@STRING{IEEE_M_CIM = "{IEEE} Comput. Intell. Mag."}
CSEM changed to CSE in 1999
@STRING{IEEE_M_CSE = "{IEEE} Comput. Sci. Eng."}
@STRING{IEEE_M_CSEM = "{IEEE} Comput. Sci. Eng. Mag."}
@STRING{IEEE_M_C = "{IEEE} Computer"}
@STRING{IEEE_M_CAP = "{IEEE} Comput. Appl. Power"}
@STRING{IEEE_M_CGA = "{IEEE} Comput. Graph. Appl."}
@STRING{IEEE_M_CONC = "{IEEE} Concurrency"}
@STRING{IEEE_M_CS = "{IEEE} Control Syst. Mag."}
@STRING{IEEE_M_DTC = "{IEEE} Des. Test. Comput."}
@STRING{IEEE_M_EI = "{IEEE} Electr. Insul. Mag."}
@STRING{IEEE_M_ETR = "{IEEE} ElectroTechnol. Rev."}
@STRING{IEEE_M_EMB = "{IEEE} Eng. Med. Biol. Mag."}
@STRING{IEEE_M_EMR = "{IEEE} Eng. Manag. Rev."}
@STRING{IEEE_M_EXP = "{IEEE} Expert"}
@STRING{IEEE_M_IA = "{IEEE} Ind. Appl. Mag."}
@STRING{IEEE_M_IE = "{IEEE} Ind. Electron. Mag."}
@STRING{IEEE_M_IM = "{IEEE} Instrum. Meas. Mag."}
@STRING{IEEE_M_IS = "{IEEE} Intell. Syst."}
@STRING{IEEE_M_ITS = "{IEEE} Intell. Transp. Syst. Mag."}
@STRING{IEEE_M_IC = "{IEEE} Internet Comput."}
@STRING{IEEE_M_ITP = "{IEEE} {IT} Prof."}
@STRING{IEEE_M_MICRO = "{IEEE} Micro"}
@STRING{IEEE_M_MW = "{IEEE} Microw. Mag."}
@STRING{IEEE_M_MM = "{IEEE} Multimedia"}
@STRING{IEEE_M_NANO = "{IEEE} Nanotechnol. Mag."}
@STRING{IEEE_M_NET = "{IEEE} Netw."}
IEEE's editorial manual lists "Pers. Commun.",
but "Personal Commun. Mag." seems to be what is used in the journals
@STRING{IEEE_M_PCOM = "{IEEE} Personal Commun. Mag."}
@STRING{IEEE_M_POT = "{IEEE} Potentials"}
CAP and PER merged to form PE in 2003
@STRING{IEEE_M_PE = "{IEEE} Power Energy Mag."}
@STRING{IEEE_M_PER = "{IEEE} Power Eng. Rev."}
@STRING{IEEE_M_PVC = "{IEEE} Pervasive Comput."}
@STRING{IEEE_M_RA = "{IEEE} Robot. Autom. Mag."}
@STRING{IEEE_M_SAP = "{IEEE} Security Privacy"}
@STRING{IEEE_M_SP = "{IEEE} Signal Process. Mag."}
@STRING{IEEE_M_S = "{IEEE} Softw."}
@STRING{IEEE_M_SPECT = "{IEEE} Spectr."}
@STRING{IEEE_M_TS = "{IEEE} Technol. Soc. Mag."}
@STRING{IEEE_M_VT = "{IEEE} Veh. Technol. Mag."}
@STRING{IEEE_M_WC = "{IEEE} Wireless Commun. Mag."}
@STRING{IEEE_M_TODAY = "Today's Engineer"}
IEEE Online Publications
@STRING{IEEE_O_CSTO = "{IEEE} Commun. Surveys Tuts."}
@STRING{IEEE_O_DSO = "{IEEE} Distrib. Syst. Online"}
--
EOF
literature/MYabrv.bib · 3 KB
conference
@String{AOSD = "Proc.\ Int'l Conf.\ Aspect-Oriented Software Development"}
@String{APSEC = "Proc.\ Asia-Pacific Software Engineering Conference"}
@String{ASE = "Proc.\ Int'l Conf.\ Automated Software Engineering"}
@String{CAiSE = "Proc.\ Int'l Conf.\ Advanced Information Systems Engineering"}
@String{CASCON = "Proc.\ Conf.\ Centre for Advanced Studies on Collaborative Research"}
@String{ECBS = "Proc.\ Int'l Conf.\ Engineering of Computer-Based Systems"}
@String{ECMDA = "Proc.\ Europ.\ Conf.\ Model Driven Architecture - Foundations and Applications"}
@String{ECOOP = "Proc.\ Europ.\ Conf.\ Object-Oriented Programming"}
@String{ESECFSE = "Proc.\ Europ.\ Software Engineering Conf./Foundations of Software Engineering"}
@String{FASE = "Proc.\ Int'l Conf.\ Fundamental Approaches to Software Engineering"}
@String{GCSE = "Proc.\ Int'l Conf.\ Generative and Component-Based Software Engineering"}
@String{GPCE = "Proc.\ Int'l Conf.\ Generative Programming and Component Engineering"}
@String{ICAI = "Proc.\ Int'l Conf.\ Artificial Intelligence"}
@String{ICECCS = "Proc.\ Int'l Conf.\ Engineering of Complex Computer Systems"}
@String{ICFP = "Proc.\ Int'l Conf.\ Functional Programming"}
@String{ICSE = "Proc.\ Int'l Conf.\ Software Engineering"}
@String{ICSM = "Proc.\ Int'l Conf.\ Software Maintenance"}
@String{ICSR = "Proc.\ Int'l Conf.\ Software Reuse"}
@String{IDPT = "Proc.\ World Conf.\ Integrated Design and Process Technology"}
@String{OOPSLA = "Proc.\ Conf.\ Object-Oriented Programming, Systems, Languages and Applications"}
@String{POPL = "Proc.\ Conf.\ Principles of Programming Languages"}
@String{RE = "Proc.\ Int'l Conf.\ Requirements Engineering"}
@String{SEKE = "Proc.\ Int'l Conf.\ Software Engineering and Knowledge Engineering"}
@String{SERP = "Proc.\ Int'l Conf.\ Software Engineering Research and Practice"}
@String{SPLC = "Proc.\ Int'l Software Product Line Conference"}
@String{WCRE = "Proc.\ Working Conference on Reverse Engineering"}
@String{WICSA = "Proc.\ Working Conference on Software Architecture"}
workshop
@String{APLE = "Proc.\ Int'l Workshop Agile Product Line Engineering"}
@String{Eclipse = "Proc.\ Workshop Eclipse Technology Exchange"}
@String{FOAL = "Proc.\ Workshop Foundations of Aspect-Oriented Languages"}
@String{GP = "Proc.\ Workshop Generative Programming"}
@String{MVOOPL = "Proc.\ Workshop Modelling Variability for Object-Oriented Product Lines"}
@String{ViSPLE = "Proc.\ Int'l Workshop Visualisation in Software Product Line Engineering"}
@String{IWPC = "Proc.\ Int'l Workshop on Program Comprehension"}
@String{IW-SAPF = "Proc.\ Int'l Workshop Software Architectures for Product Families"}
@String{SF = "Proc.\ Int'l Workshop Software Factories"}
@String{SVMPD = "Proc.\ Int'l Workshop on Software Variability Management for Product Derivation - Towards Tool Support"}
@String{SWESE = "Proc.\ Workshop Semantic Web Enabled Software Engineering"}
symposium
@String{FSE = "Proc.\ Int'l Symposium Foundations of Software Engineering"}
@String{POPL = "Proc.\ Symposium on Principles of Programming Languages"}
@String{SC = "Proc.\ Int'l Symposium Software Composition"}
journal
@String{CACM = "Comm.\ ACM"}
@String{SEN = "Softw.\ Eng.\ Notes"}
@String{SME = "J. Softw. Maint. Evol."}
other
@String{GTTSE = "Proc.\ Generative and Transformational Techniques in Software Engineering"}
@String{LNCS = "LNCS"}
@String{AddisonWesleyLongman = "Addison-Wesley"},
literature/literature.bib · 950 B
@inproceedings{DBLP:conf/msr/SihlerPSTDD24,
author = {Florian Sihler and
Lukas Pietzschmann and
Raphael Straub and
Matthias Tichy and
Andor Diera and
Abdelhalim Hafedh Dahou},
editor = {Diomidis Spinellis and
Alberto Bacchelli and
Eleni Constantinou},
title = {On the Anatomy of Real-World {R} Code for Static Analysis},
booktitle = {21st {IEEE/ACM} International Conference on Mining Software Repositories,
{MSR} 2024, Lisbon, Portugal, April 15-16, 2024},
pages = {619--630},
publisher = {{ACM}},
year = {2024},
doi = {10.1145/3643991.3644911},
timestamp = {Wed, 23 Oct 2024 16:44:12 +0200},
biburl = {https://dblp.org/rec/conf/msr/SihlerPSTDD24.bib},
bibsource = {dblp computer science bibliography, https://dblp.org}
}
segments/abstract.tex · 257 B
\def\abstractblk#1{\strut\quad\sidenote{\textsc{#1}}\ignorespaces}
\begin{abstract}
Text is funny!
\abstractblk{Context}
\abstractblk{Objective}
\abstractblk{Method}
\abstractblk{Limitations}
\abstractblk{Results}
\end{abstract}
segments/acknowledgements.tex · 62 B
\begin{acknowledgements}
Thanksies!
\end{acknowledgements}
segments/concept.tex · 217 B
\setchaptertoc
\chapter{Concept}\label{chp:concept}
\csummary{Why even concepts?\csumnext Why even A?}
\begin{summary}
The concept is\ldots
\end{summary}
\section{Formalizing Penguins}
\section{Penguin Composition}segments/conclusion.tex · 247 B
\setchaptertoc
\chapter{Conclusion}\label{chp:conclusion}
\csummary{What is left to do, and what can be learned?}
\begin{summary}
Within this chapter, we summarize the work of \ldots
\end{summary}
\section{Retrospective}
\section{Future Work}segments/evaluation.tex · 310 B
\setchaptertoc
\chapter{Evaluation}\label{chp:evaluation}
\csummary{Is it good?}
\begin{summary}
We did\ldots
\end{summary}
\section{Methodology}
\section[Study 1]{Study 1: Penguins in the Wild}
\section[Study 2]{Study 2: Penguins in Captivity}
\section{Discussion}
\section[Threats]{Threats to Validity}segments/glossary.tex · 3 KB
% normal glossary
\newglossaryentry{formal:model}{%
name={model},plural={models},
description={%
Finite set of \glspl{formal:model-element} \ldots
},%
shortdesc={Set of \glspl{formal:model-element}.}
}
\newglossaryentry{formal:model-element}{%
name={model element},plural={model elements},
description={%
Component of a \gls{formal:model} \ldots
},%
shortdesc={Uniquely identified element of a \gls{formal:model}.}
}
\newglossaryentry{formal:external-factor}{%
name={external factor}, plural={external factors},
description={%
A factor defined outside of the \gls{formal:model} and its expressions. Its change can yield completely different values inferred by the solver.
},%
shortdesc={Factors outside of a \gls{formal:model}[models] control}%
}
\newglossaryentry{def:behavioral-equivalence}{%
name={behavioral equivalence},
first={behavioral equivalence [first use!]},
description={%
Two \glspl{formal:model}~\(A\) and~\(B\) have the same observable behavior for all \textit{variables} they do have in common\ldots
},%
shortdesc={%
All \textit{variables} in common evaluate to the same value for all external factors.%
}%
}
% acronyms
\newacronym{cpo}{CPO}{Complete Partial Order}
\newacronym{ast}{AST}{Abstract Syntax Tree}
\newacronym{ip}{IP}{Intellectual Property}
\newacronym[plural={Internet Protocol addresses}]{net:ip}{IP address}{Internet Protocol address}
% notations
\newglossaryentry{not:N}{%
name={Natural Number}, symbol={\ensuremath{\mathbb{N}}},
type={notation},
description={%
Describes the set of non negative integers: \(\{1, 2, \ldots\}\). If~\(0\) is to be included, it is indexed as \(\mathbb{N}_0\).
},%
shortdesc={%
Set of non-negative ints.
}%
}
\newglossaryentry{not:Z}{%
name={Integer}, symbol={\ensuremath{\mathbb{Z}}},
type={notation},
description={%
Describes the set of non negative as well as the negative integers: \(\{\ldots, -1, 0, 1, 2, \ldots\}\).
},%
shortdesc={%
Set of integers.
}%
}
\newglossaryentry{not:R}{%
name={real number}, symbol={\ensuremath{\mathbb{R}}},
type={notation},
description={%
Describes the set of real numbers.
},%
shortdesc={%
Set of real numbers.
}%
}
\newglossaryentry{not:C}{%
name={Complex}, symbol={\ensuremath{\mathbb{C}}}, type={notation},
description={Describes the set of complex numbers.},
shortdesc={Set of complex numbers.}%
}
\newglossaryentry{not:P}{%
name={powerset}, symbol={\ensuremath{\mathcal{P}}},
type={notation},
description={%
With \(\P(X)\) we denote the powerset of a set \(X\). That is, the set of all subsets of \(X\), including the empty set and \(X\) itself.
},%
shortdesc={%
Describes the powerset \(\P(X)\) of a set \(X\).
}%
}segments/implementation.tex · 247 B
\setchaptertoc
\chapter{Implementation}\label{chp:implementation}
\csummary{What did change?}
\begin{summary}
Doing something completely different\ldots
\end{summary}
\section[Fun]{Petting Penguins}
\section[Happy]{How Cute Are Penguins PLS?!}
segments/introduction.tex · 7 KB
\setchaptertoc
\chapter{Introduction}\label{chp:introduction}
\csummary{What is the problem solved by this thesis?\csumnext What are our research questions?\csumnext What are our contributions?}
\section{Motivation}
Sample cite~\cite{DBLP:conf/msr/SihlerPSTDD24}
\begin{minted}{R}
x <- list(i='hey', j='there')
for(i in x) {
print(paste("x$i", x$i))
}
print(x)
\end{minted}
To interpret the program above, we take \bR{x <- 2} to the set of \gls{not:N}, \gls{not:Z}, and \gls{not:R} because they describe funny numbers that we can use to index what we call an \gls{ast} (if you want the long form use \texttt{\textbackslash glsac}: \glsac{ast}). Now we can use a \gls{cpo} or verify the \gls{def:behavioral-equivalence} with \glspl{formal:external-factor} when interpreting the code as a \Gls{formal:model} (see \gls{def:behavioral-equivalence}, sometimes called \gls{def:behavioral-equivalence}[foo bar]).
\gls{not:N} will not be repeated on this page!
Using the \texttt{\textbackslash glssym} macro defined in the preamble you can even color symbol uses such as \glssym{not:N} automatically if this is to your liking:
\begin{align}
\glssym{not:N} &= \{1, 2, \ldots\} \\
\glssym{not:Z} &= \glssym{not:N} \cup \{0\} \cup \{-1, -2, \ldots\} \\
\glssym{not:R} &= \textit{Set of real numbers} \\
\glssym{not:C} &= \textit{Set of complex numbers} \\
\glssym{not:N} &\subset \glssym{not:Z} \subset \glssym{not:R} % \subset \glssym{not:C}
\end{align}
However, as you may see, \glssym{not:C} is not shown in the sidebar even though it appears first within the math mode. The reason(s) for this are manifold but in short we avoided this as math mode may be rendered multiple times.
You can use \texttt{\textbackslash showsymbols} to propose a list of symbols to show before the math environment (using \texttt{\textbackslash showsymbols*} these will be forced as showcased below):
\begin{align}
\showsymbols*{not:N,not:Z,not:R,not:C}
\glssym{not:N} &= \{1, 2, \ldots\} \\
\glssym{not:Z} &= \glssym{not:N} \cup \{0\} \cup \{-1, -2, \ldots\} \\
\glssym{not:R} &= \textit{Set of real numbers} \\
\glssym{not:C} &= \textit{Set of complex numbers} \\
\glssym{not:N} &\subset \glssym{not:Z} \subset \glssym{not:R} % \subset \glssym{not:C}
\end{align}
\clearpage
\begin{figure}
\begin{subfigure}[c]{0.33\linewidth}
\includegraphics[width=\linewidth]{img/example.pdf}
\caption{First subfigure.}
\label{fig:first}
\end{subfigure}\hfill
\begin{subfigure}[c]{0.33\linewidth}
\includegraphics[width=\linewidth]{img/example.pdf}
\caption{Second subfigure.}
\end{subfigure}
\caption[Main]{Main caption.}
\label{fig:main}
\end{figure}
A viable way to group different figures is the \textit{subfigures} command, a short example can be seen at \cref{fig:main}.
A single subfigure can be referenced on its own, like \cref{fig:first}.
This is \cref{fig:main} with the name \nameref{fig:main}.\footurl{www.google.com}{2024-12-24}
See ulm university\foothref{https://web.archive.org/web/20241221140233/https://www.uni-ulm.de/}{https://www.uni-ulm.de/}{2024-12-21} for more information.
\begin{table}
\caption{A simple table}
\begin{tabular}{cc}
\toprule
A & B \\
\midrule
1 & 2 \\
3 & 4 \\
\bottomrule
\end{tabular}
\label{tab:simple}
\end{table}
Notes, references, and small figures can be placed in the margin with \texttt{\textbackslash sidenote}.\sidenote{Like this one, which is typeset next to its anchor.}
A figure that is too small to deserve a float of its own is a good candidate for the margin, which is what the \texttt{sidefig} environment is for:
\begin{sidefig}
\centering
\includegraphics[width=.8\linewidth]{img/example.pdf}
\caption{A figure within the margin.}
\label{fig:sidenote}
\end{sidefig}
Such a figure is numbered and referenced like any other one, see \cref{fig:sidenote}.
The \texttt{sidetbl} environment does the same for tables, see \cref{tab:sidenote}.
\begin{sidetbl}
\caption{A table within the margin.}
\label{tab:sidenote}
\begin{tabular}{cc}
\toprule
A & B \\
\midrule
1 & 2 \\
\bottomrule
\end{tabular}
\end{sidetbl}
Their starred variants \texttt{sidefig*} and \texttt{sidetbl*} accept verbatim content such as listings (see \cref{fig:sidelst}).
The optional argument shifts a note vertically, which is helpful to align it with its surroundings.\sidenote[1.5\baselineskip]{This note is shifted downwards by one and a half lines.}
\section{Problem Statement}
\begin{pseudo}[tbp]
\caption{Algo Good}
\label{fun:good-algo}
\begin{algorithm}[H]
\PreCode
\Input{x :: String}
\Output{y :: String}
\Output{z :: String}
\StartCode
\lIf{x \KwIs "hello"}{
\label{alg:important-line}\Return{"world"}
}
\While{true}{
\If{y \KwIs "world"}{
\Return{"hello"}
}
}
\Return{"goodbye"}
\end{algorithm}
\end{pseudo}
In the \nameref{fun:good-algo} algorithm \cref{fun:good-algo}, an important line is \AlgoLineRef{alg:important-line}.
\begin{rqs}
\item \label{rq:concept} What is the concept of this thesis?
\item \label{rq:implementation} How is the concept implemented?
\item \label{rq:evaluation} How is the implementation evaluated?
\begin{rqs}
\item \label{rq:evaluation:correctness} How is the correctness evaluated? \begin{rqs}
\item Please do not nest the questions that deep!
\end{rqs}
\item \label{rq:evaluation:performance} How is the performance evaluated?
\end{rqs}
\end{rqs}
We can now reference \ref{rq:concept} or with cleveref: \cref{rq:concept}.
You can also reference default enumerate elements:
\begin{enumerate}
\item \label{item:rando}First item
\item Second item
\end{enumerate}
With ref: \enquote{\ref{item:rando}}, on page \pageref{item:rando}, and cref: \enquote{\cref{item:rando}}.
\needspace{5\baselineskip}
But please, if there is any sense in doing so make use of, e.g., \texttt{ref} by \texttt{enumitem}:
\begin{enumerate}[ref={Penguin Element \arabic*}]
\item \label{item:rando2}First item
\item Second item
\end{enumerate}
With ref: \enquote{\ref{item:rando2}}, on page \pageref{item:rando2}, and cref: \enquote{\cref{item:rando2}}.
Using \texttt{\textbackslash newlist} you can also define your own lists, e.g., for research questions or contributions and give them your own ref names~--- see, e.g., \texttt{rqs} for an example.
\begin{minted}[float,caption={A floating caption},label=jeah]{R}
x <- list(i='hey', j='there')
for(i in x) {
print(paste("x$i", x$i))!*\label{lst:cool-line}*!
}
print(x)
\end{minted}
We can reference code, see: \cref{jeah}.
And lines of code as well, see: \cref{lst:cool-line}.
Verbatim content such as a listing does not survive the way \texttt{sidefig} collects its body, which is what the starred \texttt{sidefig*} and \texttt{sidetbl*} environments are for.
\begin{sidefig*}
\begin{lstlisting}[language=R]
x <- c(1, 2)
print(x)
\end{lstlisting}
\caption{A listing within the margin.}
\label{fig:sidelst}
\end{sidefig*}
They take no vertical shift, everything else works as before.
Any other float type is available with \texttt{sidefloat} and \texttt{sidefloat*}, which take the type as an argument, so a listing can be a listing as well (see \cref{lst:sidelst}).
\begin{sidefloat*}{lstlisting}
\xlstsetmintedstyle{plain}
\begin{minted}{R}
print("hi")
\end{minted}
\caption{A real listing in the margin.}
\label{lst:sidelst}
\end{sidefloat*}
\section{Contributions}
\section{Overview}
segments/related-work.tex · 344 B
\setchaptertoc
\chapter{Related Work}\label{chp:related-work}
\begin{summary}
All the important related work!
\end{summary}
\chapter{Background}\label{chp:background}
\begin{summary}
Use this chapter only if parts of your topic are foreign in a way so that the average computer science reader needs to be introduced to it.
\end{summary}
thesis.cls · 6 KB
\NeedsTeXFormat{LaTeX2e}
\def\thesis@classname{thesis}
\ProvidesClass{\thesis@classname}[2024/12/24 Florian Sihler - Template for Theses]
\def\thesis@warn{\ClassWarning{\thesis@classname}}
\def\thesis@error{\ClassError{\thesis@classname}}
% region setup-keys
\RequirePackage{kvoptions}
\SetupKeyvalOptions{family=thesis,prefix=thesis@}
% general
\DeclareBoolOption{draft}
\DeclareBoolOption{verbose}
\DeclareStringOption[_config]{configpath}
\DeclareStringOption[uulm-sp]{profile}
\DeclareStringOption[master-thesis]{type}
\DeclareStringOption[CCBY]{license}
\DeclareStringOption[\translate{computer-science}]{field}
\DeclareBoolOption{print}
\DeclareComplementaryOption{digital}{print}
% layout
\DeclareStringOption[10pt]{fontsize}
\DeclareStringOption[a4]{paper}
\DeclareBoolOption[true]{oneside}
\DeclareBoolOption[true]{enhanceMath}
\DeclareComplementaryOption{twoside}{oneside}
% also this option still exists, disabling the marginpar is no longer (fully) supported
\DeclareBoolOption[true]{marginpar}
\DeclareComplementaryOption{nomarginpar}{marginpar}
\DeclareBoolOption[true]{citeInMarginpar}
\DeclareStringOption[chapter]{citeMarginparScope}
\DeclareBoolOption[false]{sftitle}
\DeclareComplementaryOption{rmtitle}{sftitle}
\DeclareBoolOption[true]{pageInFloatRef}
\DeclareStringOption[auto]{floatRefSidenotes}
\DeclareBoolOption[true]{hideEmptyLists}
\DeclareComplementaryOption{showEmptyLists}{hideEmptyLists}
% links
\DeclareBoolOption[true]{hyperref}
\DeclareComplementaryOption{nohyperref}{hyperref}
% fonts
\DeclareBoolOption[true]{beramono}
\DeclareBoolOption[true]{palatino}
\DeclareBoolOption[true]{notomath}
\DeclareBoolOption[true]{fira}
\ProcessKeyvalOptions*
% the scope within which a citation appears in the margin at most once
\begingroup
\def\@tempa#1{\expandafter\gdef\csname thesis@citescope@#1\endcsname}
\@tempa{chapter}{\thechapter}
\@tempa{section}{\thesection}
\@tempa{subsection}{\thesubsection}
\@tempa{page}{\thepage}
\@tempa{document}{document}
\@tempa{always}{}
\endgroup
\newif\ifthesis@citescope@always
\ifcsname thesis@citescope@\thesis@citeMarginparScope\endcsname
\def\thesis@@val{always}%
\ifx\thesis@citeMarginparScope\thesis@@val\thesis@citescope@alwaystrue\fi
\else
\thesis@error{Invalid value '\thesis@citeMarginparScope' for option citeMarginparScope}{Please use 'chapter', 'section', 'subsection', 'page', 'document', or 'always'.}%
\fi
\newif\ifthesis@floatRefSidenotes
\def\thesis@@val{auto}
\ifx\thesis@floatRefSidenotes\thesis@@val
\ifthesis@pageInFloatRef\else\thesis@floatRefSidenotestrue\fi
\else
\def\thesis@@val{true}%
\ifx\thesis@floatRefSidenotes\thesis@@val\thesis@floatRefSidenotestrue\else
\def\thesis@@val{false}%
\ifx\thesis@floatRefSidenotes\thesis@@val\else
\thesis@error{Invalid value '\thesis@floatRefSidenotes' for option floatRefSidenotes}{Please use 'true', 'false', or 'auto'.}%
\fi
\fi
\fi
% endregion
% region deal with verbose
\def\thesis@info{\ClassInfo{\thesis@classname}}
\ifthesis@verbose
\errorcontextlines=9999
\let\thesis@log\typeout
\let\thesis@debug\typeout
\else
\let\thesis@log\@gobble
\let\thesis@debug\@gobble
\fi
% endregion
\RequirePackage{etoolbox}
\def\InputFrom#1{\thesis@info{Adding '#1' to the input path.}\appto\input@path{{#1/}}\appto\graphicspath{{#1/}}}
% region setup the input path
\expandafter\ifblank\expandafter{\thesis@configpath}{:
\thesis@debug{No config path given, does not set up \string\input@path}%
}{%
\InputFrom{\thesis@configpath}%
}
% endregion
% region load data
\def\thesis@internal@path{internal/}
% may be defined before \documentclass to relocate the profile folder
\providecommand*\thesisProfilesPath{profiles/\thesis@profile}
\def\thesis@profiles@path{\thesisProfilesPath}
\def\thesis@load@profile#1{%
\InputIfFileExists{\thesis@profiles@path/#1.tex}{%
\thesis@info{Loaded '#1' from profile '\thesis@profile' (from: '\thesis@profiles@path')}%
}{%
\thesis@error{Profile '\thesis@profile' does not have '#1' (searched at \thesis@profiles@path/#1.tex)}{Please make sure the configuration file is present.}%
}%
}
\def\thesis@internal@load#1{\makeatletter
\InputIfFileExists{\thesis@internal@path/#1.tex}{%
\thesis@log{Loaded internal::#1}%
}{%
\thesis@error{unable to find '#1' internally (searched at \thesis@internal@path/#1.tex)}{Please make sure the file is present.}%
}%
}
\let\ThesisModule\thesis@internal@load
% endregion
% region load class
\PassOptionsToClass{
fontsize=\thesis@fontsize,
paper=\thesis@paper,
numbers=noendperiod,
chapterprefix=true,
appendixprefix=true,
titlepage=firstiscover
}{scrbook}
\ifthesis@oneside
\PassOptionsToClass{twoside=false}{scrbook}
\else
\PassOptionsToClass{twoside=true}{scrbook}
\fi
\ifthesis@draft
\PassOptionsToClass{draft=true,overfullrule=true}{scrbook}
\fi
\LoadClass{scrbook}
\RequirePackage{scrhack}
\RequirePackage{scrwfile}
\RequirePackage{iftex}
\ifthesis@draft
\RequirePackage[draft=false]{scrlayer-scrpage}
\fi
\ifluatex
\RequirePackage{polyglossia}
\setmainlanguage{english}
\else
\RequirePackage{babel}
\fi
% endregion
\ifthesis@draft
\long\def\hideindraft#1{}
\else
\long\def\hideindraft#1{#1}
\fi
\def\thesis@voidpar{{\parskip=0pt\parindent=0pt\par}}
\thesis@internal@load{translation}
\thesis@internal@load{colors}
\thesis@internal@load{fonts}
\thesis@internal@load{page}
\thesis@internal@load{headfoot}
\thesis@internal@load{layout}
\thesis@internal@load{marginpar}
\thesis@internal@load{tables}
\thesis@internal@load{footnote}
\thesis@internal@load{chapter}
\thesis@internal@load{license}
\thesis@internal@load{floats}
\thesis@internal@load{titlepage}
\RequirePackage{mathtools}
\thesis@internal@load{hyperref}
\thesis@internal@load{biblatex}
\thesis@internal@load{environments}
\thesis@load@profile{defaults}
% TODO: one format fmt for default configuration?
% TODO: externalize support?
\endinputthesis.tex — the file that is compiled · 3 KB
\documentclass[
verbose,
english,
type=bachelor-thesis, % master-thesis
%field=Computer Science, % change your field
license=CCBY, % CCBY, CCBYSA, CCBYNC, CCBYNCSA; open an issue if you need another license
%sftitle, % sans-serif titles
paper=a4, % forces A4 format
%twoside, % twosided layout
%draft, % omit title page, listings, and particular chapters selected below using include only
%print, % the printed version does not use colored links
%citeMarginparScope=section, % repeat margin cites per section instead of per chapter (also: subsection, page, document, always)
%pageInFloatRef=false % if you want to have the default names for floats instead of <page><Letter>
%floatRefSidenotes=true % force 'on page' sidenotes for float refs (auto: only without pageInFloatRef)
%notomath=false % do not use noto math as a font but fallback to the mathpazo alternative
]{thesis}
\addbibresource{literature/literature.bib}
% for the final page! (see below with `\makedeclarationofauthenticity)
\ThesisModule{authenticity}
% specify \signature{path/to/signature.png} to include a signature
% you can also shift the signature with \signature[xshift=0pt,yshift=0pt]{path/to/signature.png}
% if you want to set the location of the signature, use
\signaturelocation{Ulm}
% if you want to set the submission date of the declaration, use
\signaturedate{2025-12-30}
\makedeclarationofauthenticity % for a predefined declaration of authenticity
% \begin{declarationofauthenticity} % when you want to write your own text
% No, I definitely did not copy all my code from StackOverflow. I swear!
% \end{declarationofauthenticity}
% provide addon listings support:
\ThesisModule{listings}
\LoadLanguage{R}
% link code in listings to its definition (see the README):
% \ThesisModule{codelink}
\ThesisModule{units}
\ThesisModule{pseudocode}
% do you have a glossary?
\ThesisModule{glossary}
\loadglsentries{segments/glossary.tex}
% do you want colored glossary symbols in the document?
\def\glssym#1{{\color{purple!80!blue}\gls{#1}}}
% == Important Metadata
\title{Your paper}
\author{Your Amazing Name}
% \studentnumber{} your matriculation number if you have to
\titleimage[width=.75\linewidth]{img/title-banner-image}
\date{\today}
\examiner{Prof. Dr. Matthias Tichy}{Institute of Software Engineering and Programming Languages}
% \examiner{Your Second Examiner}{Their Institute}
\supervisor{Florian Sihler}{Institute of Software Engineering and Programming Languages}
% == End of Important Metadata
\begin{document}
\hideindraft{
\frontmatter
\maketitle
\include{segments/abstract}
\include{segments/acknowledgements}
\tableofcontents
{
% if you do not want new pages:
% \clearpage
% \let\LaTeXStandardClearpage\clearpage
% \let\clearpage\relax
% a list without any entry prints nothing at all (no heading, no page),
% so you can simply keep all of them -- use the `showEmptyLists`
% document class option if you want them printed even when empty
\listoffigures
\listoftables
\lstlistoflistings
}
}
\mainmatter
\include{segments/introduction}
\include{segments/related-work}
\include{segments/concept}
\include{segments/implementation}
\include{segments/evaluation}
\include{segments/conclusion}
\backmatter
\printbibliography
\let\clearpage\newpage
\let\cleardoublepage\newpage
\chapter{Glossary and Acronyms}
\printglossaries
\end{document}
The first page, as this template compiles today. Click it to enlarge, and again to shrink. Open the file ↗