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.
385 lines
12 KiB
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
|