GEX thesis source code, full text, references
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
gex-thesis/ctuth-core.tex

385 lines
12 KiB

7 years ago
%!TEX ROOT = ctutest.tex
\ProvidesExplFile{ctuth-core.tex}%
{2015/11/15}{0.1 t1511151022}%MY TIMESTAMP HERE {0.1}
{"Core"\space part\space of\space the\space class\space ctuthesis}
%%% GENERAL LaTeX3 THINGIES
\cs_generate_variant:Nn \keys_set:nn { nx }
\cs_generate_variant:Nn \tl_if_eq:nnTF { xn }
\cs_generate_variant:Nn \seq_gconcat:NNN { cc }
\cs_generate_variant:Nn \str_if_eq:nnTF { xn }
\skip_new:N \g_ctuthesis_tempa_skip
%%% CLASS SETUP, FIELDS, TEMPLATES, THEMES
% Set allowed languages: No other languages can ever be main, title or second
\tl_gset:Nn \g_ctuthesis_alllanguages_tl {{czech}{english}{slovak}}
% Error message for using \ctuprocess twice
\msg_new:nnn { ctuthesis } { ctuprocess-twice } { The~macro~ \token_to_str:N \ctuprocess\ should~
be~used~only~once~in~preamble. }
% Error message for not using \ctuprocess at all
\msg_new:nnn { ctuthesis } { ctuprocess-none } { It~is~necessary~to~use~the~
macro~ \token_to_str:N \ctuprocess\ once~in~the~preamble. }
%%% KEY-VALUE SETUP
% Two seqs: one for keys that need disabling after \documentclass,
% another one for keys that need disabling after \ctuprocess
\seq_new:N \g_ctuthesis_keys_nop_seq
\seq_new:N \g_ctuthesis_keys_nopost_seq
% Add the clist #2 into seq #1
\cs_new:Nn \ctuthesis_keys_add_no:nn {
\group_begin:
\seq_set_from_clist:Nn \l_temp_ctuthesis_a_seq { #2 }
\seq_gconcat:ccN { g_ctuthesis_keys_#1_seq } { g_ctuthesis_keys_#1_seq } \l_temp_ctuthesis_a_seq
\group_end:
}
% Error messages for the keyvalue interface
\msg_new:nnn { ctuthesis } { keys-unknown } { The~key~'#1'~is~not~known~to~the~
class~'ctuthesis'~and~will~be~ignored. }
\msg_new:nnn { ctuthesis } { keys-nopost } { The~key~'#1'~is~forbidden~after~
\token_to_str:N \ctuprocess \space and~will~be~ignored.~You~may~wish~to~
set~it~up~before. }
\msg_new:nnn { ctuthesis } { keys-nop } { The~key~'#1'~is~forbidden~in~
\token_to_str:N \ctusetup \space and~will~be~ignored.~Use~the~optional~argument~
of~ \token_to_str:N \documentclass \space to~set~it~up. }
% Very standard unknown key treatment
\keys_define:nn { ctuthesis } {
unknown .code:n = \msg_error:nnx { ctuthesis } { keys-unknown } { \l_keys_key_tl },
}
% Disables keys marked '#1' (either 'nop' or 'nopost')
\cs_new:Nn \ctuthesis_disable_keys:n {
\seq_map_inline:cn { g_ctuthesis_keys_#1_seq } {
\keys_define:nn { ctuthesis } {
##1 .code:n = \msg_error:nnx { ctuthesis } { keys-#1 } { ##1 },
}
}
}
% General keys
\tl_gset:Nn \g_ctuthesis_fontsize_tl {11pt}
\seq_new:N \g_ctuthesis_languages_seq
\keys_define:nn { ctuthesis } {
% Only 11pt fontsize is allowed
fontsize .choices:nn = { 11pt } { \tl_gset_eq:NN \g_ctuthesis_fontsize_tl \l_keys_choice_tl },
% Oneside option
oneside .bool_gset:c = { g_ctuthesis_switch_oneside_bool },
oneside .initial:n = { false },
twoside .meta:n = { oneside = false },
% Draft option
draft .bool_gset:c = { g_ctuthesis_switch_draft_bool },
draft .initial:n = { false },
% We use three languages:
% main for the work itself, ToC and LoFT
mainlanguage .choice:,
% title for the titlepage, thanks, declaration and abstract
titlelanguage .choice:,
% second is the language of second abstract. First abstract is in title language,
% second abstract is either in main language, or in English for Czech/Slovak theses
% or Czech for English theses. It will be set automatically.
secondlanguage .choice:,
% otherlanguages will be simply passed on to babel
otherlanguages .code:n =
\seq_set_from_clist:Nn \l_temp_ctuthesis_a_seq { #1 }
\seq_gconcat:NNN \g_ctuthesis_languages_seq \g_ctuthesis_languages_seq \l_temp_ctuthesis_a_seq
,
}
\ctuthesis_keys_add_no:nn { nop } { draft, fontsize, oneside, twoside }
\ctuthesis_keys_add_no:nn { nopost } { mainlanguage, titlelanguage, secondlanguage }
% Switches defaulting to false
\tl_map_inline:nn { {front-specification}{monochrome}{savetoner}{pkg-listings}{layout-short} } {
\keys_define:nn { ctuthesis } {
#1 .bool_gset:c = { g_ctuthesis_switch_#1_bool },
#1 .initial:n = { false },
}
}
\ctuthesis_keys_add_no:nn { nopost } { monochrome, savetoner, pkg-listings }
% Switches defaulting to true
\tl_map_inline:nn { {front-list-of-tables}{front-list-of-figures}{pkg-hyperref}{pkg-makeidx}{pkg-amsthm} } {
\keys_define:nn { ctuthesis } {
#1 .bool_gset:c = { g_ctuthesis_switch_#1_bool },
#1 .initial:n = { true },
}
}
\ctuthesis_keys_add_no:nn { nopost } { pkg-hyperref, pkg-makeidx }
% We allow the key 11pt along with the key fontsize
\tl_map_inline:nn { {11pt} } {
\keys_define:nn { ctuthesis } {
#1 .meta:n = { fontsize = #1 },
}
\ctuthesis_keys_add_no:nn { nop } { #1 }
}
% Basic fields that are not language-dependent
\tl_map_inline:nn { {author}{supervisor}{supervisor-specialist}{supervisor-address}{day}{month}{year}
{facultynum}{specification-file}{preprint} } {
\keys_define:nn { ctuthesis } {
#1 .tl_gset:c = { g_ctuthesis_field_#1_tl },
}
}
% Language-dependent keys and environments
\tl_map_inline:Nn \g_ctuthesis_alllanguages_tl {
% Various fields in various languages
\tl_map_inline:nn { {title}{subtitle}{university}{university-endl}{faculty}{department}
{doctype}{fieldofstudy}{subfieldofstudy}{keywords} } {
\keys_define:nn { ctuthesis } {
##1-#1 .tl_gset:c = g_ctuthesis_field_##1_#1_tl,
}
}
% Sets up the choice for each of the languages
\tl_map_inline:nn { {mainlanguage}{titlelanguage}{secondlanguage} } {
\keys_define:nn { ctuthesis } {
##1 / #1 .code:n =
\tl_gset:cn { g_ctuthesis_field_##1_tl } { #1 }
\seq_gput_right:Nn \g_ctuthesis_languages_seq { #1 },
}
}
% The abstract is now language-dependent
\NewEnviron { abstract-#1 } { \tl_gset:cV { g_ctuthesis_field_abstract_#1_tl } \BODY }
\tl_new:c { g_ctuthesis_field_abstract_#1_tl }
}
% "abstract" itself is not used, the language of the abstract has to be specified
\msg_new:nnn { ctuthesis } { abstract-forbidden } { The~environment~'abstract'~should~be~replaced~
by~'abstract-lang'~with~the~proper~language~specified. }
\DeclareDocumentEnvironment{ abstract }{ }{ \msg_error:nn { ctuthesis } { abstract-forbidden } }{ }
% "thanks" and "declaration" are fields, but set up as environments rather then KVs
\cs_undefine:c { thanks }
\NewEnviron { thanks } { \tl_gset:cV { g_ctuthesis_field_thanks_tl } \BODY }
\tl_new:c { g_ctuthesis_field_thanks_tl }
\NewEnviron { declaration } { \tl_gset:cV { g_ctuthesis_field_declaration_tl } \BODY }
\tl_new:c { g_ctuthesis_field_declaration_tl }
\tl_gset:Nn \g_ctuthesis_ctulstbg_tl { ctulstbg }
\keys_define:nn { ctuthesis } {
ctulstbg .tl_gset:N = \g_ctuthesis_ctulstbg_tl
}
% A macro called after every \keys_set{ctuthesis}{...}
\cs_new:Nn \ctuthesis_ctusetup_trigger: {
% Remove duplicates from the language list
\seq_gremove_duplicates:N \g_ctuthesis_languages_seq
% Set up titlelanguage as mainlanguage if the latter is defined and the former is not
\bool_if:nT { \tl_if_exist_p:c { g_ctuthesis_field_mainlanguage_tl }
&& ! \tl_if_empty_p:c { g_ctuthesis_field_mainlanguage_tl }
&& ( ! \tl_if_exist_p:c { g_ctuthesis_field_titlelanguage_tl }
|| \tl_if_empty_p:c { g_ctuthesis_field_titlelanguage_tl } )
} {
\keys_set:nx { ctuthesis } { titlelanguage = \tl_use:c { g_ctuthesis_field_mainlanguage_tl } }
}
% Set up secondlanguage if it has not been set up before
\bool_if:nT { \tl_if_exist_p:c { g_ctuthesis_field_mainlanguage_tl }
&& \tl_if_exist_p:c { g_ctuthesis_field_titlelanguage_tl }
&& ( ! \tl_if_exist_p:c { g_ctuthesis_field_secondlanguage_tl }
|| \tl_if_empty_p:c { g_ctuthesis_field_secondlanguage_tl } )
} {
\tl_if_eq:ccTF { g_ctuthesis_field_mainlanguage_tl } { g_ctuthesis_field_titlelanguage_tl } {
\tl_if_eq:xnTF { \tl_use:c { g_ctuthesis_field_mainlanguage_tl } } { english } {
\keys_set:nn { ctuthesis } { secondlanguage = czech }
} {
\keys_set:nn { ctuthesis } { secondlanguage = english }
}
} {
\keys_set:nx { ctuthesis } { secondlanguage = \tl_use:c { g_ctuthesis_field_mainlanguage_tl } }
}
}
}
% Key setup to be used in the preamble
\NewDocumentCommand \ctusetup { m } {
\keys_set:nn { ctuthesis } { #1 }
\ctuthesis_ctusetup_trigger:
}
%%% THEMES, TEMPLATES AND FIELDS
% Theme, template and field hadling - "unknown" error messages
\msg_new:nnn { ctuthesis } { unknown-theme } { Theme~'#1'~has~not~been~defined~
for~use~with~ \token_to_str:N \ctutheme . }
\msg_new:nnn { ctuthesis } { unknown-template } { Template~'#1'~has~not~been~defined~
for~use~with~ \token_to_str:N \ctutemplate . }
\msg_new:nnn { ctuthesis } { unknown-field } { Field~'#1'~has~not~been~defined~
for~use~with~ \token_to_str:N \ctufield . }
% Theme and template hadling - setters
\NewDocumentCommand \ctuthemeset { >{\TrimSpaces}m +m } {
\cs_set:cn { ctuthesis_theme_#1_var: } { #2 }
}
\NewDocumentCommand \ctutemplateset { >{\TrimSpaces}m +m } {
\cs_set:cn { ctuthesis_template_#1_var: } { #2 }
}
% Theme, template and field hadling - getters
\NewDocumentCommand \ctutheme { >{\TrimSpaces}m } {
\cs_if_exist_use:cF { ctuthesis_theme_#1_var: } { \msg_error:nnx { ctuthesis } { unknown-theme } { #1 } }
}
\NewDocumentCommand \ctutemplate { >{\TrimSpaces}m } {
\cs_if_exist_use:cF { ctuthesis_template_#1_var: } { \msg_error:nnx { ctuthesis } { unknown-template } { #1 } }
}
% `\ctufield` supports the context language specifier as an optional argument
\NewDocumentCommand \ctufield { >{\TrimSpaces}o >{\TrimSpaces}m } {
\IfValueTF { #1 } {
% \ctuthesis_field_exists:nF { #1 language } { \msg_error:nnx { ctuthesis } { unknown-field } { #1 } }
% \ctuthesis_field_use:n { #2_\ctuthesis_field_use:n { #1 language } }
\ctuthesis_field_use:nn { #1 } { #2 }
} {
\ctuthesis_field_use:n { #2 }
}
}
\cs_new:Nn \ctuthesis_field_use:n {
\cs_if_exist_use:cF { g_ctuthesis_field_#1_tl } { \msg_error:nnx { ctuthesis } { unknown-field } { #1 } }
}
% This one takes two arguments: the language and the field name
\cs_new:Nn \ctuthesis_field_use:nn {
\cs_if_exist:cF { g_ctuthesis_field_#1language_tl } { \msg_error:nnx { ctuthesis } { unknown-field } { #1 } }
\ctuthesis_field_use:n { #2_\ctuthesis_field_use:n { #1 language } }
}
% Theme, template and field hadling - existance conditionals
\prg_new_conditional:Nnn \ctuthesis_theme_exists:n { p, T, F, TF } {
\cs_if_exist:cTF { ctuthesis_theme_#1_var } { \prg_return_true: } { \prg_return_false: }
}
\prg_new_conditional:Nnn \ctuthesis_template_exists:n { p, T, F, TF } {
\cs_if_exist:cTF { ctuthesis_template_#1_var } { \prg_return_true: } { \prg_return_false: }
}
\prg_new_conditional:Nnn \ctuthesis_field_exists:n { p, T, F, TF } {
\cs_if_exist:cTF { g_ctuthesis_field_#1_tl } { \prg_return_true: } { \prg_return_false: }
}
% Theme, template and field hadling - publicly available conditionals with "true" and "false" branches
\DeclareDocumentCommand \ctuiftheme { s~>{\TrimSpaces}m +m +m } {
\ctuthesis_theme_exists:nTF { #2 } {
\IfBooleanTF { #1 } {
\tl_if_empty:cTF { g_ctuthesis_theme_#1_tl } { #4 } { #3 }
} {
#3
}
} {
#4
}
}
\DeclareDocumentCommand \ctuiftemplate { s~>{\TrimSpaces}m +m +m } {
\ctuthesis_template_exists:nTF { #2 } {
\IfBooleanTF { #1 } {
\tl_if_empty:cTF { g_ctuthesis_template_#1_tl } { #4 } { #3 }
} {
#3
}
} {
#4
}
}
% The starred variant checks for emptiness rather than for existance
\DeclareDocumentCommand \ctuiffield { s~>{\TrimSpaces}o >{\TrimSpaces}m +m +m } {
\IfValueTF { #2 } {
\ctuthesis_field_exists:nF { #2 language } { \msg_error:nnx { ctuthesis } { unknown-field } { #1 } }
\IfBooleanTF { #1 } {
\ctuiffield * { #3_\ctuthesis_field_use:n { #2 language } } { #4 } { #5 }
} {
\ctuiffield { #3_\ctuthesis_field_use:n { #2 language } } { #4 } { #5 }
}
} {
\ctuthesis_field_exists:nTF { #3 } {
\IfBooleanTF { #1 } {
\tl_if_empty:cTF { g_ctuthesis_field_#3_tl } { #5 } { #4 }
} {
#4
}
} {
\ctuthesis_field_exists:nTF { #3 } { #5 } { #4 }
}
}
}
% We don't do any check for existance of a switch, so better be careful.
\prg_new_conditional:Nnn \ctuthesis_if_switch:n { p, T, F, TF } {
\bool_if:cTF { g_ctuthesis_switch_#1_bool } { \prg_return_true: } { \prg_return_false: }
}
\DeclareDocumentCommand \ctuifswitch { >{\TrimSpaces}m +m +m } {
\bool_if:cTF { g_ctuthesis_switch_#1_bool } { #2 } { #3 }
}
%%% LOGGING
% Create \ctuverlog which contains the automatically updated timestamp of the file.
% It can be used for instance in \ctusetup{preprint = \ctuverlog} in order to show
% the timestamp on every page.
\cs_new:Npx \ctuverlog {
ctuthesis ~ \use_ii:nn
{2015/11/15}{ t1511151022}%MY TIMESTAMP HERE {}
}
\endinput