summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2024-10-01 20:00:43 +0000
committerKarl Berry <karl@freefriends.org>2024-10-01 20:00:43 +0000
commit53e723733df96c106cfd39d25b24a5a6762fd078 (patch)
tree55c696d4189fad516a9378d8fd27df4a9d81c5a7
parentfb0d2e7d5f76094d5c999a0c9657b5d2bc665f59 (diff)
udiss (1oct24)
git-svn-id: svn://tug.org/texlive/trunk@72445 c570f23f-e606-0410-a88d-b1316a301751
-rw-r--r--Master/texmf-dist/doc/latex/udiss/README.txt7
-rw-r--r--Master/texmf-dist/doc/latex/udiss/logos/udiss-logo-ukerala.pngbin0 -> 66033 bytes
-rw-r--r--Master/texmf-dist/doc/latex/udiss/udiss-fonts-english.tex75
-rw-r--r--Master/texmf-dist/doc/latex/udiss/udiss-fonts-hindi.tex100
-rw-r--r--Master/texmf-dist/doc/latex/udiss/udiss-fonts-malayalam.tex94
-rw-r--r--Master/texmf-dist/doc/latex/udiss/udiss-fonts-marathi.tex126
-rw-r--r--Master/texmf-dist/doc/latex/udiss/udiss-style-ukerala.tex43
-rw-r--r--Master/texmf-dist/doc/latex/udiss/udiss.pdfbin0 -> 471468 bytes
-rw-r--r--Master/texmf-dist/source/latex/udiss/udiss.dtx4143
-rw-r--r--Master/texmf-dist/source/latex/udiss/udiss.ins75
-rw-r--r--Master/texmf-dist/tex/latex/udiss/udiss.cls1868
-rwxr-xr-xMaster/tlpkg/bin/tlpkg-ctan-check2
-rw-r--r--Master/tlpkg/tlpsrc/collection-publishers.tlpsrc1
-rw-r--r--Master/tlpkg/tlpsrc/udiss.tlpsrc0
14 files changed, 6533 insertions, 1 deletions
diff --git a/Master/texmf-dist/doc/latex/udiss/README.txt b/Master/texmf-dist/doc/latex/udiss/README.txt
new file mode 100644
index 00000000000..6264a211a92
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/udiss/README.txt
@@ -0,0 +1,7 @@
+------------------------------------------------------------
+Class: udiss
+Author: TUGIndia
+Description: A LaTeX bundle for typesetting dissertations
+Bugs: puszcza.gnu.org.ua/bugs/?group=udiss
+Licenses: GPLv3+, GFDLv1.3+
+------------------------------------------------------------
diff --git a/Master/texmf-dist/doc/latex/udiss/logos/udiss-logo-ukerala.png b/Master/texmf-dist/doc/latex/udiss/logos/udiss-logo-ukerala.png
new file mode 100644
index 00000000000..9e2dd34afb0
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/udiss/logos/udiss-logo-ukerala.png
Binary files differ
diff --git a/Master/texmf-dist/doc/latex/udiss/udiss-fonts-english.tex b/Master/texmf-dist/doc/latex/udiss/udiss-fonts-english.tex
new file mode 100644
index 00000000000..0e0a084278c
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/udiss/udiss-fonts-english.tex
@@ -0,0 +1,75 @@
+%%
+%% This is file `udiss-fonts-english.tex',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% udiss.dtx (with options: `babel-en')
+%% ---------------------------------------------------------
+%% Bundle: udiss
+%% Version: v0.1 (October 1, 2024)
+%% Author: Indian TeX Users Group
+%% Description: A LaTeX bundle for typesetting dissertations
+%% Bugs: puszcza.gnu.org.ua/bugs/?group=udiss
+%% Licenses: GPLv3+, GFDLv1.3+
+%% ---------------------------------------------------------
+%%
+%% The LaTeX bundle udiss v0.1
+%% Copyright © 2024 Indian TeX Users Group
+%%
+%% This program is free software: you can redistribute it
+%% and/or modify it under the terms of the GNU General
+%% Public License as published by the Free Software
+%% Foundation, either version 3 of the License, or (at your
+%% option) any later version.
+%%
+%% This program is distributed in the hope that it will be
+%% useful, but WITHOUT ANY WARRANTY; without even the
+%% implied warranty of MERCHANTABILITY or FITNESS FOR A
+%% PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public
+%% License along with this program. If not, see
+%% <https://www.gnu.org/licenses/>.
+%% ---------------------------------------------------------
+\babelfont[english]{rm}[%
+ IgnoreFontspecFile,%
+ Extension = {.otf},%
+ ItalicFont = {NewCM10-BookItalic},%
+ BoldFont = {NewCM10-Bold},%
+ BoldItalicFont = {NewCM10-BoldItalic},%
+ SlantedFont = {NewCM10-Book},%
+ BoldSlantedFont = {NewCM10-Bold},%
+ Numbers = {OldStyle},%
+ CharacterVariant = {6},%
+ \ifLuaTeX
+ Renderer = {HarfBuzz}%
+ \fi
+]{NewCM10-Book}
+\babelfont[english]{sf}[%
+ IgnoreFontspecFile,%
+ Extension = {.otf},%
+ ItalicFont = {NewCMSans10-BookOblique},%
+ BoldFont = {NewCMSans10-Bold},%
+ BoldItalicFont = {NewCMSans10-BoldOblique},%
+ SlantedFont = {NewCMSans10-Book},%
+ BoldSlantedFont = {NewCMSans10-Bold},%
+ Numbers = {OldStyle},%
+ CharacterVariant = {6},%
+ \ifLuaTeX
+ Renderer = {HarfBuzz}%
+ \fi
+]{NewCMSans10-Book}
+\babelfont[english]{tt}[%
+ IgnoreFontspecFile,%
+ Extension = {.otf},%
+ BoldFont = {NewCMMono10-Bold},%
+ ItalicFont = {NewCMMono10-Italic},%
+ \ifLuaTeX
+ Renderer = {HarfBuzz}%
+ \fi
+]{NewCMMono10-Book}
+\endinput
+%%
+%% End of file `udiss-fonts-english.tex'.
diff --git a/Master/texmf-dist/doc/latex/udiss/udiss-fonts-hindi.tex b/Master/texmf-dist/doc/latex/udiss/udiss-fonts-hindi.tex
new file mode 100644
index 00000000000..61caabaad8d
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/udiss/udiss-fonts-hindi.tex
@@ -0,0 +1,100 @@
+%%
+%% This is file `udiss-fonts-hindi.tex',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% udiss.dtx (with options: `babel-hi')
+%% ---------------------------------------------------------
+%% Bundle: udiss
+%% Version: v0.1 (October 1, 2024)
+%% Author: Indian TeX Users Group
+%% Description: A LaTeX bundle for typesetting dissertations
+%% Bugs: puszcza.gnu.org.ua/bugs/?group=udiss
+%% Licenses: GPLv3+, GFDLv1.3+
+%% ---------------------------------------------------------
+%%
+%% The LaTeX bundle udiss v0.1
+%% Copyright © 2024 Indian TeX Users Group
+%%
+%% This program is free software: you can redistribute it
+%% and/or modify it under the terms of the GNU General
+%% Public License as published by the Free Software
+%% Foundation, either version 3 of the License, or (at your
+%% option) any later version.
+%%
+%% This program is distributed in the hope that it will be
+%% useful, but WITHOUT ANY WARRANTY; without even the
+%% implied warranty of MERCHANTABILITY or FITNESS FOR A
+%% PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public
+%% License along with this program. If not, see
+%% <https://www.gnu.org/licenses/>.
+%% ---------------------------------------------------------
+\IfLanguageName{hindi}{%
+ \ekvset{udiss}{%
+ rmfont = {Mukta-Regular.ttf},%
+ rmitfont = {Mukta-Regular.ttf},%
+ rmbffont = {Mukta-Bold.ttf},%
+ rmbfitfont = {Mukta-Bold.ttf},%
+ rmfeatures = {%
+ Script = {Devanagari}%
+ },%
+ sffont = {Mukta-Regular.ttf},%
+ sfitfont = {Mukta-Regular.ttf},%
+ sfbffont = {Mukta-Bold.ttf},%
+ sfbfitfont = {Mukta-Bold.ttf},%
+ sffeatures = {%
+ Script = {Devanagari}%
+ },%
+ ttfont = {Mukta-Regular.ttf},%
+ ttitfont = {Mukta-Regular.ttf},%
+ ttbffont = {Mukta-Bold.ttf},%
+ ttbfitfont = {Mukta-Bold.ttf},%
+ sffeatures = {%
+ Script = {Devanagari}%
+ }%
+ }%
+}{%
+ \babelfont[hindi]{rm}[%
+ IgnoreFontspecFile,%
+ ItalicFont = {Mukta-Regular.ttf},%
+ BoldFont = {Mukta-Bold.ttf},%
+ BoldItalicFont = {Mukta-Bold.ttf},%
+ Language = {Hindi},%
+ Script = {Devanagari},%
+ Numbers = {OldStyle},%
+ \ifLuaTeX
+ Renderer = {HarfBuzz}%
+ \fi
+ ]{Mukta-Regular.ttf}
+ \babelfont[hindi]{sf}[%
+ IgnoreFontspecFile,%
+ ItalicFont = {Mukta-Regular.ttf},%
+ BoldFont = {Mukta-Bold.ttf},%
+ BoldItalicFont = {Mukta-Bold.ttf},%
+ Language = {Hindi},%
+ Script = {Devanagari},%
+ Numbers = {OldStyle},%
+ \ifLuaTeX
+ Renderer = {HarfBuzz}%
+ \fi
+ ]{Mukta-Regular.ttf}
+ \babelfont[hindi]{tt}[%
+ IgnoreFontspecFile,%
+ ItalicFont = {Mukta-Regular.ttf},%
+ BoldFont = {Mukta-Bold.ttf},%
+ BoldItalicFont = {Mukta-Bold.ttf},%
+ Language = {Hindi},%
+ Script = {Devanagari},%
+ Numbers = {OldStyle},%
+ \ifLuaTeX
+ Renderer = {HarfBuzz}%
+ \fi
+ ]{Mukta-Regular.ttf}
+}
+\endinput
+%%
+%% End of file `udiss-fonts-hindi.tex'.
diff --git a/Master/texmf-dist/doc/latex/udiss/udiss-fonts-malayalam.tex b/Master/texmf-dist/doc/latex/udiss/udiss-fonts-malayalam.tex
new file mode 100644
index 00000000000..e16c181c0a8
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/udiss/udiss-fonts-malayalam.tex
@@ -0,0 +1,94 @@
+%%
+%% This is file `udiss-fonts-malayalam.tex',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% udiss.dtx (with options: `babel-ml')
+%% ---------------------------------------------------------
+%% Bundle: udiss
+%% Version: v0.1 (October 1, 2024)
+%% Author: Indian TeX Users Group
+%% Description: A LaTeX bundle for typesetting dissertations
+%% Bugs: puszcza.gnu.org.ua/bugs/?group=udiss
+%% Licenses: GPLv3+, GFDLv1.3+
+%% ---------------------------------------------------------
+%%
+%% The LaTeX bundle udiss v0.1
+%% Copyright © 2024 Indian TeX Users Group
+%%
+%% This program is free software: you can redistribute it
+%% and/or modify it under the terms of the GNU General
+%% Public License as published by the Free Software
+%% Foundation, either version 3 of the License, or (at your
+%% option) any later version.
+%%
+%% This program is distributed in the hope that it will be
+%% useful, but WITHOUT ANY WARRANTY; without even the
+%% implied warranty of MERCHANTABILITY or FITNESS FOR A
+%% PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public
+%% License along with this program. If not, see
+%% <https://www.gnu.org/licenses/>.
+%% ---------------------------------------------------------
+\IfLanguageName{malayalam}{%
+ \ekvset{udiss}{%
+ rmfont = {RIT-Rachana-Regular.ttf},%
+ rmitfont = {RIT-Rachana-Italic.ttf},%
+ rmbffont = {RIT-Rachana-Bold.ttf},%
+ rmbfitfont = {RIT-Rachana-BoldItalic.ttf},%
+ rmfeatures = {%
+ Script = {Malayalam}%
+ },%
+ sffont = {RIT-MeeraNew.ttf},%
+ sfitfont = {RIT-MeeraNew.ttf},%
+ sfbffont = {RIT-tnjoy-bold.ttf},%
+ sfbfitfont = {RIT-tnjoy-bold.ttf},%
+ sffeatures = {%
+ Script = {Malayalam}%
+ },%
+ ttfont = {RIT-MeeraNew.ttf},%
+ ttitfont = {RIT-MeeraNew.ttf},%
+ ttbffont = {RIT-tnjoy-bold.ttf},%
+ ttbfitfont = {RIT-tnjoy-bold.ttf},%
+ sffeatures = {%
+ Script = {Malayalam}%
+ }%
+ }%
+}{%
+ \babelfont[malayalam]{rm}[%
+ IgnoreFontspecFile,%
+ Script = {Malayalam},%
+ ItalicFont = {RIT-Rachana-Italic.ttf},%
+ BoldFont = {RIT-Rachana-Bold.ttf},%
+ BoldItalicFont = {RIT-Rachana-BoldItalic.ttf},%
+ \ifLuaTeX
+ Renderer = {HarfBuzz}%
+ \fi
+ ]{RIT-Rachana-Regular.ttf}
+ \babelfont[malayalam]{sf}[%
+ IgnoreFontspecFile,%
+ Script = {Malayalam},%
+ ItalicFont = {RIT-tnjoy-regular.ttf},%
+ BoldFont = {RIT-tnjoy-bold.ttf},%
+ BoldItalicFont = {RIT-tnjoy-bold.ttf},%
+ \ifLuaTeX
+ Renderer = {HarfBuzz}%
+ \fi
+ ]{RIT-tnjoy-regular.ttf}
+ \babelfont[malayalam]{tt}[%
+ IgnoreFontspecFile,%
+ Script = {Malayalam},%
+ ItalicFont = {RIT-tnjoy-regular.ttf},%
+ BoldFont = {RIT-tnjoy-bold.ttf},%
+ BoldItalicFont = {RIT-tnjoy-bold.ttf},%
+ \ifLuaTeX
+ Renderer = {HarfBuzz}%
+ \fi
+ ]{RIT-tnjoy-regular.ttf}%
+}
+\endinput
+%%
+%% End of file `udiss-fonts-malayalam.tex'.
diff --git a/Master/texmf-dist/doc/latex/udiss/udiss-fonts-marathi.tex b/Master/texmf-dist/doc/latex/udiss/udiss-fonts-marathi.tex
new file mode 100644
index 00000000000..00e6f33dca8
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/udiss/udiss-fonts-marathi.tex
@@ -0,0 +1,126 @@
+%%
+%% This is file `udiss-fonts-marathi.tex',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% udiss.dtx (with options: `babel-mr')
+%% ---------------------------------------------------------
+%% Bundle: udiss
+%% Version: v0.1 (October 1, 2024)
+%% Author: Indian TeX Users Group
+%% Description: A LaTeX bundle for typesetting dissertations
+%% Bugs: puszcza.gnu.org.ua/bugs/?group=udiss
+%% Licenses: GPLv3+, GFDLv1.3+
+%% ---------------------------------------------------------
+%%
+%% The LaTeX bundle udiss v0.1
+%% Copyright © 2024 Indian TeX Users Group
+%%
+%% This program is free software: you can redistribute it
+%% and/or modify it under the terms of the GNU General
+%% Public License as published by the Free Software
+%% Foundation, either version 3 of the License, or (at your
+%% option) any later version.
+%%
+%% This program is distributed in the hope that it will be
+%% useful, but WITHOUT ANY WARRANTY; without even the
+%% implied warranty of MERCHANTABILITY or FITNESS FOR A
+%% PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public
+%% License along with this program. If not, see
+%% <https://www.gnu.org/licenses/>.
+%% ---------------------------------------------------------
+\babelprovide[%
+ mapdigits,%
+ counters/स्वर = अ आ इ ई उ ऊ ए ऐ ओ औ अं अः ॲ ऋ ऌ ऑ,%
+ counters/अंक = एक दोन तीन चार पाच सहा सात आठ नऊ दहा अकरा
+ बारा तेरा चौदा पंधरा सोळा सतरा अठरा एकोणीस वीस एकवीस बावीस
+ तेवीस चोवीस पंचवीस सव्वीस सत्तावीस अठ्ठावीस एकोणतीस तीस एकतीस
+ बत्तीस तेहतीस चौतीस पस्तीस छत्तीस सदतीस अडतीस एकोणचाळीस चाळीस
+ एकेचाळीस बेचाळीस त्रेचाळीस चव्वेचाळीस पंचेचाळीस शेहेचाळीस सत्तेचाळीस
+ अठ्ठेचाळीस एकोणपन्नास पन्नास एकावन्न बावन्न त्रेपन्न चौपन्न पंचावन्न
+ छप्पन्न सत्तावन्न अठ्ठावन्न एकोणसाठ साठ एकसष्ट बासष्ट त्रेसष्ट चौसष्ट
+ पासष्ट सहासष्ट सदुष्ट अडुसष्ट एकोणसत्तर सत्तर एकाहत्तर बाहत्तर
+ त्र्याहत्तर चौऱ्याहत्तर पंचाहत्तर शाहत्तर सत्त्याहत्तर अठ्ठ्याहत्तर
+ एकोणऐंशी ऐंशी एक्याऐंशी ब्याऐंशी त्र्याऐंशी चौऱ्याऐंशी पंच्याऐंशी श्याऐंशी
+ सत्त्याऐंशी अठ्ठ्याऐंशी एकोणनव्वद नव्वद एक्याण्णव ब्याण्णव त्र्याण्णव
+ चौऱ्याण्णव पंचाण्णव शहाण्णव सत्त्याण्णव अठ्याण्णव नव्याण्णव शंभर,%
+ counters/व्यंजन = क ख ग घ ङ%
+ च छ ज झ ञ%
+ ट ठ ड ढ ण%
+ त थ द ध न%
+ प फ ब भ म%
+ य र ल व श ष स ह ळ,%
+ Alph = अंक,%
+ alph = स्वर%
+]{marathi}
+\def\theenumiii{\localecounter{व्यंजन}{enumiii}}
+\def\theenumiv{\localecounter{अंक}{enumiii}}
+\IfLanguageName{marathi}{%
+ \ekvset{udiss}{%
+ rmfont = {Mukta-Regular.ttf},%
+ rmitfont = {Mukta-Regular.ttf},%
+ rmbffont = {Mukta-Bold.ttf},%
+ rmbfitfont = {Mukta-Bold.ttf},%
+ rmfeatures = {%
+ Script = {Devanagari}%
+ },%
+ sffont = {Mukta-Regular.ttf},%
+ sfitfont = {Mukta-Regular.ttf},%
+ sfbffont = {Mukta-Bold.ttf},%
+ sfbfitfont = {Mukta-Bold.ttf},%
+ sffeatures = {%
+ Script = {Devanagari}%
+ },%
+ ttfont = {Mukta-Regular.ttf},%
+ ttitfont = {Mukta-Regular.ttf},%
+ ttbffont = {Mukta-Bold.ttf},%
+ ttbfitfont = {Mukta-Bold.ttf},%
+ sffeatures = {%
+ Script = {Devanagari}%
+ }%
+ }%
+}{%
+ \babelfont[marathi]{rm}[%
+ IgnoreFontspecFile,%
+ ItalicFont = {Mukta-Regular.ttf},%
+ BoldFont = {Mukta-Bold.ttf},%
+ BoldItalicFont = {Mukta-Bold.ttf},%
+ Language = {Marathi},%
+ Script = {Devanagari},%
+ Numbers = {OldStyle},%
+ \ifLuaTeX
+ Renderer = {HarfBuzz}%
+ \fi
+ ]{Mukta-Regular.ttf}
+ \babelfont[marathi]{sf}[%
+ IgnoreFontspecFile,%
+ ItalicFont = {Mukta-Regular.ttf},%
+ BoldFont = {Mukta-Bold.ttf},%
+ BoldItalicFont = {Mukta-Bold.ttf},%
+ Language = {Marathi},%
+ Script = {Devanagari},%
+ Numbers = {OldStyle},%
+ \ifLuaTeX
+ Renderer = {HarfBuzz}%
+ \fi
+ ]{Mukta-Regular.ttf}
+ \babelfont[marathi]{tt}[%
+ IgnoreFontspecFile,%
+ ItalicFont = {Mukta-Regular.ttf},%
+ BoldFont = {Mukta-Bold.ttf},%
+ BoldItalicFont = {Mukta-Bold.ttf},%
+ Language = {Marathi},%
+ Script = {Devanagari},%
+ Numbers = {OldStyle},%
+ \ifLuaTeX
+ Renderer = {HarfBuzz}%
+ \fi
+ ]{Mukta-Regular.ttf}%
+}
+\endinput
+%%
+%% End of file `udiss-fonts-marathi.tex'.
diff --git a/Master/texmf-dist/doc/latex/udiss/udiss-style-ukerala.tex b/Master/texmf-dist/doc/latex/udiss/udiss-style-ukerala.tex
new file mode 100644
index 00000000000..bb9aa134ec6
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/udiss/udiss-style-ukerala.tex
@@ -0,0 +1,43 @@
+%%
+%% This is file `udiss-style-ukerala.tex',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% udiss.dtx (with options: `ukerala')
+%% ---------------------------------------------------------
+%% Bundle: udiss
+%% Version: v0.1 (October 1, 2024)
+%% Author: Indian TeX Users Group
+%% Description: A LaTeX bundle for typesetting dissertations
+%% Bugs: puszcza.gnu.org.ua/bugs/?group=udiss
+%% Licenses: GPLv3+, GFDLv1.3+
+%% ---------------------------------------------------------
+%%
+%% The LaTeX bundle udiss v0.1
+%% Copyright © 2024 Indian TeX Users Group
+%%
+%% This program is free software: you can redistribute it
+%% and/or modify it under the terms of the GNU General
+%% Public License as published by the Free Software
+%% Foundation, either version 3 of the License, or (at your
+%% option) any later version.
+%%
+%% This program is distributed in the hope that it will be
+%% useful, but WITHOUT ANY WARRANTY; without even the
+%% implied warranty of MERCHANTABILITY or FITNESS FOR A
+%% PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public
+%% License along with this program. If not, see
+%% <https://www.gnu.org/licenses/>.
+%% ---------------------------------------------------------
+\ekvset{udiss}{%
+ university = {University of Kerala},%
+ logo = {udiss-logo-ukerala.png},%
+ logoheight = {0.11}%
+}
+\endinput
+%%
+%% End of file `udiss-style-ukerala.tex'.
diff --git a/Master/texmf-dist/doc/latex/udiss/udiss.pdf b/Master/texmf-dist/doc/latex/udiss/udiss.pdf
new file mode 100644
index 00000000000..7d616591ba2
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/udiss/udiss.pdf
Binary files differ
diff --git a/Master/texmf-dist/source/latex/udiss/udiss.dtx b/Master/texmf-dist/source/latex/udiss/udiss.dtx
new file mode 100644
index 00000000000..32dc9595604
--- /dev/null
+++ b/Master/texmf-dist/source/latex/udiss/udiss.dtx
@@ -0,0 +1,4143 @@
+% \iffalse meta-comment
+%
+% File: udiss.dtx
+% ----------------------------------------------------------
+% Bundle: udiss
+% Version: v0.1 (October 1, 2024)
+% Author: TUGIndia
+% Description: A LaTeX bundle for typesetting dissertations
+% Bugs: puszcza.gnu.org.ua/bugs/?group=udiss
+% Licenses: GPLv3+, GFDLv1.3+
+% ----------------------------------------------------------
+% The LaTeX bundle udiss v0.1
+% Copyright © 2024 TUGIndia
+%
+% This program is free software: you can redistribute it
+% and/or modify it under the terms of the GNU General Public
+% License as published by the Free Software Foundation,
+% either version 3 of the License, or (at your option) any
+% later version.
+%
+% This program is distributed in the hope that it will be
+% useful, but WITHOUT ANY WARRANTY; without even the implied
+% warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+% PURPOSE. See the GNU General Public License for more
+% details.
+%
+% You should have received a copy of the GNU General Public
+% License along with this program. If not, see
+% <https://www.gnu.org/licenses/>.
+% ----------------------------------------------------------
+% arara: lualatex
+% arara: lualatex
+% arara: clean: {
+% arara: --> extensions: [
+% arara: --> log,aux,glo,idx,ist,
+% arara: --> out,toc,hd
+% arara: --> ]
+% arara: --> }
+% ----------------------------------------------------------
+% \fi
+% \iffalse
+%<*internal>
+\iffalse
+%</internal>
+%<*readme>
+------------------------------------------------------------
+Class: udiss
+Author: TUGIndia
+Description: A LaTeX bundle for typesetting dissertations
+Bugs: puszcza.gnu.org.ua/bugs/?group=udiss
+Licenses: GPLv3+, GFDLv1.3+
+------------------------------------------------------------
+%</readme>
+%<*internal>
+\fi
+%</internal>
+%<*driver>
+\documentclass{l3doc}
+\usepackage[provide*=*]{babel}
+\babelprovide[import,main]{english}
+\babelprovide[import,onchar={ids fonts}]{marathi}
+\usepackage[svgnames]{xcolor}
+\usepackage{fontawesome5}
+\usepackage{gfdl}
+\usepackage{microtype}
+\usepackage{unicode-math}
+\usepackage{hologo}
+\babelfont{rm}[%
+ IgnoreFontspecFile,%
+ Extension = {.otf},%
+ ItalicFont = {NewCM10-BookItalic},%
+ BoldFont = {NewCM10-Bold},%
+ BoldItalicFont = {NewCM10-BoldItalic},%
+ SlantedFont = {NewCM10-Book},%
+ BoldSlantedFont = {NewCM10-Bold},%
+ Numbers = {OldStyle},%
+ CharacterVariant = {6}%
+]{NewCM10-Book}
+\babelfont{sf}[%
+ IgnoreFontspecFile,%
+ Extension = {.otf},%
+ ItalicFont = {NewCMSans10-BookOblique},%
+ BoldFont = {NewCMSans10-Bold},%
+ BoldItalicFont = {NewCMSans10-BoldOblique},%
+ SlantedFont = {NewCMSans10-Book},%
+ BoldSlantedFont = {NewCMSans10-Bold},%
+ Numbers = {OldStyle},%
+ CharacterVariant = {6}%
+]{NewCMSans10-Book}
+\babelfont{tt}[%
+ IgnoreFontspecFile,%
+ Extension = {.otf},%
+ BoldFont = {NewCMMono10-Bold},%
+ ItalicFont = {NewCMMono10-Italic}%
+]{NewCMMono10-Book}
+\setmathfont[%
+ IgnoreFontspecFile,%
+ Extension = {.otf},%
+ CharacterVariant = {1}%
+]{NewCMMath-Book}
+\newfontfamily\newcmnewnum[%
+ IgnoreFontspecFile,%
+ Extension = {.otf}%
+]{NewCM10-Book}
+\newfontfamily\newcmnewone[%
+ IgnoreFontspecFile,%
+ Extension = {.otf},%
+ Numbers = {OldStyle}%
+]{NewCM10-Book}
+\newfontfamily\expkvkp[%
+ BoldFont = {KpRoman-Bold.otf}%
+]{KpRoman-Regular.otf}
+\babelfont[marathi]{tt}[%
+ IgnoreFontspecFile,%
+ Script = {Devanagari},%
+ Language = {Marathi},%
+ Renderer = {HarfBuzz},%
+ ItalicFont = {NewCMMono10-Book.otf}%
+]{Mukta-Regular.ttf}
+\colorlet{udisslink}{red!60!black}
+\colorlet{udissurl}{blue!60!black}
+\colorlet{udisscite}{green!60!black}
+\hypersetup{%
+ unicode,%
+ colorlinks,%
+ linkcolor = {udisslink},%
+ citecolor = {udisscite},%
+ urlcolor = {udissurl},%
+ pdftitle = {The udiss bundle},%
+ pdfauthor = {TUGIndia},%
+ pdfcreator = {TUGIndia},%
+ pdfsubject = {%
+ A LaTeX bundle for typesetting dissertations%
+ },%
+ pdfkeywords = {%
+ LaTeX, dissertations, thesis, bundle, academia%
+ }%
+}
+\gfdlcopyrightholders{%
+ \texorpdfstring{%
+ \TUGIndia
+ }{%
+ TUGIndia%
+ }%
+}
+\gfdlcopyrightdescription{%
+ \texorpdfstring{The \cls{udiss} bundle}%
+ {The udiss bundle}%
+}
+\gfdlcopyrightableyears{2024}
+\usepackage{cleveref}
+\usepackage{stackengine}
+\setquotestyle{british}
+\def\udisstval{%
+ \hfill
+ \begingroup
+ \ttfamily
+ \textcolor{udisslink}{true}\,\textbar\,false%
+ \endgroup
+}
+\def\udissfval{%
+ \hfill
+ \begingroup
+ \ttfamily
+ true\,\textbar\,\textcolor{udisslink}{false}%
+ \endgroup
+}
+\def\udisscolorred{%
+ \hfill
+ \begingroup
+ \ttfamily
+ \color{udisslink}%
+ udisslink%
+ \endgroup
+}
+\def\udisscolorblue{%
+ \hfill
+ \begingroup
+ \ttfamily
+ \color{udisslink}%
+ udissurl%
+ \endgroup
+}
+\def\udisscolorgreen{%
+ \hfill
+ \begingroup
+ \ttfamily
+ \color{udisslink}%
+ udisscite%
+ \endgroup
+}
+\def\udissarr{%
+ \hfill
+ \begingroup
+ \ttfamily
+ \color{udisslink}%
+ all-rights-reserved%
+ \endgroup
+}
+\makeatletter
+% Adapted from manfnt.sty (LPPL v1.0+)
+\DeclareFontFamily{U}{manfnt}{}
+\DeclareFontShape{U}{manfnt}{m}{n}{ <-> manfnt }{}
+\def\manfntsymbol#1{%
+ \begingroup
+ \fontencoding{U}
+ \fontfamily{manfnt}\selectfont
+ \symbol{#1}%
+ \endgroup
+}
+\def\dbend{%
+ \manfntsymbol{127}%
+ \hspace*{0.5em}%
+}
+\def\ddbend{%
+ \manfntsymbol{127}%
+ \manfntsymbol{127}%
+ \hspace*{0.5em}%
+}
+\makeatother
+\ExplSyntaxOn
+%% Answer on TopAnswers by Udi Fogiel (LPPL v1.3c+)
+%% URL: https://topanswers.xyz/tex?q=8033
+\NewDocumentCommand \textfunction { v }{
+ \__codedoc_function_index:n { #1 }
+ \__codedoc_function_label:nN { #1 } \c_false_bool
+ \texttt{#1}
+}
+\ExplSyntaxOff
+\def\TUGIndia{\textsc{tugindia}}
+\def\babelurl{%
+ https://latex3.github.io/babel/guides/%
+ which-method-for-which-language.html%
+}
+\definecolor{ekvred}{HTML}{9F393D}
+\colorlet{ekvgrey}{black!75}
+\NewDocumentCommand\expkvlogo{ m }{%
+ %% Stolen from Jonathan's sources: preamble-logos.tex
+ %% LPPL 1.3c+
+ %% /texmf-dist/doc/latex/expkv-bundle/preamble-logos.tex
+ \begingroup
+ \expkvkp
+ \bfseries
+ {%
+ \color{ekvgrey}e%
+ \kern-.05em x\kern-.05em%
+ }%
+ \lower.493ex\hbox{%
+ {\color{ekvgrey}P}%
+ \kern-.1em{\color{ekvred}k}}%
+ \kern-.18em{\color{ekvred}v}%
+ \IfBlankF{#1}{%
+ \begingroup
+ \color{ekvgrey}%
+ \kern.05em\rule[-.1ex]{.08em}{1.2ex}%
+ \kern.05em\textsc{#1}%
+ \endgroup
+ }%
+ \endgroup
+}
+
+\begin{document}
+\DocInput{udiss.dtx}
+\end{document}
+%</driver>
+% \fi
+% \title{The \cls{udiss} bundle}
+% \author{\TUGIndia}
+% \date{^^A
+% Version 0.1---October 1, 2024\\[1ex]^^A
+% {^^A
+% \small\faIcon{link}\quad
+% \url{https://ctan.org/pkg/udiss}^^A
+% }\\^^A
+% {^^A
+% \small\faIcon{bug}\quad
+% \url{https://puszcza.gnu.org.ua/bugs/?group=udiss}^^A
+% }^^A
+% }
+%
+% \maketitle
+%
+% \tableofcontents
+%
+% \DoNotIndex{%
+% \@empty,\@percentchar,\AddToHook,\ClassError,
+% \ClassWarningNoLine,\IfBlankTF,\IfBooleanTF,
+% \IfFileExists,\IfLanguageName,\LoadClass,
+% \MessageBreak,\NewDocumentCommand,\PassOptionsToClass,
+% \PassOptionsToPackage,\ProcessList,\ProvidesClass,
+% \RenewDocumentCommand,\RequirePackage,\RequireTUTeX,
+% \SplitList,\addcontentsline,\addfontfeature,
+% \addtocounter,\alph,\babelfont,\babelprovide,\begin,
+% \begingroup,\bfseries,\bigskip,\clearpage,\color,
+% \colorlet,\def,\definecolor,\dimexpr,\docLicenseThis,
+% \documentclass,\edef,\ekvdefinekeys,
+% \ekvoProcessGlobalOptions,\ekvoProcessLocalOptions,
+% \ekvset,\else,\empty,\end,\endcsname,\endgroup,\enquote,
+% \expandafter,\expanded,\fbox,\fboxsep,\fi,
+% \fontspec,\hrule,\hspace,\hypersetup,\ifLuaTeX,
+% \ifnum,\ifx,\includegraphics,\input,\itshap,
+% \udiss@lgbbl,\let,\linewidth,\loop,\medskip,
+% \newcounter,\newif,\newpage,\noindent,\normalfont,
+% \numexpr,\pagestyle,\parindent,\protected,\relax,
+% \repeat,\setlength,\setmathfont,\space,\stepcounter,
+% \stretch,\string,\tableofcontents,\textLF,
+% \textheight,\the,\thispagestyle,\unexpanded,\vfill,
+% \vspace,\year,\itshape,\csname,\fboxrule,\flushleft,
+% \flushright,\LARGE,\listoffigures,\listoftables,
+% \localecounter,\makeatletter,\makeatother,\normalsize,
+% \Require,\theenumiii,\theenumiv^^A
+% }
+%
+% \begin{documentation}
+% \section{Introduction}
+% \label{int}
+%
+% The \cls{udiss} bundle is a \LaTeX-class-file developed to
+% assist students in typesetting their \emph{u}niversity
+% \emph{diss}ertations. It is a collection of multiple
+% support files. This is the first experimental version. We
+% need feedback and comments from the community to make it
+% better. Currently, nothing should be considered
+% \enquote{stable}. Soon after getting comments and reviews
+% from the community, we will move towards a stable version.
+%
+% Universities often have strict requirements regarding the
+% formatting of the dissertations/theses submitted to them.
+% This bundle pre-supplies a generic style
+% (university-agnostic) for creating dissertations. It can
+% be loaded simply with:
+%
+% \begin{verbatim}
+% \documentclass{udiss}
+% \end{verbatim}
+%
+% But, apart from the generic style, it also supplies
+% university or department specific files for some selected
+% institutions. Each specialised class file comes
+% with an identifier. E.g., if you want to use the template
+% for the Kerala university, you may use the |ukerala| tag
+% and load its template like in the following:
+%
+% \begin{verbatim}
+% \documentclass{udiss}
+% \dissertationstyle{ukerala}
+% \end{verbatim}
+%
+% We are willing to expand. If you want your institution to
+% be supported by us, please have a look at the instructions
+% given in \cref{req}. If you want to develop your own
+% style, please have a look at the developer's instruction
+% given in \cref{dev}. If you want to get your class
+% published under this bundle, please have a look at the
+% contribution guidelines given in \cref{con}.
+%
+% This document explains the user interface as well as the
+% implementation of the class. It has three major parts.
+% The first one contains the documentation of the class
+% (\cref{doc}), the second one contains the developer's
+% manual (\cref{dev}) and the third one contains the
+% implementation of it (\cref{imp}).
+%
+% Before getting started with the documentation, just a
+% brief note about our approach. As of version 0.1, we are
+% planning to have a radically all-modern and
+% backwards-blind approach. This is a Unicode-only package,
+% meaning, it won't work with the classic PDF\LaTeX. We load
+% the modern, well maintaned and inclusive implementation of
+% the Latin Modern family, i.e., the New Computer Modern
+% family (\url{ctan.org/pkg/newcm}). For using/testing the
+% class, please use the latest \TeX\ Live (all packages
+% updated, as of 2024-09-27). Both \hologo{XeLaTeX} and
+% Lua\LaTeX\ supported, but the latter is recommended as it
+% identifies scripts without markup.
+%
+% \section{Documentation}
+% \label{doc}
+%
+% This part of the document describes everything that a
+% normal user of this class should know. It enlists all the
+% features of the class.
+%
+% \subsection{User manual}
+%
+% Since this is a class that typesets dissertations, it
+% requires some basic information which is provided using
+% the following macros.
+%
+% We provide the usual \LaTeX-like macros for the
+% convenience, but these macros have
+% \emph{key-value}-equivalents as well.
+%
+% \begin{function}{\title,\author,\pronouns}
+% \begin{syntax}
+% \cs{title}\marg{the-title-of-the-dissertation}^^A
+% \ignorespaces\hfill^^A
+% {\footnotesize\faIcon{exclamation-triangle}}
+% \cs{author}\marg{name-of-the-author}^^A
+% \ignorespaces\hfill^^A
+% {\footnotesize\faIcon{exclamation-triangle}}
+% \cs{pronouns}\marg{the-pronouns-of-the-author}
+% \end{syntax}
+% Like in most standard \LaTeX\ classes, |\title|
+% command saves the title of the dissertation from its
+% argument. This is one of the commands which we mark as
+% \emph{strict}. In the manual, all such commands are
+% marked with a
+% {\footnotesize\faIcon{exclamation-triangle}} symbol at
+% the right end. If such commands (or their parametric
+% equivalents as shown in the following paragraph) are not
+% provided, the compilation is interrupted with an error.
+% The |\author| command doesn't return any error if the
+% class option |blind| is loaded. Since the |blind| option
+% is used for anonymous submissions, the author
+% information is irrelevant anyways and hence, is ignored.
+%
+% These macros are available as class options too. One
+% just has to use |title=|\marg{title} in the optional
+% argument of the |\documentclass| command. Similarly,
+% |author| and |pronouns| also are available.
+% \end{function}
+%
+% \begin{function}{\subtitle,\shorttitle}
+% \begin{syntax}
+% \cs{subtitle}\marg{the-subtitle-of-the-dissertation}
+% \cs{shorttitle}\marg{a-short-title-for-headers}
+% \end{syntax}
+% Dissertations often have a subtitle too, but it is not
+% an absolute requirement, so optionally, one may want to
+% use |\subtitle| command. Sometimes the title and the
+% subtitle are too long for the running header. One may
+% provide a short title with |\shorttitle| for this
+% purpose. Depending on the selected template and options,
+% it will be printed.
+%
+% These commands are also available as class options
+% |subtitle| and |shorttitle|.
+% \end{function}
+%
+% \begin{function}{\stream,\discipline,\degree}
+% \begin{syntax}
+% \cs{stream}\marg{the-name-of-the-stream}^^A
+% \ignorespaces\hfill^^A
+% {\footnotesize\faIcon{exclamation-triangle}}
+% \cs{discipline}\marg{the-name-of-the-discipline}^^A
+% \ignorespaces\hfill^^A
+% {\footnotesize\faIcon{exclamation-triangle}}
+% \cs{degree}\marg{the-name-of-the-degree}^^A
+% \ignorespaces\hfill^^A
+% {\footnotesize\faIcon{exclamation-triangle}}
+% \end{syntax}
+% These details are used at several places in the class.
+% E.g., the declaration, the \enquote{fulfilment}
+% statement printed on the first page. Like most other
+% macros, these too have straight forward
+% \emph{key-value}-equivalents |stream|, |discipline| and
+% |degree|.
+% \end{function}
+%
+% \begin{function}{\supervisor,\university,\department}
+% \begin{syntax}
+% \cs{supervisor}\marg{name-of-the-supervisor}^^A
+% \ignorespaces\hfill^^A
+% {\footnotesize\faIcon{exclamation-triangle}}
+% \cs{university}\marg{name-of-the-university}^^A
+% \ignorespaces\hfill^^A
+% {\footnotesize\faIcon{exclamation-triangle}}
+% \cs{department}\marg{name-of-the-department}^^A
+% \ignorespaces\hfill^^A
+% {\footnotesize\faIcon{exclamation-triangle}}
+% \end{syntax}
+% These commands are not seen in other standard
+% \LaTeX-classes, but \cls{udiss} requires them
+% obligatorily (only except in the |blind| mode).
+%
+% |supervisor|, |university| and |department| are the
+% \emph{key-value}-equivalents.
+% \end{function}
+%
+% \begin{function}{\logo,\logo*}
+% \begin{syntax}
+% \cs{logo}\marg{file-name}
+% \cs{logo*}\marg{\TeX-code}
+% \end{syntax}
+% Some departments mandate printing the university logos
+% in the dissertation. If this command is used, the logo
+% is printed. The location of the logo can be customised
+% as per the requirement. The class provides options for
+% that.
+%
+% If you are mad about \TeX\ and have a code for printing
+% the logo of your institute, use this command with a star
+% and in its argument, paste your code to get it printed
+% at an appropriate place.
+%
+% We have |logo| and |logo*| as the
+% \emph{key-value}-equivalents.
+% \end{function}
+%
+% \begin{function}{language,ldfbabel,nofontwarning}
+% \begin{syntax}
+% |language|=\marg{babel-language-names}
+% |ldfbabel|=\marg{babel-ldf-language-names}
+% |nofontwarning|=\marg{truth-value}\udissfval
+% \end{syntax}
+% The \pkg{babel} package has a complex mechanism for
+% loading languages. The complex design has its own
+% advantages, especially with regards to backwards
+% compatibility. For detailed explanation, it's best to go
+% through the user manual of \pkg{babel}, or its official
+% online documentation, especially the web-page at:
+% \url{\babelurl}.
+%
+% To help those who are completely at sea, we briefly will
+% have a look at the two mechanisms \pkg{babel} provides.
+% One is the original method of loading the
+% language-name(s) as class option(s), so something like:
+%
+% \begin{verbatim}
+% \usepackage[italian,hindi,english]{babel}
+% \end{verbatim}
+%
+% The last one from the list is understood as the
+% \enquote{main} language of the document. These languages
+% are defined using the so-called |.ldf|-files. A lot of
+% support for some languages is available using this
+% mechanism. For some European languages, e.g., French,
+% the difference between the two mechanisms is too sharp
+% and it has been found that a lot of native speakers
+% still prefer the old, stable way of using |.ldf|-files.
+% If you are one of them and you are used to loading
+% language-names as options to package \pkg{babel}, you
+% should use the |ldfbabel| option of \cls{udiss}. But we
+% advise against it.
+%
+% The second approach provided by \pkg{babel} for loading
+% languages is as follows:
+%
+% \bigskip
+% |\babelprovide|\marg{language-name}
+% \bigskip
+%
+% This method follows and uses the Unicode Common Locale
+% Data Repository (CLDR) for creating the resources. This
+% data is saved in |.ini| files. This is a more modern
+% approach, in our opinion. But it may cost us a little
+% bit of inconvenience since it doesn't support the common
+% short-hands which are provided by the |.ldf| files. But
+% short-hands make the input more and more \TeX-dependent
+% and thus less productive, so we don't endorse it. That
+% is why the more intuitive name for language-options in
+% this class is for the |.ini|-based approach. We load the
+% |english| language by default if no other is loaded. For
+% this too, we go with the |.ini| file developed for
+% English.
+%
+% The syntax of both these options is exactly like the one
+% provided by \pkg{babel}. One may provide a
+% comma-separated list and the last one of them will be
+% set as the main language of the document. Have a look at
+% \cref{dev} for more details regarding this.
+%
+% We also provide some auxiliary \TeX\ files with the
+% class for setting the font-families as well as the
+% language-specifics as required by \pkg{babel}. If a file
+% like that it is not found, we issue a warning. If the
+% users want that warning to be silent, they can use the
+% option |nofontwarning|.
+% \end{function}
+%
+% \begin{function}{license,copyright-yrs,localcopyright}
+% \begin{syntax}
+% |license|=\marg{all-rights-reserved/CC-BY-SA/GFDL}^^A
+% \udissarr
+% |copyright-yrs|=\marg{copyrightable-years}\hfill^^A
+% {\color{udisslink}|\the\year|}
+% |localcopyright|=\marg{the-word-for-copyright}^^A
+% \hfill{\color{udisslink}|Copyright|}
+% \end{syntax}
+% This is an option to set a license for the dissertation.
+% We encourage users to use free culture licenses.
+% Currently we support two popular licenses, i.e.,
+% \enquote{CC-BY-SA 4.0+ International} and \enquote{GFDL
+% v1.3+}. We don't set any license by default as we
+% believe making a work \enquote{free} (as in freedom)
+% should be the decision of the author and hence
+% \enquote{all rights are reserved} by default. If you are
+% not using the |blind| package option, your output will
+% have a copyright notice with your (author's) name and
+% the current year as the copyrightable year in the
+% metadata of the PDF. If you are wondering why, the
+% |blind| option is for preserving the anonymity of the
+% author and the copyright-notices require a
+% copyright-holder by default, thus with |blind| option,
+% we have disabled choosing licenses. If you want to
+% change the copyrightable year(s), you may use the option
+% |copyright-yrs|. Since the package is supposed to
+% support multilingual typesetting, we have provided an
+% option to change the word \enquote{Copyright} to the one
+% in the main language of your document.
+% \end{function}
+%
+% \begin{function}{placeholders}
+% \begin{syntax}
+% |placeholders|
+% \end{syntax}
+% If you want to see how the things so far discussed come
+% together, you may just load this option. It places
+% placeholders for all the options discussed for creating
+% a sample document.
+% \end{function}
+%
+% \begin{function}{^^A
+% lot,lof,declaration,declarationtxt,decllocal^^A
+% }
+% \begin{syntax}
+% |lot|=\marg{truth-value}\udissfval
+% |lof|=\marg{truth-value}\udissfval
+% |declaration|=\marg{truth-value}\udissfval
+% \end{syntax}
+% By default, the class only prints the table of contents.
+% If the author requires the list of figures (|lof|) or
+% tables (|lot|), they may use the respective option.
+% These are boolean keys which take either |true| or
+% |false| as their values. Not passing any truth-value to
+% a |key| is equivalent to using |key=true|. Similarly,
+% many universities require a declaration from the
+% candidate regarding the originality of the work. We have
+% provided a sample draft of the declaration in a
+% renewable macro, but it is not enabled by default. After
+% getting comments from the community, we will decide what
+% should be done with it. Note that the default value for
+% all these keys is |false|\footnote{^^A
+% Throughout the documentation, at the right corner, we
+% enlist the possible values to a key and the default
+% one is marked in red.^^A
+% }. Declaration text can be edited using |declarationtxt|
+% option. The local word for declaration is stored in
+% |decllocal| (defaulting to \enquote{Declaration}).
+% \end{function}
+%
+% \begin{function}{blind}
+% \begin{syntax}
+% |blind|=\marg{truth-value}\udissfval
+% \end{syntax}
+% At times, anonymous submissions are required where the
+% name of the author and supervisor is hidden.
+% \end{function}
+%
+% \begin{function}{framed-title}
+% \begin{syntax}
+% |framed-title|=\marg{truth-value}\udissfval
+% \end{syntax}
+% By default the title-page is very minimal. If a user
+% wants to have a frame around the title-page, they may
+% use this option.
+% \end{function}
+%
+% \begin{function}{^^A
+% print,norefcolors,colorprint,udisslinkclr,^^A
+% udissurlclr,udissciteclr^^A
+% }
+% \begin{syntax}
+% |print|=\marg{truth-value}\udissfval
+% |norefcolors|=\marg{truth-value}\udissfval
+% |udisslinkclr|=\marg{link-colour}\udisscolorred
+% |udissurlclr|=\marg{url-colour}\udisscolorblue
+% |udissciteclr|=\marg{cite-colour}\udisscolorgreen
+% \end{syntax}
+% Many departments require the submissions to be made in
+% the print form as well. For that, |print| is a boolean
+% option. It creates outputs suitable for the print
+% submissions. The class, by default, does not use |print|
+% option. The default output of the class is suitable for
+% digital submissions. The following settings are always
+% turned on by the class in normal circumstances:
+%
+% \begin{itemize}
+% \item The \pkg{hyperref} package is loaded.
+% \item The \pkg{xcolor} package is loaded. Some colours
+% for the internal cross-references are pre-selected.
+% \end{itemize}
+%
+% If you don't want colours for the hyperlinks in your
+% digital document, you may use the |norefcolors|
+% option. If you don't like the pre-defined colour-scheme
+% given by us for the digital documents, you may use the
+% class options specifically developed for changing them.
+% They are |udisslinkclr|, |udissurlclr| and
+% |udissciteclr|. The arguments of these options are
+% either the pre-defined colours by package |xcolor| or
+% user-defined colours with the |\colorlet| or
+% |\definecolor| commands. The default colour-scheme
+% used by us is as seen in the macro explanation above.
+%
+% More importantly though, if a PDF with colours is given
+% for printing and the printer is using the black and
+% white mode, then the coloured words look faded in the
+% print out. To avoid this, we load the \pkg{xcolor}
+% package only when the |print| option is \emph{not}
+% loaded (basically always, by default). For performance
+% reasons, we don't load the |hyperref| package when
+% |print| is loaded. Hyper-references make sense only in a
+% digital PDF, so to optimise PDF compilation, in |print|
+% mode, we don't load |hyperref|.
+% \end{function}
+%
+% Note that if you are using the |license| option with
+% |CC-BY-SA|, the \pkg{doclicense} package |\Require|d for
+% printing the license automatically loads the
+% \pkg{hyperref} package. We don't have any control over it
+% and hence, you will see the hyperlink boxes around the
+% CC-text. You can safely ignore them as the text is still
+% in black colour and your objective is anyways just to
+% \emph{print} the output.
+%
+% \begin{function}{oldstylenumoff,oldone}
+% \begin{syntax}
+% |oldstylenumoff|=\marg{truth-value}\udissfval
+% |oldone|=\marg{truth-value}\udissfval
+% \end{syntax}
+% In text, the old style numbers look better. The numbers
+% in the current document are old style. Lining numbers,
+% on the other hand, don't have ascenders and descenders.
+%
+% If you prefer the lining numbers, you may turn this
+% option on and all the fonts will start showing lining
+% numbers. Note that printing of old style numbers also
+% depends upon whether the font has old style numbers or
+% not. The relevant settings are added to the font
+% automatically, but while selecting the font, first make
+% sure whether the old style table is present or not.
+%
+% Apart from that, the New Computer Modern font family
+% provides an old-style shape for the number 1 (this exact
+% shape!), but this shape is provided as a character
+% variant and character variants cannot be loaded
+% globally, since various fonts may have various variants
+% at that slot, hence if someone wants this shape, they
+% will have to use the |oldone| option. Without this
+% option the number looks like as seen on the first line
+% and that's the default style of \cls{udiss}.
+%
+% \begin{quote}
+% {\newcmnewone 0123456789}\hfill
+% \begingroup
+% \ttfamily\footnotesize\color{udisslink}^^A
+% Old style with default 1^^A
+% \endgroup
+%
+% 0123456789\hfill
+% \texttt{\footnotesize Old style with the old 1}^^A
+%
+% {\newcmnewnum 0123456789}\hfill
+% \texttt{\footnotesize Lining}^^A
+% \end{quote}
+% \end{function}
+%
+% \begin{function}{fulfilment}
+% \begin{syntax}
+% |fulfilment|=\ignorespaces^^A
+% \marg{the-titlepage-sentence-about-course-requirement}
+% \end{syntax}
+% The title-page prints a sentence which says:
+%
+% \begin{quote}
+% A dissertation submitted in the partial fulfilment of
+% the requirements for the |\udiss@degree|\ program
+% in |\udiss@discipline|.
+% \end{quote}
+%
+% In order to change it, one may use this package option.
+% If you want to use the internal macros for univesity
+% and department names, don't forget to use
+% |\makeatletter| and |\makeatother|.
+% \end{function}
+%
+% As described in the introduction (\cref{int}), the users
+% can choose to load the generic style or a specialised
+% style. For that, we have the following macro:
+%
+% \begin{function}{\dissertationstyle}
+% \begin{syntax}
+% \cs{dissertationstyle}\marg{style-for-dissertation}
+% \end{syntax}
+% With this command, you may select the institute or the
+% style. It will set certain defaults.
+%
+% We provide limited support as of v0.1 (only for
+% university of Kerala). We wish to expand more. Send us
+% support requests for adding your institute to the list.
+% \end{function}
+%
+% \subsection{Multilingual typesetting}
+%
+% The \cls{udiss} class aims at supporting multilingual
+% typesetting by default. We load the \pkg{babel} package
+% for linguistic support, \pkg{fontspec} and
+% \pkg{unicode-math} package for loading fonts. It's the
+% best to not load them again. For loading languages, it's
+% best to use the package internal mechanism. If you find
+% something missing in the mechanism, you may load
+% \pkg{babel} or \pkg{fontspec} commands directly. Please
+% consider reporting a missing feature so that we can
+% implement it in the future versions.
+%
+% We will see two examples of loading languages.
+%
+% \subsection[Developer's manual]{^^A
+% Developer's manual\marginpar{\hfill\dbend}\\[0.5ex]^^A
+% \small\normalfont\itshape
+% \quad Only if you sure about what you are doing^^A
+% }
+% \label{dev}
+%
+% As the section title and the double bend suggests, this
+% area is for advanced customisation. Only enter it if you
+% have sufficient confidence to avoid errors.
+%
+%
+% \subsubsection{Fonts}
+%
+% We are a Unicode-only class, so we need to take care of
+% three major font families, i.e., Roman,
+% \texttt{Typewriter} and \textsf{Sans} (stylisation
+% intentional, for demonstration). The \pkg{fontspec}
+% package takes care of Unicode fonts in \LaTeX, but we,
+% additionally, load package \pkg{unicode-math} too, to set
+% math-fonts. Even though, this much is practically enough
+% for font-selection, we go with the \pkg{babel}'s mechanism
+% of loading language-specific fonts, so that the fonts
+% don't apply globally. Our class already takes care of most
+% of the requirements regarding font, but if you want to
+% tinker with the defaults, you are advised to read this
+% section. The following parameters are for you.
+%
+% \begin{function}{explicitext,ignorefsoff}
+% \begin{syntax}
+% |explicitext|=\marg{truth-value}\udissfval
+% |ignorefsoff|=\marg{truth-value}\udisstval
+% \end{syntax}
+% Without this option, one cannot use the |Extension|
+% parameter of package \pkg{fontspec}/\pkg{unicode-math}.
+% We have some options later which set the extension for
+% |rm|, |sf| and |tt| families. They are also useless if
+% this key is not used. A word of caution: loading
+% explicit extensions for fonts is restrictive. Suppose
+% you want to use KpRoman-Regular as your normal font,
+% but, say, FreeSerifBold as your bold font (please don't,
+% this is solely for exemplification :P), loading an
+% explicit extension will cause errors as the former is an
+% OpenType font and the latter is a TrueType one. So if
+% you are 200\% sure that all the fonts you need use one
+% particular extension \emph{only}, then use this option.
+% Otherwise, you are better off without it.
+%
+% The \TeX-tree contains many files having the
+% |.fontspec| extension. These files contain predefined
+% settings for fonts which the users may not always want.
+% Thus, we ignore these files by default. If you are very
+% sure that you want to load |.fontspec| files, you may
+% turn our conditional off and the |.fontspec|-files, will
+% be loaded correctly.
+% \end{function}
+%
+% \begin{function}{^^A
+% rmfeatures,sffeatures,ttfeatures,mathfeatures^^A
+% }
+% \begin{syntax}
+% |rmfeatures|=\marg{font-features-for-serif-fonts}
+% |sffeatures|=\marg{font-features-for-sans-fonts}
+% |ttfeatures|=\marg{font-features-for-mono-fonts}
+% |mathfeatures|=\marg{font-features-for-math-fonts}
+% \end{syntax}
+% We have |udiss|-options for most commonly used optional
+% parameters of fonts, still there are a lot of them
+% available which we didn't consider important for the
+% purpose of this class, e.g., |Scale|, |Color|. If you
+% want to use these features with your fonts, you may use
+% these four options as per your need. The value of this
+% key is directly injected in the font-loading commands.
+% \end{function}
+%
+% \begin{function}{rmfntext,sffntext,ttfntext,mathfntext}
+% \begin{syntax}
+% |rmfntext|=\ignorespaces^^A
+% \marg{font-extension-for-serif-fonts}\ignorespaces^^A
+% \hfill\texttt{ttf\,\textbar\,otf}
+% |sffntext|=\ignorespaces^^A
+% \marg{font-extension-for-sans-fonts}\ignorespaces^^A
+% \hfill\texttt{ttf\,\textbar\,otf}
+% |ttfntext|=\ignorespaces^^A
+% \marg{font-extension-for-mono-fonts}\ignorespaces^^A
+% \hfill\texttt{ttf\,\textbar\,otf}
+% |mathfntext|=\ignorespaces^^A
+% \marg{font-extension-for-math-fonts}\ignorespaces^^A
+% \hfill\texttt{ttf\,\textbar\,otf}
+% \end{syntax}
+% With these four options, one may choose either
+% |ttf| or |otf| extension for a particular font family.
+% As mentioned before, it applies to all the fonts loaded
+% in that family. Note that these options are only used
+% when the |explicitext| option is active. This is why
+% there is no default value set. By default this explicit
+% extension method itself is not used.
+% \end{function}
+%
+% If you want to know the default fonts we load always with
+% \cls{udiss}, you may refer to \cref{udissenfonts}.
+%
+% \begin{table}
+% \centering
+% \small
+% \begin{tabular}{llll}
+% \toprule
+% \textfunction{rmfont} &
+% \textfunction{sffont} &
+% \textfunction{ttfont} \\
+% NewCM10-Book &
+% NewCMSans10-Book &
+% NewCMMono10-Book \\
+% \specialrule{0pt}{\aboverulesep}{\aboverulesep}
+% \textfunction{rmbffont} &
+% \textfunction{sfbffont} &
+% \textfunction{ttbffont} \\
+% NewCM10-Bold &
+% NewCMSans10-Bold &
+% NewCMMono10-Bold \\
+% \specialrule{0pt}{\aboverulesep}{\aboverulesep}
+% \textfunction{rmitfont} &
+% \textfunction{sfitfont} &
+% \textfunction{ttitfont} \\
+% NewCM10-BookItalic &
+% NewCMSans10-BookItalic &
+% NewCMMono10-BookItalic \\
+% \specialrule{0pt}{\aboverulesep}{\aboverulesep}
+% \textfunction{rmbfitfont} &
+% \textfunction{sfbfitfont} &
+% \textfunction{ttbfitfont} \\
+% NewCM10-BoldItalic &
+% NewCMSans10-BoldOblique &
+% NewCMMono10-BoldOblique \\
+% \specialrule{0pt}{\aboverulesep}{\aboverulesep}
+% \textfunction{rmslfont} &
+% \textfunction{sfslfont} &
+% \textfunction{ttslfont} \\
+% NewCM10-Book &
+% NewCMSans10-BookOblique &
+% NewCMMono10-Book \\
+% \specialrule{0pt}{\aboverulesep}{\aboverulesep}
+% \textfunction{rmbfslfont} &
+% \textfunction{sfbfslfont} &
+% \textfunction{ttbfslfont} \\
+% NewCM10-Bold &
+% NewCMSans10-BoldOblique &
+% NewCMMono10-BoldOblique \\
+% \midrule
+% \textfunction{mathfont} & & \\
+% NewCMMath-Book & & \\
+% \specialrule{0pt}{\aboverulesep}{\aboverulesep}
+% \textfunction{mathbffont} & & \\
+% NewCMMath-Bold & & \\
+% \bottomrule
+% \end{tabular}
+% \caption{Default fonts for English language (all otfs)}
+% \label{udissenfonts}
+% \end{table}
+%
+% \subsubsection{Title-page customisation}
+%
+% The title-page prints several fields and very often
+% authors are very picky about it. Most of the things we
+% offer in it are customisable. One may change the following
+% things for all the major fields on the title-page.
+%
+% \begin{enumerate}
+% \item The font
+% \item The font-size
+% \item The font-color
+% \item The font-shape (e.g., |\itshape|, |\scshape| etc.)
+% \item Additional features to the font loaded
+% \end{enumerate}
+%
+% All the parameters (along with their default values) are
+% listed in \cref{titlepagetbl}. The table uses \enquote{-}
+% when there is no change in the default, only the fields
+% having a special value are marked.
+%
+% \begin{table}
+% \small
+% \centering
+% \begin{tabular}{>{\itshape\normalsize}llllll}
+% \toprule
+% Title &
+% - &
+% |\bfseries| &
+% huge &
+% black &
+% -\\
+% & \scriptsize\textfunction{titlefont} &
+% \scriptsize\textfunction{titleshape} &
+% \scriptsize\textfunction{titlesize} &
+% \scriptsize\textfunction{titlecolor} &
+% \scriptsize\textfunction{titleffeat}\\
+% \cmidrule{2-6}
+% Subtitle &
+% - &
+% |\normalfont| &
+% large &
+% black &
+% -\\
+% & \scriptsize\textfunction{subtitlefont} &
+% \scriptsize\textfunction{subtitleshape} &
+% \scriptsize\textfunction{subtitlesize} &
+% \scriptsize\textfunction{subtitlecolor} &
+% \scriptsize\textfunction{subtitleffeat}\\
+% \cmidrule{2-6}
+% Author &
+% - &
+% |\normalfont| &
+% large &
+% black &
+% -\\
+% & \scriptsize\textfunction{authorfont} &
+% \scriptsize\textfunction{authorshape} &
+% \scriptsize\textfunction{authorsize} &
+% \scriptsize\textfunction{authorcolor} &
+% \scriptsize\textfunction{authorffeat}\\
+% \cmidrule{2-6}
+% University &
+% - &
+% |\normalfont| &
+% |\normalsize| &
+% black &
+% -\\
+% & \scriptsize\textfunction{unifont} &
+% \scriptsize\textfunction{unishape} &
+% \scriptsize\textfunction{unisize} &
+% \scriptsize\textfunction{unicolor} &
+% \scriptsize\textfunction{uniffeat}\\
+% \cmidrule{2-6}
+% Department &
+% - &
+% |\normalfont| &
+% |small| &
+% black &
+% -\\
+% & \scriptsize\textfunction{deptfont} &
+% \scriptsize\textfunction{deptshape} &
+% \scriptsize\textfunction{deptsize} &
+% \scriptsize\textfunction{deptcolor} &
+% \scriptsize\textfunction{deptffeat}\\
+% \cmidrule{2-6}
+% Fulfilment &
+% - &
+% |\normalfont| &
+% small &
+% black &
+% -\\
+% & \scriptsize\textfunction{fffont} &
+% \scriptsize\textfunction{ffshape} &
+% \scriptsize\textfunction{ffsize} &
+% \scriptsize\textfunction{ffcolor} &
+% \scriptsize\textfunction{fffeat}\\
+% \bottomrule
+% \end{tabular}
+% \caption{Customising title-page}
+% \label{titlepagetbl}
+% \end{table}
+%
+% \begin{function}{logowidth,logoheight}
+% \begin{syntax}
+% |logowidth|=\marg{logo-width-proportion}\hfill^^A
+% \begingroup^^A
+% \ttfamily\color{udisslink}^^A
+% 0.3^^A
+% \endgroup
+% |logoheight|=\marg{logo-height-proportion}\hfill^^A
+% \begingroup^^A
+% \ttfamily\color{udisslink}^^A
+% 0.075^^A
+% \endgroup
+% \end{syntax}
+% By default the width of the logo is
+% 0.3$\times$|\linewidth| and 0.075$\times$|\textheight|.
+% If you want to change these default numbers, you may use
+% these parameters.
+% \end{function}
+% \subsection[^^A
+% Contributing to our repository^^A
+% ]{^^A
+% Contributing to the bundle^^A
+% \marginpar{\hfill\ddbend}\\[0.5ex]^^A
+% \small\normalfont\itshape
+% \quad Only if you are ready to bear with us :P^^A
+% }
+% \label{con}
+%
+% We welcome contributions to our code. Our code is hosted
+% at Puszcza, a free-software-based web-space. But for
+% consistency, we request our supporters to write the code
+% using 60 characters per line limit. Try to adhere to the
+% coding conventions. If there is a slight violation here
+% and there in your patches, please don't mind us editing
+% your code first and then merging it in the main branch.
+%
+% We release our code with GPLv3+ and the documentation with
+% GFDLv1.3+. Your patches also will have to comply with the
+% conditions of these licenses.
+%
+% If you wish to document your patches, please avoid
+% gendered language. Use \emph{they/them} pronouns when
+% referring to users.
+%
+% Apart from university-styles, we also need support for
+% language and fonts. If you know free/libre Unicode fonts
+% for your language, please release them on CTAN or let us
+% know about them, so that we will release using our
+% templates. Provide appropriate translations for the fields
+% provided in class.
+%
+% The class comes with a test-suit. You are advised to run
+% |l3build check| command before pushing a patch. This way
+% we can be sure that the patch doesn't break any of the
+% already existing features. If you think something was
+% buggy in the original design and you got a fix for that,
+% kindly run |l3build save| on the concerned test file and
+% push the changed |.lvt| and |.tlg|s also.
+%
+% \section{Requests for new templates}
+% \label{req}
+%
+% We are open to your support-requests too. Just let us know
+% the norms and conventions of your institution. Let us know
+% which fields you would like to have pre-filled in the
+% style file. If you require the logo to be printed on the
+% title-page, send it to us in a decent resolution. We will
+% include it in our bundle.
+% \end{documentation}
+%
+% \begin{implementation}
+% \section{Implementation}
+% \label{imp}
+%
+% In this section, we explain how this program was
+% developed. We discuss the tools used by us for developing
+% the features offered in this class. The features can be
+% seen in the left margin hyperlinked to their respective
+% place in the documentation section \cref{doc}.
+%
+% We first declare the tag used by the |.ins| file for
+% stripping the source-code of the generic class. We will
+% have several tags for generating the other class-files,
+% but for the convenience of maintenance, we will have all
+% the code in this central |.dtx| file.
+%
+% \begin{macrocode}
+%<*class>
+% \end{macrocode}
+%
+% First we declare the class with some elementary
+% information.
+%
+% \begin{macrocode}
+\ProvidesClass{udiss}[2024/10/01 v0.1
+ A LaTeX bundle for typesetting dissertations (TUGIndia)]
+% \end{macrocode}
+%
+% We develop the options for the class using
+% |\ekvdefinekeys| command. This command is provided by the
+% \expkvlogo{def} package, whereas for creating
+% class/package options, we use the \expkvlogo{opt}
+% package. For performance reasons, we don't use the entire
+% \expkvlogo{bundle}.
+%
+% \begin{macrocode}
+\RequirePackage{expkv-def,expkv-opt}
+% \end{macrocode}
+%
+% \begin{macro}{\pronouns,pronouns}
+% Mostly we have implemented the macros in the same order
+% as they are documented, but the exception is of the
+% first two, i.e., |\title| and |\author|. These commands
+% are developed by the standard classes too and hence,
+% after loading the class (\cls{memoir} in our case) their
+% definitions are rewritten. Thus these two macros are
+% developed a little late in the code. Rest is still in
+% line with the documentation. The method of saving the
+% values of the macros is an indirect one. We use internal
+% macros (e.g., |\udiss@title|) for saving them.
+%
+% We start with the |pronouns| field. Since it is
+% optional, we don't need any errors here. At each step,
+% we set some if-conditionals. All of them follow the
+% standard convention of prefixing the class/package name
+% and the |@| symbol for internalising. Have a look at the
+% following two conditionals which we use immediately
+% while defining the |pronouns| field:
+%
+% \begin{macrocode}
+\newif\ifudiss@pronouns
+\newif\ifudiss@blind
+% \end{macrocode}
+%
+% We use the \pkg{xparse}-syntax for developing user-side
+% macros. First we check if the class option |blind| is
+% loaded. If it is so, there is no point in saving
+% |pronouns|, hence it is skipped. The following code does
+% that:
+%
+% \begin{macrocode}
+\NewDocumentCommand{ \pronouns }{ m }{%
+ \ifudiss@blind
+ \else
+ \def\udiss@pronouns{#1}%
+ \fi
+}
+% \end{macrocode}
+%
+% As mentioned before, we use \expkvlogo{def} and
+% \expkvlogo{opt} packages for developing the
+% \emph{key-values}. The former proives a command
+% |\ekvdefinekeys| that defines all the \emph{key}s. We
+% could have called it just once in the code and developed
+% all the \emph{key}s at one go, but in order to keep the
+% implementation in line with the documentation and for a
+% generally better readable code, we segment it in several
+% pieces and develop the respective options with different
+% calls of |\ekvdefinekeys|. Note that the set used for
+% all of them is still the same, i.e., |udiss|. Storing a
+% value passed to a key in a specific macro for later use
+% is quite straight-forward in \expkvlogo{def}, but since
+% we need to set some macros conditionally, we will use
+% the |code| \emph{type} of \expkvlogo{}. The first
+% non-space-token followed by the invocation of this type
+% is the name of the \emph{key}. Its argument is an
+% arbitrary \TeX-code where we can use have the usual
+% \TeX-argument-call, i.e., |#1|.
+%
+%
+% \begin{macrocode}
+\ekvdefinekeys{udiss}{%
+ code pronouns = {%
+ \ifudiss@blind
+ \else
+ \def\udiss@pronouns{(#1)}%
+ \fi
+ \udiss@pronounstrue
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% The |\ifudiss@blind| conditional was developed in order to
+% conditionally save (and print) some information which
+% identifies the author. If a user loads the option |blind|,
+% they don't need that information to be printed and since
+% it is not supposed to be printed, why to even save it?
+% Thus we save it only when needed.
+%
+% \begin{macro}{title,author}
+%
+% Since we don't allow blank arguments for \emph{strict}
+% commands/parameters, we check their existence there and
+% there and generate an error if found blank. Since we
+% need to error twice (once with the macro, once with the
+% parameter, we save the code for generating the error in
+% a handy internal macro. Let's have a look at one
+% developed for the |title| field.
+%
+% \begin{macrocode}
+\newif\ifudiss@title
+\def\udiss@blank@title@err{%
+ \ClassError{udiss}{%
+ The `title' field cannot be blank%
+ }{%
+ You have provided an empty argument to the `title'
+ field. This is not\MessageBreak permitted by the class.%
+ }%
+}
+% \end{macrocode}
+%
+% We use the same method for all the other \emph{strict}
+% commands too.
+%
+% \begin{macrocode}\newif\ifudiss@author
+\def\udiss@blank@author@err{%
+ \ClassError{udiss}{%
+ The `author' field cannot be blank%
+ }{%
+ You have provided an empty argument to the `author'
+ field. This is not\MessageBreak permitted by the class.%
+ }%
+}
+% \end{macrocode}
+%
+% Now we start developing the code for the |title| and
+% |author| parameters. In order to check whether a macro
+% is empty or not, we need to use the
+% |\ifx\macro|$_{1}$|\macro|$_{2}$ construct. But since
+% we have an argument and not a ready macro for
+% comparison, we first we develop an internal macro with
+% the argument as its value.
+%
+% \begin{macrocode}
+\ekvdefinekeys{udiss}{%
+ code title = {%
+ \def\udiss@tmp@title{#1}%
+% \end{macrocode}
+%
+% The true branch of this conditional, i.e., everything
+% till either |\else| or |\fi| is found, defines the
+% actual macro to be used while typesetting, i.e.,
+% |\udiss@title|, but since the user has provided a blank
+% macro, we give a cryptic value to the macro, e.g.,
+% |-NoValidTitle-|. Note that this gets printed in the
+% document even though the user gets an error. Since we
+% use this regularly, a user may search for |-NoValid| in
+% the output to find out all the values they missed
+% providing.
+%
+% \begin{macrocode}
+ \ifx\udiss@tmp@title\empty
+ \def\udiss@title{-NoValidTitle-}%
+% \end{macrocode}
+%
+% After this, we print the error for the blank argument.
+% In the |\else| branch (which means the user did
+% \emph{not} pass a blank argument, but provided a
+% legit value), we define the command with the actual
+% user-given-value. This is the most ideal condition.
+%
+% \begin{macrocode}
+ \udiss@blank@title@err
+ \else
+ \def\udiss@title{#1}%
+ \fi
+ },%
+% \end{macrocode}
+%
+% We repeat the same pattern for the \emph{strict} commands
+% now. Here is the code for |author|.
+%
+% \begin{macrocode}
+ code author = {%
+ \def\udiss@tmp@author{#1}%
+ \ifx\udiss@tmp@author\empty
+ \def\udiss@author{-NoValidAuthor-}%
+ \udiss@blank@author@err
+ \else
+ \def\udiss@author{#1}%
+ \fi
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{subtitle,\subtitle,shorttitle,\shorttitle}
+% Here is the code for the |subtitle| and |shorttitle|
+% fields. As they aren't \emph{strict}, no errors needed
+% for them. We need a conditional though. We set it to
+% true so that it is understood that this field was not
+% forgotten by the author. Only if their value is true, we
+% print them later.
+%
+% \begin{macrocode}
+\newif\ifudiss@subtitle
+\newif\ifudiss@shorttitle
+\ekvdefinekeys{udiss}{%
+ code subtitle = {%
+ \IfBlankTF{#1}{%
+ \def\udiss@subtitle{-NoValidSubtitle-}%
+ \udiss@subtitletrue
+ }{%
+ \def\udiss@subtitle{#1}%
+ \udiss@subtitletrue
+ }%
+ },%
+ code shorttitle = {%
+ \IfBlankTF{#1}{%
+ \def\udiss@shorttitle{-NoValidSubtitle-}%
+ \udiss@shorttitletrue
+ }{%
+ \def\udiss@shorttitle{#1}%
+ \udiss@shorttitletrue
+ }%
+ }%
+}
+\NewDocumentCommand{ \subtitle }{ m }{%
+ \def\udiss@subtitle{#1}%
+ \udiss@subtitletrue
+}
+\NewDocumentCommand{ \shorttitle }{ m }{%
+ \def\udiss@shorttitle{#1}%
+ \udiss@shorttitletrue
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{^^A
+% stream,\stream,discipline,\discipline,^^A
+% degree,\degree^^A
+% }
+% Again some compulsory fields, so we develop the errors,
+% then the \emph{key}s and then the macros.
+%
+% \begin{macrocode}
+\newif\ifudiss@stream
+\def\udiss@blank@stream@err{%
+ \ClassError{udiss}{%
+ The `stream' field cannot be blank%
+ }{%
+ You have provided an empty argument to the `stream'
+ field. This is not\MessageBreak permitted by the class.%
+ }%
+}
+\newif\ifudiss@discipline
+\def\udiss@blank@discipline@err{%
+ \ClassError{udiss}{%
+ The `discipline' field cannot be blank%
+ }{%
+ You have provided an empty argument to the `discipline'
+ field. This is not\MessageBreak permitted by the class.%
+ }%
+}
+\newif\ifudiss@degree
+\def\udiss@blank@degree@err{%
+ \ClassError{udiss}{%
+ The `degree' field cannot be blank%
+ }{%
+ You have provided an empty argument to the `degree'
+ field. This is not\MessageBreak permitted by the class.%
+ }%
+}
+\ekvdefinekeys{udiss}{%
+ code stream = {%
+ \def\udiss@tmp@stream{#1}%
+ \ifx\udiss@tmp@stream\empty
+ \def\udiss@stream{-NoValidStream-}%
+ \udiss@blank@stream@err
+ \else
+ \def\udiss@stream{#1}%
+ \fi
+ },%
+ code discipline = {%
+ \def\udiss@tmp@discipline{#1}%
+ \ifx\udiss@tmp@discipline\empty
+ \def\udiss@discipline{-NoValidDiscipline-}%
+ \udiss@blank@discipline@err
+ \else
+ \def\udiss@discipline{#1}%
+ \fi
+ },%
+ code degree = {%
+ \def\udiss@tmp@degree{#1}%
+ \ifx\udiss@tmp@degree\empty
+ \def\udiss@degree{-NoValidDegree-}%
+ \udiss@blank@degree@err
+ \else
+ \def\udiss@degree{#1}%
+ \fi
+ }%
+}
+\NewDocumentCommand{ \stream }{ m }{%
+ \IfBlankTF{#1}{%
+ \udiss@blank@stream@err
+ \def\udiss@stream{-NoValidStream-}%
+ }{%
+ \def\udiss@stream{#1}%
+ }%
+ \IfBlankTF{#1}{%
+ \udiss@streamtrue
+ }{%
+ \def\udiss@stream{#1}%
+ \udiss@streamtrue
+ }%
+}
+\NewDocumentCommand{ \discipline }{ m }{%
+ \IfBlankTF{#1}{%
+ \udiss@blank@discipline@err
+ \def\udiss@discipline{-NoValidDiscipline-}%
+ }{%
+ \def\udiss@discipline{#1}%
+ }%
+ \IfBlankTF{#1}{%
+ \udiss@disciplinetrue
+ }{%
+ \def\udiss@discipline{#1}%
+ \udiss@disciplinetrue
+ }%
+}
+\NewDocumentCommand{ \degree }{ m }{%
+ \IfBlankTF{#1}{%
+ \udiss@blank@degree@err
+ \def\udiss@degree{-NoValidDegree-}%
+ }{%
+ \def\udiss@degree{#1}%
+ }%
+ \IfBlankTF{#1}{%
+ \udiss@degreetrue
+ }{%
+ \def\udiss@degree{#1}%
+ \udiss@degreetrue
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% We then develop the last set of \emph{strict} macros which
+% are used in the declaration and some on the title-page
+% too. The method is no different.
+%
+% \begin{macro}{^^A
+% supervisor,\supervisor,university,\university,^^A
+% department,\department^^A
+% }
+% \begin{macrocode}
+\newif\ifudiss@supervisor
+\newif\ifudiss@university
+\newif\ifudiss@department
+\def\udiss@blank@supervisor@err{%
+ \ClassError{udiss}{%
+ The `supervisor' field cannot be blank%
+ }{%
+ You have provided an empty argument to the `supervisor'
+ field. This is not\MessageBreak permitted by the class.%
+ }%
+}
+\def\udiss@blank@university@err{%
+ \ClassError{udiss}{%
+ The `university' field cannot be blank%
+ }{%
+ You have provided an empty argument to the `university'
+ field. This is not\MessageBreak permitted by the class.%
+ }%
+}
+\def\udiss@blank@department@err{%
+ \ClassError{udiss}{%
+ The `department' field cannot be blank%
+ }{%
+ You have provided an empty argument to the `department'
+ field. This is not\MessageBreak permitted by the class.%
+ }%
+}
+\ekvdefinekeys{udiss}{%
+ code supervisor = {%
+ \def\udiss@tmp@supervisor{#1}%
+ \ifx\udiss@tmp@supervisor\empty
+ \def\udiss@supervisor{-NoValidSupervisor-}%
+ \udiss@blank@supervisor@err
+ \else
+ \def\udiss@supervisor{#1}%
+ \fi
+ },%
+ code university = {%
+ \def\udiss@tmp@university{#1}%
+ \ifx\udiss@tmp@university\empty
+ \def\udiss@university{-NoValidUniversity-}%
+ \udiss@blank@university@err
+ \else
+ \def\udiss@university{#1}%
+ \fi
+ },%
+ code department = {%
+ \def\udiss@tmp@department{#1}%
+ \ifx\udiss@tmp@department\empty
+ \def\udiss@department{-NoValidDepartment-}%
+ \udiss@blank@department@err
+ \else
+ \def\udiss@department{#1}%
+ \fi
+ }%
+}
+\NewDocumentCommand{ \supervisor }{ m }{%
+ \IfBlankTF{#1}{%
+ \udiss@blank@supervisor@err
+ \def\udiss@supervisor{-NoValidSupervisor-}%
+ }{%
+ \def\udiss@supervisor{#1}%
+ }%
+ \IfBlankTF{#1}{%
+ \udiss@supervisortrue
+ }{%
+ \def\udiss@supervisor{#1}%
+ \udiss@supervisortrue
+ }%
+}
+\NewDocumentCommand{ \university }{ m }{%
+ \IfBlankTF{#1}{%
+ \udiss@blank@university@err
+ \def\udiss@author{-NoValidUniversity-}%
+ }{%
+ \def\udiss@university{#1}%
+ }%
+ \IfBlankTF{#1}{%
+ \udiss@universitytrue
+ }{%
+ \def\udiss@university{#1}%
+ \udiss@universitytrue
+ }%
+}
+\NewDocumentCommand{ \department }{ m }{%
+ \IfBlankTF{#1}{%
+ \udiss@blank@department@err
+ \def\udiss@author{-NoValidDepartment-}%
+ }{%
+ \def\udiss@department{#1}%
+ }%
+ \IfBlankTF{#1}{%
+ \udiss@departmenttrue
+ }{%
+ \def\udiss@department{#1}%
+ \udiss@departmenttrue
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{ \logo,\logo* }
+% We develop the |\logo| command with a starred variant
+% using the intuitive \pkg{xparse} trickery. Notice the
+% use of two different conditionals |\ifudiss@logo| and
+% |\ifudiss@texlogo|.
+%
+% \begin{macrocode}
+\newif\ifudiss@logo
+\newif\ifudiss@texlogo
+\NewDocumentCommand{ \logo }{ s +m }{%
+ \IfBooleanTF{#1}{%
+ \def\udiss@texlogo{#2}%
+ \udiss@texlogotrue
+ }{%
+ \def\udiss@logo{#2}%
+ }%
+ \udiss@logotrue
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{logo,logo*}
+% \expkvlogo{} doesn't have a way to have starred
+% variants of the keys, but we can always create a
+% different key with an additional star. That's what we do
+% here.
+%
+% \begin{macrocode}
+\ekvdefinekeys{udiss}{%
+ code logo = {%
+ \def\udiss@logo{#1}%
+ \udiss@logotrue
+ },%
+ code logo* = {%
+ \def\udiss@texlogo{#1}%
+ \udiss@logotrue
+ \udiss@texlogotrue
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% Now we move to the complicated task of developing the
+% mechanism for loading languages. In order to imitate the
+% syntax of |babel|, we need a parser which inteprets
+% comma-separated language-names. We develop a new counter
+% called |udiss@langbabel| and use it with |\alph| inside
+% |\csname| in order to produce an ordered sequence of
+% macros that store the different language-names. After
+% parsing, the language macros should look like
+% |\udiss@langbabel@a|, |\udiss@langbabel@a| etc. The
+% following code does that. The |\udiss@lgbbl| macro is the
+% internal parser for the language-names.
+%
+% \begin{macrocode}
+\newcounter{udiss@langbabel}
+\stepcounter{udiss@langbabel}
+\def\udiss@int@langbabel#1{%
+ \expandafter\edef
+ \csname
+ udiss@langbabel@\alph{udiss@langbabel}%
+ \endcsname{#1}%
+ \stepcounter{udiss@langbabel}%
+}
+\NewDocumentCommand\udiss@lgbbl{ >{ \SplitList{,} } m }{%
+ \ProcessList{#1}{\udiss@int@langbabel}%
+}
+% \end{macrocode}
+%
+% \begin{macro}{language,ldfbabel,nofontwarning}
+% We first create the if-conditionals required for this
+% job.
+%
+% \begin{macrocode}
+\newif\ifudiss@lg@used
+\newif\ifudiss@ldfbabel
+% \end{macrocode}
+%
+% The |language| key takes the comma-separated list as its
+% argument and passes the list to the |\udiss@lgbbl|
+% macro which we just saw. So whenever we pass multiple
+% languages to the option |language|, it is parsed by
+% |\udiss@lgbbl|. We then turn the |\ifudiss@lg@used|
+% conditional on, so that when neither of these options
+% are used by the user, we can do something.
+%
+% \begin{macrocode}
+\ekvdefinekeys{udiss}{%
+ code language = {%
+ \udiss@lgbbl{#1}%
+ \udiss@lg@usedtrue
+ },%
+% \end{macrocode}
+%
+% On the other hand though, the process is quite simple
+% and straight forward. We need to store the list of the
+% |.ldf|-languages in a macro and later pass it to the
+% \pkg{babel} package as \pkg{babel} already understands
+% how to parse it. We store the list in the
+% |\udiss@ldfbabel@list| macro. With this option, we have
+% to turn an additional conditional on, i.e.,
+% |\ifudiss@ldfbabel|. Usually we don't use the |.ldf|
+% mechanism at all as mentioned in \cref{doc}.
+%
+% \begin{macrocode}
+ code ldfbabel = {%
+ \def\udiss@ldfbabel@list{#1}%
+ \udiss@lg@usedtrue
+ \udiss@ldfbabeltrue
+ },%
+% \end{macrocode}
+%
+% The |nofontwarning| option is developed using the
+% |invbool| \emph{type} which creates (or uses, if present)
+% a conditional and sets it to true. In this case, it is
+% |\ifudiss@font@warning|. Unless the option |nofontwarning|
+% is used, the aforementioned condition is true.
+%
+% \begin{macrocode}
+ invbool nofontwarning = {\ifudiss@font@warning}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{license,copyright-yrs,localcopyright}
+% Now we develop the options for setting a license with
+% the legit copyrightable years. As usual, we first
+% develop the required conditionals.
+%
+% \begin{macrocode}
+\newif\ifudiss@free@culture
+\newif\ifudiss@ccbysa
+\newif\ifudiss@gfdl
+% \end{macrocode}
+%
+% We use a new \expkvlogo{} \emph{type}s for license which
+% is |choice|. It takes a definite list of |choice|s that
+% run some arbitrary code. We define an internal macro
+% |\udiss@license@notice| which holds the notice text of
+% the selected licenses. We set the
+% |\ifudiss@free@culture| conditional to true if the
+% user's |choice| is |CC-BY-SA| or |GFDL|. Why we do this
+% is because if the choice is |all-rights-reserved|, it
+% need not be explicitly mentioned. It is always assumed.
+% Also, it is seen in PDF's metadata. For this, we enable
+% the conditional. Using the |initial| \emph{prefix} of
+% \expkvlogo{}, we set the |all-rights-reserved| as the
+% default choice of users.
+%
+% \begin{macrocode}
+\ekvdefinekeys{udiss}{%
+ choice license = {%
+ all-rights-reserved = {%
+ \def\udiss@license@notice{%
+ All rights reserved.\textLF
+ }%
+ },%
+ CC-BY-SA = {%
+ \def\udiss@license@notice{%
+ This work is available under the "Creative Commons
+ Attribution ShareAlike 4.0 International" license.%
+ }%
+ \def\udiss@free@license@url{%
+ https://creativecommons.org/licenses/%
+ by-sa/4.0/legalcode.txt%
+ }%
+ \udiss@free@culturetrue
+ \udiss@ccbysatrue
+ },%
+ GFDL = {%
+ \def\udiss@license@notice{%
+ Permission is granted to copy, distribute and/or
+ modify this document under the terms of the GNU Free
+ Documentation License, Version 1.3 or any later
+ version published by the Free Software Foundation;
+ with no Invariant Sections, no Front-Cover Texts,
+ and no Back-Cover Texts. A copy of the license is
+ included in the section entitled “GNU Free
+ Documentation License”.%
+ }%
+ \def\udiss@free@license@url{%
+ https://www.gnu.org/licenses/fdl-1.3.txt%
+ }%
+ \udiss@free@culturetrue
+ \udiss@gfdltrue
+ },%
+ },%
+ initial license = {all-rights-reserved},%
+% \end{macrocode}
+%
+% Then we use the |store| \emph{type} which, as the name
+% suggests, |store|s the value given by the user in a
+% macro. Again, with the |initial| \emph{prefix}, we set
+% the initial values for the two options.
+%
+% \begin{macrocode}
+ store copyright-yrs = {\udiss@copyrightable@years},%
+ initial copyright-yrs = {\the\year},%
+ store localcopyright = {\udiss@local@copyright},%
+ initial localcopyright = {Copyright},%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{placeholders}
+% This option pre-fills all the necessary fields with some
+% random (and rather delusional :P) values. We use the
+% |nmeta| \emph{type} of \expkvlogo{} for this. This type
+% uses the already developed keys with some values. When
+% the key developed with |nmeta| is used by the user, it
+% behaves as if the user has passed the keys inside it
+% with the corresponding values.
+%
+% \begin{macrocode}
+ nmeta placeholders = {%
+ title = {%
+ A groundbreaking dissertation%
+ },%
+ author = {%
+ Jane Doe%
+ },%
+ pronouns = {She/her},%
+ subtitle = {%
+ A milestone study on a longstanding question
+ in a discipline%
+ },%
+ shorttitle = {A Milestone study},%
+ stream = {intriguing stream},%
+ discipline = {rigorous discipline},
+ degree = {enriching degree},%
+ supervisor = {A kind supervisor},%
+ university = {An ideal university},%
+ department = {A homely department},%
+ license = {CC-BY-SA},%
+ copyright-yrs = {2022, 2023, 2024}%
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{^^A
+% lot,lof,declaration,declarationtxt,decllocal^^A
+% }
+% The list of tables and figures are conditionals
+% developed with the |bool| \emph{type} of \expkvlogo{}
+% which creates (or uses, if already present) a boolean.
+% It is by default set to the false value. The declaration
+% also is a |bool|ean as it is turned off by default.
+%
+% \begin{macrocode}
+\ekvdefinekeys{udiss}{%
+ bool lot = {\ifudiss@lot},%
+ bool lof = {\ifudiss@lof},%
+ bool declaration = {\ifudiss@declaration},%
+% \end{macrocode}
+%
+% The |declarationtxt| \emph{key} contains text which has
+% paragraphs inside it and the default \emph{key-value}s
+% of \expkvlogo{} are |\def| type (meaning, they don't
+% accept |\par| tokens). So in order to have the effect of
+% |\long\def|, we need to use |long| \emph{prefix} of
+% \expkvlogo{}. We set an initial value for this too. Then
+% we store the value for the local word for declaration.
+%
+% \begin{macrocode}
+ long
+ store declarationtxt = {\udiss@declaration},%
+ initial declarationtxt = {%
+ \noindent As required by the university regulations, I
+ wish to state that the work embodied in this thesis
+ titled \enquote{\udiss@title: \udiss@subtitle} forms
+ my own contribution to the research work carried out
+ under the guidance of \udiss@supervisor\ at the
+ \udiss@university, \udiss@department.
+
+ This work has not been submitted for any other degree
+ of this or any other university. Whenever references
+ have been made to previous works of others, it has
+ been clearly indicated as such and included in the
+ bibliography.
+
+ \bigskip
+ \flushright{%
+ Date: \today
+
+ \vspace{4em}%
+
+ Name: \udiss@author
+ }%
+
+ \bigskip\bigskip
+ \flushleft{%
+ Certified by:%
+
+ \vspace{4em}%
+
+ \udiss@supervisor
+ }%
+ },%
+ store decllocal = {\udiss@decllocal},%
+ initial decllocal = {Declaration}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{^^A
+% print,norefcolors,udisslinkclr,^^A
+% udissurlclr,udissciteclr^^A
+% }
+% The |print| key is created using the |bool| \emph{type}.
+% The |norefcolors| option, on the other hand, uses the
+% |invbool| \emph{type}. For |udisslinkclr|, |udissurlclr|
+% and |udissciteclr| we use the |store| \emph{type} along
+% with some |initial| values.
+%
+% \begin{macrocode}
+\ekvdefinekeys{udiss}{%
+ bool print = {\ifudiss@print},%
+ invbool norefcolors = {\ifudiss@colors},%
+ store udisslinkclr = {\udiss@int@link@color},%
+ initial udisslinkclr = {udisslink},%
+ store udissurlclr = {\udiss@int@url@color},%
+ initial udissurlclr = {udissurl},%
+ store udissciteclr = {\udiss@int@cite@color},%
+ initial udissciteclr = {udisscite}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{blind}
+% The next boolean is for printing blind documents.
+%
+% \begin{macrocode}
+\ekvdefinekeys{udiss}{%
+ bool blind = {\ifudiss@blind}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{framed-title}
+% We provide a conditional for producing a framed
+% title-page. The conditional will be used later while
+% typesetting.
+%
+% \begin{macrocode}
+\ekvdefinekeys{udiss}{%
+ bool framed-title = {\ifudiss@ftitle}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{oldone,oldstylenumoff}
+% We set the old style numerals as the default for
+% typesetting. We provide an inverse boolean for setting
+% the old style numbers off. The special shape for number
+% one is enabled only with the boolean key |oldone|. We
+% develop it here.
+%
+% \begin{macrocode}
+\ekvdefinekeys{udiss}{%
+ invbool oldstylenumoff = {\ifudiss@oldstylenum},%
+ bool oldone = {\ifudiss@oldone}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{explicitext,ignorefsoff}
+% To turn on the explicit extension mechanism of the
+% font-loading packages, we provide a conditional. It is
+% disabled by default and hence is of the |bool| type.
+%
+% \begin{macrocode}
+\ekvdefinekeys{udiss}{%
+ bool explicitext = {\ifudiss@explicitext},%
+ invbool ignorefsoff = {\ifudiss@ignorefontspec}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{fulfilment}
+% In order to store the sentence written on the
+% title-page, we again use the common |store| and
+% |initial store| pair.
+% \begin{macrocode}
+\ekvdefinekeys{udiss}{%
+ store fulfilment = {\udiss@fulfilment},%
+ initial fulfilment = {%
+ A dissertation submitted in the partial fulfilment of
+ the requirements for the \udiss@degree\ program in
+ \udiss@discipline.%
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% All of the upcoming \emph{key}s are font-selection keys.
+% We set their defaults as explained in \cref{udissenfonts}.
+%
+% \begin{macro}{^^A
+% rmfont,rmbffont,rmitfont,rmbfitfont,^^A
+% rmslfont,rmbfslfont^^A
+% }
+% The following sets the default text font for the
+% document. We are using NewCM family as the default
+% font-family. But as of now, the NewCM fonts don't have
+% all the variants. E.g., it lacks slanted/oblique shapes
+% in the natural weight, but we provide the regular ones
+% in place of them.
+%
+% \begin{macrocode}
+\ekvdefinekeys{udiss}{%
+ store rmfont = {\udiss@rmfont},%
+ initial rmfont = {NewCM10-Book.otf},%
+ store rmbffont = {\udiss@rmbffont},%
+ initial rmbffont = {NewCM10-Bold.otf},%
+ store rmitfont = {\udiss@rmitfont},%
+ initial rmitfont = {NewCM10-BookItalic.otf},%
+ store rmbfitfont = {\udiss@rmbfitfont},%
+ initial rmbfitfont = {NewCM10-BoldItalic.otf},%
+ store rmslfont = {\udiss@rmslfont},%
+ initial rmslfont = {NewCM10-Book.otf},%
+ store rmbfslfont = {\udiss@rmbfslfont},%
+ initial rmbfslfont = {NewCM10-Bold.otf},%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{^^A
+% sffont,sfbffont,sfitfont,sfbfitfont,^^A
+% sfslfont,sfbfslfont^^A
+% }
+%
+% Similarly, we store values for the sans fonts too. NewCM
+% lacks certain variants in sans, but again, the options
+% are set font-agnostically and hence they are more in
+% number than the actually available variants. The sans
+% fonts in NewCM, don't have an Italic design. We have
+% used the oblique version of the fonts there instead.
+% Note that the same designs are used for the slanted
+% fonts too.
+%
+% \begin{macrocode}
+ store sffont = {\udiss@sffont},%
+ initial sffont = {NewCMSans10-Book.otf},%
+ store sfbffont = {\udiss@sfbffont},%
+ initial sfbffont = {NewCMSans10-Bold.otf},%
+ store sfitfont = {\udiss@sfitfont},
+ initial sfitfont = {NewCMSans10-BookOblique.otf},%
+ store sfbfitfont = {\udiss@sfbfitfont},%
+ initial sfbfitfont = {NewCMSans10-BoldOblique.otf},%
+ store sfslfont = {\udiss@sfslfont},%
+ initial sfslfont = {NewCMSans10-BookOblique.otf},%
+ store sfbfslfont = {\udiss@sfbfslfont},%
+ initial sfbfslfont = {NewCMSans10-BoldOblique.otf},%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{^^A
+% ttfont,ttbffont,ttitfont,ttbfitfont,^^A
+% ttslfont,ttbfslfont^^A
+% }
+% The settings for typewriter fonts are loaded in the below
+% code. We have a strange situation here. NewCM provides
+% |BookItalic|, but doesn't have a |BoldItalic|. We instead
+% have |BoldOblique|. Thus we set the |BookItalic| as the
+% |ttitfont| and |BoldOblique| as the |ttbfit| font. The
+% same pair for |ttslfont| and |ttbfslfont|.
+%
+% \begin{macrocode}
+ store ttfont = {\udiss@ttfont},%
+ initial ttfont = {NewCMMono10-Book.otf},%
+ store ttbffont = {\udiss@ttbffont},
+ initial ttbffont = {NewCMMono10-Bold.otf},%
+ store ttitfont = {\udiss@ttitfont},%
+ initial ttitfont = {NewCMMono10-BookItalic.otf},%
+ store ttbfitfont = {\udiss@ttbfitfont},%
+ initial ttbfitfont = {NewCMMono10-BoldOblique.otf},%
+ store ttslfont = {\udiss@ttslfont},%
+ initial ttslfont = {NewCM10-Book.otf},%
+ store ttbfslfont = {\udiss@ttbfslfont},%
+ initial ttbfslfont = {NewCMMono10-BoldOblique.otf},%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{mathfont,mathbffont}
+% Maths fonts have very little variation, so we just have
+% two parameters for selecting the fonts and two of the
+% usual parameters for features and extensions.
+%
+% \begin{macrocode}
+ store mathfont = {\udiss@mathfont},%
+ initial mathfont = {NewCMMath-Book.otf},%
+ store mathbffont = {\udiss@mathbffont},%
+ initial mathbffont = {NewCMMath-Bold.otf},%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{^^A
+% rmfeatures,rmfntext,sffeatures,sffntext,^^A
+% ttfeatures,ttfntext,mathfeatures,mathfntext^^A
+% }
+% If the user wants to add features to the selected fonts,
+% they are allowed to use these commands and if they use
+% the |explicitext| option, they can choose the font
+% extensions too using the \emph{key}s specifically
+% developed for that. We use |store| and |choice|
+% \emph{type}s for this.
+%
+% \begin{macrocode}
+ store rmfeatures = {\udiss@rmfeatures},%
+ choice rmfntext = {%
+ ttf = {%
+ \ifudiss@explicitext
+ \def\udiss@rmfntext{ttf}%
+ \else
+ \ClassError{udiss}{%
+ Option `explicitext' is needed for adding
+ font extensions%
+ }{%
+ You have loaded font-option `rmfntext' to
+ add extension to font-names.
+ This\MessageBreak option is supposed to be
+ used only with the `explicitext' option.
+ E.g., for\MessageBreak loading, say,
+ FreeSerif, you may choose one of the
+ following two methods:%
+ \MessageBreak\MessageBreak
+ 1. The recommended method:%
+ \MessageBreak
+ \space\space\space
+ ----8<---------------8<----%
+ \MessageBreak
+ \space\space\space
+ \string\documentclass[\@percentchar
+ \MessageBreak
+ \space\space\space\space\space
+ rmfont = {FreeSerif.ttf}\@percentchar
+ \MessageBreak
+ \space\space\space
+ ]{udiss}\MessageBreak
+ \space\space\space
+ ----8<---------------8<----%
+ \MessageBreak\MessageBreak
+ 2. The alternative:%
+ \MessageBreak
+ \space\space\space
+ ----8<------------8<----%
+ \MessageBreak
+ \space\space\space
+ \string\documentclass[\@percentchar
+ \MessageBreak
+ \space\space\space\space\space
+ explicitext,\@percentchar
+ \MessageBreak
+ \space\space\space\space\space
+ rmfont = {FreeSerif},\@percentchar
+ \MessageBreak
+ \space\space\space\space\space
+ rmfntext = {ttf}\@percentchar
+ \MessageBreak
+ \space\space\space
+ ]{udiss}%
+ \MessageBreak
+ \space\space\space
+ ----8<------------8<----%
+ }%
+ \fi
+ },%
+ otf = {%
+ \ifudiss@explicitext
+ \def\udiss@rmfntext{otf}%
+ \else
+ \ClassError{udiss}{%
+ Option `explicitext' is needed for adding
+ font extensions%
+ }{%
+ You have loaded font-option `rmfntext' to
+ add extension to font-names.
+ This\MessageBreak option is supposed to be
+ used only with the `explicitext' option.
+ E.g., for\MessageBreak loading, say,
+ KpRoman-Regular.otf, you may choose one of
+ the following two\MessageBreak
+ methods:%
+ \MessageBreak\MessageBreak
+ 1. The recommended method:%
+ \MessageBreak
+ \space\space\space
+ ----8<---------------------8<----%
+ \MessageBreak
+ \space\space\space
+ \string\documentclass[\@percentchar
+ \MessageBreak
+ \space\space\space\space\space
+ rmfont = {KpRoman-Regular.otf}%
+ \@percentchar
+ \MessageBreak
+ \space\space\space
+ ]{udiss}\MessageBreak
+ \space\space\space
+ ----8<---------------------8<----%
+ \MessageBreak
+ \MessageBreak
+ 2. The alternative:%
+ \MessageBreak
+ \space\space\space
+ ----8<------------------8<----%
+ \MessageBreak
+ \space\space\space
+ \string\documentclass[\@percentchar
+ \MessageBreak
+ \space\space\space\space\space
+ explicitext,\@percentchar
+ \MessageBreak
+ \space\space\space\space\space
+ rmfont = {KpRoman-Regular},%
+ \@percentchar
+ \MessageBreak
+ \space\space\space\space\space
+ rmfntext = {otf}\@percentchar
+ \MessageBreak
+ \space\space\space
+ ]{udiss}%
+ \MessageBreak
+ \space\space\space
+ ----8<------------------8<----%
+ }%
+ \fi
+ }%
+ },%
+ store sffeatures = {\udiss@sffeatures},%
+ choice sffntext = {%
+ ttf = {%
+ \ifudiss@explicitext
+ \def\udiss@sffntext{ttf}%
+ \else
+ \ClassError{udiss}{%
+ Option `explicitext' is needed for adding
+ font extensions%
+ }{%
+ You have loaded font-option `sffntext' to
+ add extension to font-names.
+ This\MessageBreak option is supposed to be
+ used only with the `explicitext' option.
+ E.g., for\MessageBreak loading, say,
+ FreeSans, you may choose one of the
+ following two methods:%
+ \MessageBreak\MessageBreak
+ 1. The recommended method:%
+ \MessageBreak
+ \space\space\space
+ ----8<---------------8<----%
+ \MessageBreak
+ \space\space\space
+ \string\documentclass[\@percentchar
+ \MessageBreak
+ \space\space\space\space\space
+ sffont = {FreeSans.ttf}\@percentchar
+ \MessageBreak
+ \space\space\space
+ ]{udiss}\MessageBreak
+ \space\space\space
+ ----8<---------------8<----%
+ \MessageBreak\MessageBreak
+ 2. The alternative:%
+ \MessageBreak
+ \space\space\space
+ ----8<------------8<----%
+ \MessageBreak
+ \space\space\space
+ \string\documentclass[\@percentchar
+ \MessageBreak
+ \space\space\space\space\space
+ explicitext,\@percentchar
+ \MessageBreak
+ \space\space\space\space\space
+ sffont = {FreeSans},\@percentchar
+ \MessageBreak
+ \space\space\space\space\space
+ sffntext = {ttf}\@percentchar
+ \MessageBreak
+ \space\space\space
+ ]{udiss}%
+ \MessageBreak
+ \space\space\space
+ ----8<------------8<----%
+ }%
+ \fi
+ },%
+ otf = {%
+ \ifudiss@explicitext
+ \def\udiss@sffntext{otf}%
+ \else
+ \ClassError{udiss}{%
+ Option `explicitext' is needed for adding
+ font extensions%
+ }{%
+ You have loaded font-option `sffntext' to
+ add extension to font-names.
+ This\MessageBreak option is supposed to be
+ used only with the `explicitext' option.
+ E.g., for\MessageBreak loading, say,
+ KpSans-Regular.otf, you may choose one of
+ the following two\MessageBreak
+ methods:%
+ \MessageBreak\MessageBreak
+ 1. The recommended method:%
+ \MessageBreak
+ \space\space\space
+ ----8<---------------------8<----%
+ \MessageBreak
+ \space\space\space
+ \string\documentclass[\@percentchar
+ \MessageBreak
+ \space\space\space\space\space
+ sffont = {KpSans-Regular.otf}%
+ \@percentchar
+ \MessageBreak
+ \space\space\space
+ ]{udiss}\MessageBreak
+ \space\space\space
+ ----8<---------------------8<----%
+ \MessageBreak
+ \MessageBreak
+ 2. The alternative:%
+ \MessageBreak
+ \space\space\space
+ ----8<------------------8<----%
+ \MessageBreak
+ \space\space\space
+ \string\documentclass[\@percentchar
+ \MessageBreak
+ \space\space\space\space\space
+ explicitext,\@percentchar
+ \MessageBreak
+ \space\space\space\space\space
+ sffont = {KpSans-Regular},%
+ \@percentchar
+ \MessageBreak
+ \space\space\space\space\space
+ sffntext = {otf}\@percentchar
+ \MessageBreak
+ \space\space\space
+ ]{udiss}%
+ \MessageBreak
+ \space\space\space
+ ----8<------------------8<----%
+ }%
+ \fi
+ }%
+ },%
+ store ttfeatures = {\udiss@ttfeatures},%
+ choice ttfntext = {%
+ ttf = {%
+ \ifudiss@explicitext
+ \def\udiss@ttfntext{ttf}%
+ \else
+ \ClassError{udiss}{%
+ Option `explicitext' is needed for adding
+ font extensions%
+ }{%
+ You have loaded font-option `ttfntext' to
+ add extension to font-names.
+ This\MessageBreak option is supposed to be
+ used only with the `explicitext' option.
+ E.g., for\MessageBreak loading, say,
+ FreeMono, you may choose one of the
+ following two methods:%
+ \MessageBreak\MessageBreak
+ 1. The recommended method:%
+ \MessageBreak
+ \space\space\space
+ ----8<---------------8<----%
+ \MessageBreak
+ \space\space\space
+ \string\documentclass[\@percentchar
+ \MessageBreak
+ \space\space\space\space\space
+ ttfont = {FreeMono.ttf}\@percentchar
+ \MessageBreak
+ \space\space\space
+ ]{udiss}\MessageBreak
+ \space\space\space
+ ----8<---------------8<----%
+ \MessageBreak\MessageBreak
+ 2. The alternative:%
+ \MessageBreak
+ \space\space\space
+ ----8<------------8<----%
+ \MessageBreak
+ \space\space\space
+ \string\documentclass[\@percentchar
+ \MessageBreak
+ \space\space\space\space\space
+ explicitext,\@percentchar
+ \MessageBreak
+ \space\space\space\space\space
+ ttfont = {FreeMono},\@percentchar
+ \MessageBreak
+ \space\space\space\space\space
+ ttfntext = {ttf}\@percentchar
+ \MessageBreak
+ \space\space\space
+ ]{udiss}%
+ \MessageBreak
+ \space\space\space
+ ----8<------------8<----%
+ }%
+ \fi
+ },%
+ otf = {%
+ \ifudiss@explicitext
+ \def\udiss@ttfntext{otf}%
+ \else
+ \ClassError{udiss}{%
+ Option `explicitext' is needed for adding
+ font extensions%
+ }{%
+ You have loaded font-option `ttfntext' to
+ add extension to font-names.
+ This\MessageBreak option is supposed to be
+ used only with the `explicitext' option.
+ E.g., for\MessageBreak loading, say,
+ KpMono-Regular.otf, you may choose one of
+ the following two\MessageBreak
+ methods:%
+ \MessageBreak\MessageBreak
+ 1. The recommended method:%
+ \MessageBreak
+ \space\space\space
+ ----8<---------------------8<----%
+ \MessageBreak
+ \space\space\space
+ \string\documentclass[\@percentchar
+ \MessageBreak
+ \space\space\space\space\space
+ ttfont = {KpMono-Regular.otf}%
+ \@percentchar
+ \MessageBreak
+ \space\space\space
+ ]{udiss}\MessageBreak
+ \space\space\space
+ ----8<---------------------8<----%
+ \MessageBreak
+ \MessageBreak
+ 2. The alternative:%
+ \MessageBreak
+ \space\space\space
+ ----8<------------------8<----%
+ \MessageBreak
+ \space\space\space
+ \string\documentclass[\@percentchar
+ \MessageBreak
+ \space\space\space\space\space
+ explicitext,\@percentchar
+ \MessageBreak
+ \space\space\space\space\space
+ ttfont = {KpMono-Regular},%
+ \@percentchar
+ \MessageBreak
+ \space\space\space\space\space
+ ttfntext = {otf}\@percentchar
+ \MessageBreak
+ \space\space\space
+ ]{udiss}%
+ \MessageBreak
+ \space\space\space
+ ----8<------------------8<----%
+ }%
+ \fi
+ }%
+ },%
+ store mathfeatures = {\udiss@mathfeatures},%
+ choice mathfntext = {%
+ ttf = {%
+ \ifudiss@explicitext
+ \def\udiss@mathfntext{ttf}%
+ \else
+ \ClassError{udiss}{%
+ Option `explicitext' is needed for adding
+ font extensions%
+ }{%
+ You have loaded font-option `mathfntext'
+ to add extension to font-names.
+ This\MessageBreak option is supposed to be
+ used only with the `explicitext' option.
+ E.g., for\MessageBreak loading, say,
+ NotoSansMath-Regular, you may choose one
+ of the following two\MessageBreak
+ methods:%
+ \MessageBreak\MessageBreak
+ 1. The recommended method:%
+ \MessageBreak
+ \space\space\space
+ ----8<----------------------------8<----%
+ \MessageBreak
+ \space\space\space
+ \string\documentclass[\@percentchar
+ \MessageBreak
+ \space\space\space\space\space
+ mathfont = {NotoSansMath-Regular.ttf}%
+ \@percentchar
+ \MessageBreak
+ \space\space\space
+ ]{udiss}\MessageBreak
+ \space\space\space
+ ----8<----------------------------8<----%
+ \MessageBreak\MessageBreak
+ 2. The alternative:%
+ \MessageBreak
+ \space\space\space
+ ----8<-------------------------8<----%
+ \MessageBreak
+ \space\space\space
+ \string\documentclass[\@percentchar
+ \MessageBreak
+ \space\space\space\space\space
+ explicitext,\@percentchar
+ \MessageBreak
+ \space\space\space\space\space
+ mathfont = {NotoSansMath-Regular},%
+ \@percentchar
+ \MessageBreak
+ \space\space\space\space\space
+ mathfntext = {ttf}\@percentchar
+ \MessageBreak
+ \space\space\space
+ ]{udiss}%
+ \MessageBreak
+ \space\space\space
+ ----8<-------------------------8<----%
+ }%
+ \fi
+ },%
+ otf = {%
+ \ifudiss@explicitext
+ \def\udiss@mathfntext{otf}%
+ \else
+ \ClassError{udiss}{%
+ Option `explicitext' is needed for adding
+ font extensions%
+ }{%
+ You have loaded font-option `mathfntext'
+ to add extension to font-names.
+ This\MessageBreak option is supposed to be
+ used only with the `explicitext' option.
+ E.g., for\MessageBreak loading, say,
+ XITSMath-Regular, you may choose one of
+ the following two\MessageBreak methods:%
+ \MessageBreak\MessageBreak
+ 1. The recommended method:%
+ \MessageBreak
+ \space\space\space
+ ----8<----------------------------8<----%
+ \MessageBreak
+ \space\space\space
+ \string\documentclass[\@percentchar
+ \MessageBreak
+ \space\space\space\space\space
+ mathfont = {XITSMath-Regular.otf}%
+ \@percentchar
+ \MessageBreak
+ \space\space\space
+ ]{udiss}\MessageBreak
+ \space\space\space
+ ----8<----------------------------8<----%
+ \MessageBreak\MessageBreak
+ 2. The alternative:%
+ \MessageBreak
+ \space\space\space
+ ----8<-------------------------8<----%
+ \MessageBreak
+ \space\space\space
+ \string\documentclass[\@percentchar
+ \MessageBreak
+ \space\space\space\space\space
+ explicitext,\@percentchar
+ \MessageBreak
+ \space\space\space\space\space
+ mathfont = {XITSMath-Regular},%
+ \@percentchar
+ \MessageBreak
+ \space\space\space\space\space
+ mathfntext = {otf}\@percentchar
+ \MessageBreak
+ \space\space\space
+ ]{udiss}%
+ \MessageBreak
+ \space\space\space
+ ----8<-------------------------8<----%
+ }%
+ \fi
+ }%
+ },%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{^^A
+% titleshape,titlefont,titleffeat,titlesize,titlecolor^^A
+% }
+% We store various variables in these keys for customising
+% the layout of the title-page. The following are the keys
+% specifically developed for customising the title. The
+% sizing is done with internal macros specifically
+% designed for consistent size-changing. We use
+% \pkg{fontspec}-scaling for that.
+%
+% \begin{macrocode}
+\ekvdefinekeys{udiss}{%
+ store titleshape = {\udiss@title@shape},%
+ initial titleshape = {\bfseries},%
+ store titlefont = {\udiss@title@font},%
+ store titlesize = {\udiss@title@size},%
+ initial titlesize = {\udiss@int@huge},%
+ store titlecolor = {\udiss@title@color},%
+ initial titlecolor = {black},%
+ store titleffeat = {\udiss@title@fontfeats},%
+ initial titleffeat = {}%
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{^^A
+% subtitleshape,subtitlefont,subtitleffeat,^^A
+% subtitlesize,subtitlecolor^^A
+% }
+% The same logic is applied for subtitles and these
+% variables are created.
+%
+% \begin{macrocode}
+\ekvdefinekeys{udiss}{%
+ store subtitleshape = {\udiss@subtitle@shape},%
+ initial subtitleshape = {\normalfont},%
+ store subtitlefont = {\udiss@subtitle@font},%
+ store subtitlesize = {\udiss@subtitle@size},%
+ initial subtitlesize = {\udiss@int@large},%
+ store subtitlecolor = {\udiss@subtitle@color},%
+ initial subtitlecolor = {black},%
+ store subtitleffeat = {\udiss@subtitle@fontfeats},%
+ initial subtitleffeat = {}%
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{^^A
+% authorshape,authorfont,authorsize,authorcolor,^^A
+% authorffeat^^A
+% }
+% Similarly, we have the following keys for author.
+%
+% \begin{macrocode}
+\ekvdefinekeys{udiss}{%
+ store authorshape = {\udiss@author@shape},%
+ initial authorshape = {\normalfont},%
+ store authorfont = {\udiss@author@font},%
+ store authorsize = {\udiss@author@size},%
+ initial authorsize = {\udiss@int@large},%
+ store authorcolor = {\udiss@author@color},%
+ initial authorcolor = {black},%
+ store authorffeat = {\udiss@author@fontfeats},%
+ initial authorffeat = {}%
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{^^A
+% unishape,unifont,unisize,unicolor,uniffeat^^A
+% }
+% The same pattern for printing the university name.
+%
+% \begin{macrocode}
+\ekvdefinekeys{udiss}{%
+ store unishape = {\udiss@uni@shape},%
+ initial unishape = {\itshape},%
+ store unifont = {\udiss@uni@font},%
+ store unisize = {\udiss@uni@size},%
+ initial unisize = {\normalsize},%
+ store unicolor = {\udiss@uni@color},%
+ initial unicolor = {black},%
+ store uniffeat = {\udiss@uni@fontfeats}%
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{^^A
+% deptshape,deptfont,deptsize,deptcolor,deptffeat^^A
+% }
+% The following keys for the department.
+%
+% \begin{macrocode}
+\ekvdefinekeys{udiss}{%
+ store deptshape = {\udiss@dept@shape},%
+ initial deptshape = {\normalfont},%
+ store deptfont = {\udiss@dept@font},%
+ store deptsize = {\udiss@dept@size},%
+ initial deptsize = {\udiss@int@small},%
+ store deptcolor = {\udiss@dept@color},%
+ initial deptcolor = {black},%
+ store deptffeat = {\udiss@dept@fontfeats},%
+ initial deptffeat = {}%
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{^^A
+% ffshape,fffont,ffsize,ffcolor,ffffeat^^A
+% }
+% These are for the fulfilment-text.
+%
+% \begin{macrocode}
+\ekvdefinekeys{udiss}{%
+ store ffshape = {\udiss@fulfilment@shape},%
+ initial ffshape = {\normalfont},%
+ store fffont = {\udiss@fulfilment@font},%
+ store ffsize = {\udiss@fulfilment@size},%
+ initial ffsize = {\udiss@int@small},%
+ store ffcolor = {\udiss@fulfilment@color},%
+ initial ffcolor = {black},%
+ store fffeat = {\udiss@fulfilment@fontfeats},%
+ initial fffeat = {}%
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{^^A
+% logowidth,logoheight^^A
+% }
+% The following parameters save the values for the
+% logo-height and the logo-width. These are the last
+% options after which we |\Process| our options.
+%
+% \begin{macrocode}
+\ekvdefinekeys{udiss}{%
+ store logowidth = {\udiss@logo@width},%
+ initial logowidth = {0.3},%
+ store logoheight = {\udiss@logo@hght},%
+ initial logoheight = {0.075}%
+}
+\ekvoProcessGlobalOptions{udiss}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\dissertationstyle}
+% We develop the command for loading custom styles. It
+% just inputs files starting with |udiss-style-| followed
+% by the designated tag, e.g., |ukerala| for the
+% university of Kerala.
+%
+% \begin{macrocode}
+\NewDocumentCommand{ \dissertationstyle }{ m }{%
+ \AddToHook{begindocument/before}{%
+ \input{udiss-style-#1}%
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% To minimise loading a lot of packages, we use the
+% \cls{memoir} class which provides many features useful for
+% document-creation. But we also need to set print and
+% digital versions of the dissertations. For that we use our
+% conditional.
+%
+% \begin{macrocode}
+\ifudiss@print
+\else
+ \PassOptionsToClass{oneside}{memoir}%
+\fi
+\LoadClass{memoir}
+% \end{macrocode}
+%
+% \begin{macro}{\title,\author}
+% We defined most other commands as per the flow of the
+% documentation, but as mentioned before, we had kept
+% |\title| and |\author| aside. As mentioned before, we
+% did so because these commands are defined by the
+% \cls{memoir} class. If we had defined it before loading
+% the memoir class (which we just loaded), the commands
+% would have got renewed after loading the class and thus
+% our internal macros would have failed. On the other
+% hand, we could not have loaded the memoir class in the
+% beginning, because we use the |\ifudiss@print|
+% conditional, i.e., developed with the help of
+% \expkvlogo{def} package. Even if we had separated the
+% code of |print| key, it would have been necessary to
+% process the keys using |\ekvoProcessGlobalOptions|, but
+% we could not have done that since there were a lot of
+% other options pending. This is why, we develop the
+% |\title| and |\author| commands now.
+%
+% \begin{macrocode}
+\RenewDocumentCommand{ \title }{ m }{%
+ \IfBlankTF{#1}{%
+ \udiss@blank@title@err
+ \def\udiss@title{-NoValidTitle-}%
+ }{%
+ \def\udiss@title{#1}%
+ }%
+}
+\RenewDocumentCommand{ \author }{ m }{%
+ \IfBlankTF{#1}{%
+ \udiss@blank@author@err
+ \def\udiss@author{-NoValidAuthor-}%
+ }{%
+ \def\udiss@author{#1}%
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% We are using OpenType fonts for better accessibility. They
+% are incompatible with the classic PDF\LaTeX\ and require
+% either Lua\LaTeX\ or \hologo{XeLaTeX} for compilation. To
+% ensure that one of these two is loaded, we load the
+% \pkg{iftex} package and mandate a Unicode engine with the
+% |\RequireTUTeX| command.
+%
+% \begin{macrocode}
+\RequirePackage{iftex}
+\RequireTUTeX
+% \end{macrocode}
+%
+% We used custom \cls{udiss} size commands. They are
+% developed with \pkg{fontspec}-scaling as follows:
+%
+% \begin{macrocode}
+\def\udiss@int@HUGE{%
+ \addfontfeature{Scale={2.5}}%
+}
+\def\udiss@int@Huge{%
+ \addfontfeature{Scale={2}}%
+}
+\def\udiss@int@huge{%
+ \addfontfeature{Scale={1.7}}%
+}
+\def\udiss@int@LARGE{%
+ \addfontfeature{Scale={1.4}}%
+}
+\def\udiss@int@Large{%
+ \addfontfeature{Scale={1.2}}%
+}
+\def\udiss@int@large{%
+ \addfontfeature{Scale={1.1}}%
+}
+\def\udiss@int@small{%
+ \addfontfeature{Scale={0.9}}%
+}
+\def\udiss@int@footnotesize{%
+ \addfontfeature{Scale={0.8}}%
+}
+\def\udiss@int@scriptsize{%
+ \addfontfeature{Scale={0.7}}%
+}
+\def\udiss@int@tiny{%
+ \addfontfeature{Scale={0.6}}%
+}
+\def\udiss@int@miniscule{%
+ \addfontfeature{Scale={0.5}}%
+}
+% \end{macrocode}
+%
+% We require the \pkg{babel} package for loading the
+% language settings. We have the following three situations
+% with loading languages in \cls{udiss}:
+%
+% \begin{enumerate}
+% \item Users don't load any of the language options at all.
+% \item Users load languages with option |ldfbabel|.
+% \item Users load languages with option |language|.
+% \end{enumerate}
+%
+% If a user has used |ldfbabel|, then the macro which stores
+% the language-list is directly passed to the package using
+% |\PassOptionsToPackage|.
+%
+% \begin{macrocode}
+\ifudiss@lg@used
+ \ifudiss@ldfbabel
+ \PassOptionsToPackage{%
+ \udiss@ldfbabel@list
+ }{babel}%
+ \fi
+% \end{macrocode}
+%
+% If user hasn't loaded any language options, we assume that
+% they have no intent to load languages that require |.ldf|
+% files and hence we mandate loading |.ini| files for all
+% the languages. In addition to that, we load |english| as
+% the main language. This takes care of the first two
+% situations.
+%
+% \begin{macrocode}
+\else
+ \PassOptionsToPackage{english,provide*=*}{babel}%
+\fi
+\RequirePackage{babel}
+% \end{macrocode}
+%
+% We also load package \pkg{iflang} for testing
+% language-names.
+%
+% \begin{macrocode}
+\RequirePackage{iflang}
+% \end{macrocode}
+%
+% First we check if the user has loaded |ldf| languages. We
+% ignore that branch completely. If it is not loaded and
+% they have loaded exactly one language, then we set that
+% language as the main language. Note that when user uses
+% one language, the value of the counter is 2 as it is
+% increased by the counter each time.
+%
+% \begin{macrocode}
+\newcounter{udiss@tmp@langcnt}
+\ifudiss@ldfbabel
+\else
+ \ifudiss@lg@used
+ \ifnum\theudiss@langbabel=2\relax
+ \addtocounter{udiss@langbabel}{-1}%
+ \ifLuaTeX
+ \babelprovide[%
+ main,%
+ import,%
+ onchar ={ids fonts}%
+ ]{%
+ \csname
+ udiss@langbabel@\alph{udiss@langbabel}%
+ \endcsname
+ }%
+ \else
+ \babelprovide[main,import]{%
+ \csname
+ udiss@langbabel@\alph{udiss@langbabel}%
+ \endcsname
+ }%
+ \fi
+ \fi
+% \end{macrocode}%
+%
+% When users use multiple languages, the situation is a bit
+% more complicated. Because the parser parses and increases
+% the counter each time. Suppose, the user provided 5
+% languages, the parser will create 5 macros \emph{and}
+% increase the counter for one last time resulting in the
+% value 6. In order to stop processing when the number of
+% actually used languages is reached, we need to store the
+% current number \emph{minus one} because of this. We have
+% to start a loop from value 1 till it reaches the last
+% value. For this, we reset the counter. In order % to stop
+% when all the languages are parsed, we need to remember the
+% actual value of the counter somewhere. Hence we create a
+% temporary counter for this and equate it with the value of
+% our actual counter minus 1. Note that we escape
+% |\ifudiss@ldfbabel| too. Now we start the calculation when
+% the counter's value is 3 or more, basically the author has
+% to use at least two languages in order to activate the
+% loop ahead.
+%
+% \begin{macrocode}
+ \ifnum\theudiss@langbabel>2\relax
+ \setcounter{udiss@tmp@langcnt}{%
+ \numexpr\theudiss@langbabel -1\relax
+ }%
+% \end{macrocode}
+%
+% We now can safely manipulate our actual counter. Starting
+% from the first language, we load all of them with the
+% |\babelprovide| command. We reset the counter to 1:
+%
+% \begin{macrocode}
+ \setcounter{udiss@langbabel}{1}%
+% \end{macrocode}
+%
+% Now we start a loop.
+%
+% \begin{macrocode}
+ \loop
+% \end{macrocode}
+%
+% Only Lua\LaTeX\ supports the |ids fonts| parameter with
+% |\babelprovide| for applying fonts to the input text with
+% respect to their Unicode slots. That is why we start the
+% |\ifLuaTeX| conditional and load the |onchar| option.
+% Loading a conditional inside |\babelprovide| wasn't
+% permitted because of expansion, hence we load the entire
+% command in the else branch. Notice that there is no space
+% after the |=| sign of the |onchar| option. To know why,
+% you may want to read this wonderful answer by Jonathan P.
+% Spratte: \url{https://topanswers.xyz/tex?q=8039#a7652}.
+%
+% \begin{macrocode}
+ \ifLuaTeX
+ \babelprovide[%
+ import,%
+ onchar ={ids fonts}%
+ ]{%
+% \end{macrocode}
+%
+% Now we pass |\udiss@langbabel@a| as an argument to
+% |\babelprovide| command (the value of the counter is as of
+% now 1).
+%
+% \begin{macrocode}
+ \csname
+ udiss@langbabel@\alph{udiss@langbabel}%
+ \endcsname
+ }%
+% \end{macrocode}
+%
+% We start the |\else| branch and use the same thing again,
+% just without the |onchar| option .
+%
+% \begin{macrocode}
+ \else
+ \babelprovide[import]{%
+ \csname
+ udiss@langbabel@\alph{udiss@langbabel}%
+ \endcsname
+ }%
+ \fi
+% \end{macrocode}
+%
+% Woohoo! We loaded the first language successfully. Now, we
+% increment the counter, but there is another situation
+% which we have to take into account. What if the user just
+% loaded a single language with the |language| option? The
+% loop will run into trouble, that's why we only run the
+% loop if the value of the total number of languages is more
+% than one. We had saved it in a temporary counter.
+%
+% \begin{macrocode}
+ \ifnum\theudiss@tmp@langcnt=1\relax
+ \else
+ \addtocounter{udiss@langbabel}{1}%
+ \fi
+% \end{macrocode}
+%
+% Now the value of the counter is 2 which means the second
+% language. We need to again load the same settings for it,
+% but we can't keep doing this manually since 1) we are lazy
+% (the most important) 2) we have no idea how many languages
+% the user has loaded, so now we actually activate the
+% |\loop| that we had started with the |\repeat| command. It
+% runs all the commands seen after the |\loop| command (this
+% includes the one used for increasing the counter too) till
+% the value of the counter is less than the value of
+% |udiss@tmp@langcnt|. Remember we had already set it to the
+% value of the original counter (before setting it to 1)
+% \emph{minus one}. Now the next command will stop at one
+% number even lesser than it as we have used the |<|
+% relation while comparing. Also, here we will close the
+% if-conditional that checked if more than one languages
+% were used or not.
+%
+% \begin{macrocode}
+ \ifnum\theudiss@langbabel<\theudiss@tmp@langcnt
+ \relax
+ \repeat
+ \fi
+% \end{macrocode}
+%
+% Are you wondering why we did this? Because we want to set
+% the \emph{exact} last language as the |main| language! The
+% current value of our counter at this point has that
+% language. But remember we are out of the loop as well as
+% the if-conditional. Thus we have to again consider the
+% situation where user just passed one language. So far what
+% we have done is load all the languages except the last one
+% with |\babelprovide|. This includes the single-language
+% case. Thus we need no further processing in that case. So
+% we only parse the last pending language if the user had
+% passed multiple languages. We start an if-conditional and
+% keep its |if|-branch empty and write the rest in the
+% |else|-branch.
+%
+% \begin{macrocode}
+ \ifnum\theudiss@langbabel=1\relax
+% \end{macrocode}
+%
+% We again use |\babelprovide|, but this time with |main|
+% option. Load the last language successfully.
+%
+% \begin{macrocode}
+ \else
+ \ifLuaTeX
+ \babelprovide[%
+ main,%
+ import,%
+ onchar ={ids fonts}%
+ ]{%
+ \csname
+ udiss@langbabel@\alph{udiss@langbabel}%
+ \endcsname
+ }%
+ \else
+ \babelprovide[main,import]{%
+ \csname
+ udiss@langbabel@\alph{udiss@langbabel}%
+ \endcsname
+ }%
+ \fi
+ \fi
+% \end{macrocode}
+%
+% Now it's the time to load language support files. We need
+% to load all the language support files and here we don't
+% have the constraint to treat the last language specially.
+% Therefore we add 1 to the temporary counter (the one that
+% was decreased before).
+%
+% \begin{macrocode}
+ \setcounter{udiss@tmp@langcnt}{%
+ \numexpr\theudiss@langbabel + 1\relax
+ }%
+% \end{macrocode}
+%
+% We again start from the first language. If the support
+% file exists for that language, we |\input| it.
+%
+% \begin{macrocode}
+ \setcounter{udiss@langbabel}{1}%
+ \loop
+ \IfFileExists{%
+ udiss-fonts-\csname
+ udiss@langbabel@\alph{udiss@langbabel}%
+ \endcsname
+ }{%
+ \input{%
+ udiss-fonts-\csname
+ udiss@langbabel@\alph{udiss@langbabel}%
+ \endcsname
+ }%
+% \end{macrocode}
+%
+% Otherwise, we check if the warning option is true. By
+% default it is always true, but if the user has used
+% |nofontwarning| option to turn them off, this conditional
+% should do its job.
+%
+% \begin{macrocode}
+ }{%
+ \ifudiss@font@warning
+ \ClassWarningNoLine{udiss}{%
+ We don't support \csname
+ udiss@langbabel@\alph{udiss@langbabel}%
+ \endcsname\space yet.%
+ \MessageBreak
+ It requires a font-setup. You may add the fonts
+ directly\MessageBreak to your preamble using:%
+ \MessageBreak\MessageBreak
+ \space\space\string\babelfont[%
+ \csname
+ udiss@langbabel@\alph{udiss@langbabel}%
+ \endcsname
+ ]{rm}{main font}%
+ \MessageBreak
+ \space\space\string\babelfont[%
+ \csname
+ udiss@langbabel@\alph{udiss@langbabel}%
+ \endcsname
+ ]{sf}{sans font}%
+ \MessageBreak
+ \space\space\string\babelfont[%
+ \csname
+ udiss@langbabel@\alph{udiss@langbabel}%
+ \endcsname
+ ]{tt}{mono font}%
+ \MessageBreak\MessageBreak
+ Read more about this in the documentation of
+ `udiss' in a\MessageBreak section called
+ `multilingual typesetting'. Consider%
+ \MessageBreak contacting us with a support
+ request and let us know some\MessageBreak
+ suitable free (libre) fonts for this
+ language. If you\MessageBreak don't wish to see
+ this warning again, use the option%
+ \MessageBreak `nofontwarning' to suppress it%
+ }%
+ \fi
+ }%
+% \end{macrocode}
+%
+% Like before, we increment the counter and start the loop
+% till this is repeated for all the languages.
+%
+% \begin{macrocode}
+ \addtocounter{udiss@langbabel}{1}%
+ \ifnum\theudiss@langbabel<\theudiss@tmp@langcnt\relax
+ \repeat
+ \fi
+\fi
+% \end{macrocode}
+%
+% After all this processing, we load the Roman,
+% \texttt{Typewriter} and \textsf{Sans} fonts stored in the
+% variables set by \emph{key}s.
+%
+% \begin{macrocode}
+\babelfont{rm}[%
+ \ifudiss@ignorefontspec
+ IgnoreFontspecFile,%
+ \fi
+ \ifudiss@explicitext
+ Extension = {.\udiss@rmfntext},%
+ \fi
+ BoldFont = {\udiss@rmbffont},%
+ ItalicFont = {\udiss@rmitfont},%
+ BoldItalicFont = {\udiss@rmbfitfont},%
+ SlantedFont = {\udiss@rmslfont},%
+ BoldSlantedFont = {\udiss@rmbfslfont},%
+ \ifudiss@oldstylenum
+ Numbers = {OldStyle},%
+ \ifudiss@oldone
+ CharacterVariant = {6},%
+ \fi
+ \fi
+ \ifLuaTeX
+ Renderer = {HarfBuzz},%
+ \fi
+ \udiss@rmfeatures
+]{\udiss@rmfont}
+\babelfont{sf}[%
+ \ifudiss@ignorefontspec
+ IgnoreFontspecFile,%
+ \fi
+ \ifudiss@explicitext
+ Extension = {.\udiss@sffntext},%
+ \fi
+ BoldFont = {\udiss@sfbffont},%
+ ItalicFont = {\udiss@sfitfont},%
+ BoldItalicFont = {\udiss@sfbfitfont},%
+ SlantedFont = {\udiss@sfslfont},%
+ BoldSlantedFont = {\udiss@sfbfslfont},%
+ \ifudiss@oldstylenum
+ Numbers = {OldStyle},%
+ \ifudiss@oldone
+ CharacterVariant = {6},%
+ \fi
+ \fi
+ \ifLuaTeX
+ Renderer = {HarfBuzz},%
+ \fi
+ \udiss@sffeatures
+]{\udiss@sffont}
+\babelfont{tt}[%
+ \ifudiss@ignorefontspec
+ IgnoreFontspecFile,%
+ \fi
+ \ifudiss@explicitext
+ Extension = {.\udiss@ttfntext},%
+ \fi
+ BoldFont = {\udiss@ttbffont},%
+ ItalicFont = {\udiss@ttitfont},%
+ BoldItalicFont = {\udiss@ttbfitfont},%
+ SlantedFont = {\udiss@ttslfont},%
+ BoldSlantedFont = {\udiss@ttbfslfont},%
+ \ifLuaTeX
+ Renderer = {HarfBuzz},%
+ \fi
+ \udiss@ttfeatures
+]{\udiss@ttfont}
+% \end{macrocode}
+%
+% We load the \pkg{unicode-math} here for loading the math
+% fonts. After that, inside |\expanded|, we load the
+% |\setmathfont| command.
+%
+% \begin{macrocode}
+\RequirePackage{unicode-math}
+\expanded{%
+ \setmathfont[%
+ \ifudiss@ignorefontspec%
+ IgnoreFontspecFile,%
+ \fi%
+ \ifudiss@explicitext
+ Extension = {.\udiss@mathfntext},%
+ \fi
+ BoldFont = {\udiss@mathbffont},%
+ SlantedFont = {\udiss@mathfont},%
+ BoldSlantedFont = {\udiss@mathbffont},%
+ \udiss@mathfeatures%
+ ]{\udiss@mathfont}%
+}
+% \end{macrocode}
+%
+% Now we load a few last packages.
+%
+% \begin{macrocode}
+\RequirePackage{graphicx}
+\RequirePackage{xcolor}
+\RequirePackage{csquotes}
+% \end{macrocode}
+%
+% For Creative Commons license, we use the \pkg{doclicense}
+% package with appropriate settings.
+%
+% \begin{macrocode}
+\ifudiss@ccbysa
+ \RequirePackage[%
+ hyperxmp = {false},%
+ type = {CC},%
+ modifier = {by-sa},%
+ version = {4.0}%
+ ]{doclicense}
+\fi
+% \end{macrocode}
+%
+% We set the \cls{udiss}-specific-colours with the following
+% commands, but we set them conditionally. If the colours
+% are disabled, we set the same colours to |black| value.
+% \begin{macrocode}
+\ifudiss@colors
+ \colorlet{udisslink}{red!60!black}
+ \colorlet{udissurl}{blue!60!black}
+ \colorlet{udisscite}{green!60!black}
+\else
+ \colorlet{udisslink}{black}
+ \colorlet{udissurl}{black}
+ \colorlet{udisscite}{black}
+\fi
+% \end{macrocode}
+%
+% We start the hook |begindocument/before| and check if
+% author did not provide any of the \emph{strict} fields
+% and if they have done so, we generate errors.
+%
+% \begin{macrocode}
+\AddToHook{begindocument/before}{%
+ \ifdefined\udiss@title
+ \else
+ \def\udiss@title{\textbf{-NoValidTitle-}}%
+ \ClassError{udiss}{%
+ Title not given%
+ }{%
+ `title' is a compulsory field. Provide it in the
+ preamble like in the following:%
+ \MessageBreak
+ \MessageBreak
+ ----8<-----------------------8<----%
+ \MessageBreak\MessageBreak
+ \space\space\string\title{title-of-the-dissertation}%
+ \MessageBreak\MessageBreak
+ ----8<-----------------------8<----%
+ \MessageBreak
+ }%
+ \fi
+ \ifdefined\udiss@author
+ \else
+ \def\udiss@author{\textbf{-NoValidAuthor-}}%
+ \ClassError{udiss}{%
+ No author given in a normal (non-blind) document%
+ }{%
+ Do you want a blind document? If yes, then use the
+ package option `blind' like\MessageBreak in the
+ following:%
+ \MessageBreak
+ ----8<------------------8<----%
+ \MessageBreak\MessageBreak
+ \space\space\string\documentclass[blind]{udiss}%
+ \MessageBreak\MessageBreak
+ ----8<------------------8<----%
+ \MessageBreak
+ Otherwise, `author' is a compulsory field. Provide it
+ in the preamble like in\MessageBreak the following:%
+ \MessageBreak
+ ----8<-------------------------8<----%
+ \MessageBreak\MessageBreak
+ \space\space\string\author{author-name}%
+ \MessageBreak\MessageBreak
+ ----8<-------------------------8<----%
+ \MessageBreak
+ }%
+ \fi
+ \ifdefined\udiss@stream
+ \else
+ \def\udiss@stream{\textbf{-NoValidStream-}}%
+ \ClassError{udiss}{%
+ Stream not given%
+ }{%
+ `stream' is a compulsory field. Provide it in the
+ preamble like in the following:%
+ \MessageBreak
+ \MessageBreak
+ ----8<-----------------------8<----%
+ \MessageBreak\MessageBreak
+ \space\space\string\stream{stream-of-the-candidate}%
+ \MessageBreak\MessageBreak
+ ----8<-----------------------8<----%
+ \MessageBreak
+ }%
+ \fi
+ \ifdefined\udiss@discipline
+ \else
+ \def\udiss@discipline{\textbf{-NoValidDiscipline-}}%
+ \ClassError{udiss}{%
+ Discipline not given%
+ }{%
+ `discipline' is a compulsory field. Provide it in the
+ preamble like in the following:%
+ \MessageBreak
+ \MessageBreak
+ ----8<-----------------------8<----%
+ \MessageBreak\MessageBreak
+ \space\space\string\discipline%
+ {discipline-of-the-candidate}%
+ \MessageBreak\MessageBreak
+ ----8<-----------------------8<----%
+ \MessageBreak
+ }%
+ \fi
+ \ifdefined\udiss@degree
+ \else
+ \def\udiss@degree{\textbf{-NoValidDegree-}}%
+ \ClassError{udiss}{%
+ Degree not given%
+ }{%
+ `degree' is a compulsory field. Provide it in the
+ preamble like in the following:%
+ \MessageBreak
+ \MessageBreak
+ ----8<-----------------------8<----%
+ \MessageBreak\MessageBreak
+ \space\space\string\degree{degree-of-the-candidate}%
+ \MessageBreak\MessageBreak
+ ----8<-----------------------8<----%
+ \MessageBreak
+ }%
+ \fi
+ \ifdefined\udiss@supervisor
+ \else
+ \def\udiss@title{\textbf{-NoValidTitle-}}%
+ \ClassError{udiss}{%
+ No supervisor given in a normal (non-blind) document%
+ }{%
+ Do you want a blind document? If yes, then use the
+ package option `blind' like\MessageBreak in the
+ following:%
+ \MessageBreak
+ ----8<------------------8<----%
+ \MessageBreak\MessageBreak
+ \space\space\string\documentclass[blind]{udiss}%
+ \MessageBreak\MessageBreak
+ ----8<------------------8<----%
+ \MessageBreak
+ Otherwise, `supervisor' is a compulsory field. Provide
+ it in the preamble like\MessageBreak in the
+ following:%
+ \MessageBreak
+ ----8<-------------------------8<----%
+ \MessageBreak\MessageBreak
+ \space\space\string\supervisor{supervisor's-name}%
+ \MessageBreak\MessageBreak
+ ----8<-------------------------8<----%
+ \MessageBreak
+ }%
+ \fi
+ \ifdefined\udiss@university
+ \else
+ \def\udiss@university{\textbf{-NoValidUniversity-}}%
+ \ClassError{udiss}{%
+ No university given in a normal (non-blind) document%
+ }{%
+ Do you want a blind document? If yes, then use the
+ package option `blind' like\MessageBreak in the
+ following:%
+ \MessageBreak
+ ----8<------------------8<----%
+ \MessageBreak\MessageBreak
+ \space\space\string\documentclass[blind]{udiss}%
+ \MessageBreak\MessageBreak
+ ----8<------------------8<----%
+ \MessageBreak
+ Otherwise, `university' is a compulsory field. Provide
+ it in the preamble like\MessageBreak in the
+ following:%
+ \MessageBreak
+ ----8<-------------------------8<----%
+ \MessageBreak\MessageBreak
+ \space\space\string\university{university-name}%
+ \MessageBreak\MessageBreak
+ ----8<-------------------------8<----%
+ \MessageBreak
+ }%
+ \fi
+ \ifdefined\udiss@department
+ \else
+ \def\udiss@department{\textbf{-NoValidDepartment-}}%
+ \ClassError{udiss}{%
+ No department given in a normal (non-blind) document%
+ }{%
+ Do you want a blind document? If yes, then use the
+ package option `blind' like\MessageBreak in the
+ following:%
+ \MessageBreak
+ ----8<------------------8<----%
+ \MessageBreak\MessageBreak
+ \space\space\string\documentclass[blind]{udiss}%
+ \MessageBreak\MessageBreak
+ ----8<------------------8<----%
+ \MessageBreak
+ Otherwise, `department'\space is a compulsory field.
+ Provide it in the preamble like in\MessageBreak the
+ following:%
+ \MessageBreak
+ ----8<-------------------------8<----%
+ \MessageBreak\MessageBreak
+ \space\space\string\department{department-name}%
+ \MessageBreak\MessageBreak
+ ----8<-------------------------8<----%
+ \MessageBreak
+ }%
+ \fi
+% \end{macrocode}
+%
+% For printing, \pkg{hyperref} and \pkg{hyperxmp} are
+% irrelevant, so we load them only when the documents are
+% digital.
+%
+% \begin{macrocode}
+ \ifudiss@print
+ \else
+ \RequirePackage{hyperref}%
+ \RequirePackage{hyperxmp}%
+% \end{macrocode}
+%
+% We set the metadata here using |\hypersetup| command.
+%
+% \begin{macrocode}
+ \hypersetup{%
+ unicode,%
+ colorlinks,%
+ pdftitle = {\udiss@title}%
+ }%
+ \ifudiss@subtitle
+ \hypersetup{%
+ pdfsubject = {\udiss@subtitle}%
+ }%
+ \fi
+% \end{macrocode}
+%
+% We don't set author's name if the user has used the
+% |blind| option as it defeats the whole purpose. If it is
+% not used, we set the copyright information and the
+% license-url. All-rights-reserved doesn't have a specific
+% license-url, so it is used only if the user uses a free
+% culture license.
+%
+% \begin{macrocode}
+ \ifudiss@blind
+ \else
+ \hypersetup{%
+ pdfauthor = {\udiss@author},%
+ pdfcopyright = {%
+ \udiss@title\textLF
+ \udiss@local@copyright\
+ ©
+ \udiss@copyrightable@years\
+ \udiss@author\textLF
+ \udiss@license@notice
+ },%
+ }%
+ \ifudiss@free@culture
+ \hypersetup{%
+ pdflicenseurl = {%
+ \udiss@free@license@url
+ }%
+ }%
+ \fi
+ \fi
+% \end{macrocode}
+%
+% If the color option is not disabled, we load the color
+% variables with |\hypersetup|.
+%
+% \begin{macrocode}
+ \ifudiss@colors
+ \hypersetup{%
+ linkcolor = {\udiss@int@link@color},%
+ urlcolor = {\udiss@int@url@color},%
+ citecolor = {\udiss@int@cite@color}%
+ }%
+% \end{macrocode}
+%
+% Otherwise, we use the |hidelinks| option of \pkg{hyperref}
+% which creates links, but without colors.
+%
+% \begin{macrocode}
+ \else
+ \hypersetup{%
+ hidelinks%
+ }%
+ \fi
+ \fi
+}
+% \end{macrocode}
+%
+% Now, after setting everything, we typeset the front matter
+% including title-page, table of contents, optionally list
+% of figures/tables and declaration with the following code.
+%
+% \begin{macrocode}
+\AddToHook{begindocument/end}{%
+ \begingroup
+ \thispagestyle{titlingpage}%
+ \ifudiss@ftitle
+ \setlength{\fboxsep}{25pt}%
+ \noindent\fbox{%
+ \begin{minipage}%
+ [c][\dimexpr\textheight-2\fboxsep-2\fboxrule]%
+ [c]{\dimexpr\linewidth-2\fboxsep-2\fboxrule}%
+ \fi
+ \hspace{0pt}%
+ \vspace{3em}%
+ \begin{center}
+ \begingroup
+ \udiss@title@shape
+ \ifx\udiss@title@font\empty
+ \else
+ \fontspec[\udiss@title@fontfeats]%
+ {\udiss@title@font}%
+ \fi
+ \udiss@title@size
+ \color{\udiss@title@color}%
+ \udiss@title
+ \endgroup
+
+ \medskip
+
+ \ifudiss@subtitle
+ \begingroup
+ \udiss@subtitle@shape
+ \ifx\udiss@subtitle@font\empty
+ \else
+ \fontspec[\udiss@subtitle@fontfeats]%
+ {\udiss@subtitle@font}%
+ \fi
+ \udiss@subtitle@size
+ \color{\udiss@subtitle@color}%
+ \udiss@subtitle
+ \endgroup
+ \fi
+
+ \vfill
+
+ \ifudiss@blind
+ \else
+ \begingroup
+ \udiss@author@shape
+ \ifx\udiss@author@font\empty
+ \else
+ \fontspec[\udiss@author@fontfeats]%
+ {\udiss@author@font}%
+ \fi
+ \udiss@author@size
+ \color{\udiss@author@color}%
+ \udiss@author
+ \ifudiss@pronouns
+ \begingroup
+ \space
+ \addfontfeature{Scale={0.6}}%
+ \udiss@pronouns
+ \endgroup
+ \fi
+ \endgroup
+
+ \vspace{2em}%
+ \fi
+
+ \begingroup
+ \udiss@fulfilment@shape
+ \ifx\udiss@fulfilment@font\empty
+ \else
+ \fontspec[\udiss@fulfilment@fontfeats]%
+ {\udiss@fulfilment@font}%
+ \fi
+ \udiss@fulfilment@size
+ \color{\udiss@fulfilment@color}%
+ \udiss@fulfilment
+ \endgroup
+
+ \vfill
+
+ \begingroup
+ \udiss@uni@shape
+ \ifx\udiss@uni@font\empty
+ \else
+ \fontspec[\udiss@university@fontfeats]%
+ {\udiss@uni@font}%
+ \fi
+ \udiss@uni@size
+ \color{\udiss@uni@color}%
+ \udiss@university
+ \endgroup
+
+ \vspace{0.5em}%
+
+ \begingroup
+ \udiss@dept@shape
+ \ifx\udiss@dept@font\empty
+ \else
+ \fontspec[\udiss@dept@fontfeats]%
+ {\udiss@dept@font}%
+ \fi
+ \udiss@dept@size
+ \color{\udiss@dept@color}%
+ \udiss@department
+ \endgroup
+
+ \ifudiss@logo
+ \bigskip
+ \ifudiss@texlogo
+ \udiss@texlogo
+ \fi
+ \includegraphics[%
+ width = {%
+ \udiss@logo@width\linewidth
+ },%
+ height = {%
+ \udiss@logo@hght\textheight
+ }%
+ ]{%
+ \udiss@logo
+ }%
+ \fi
+ \end{center}
+ \ifudiss@ftitle
+ \end{minipage}%
+ }%
+ \fi
+
+ \newpage
+
+ \ifudiss@blind
+ \else
+ \ifudiss@free@culture
+ \thispagestyle{titlingpage}%
+ \vspace*{\stretch{1}}
+ \begin{quote}
+ \setlength{\parindent}{0pt}%
+ \begingroup
+ \begin{minipage}{\linewidth}
+ \bfseries
+ \udiss@title
+
+ \udiss@local@copyright\
+ ©
+ \udiss@copyrightable@years\
+ \udiss@author
+
+ \medskip
+ \noindent\hrule \linewidth 0.4pt\relax
+ \end{minipage}
+ \endgroup
+
+ \ifudiss@gfdl
+ Permission is granted to copy, distribute and/or
+ modify this document under the terms of the GNU
+ Free Documentation License, Version 1.3 or any
+ later version published by the Free Software
+ Foundation; with no Invariant Sections, no
+ Front-Cover Texts, and no Back-Cover Texts. A copy
+ of the license is included in the section entitled
+ \enquote{GNU Free Documentation License}.%
+ \fi
+ \ifudiss@ccbysa
+ \begin{minipage}{\linewidth}
+ \doclicenseThis
+ \end{minipage}
+ \fi
+ \vspace{\stretch{3}}
+ \end{quote}
+ \newpage
+ \fi
+ \fi
+
+ \tableofcontents*
+
+ \newpage
+
+ \ifudiss@blind
+ \else
+ \ifudiss@declaration
+ \thispagestyle{empty}%
+ \begin{center}%
+ {%
+ \LARGE\bfseries
+ \udiss@decllocal
+ }%
+ \end{center}%
+
+ \udiss@declaration
+ \fi
+ \fi
+
+ \newpage
+
+ \ifudiss@lot
+ \listoftables
+ \fi
+
+ \newpage
+
+ \ifudiss@lof
+ \listoffigures
+ \fi
+ \endgroup
+}%
+% \end{macrocode}
+%
+% The following code adds the GFDL v1.3+ notice at the end
+% of the document if that option was used.
+%
+% \begin{macrocode}
+\ifudiss@blind
+\else
+ \ifudiss@gfdl
+ \AddToHook{enddocument}{%
+ \newpage
+ \begingroup
+ \pagestyle{plain}%
+ \addcontentsline{toc}%
+ {chapter}%
+ {GNU Free Documentation License}%
+ \input{gfdl-tex-1p3}%
+ \clearpage
+ \endgroup
+ }%
+ \fi
+\fi
+%</class>
+% \end{macrocode}
+%
+% Our class ended here. Now we start creating the
+% language-support files. The first is the Malayalam
+% language. We use fonts provided at:
+% \url{https://ctan.org/pkg/rit-fonts}. Notice that this is
+% done conditionally. If the language is loaded as the main
+% language, the fonts are set as the default fonts using
+% class options, else |malayalam| is passed as the optional
+% argument to |\babelfont|.
+%
+% \begin{macrocode}
+%<*babel-ml>
+\IfLanguageName{malayalam}{%
+ \ekvset{udiss}{%
+ rmfont = {RIT-Rachana-Regular.ttf},%
+ rmitfont = {RIT-Rachana-Italic.ttf},%
+ rmbffont = {RIT-Rachana-Bold.ttf},%
+ rmbfitfont = {RIT-Rachana-BoldItalic.ttf},%
+ rmfeatures = {%
+ Script = {Malayalam}%
+ },%
+ sffont = {RIT-MeeraNew.ttf},%
+ sfitfont = {RIT-MeeraNew.ttf},%
+ sfbffont = {RIT-tnjoy-bold.ttf},%
+ sfbfitfont = {RIT-tnjoy-bold.ttf},%
+ sffeatures = {%
+ Script = {Malayalam}%
+ },%
+ ttfont = {RIT-MeeraNew.ttf},%
+ ttitfont = {RIT-MeeraNew.ttf},%
+ ttbffont = {RIT-tnjoy-bold.ttf},%
+ ttbfitfont = {RIT-tnjoy-bold.ttf},%
+ sffeatures = {%
+ Script = {Malayalam}%
+ }%
+ }%
+}{%
+ \babelfont[malayalam]{rm}[%
+ IgnoreFontspecFile,%
+ Script = {Malayalam},%
+ ItalicFont = {RIT-Rachana-Italic.ttf},%
+ BoldFont = {RIT-Rachana-Bold.ttf},%
+ BoldItalicFont = {RIT-Rachana-BoldItalic.ttf},%
+ \ifLuaTeX
+ Renderer = {HarfBuzz}%
+ \fi
+ ]{RIT-Rachana-Regular.ttf}
+ \babelfont[malayalam]{sf}[%
+ IgnoreFontspecFile,%
+ Script = {Malayalam},%
+ ItalicFont = {RIT-tnjoy-regular.ttf},%
+ BoldFont = {RIT-tnjoy-bold.ttf},%
+ BoldItalicFont = {RIT-tnjoy-bold.ttf},%
+ \ifLuaTeX
+ Renderer = {HarfBuzz}%
+ \fi
+ ]{RIT-tnjoy-regular.ttf}
+ \babelfont[malayalam]{tt}[%
+ IgnoreFontspecFile,%
+ Script = {Malayalam},%
+ ItalicFont = {RIT-tnjoy-regular.ttf},%
+ BoldFont = {RIT-tnjoy-bold.ttf},%
+ BoldItalicFont = {RIT-tnjoy-bold.ttf},%
+ \ifLuaTeX
+ Renderer = {HarfBuzz}%
+ \fi
+ ]{RIT-tnjoy-regular.ttf}%
+}
+%</babel-ml>
+% \end{macrocode}
+%
+% Marathi requires local numerals and local counters. We
+% provide that here and set Mukta as the default font
+% provided in: \url{https://ctan.org/pkg/EkType-Tanka}.
+%
+% \begin{macrocode}
+%<*babel-mr>
+\babelprovide[%
+ mapdigits,%
+ counters/स्वर = अ आ इ ई उ ऊ ए ऐ ओ औ अं अः ॲ ऋ ऌ ऑ,%
+ counters/अंक = एक दोन तीन चार पाच सहा सात आठ नऊ दहा अकरा
+ बारा तेरा चौदा पंधरा सोळा सतरा अठरा एकोणीस वीस एकवीस बावीस
+ तेवीस चोवीस पंचवीस सव्वीस सत्तावीस अठ्ठावीस एकोणतीस तीस एकतीस
+ बत्तीस तेहतीस चौतीस पस्तीस छत्तीस सदतीस अडतीस एकोणचाळीस चाळीस
+ एकेचाळीस बेचाळीस त्रेचाळीस चव्वेचाळीस पंचेचाळीस शेहेचाळीस सत्तेचाळीस
+ अठ्ठेचाळीस एकोणपन्नास पन्नास एकावन्न बावन्न त्रेपन्न चौपन्न पंचावन्न
+ छप्पन्न सत्तावन्न अठ्ठावन्न एकोणसाठ साठ एकसष्ट बासष्ट त्रेसष्ट चौसष्ट
+ पासष्ट सहासष्ट सदुष्ट अडुसष्ट एकोणसत्तर सत्तर एकाहत्तर बाहत्तर
+ त्र्याहत्तर चौऱ्याहत्तर पंचाहत्तर शाहत्तर सत्त्याहत्तर अठ्ठ्याहत्तर
+ एकोणऐंशी ऐंशी एक्याऐंशी ब्याऐंशी त्र्याऐंशी चौऱ्याऐंशी पंच्याऐंशी श्याऐंशी
+ सत्त्याऐंशी अठ्ठ्याऐंशी एकोणनव्वद नव्वद एक्याण्णव ब्याण्णव त्र्याण्णव
+ चौऱ्याण्णव पंचाण्णव शहाण्णव सत्त्याण्णव अठ्याण्णव नव्याण्णव शंभर,%
+ counters/व्यंजन = क ख ग घ ङ%
+ च छ ज झ ञ%
+ ट ठ ड ढ ण%
+ त थ द ध न%
+ प फ ब भ म%
+ य र ल व श ष स ह ळ,%
+ Alph = अंक,%
+ alph = स्वर%
+]{marathi}
+\def\theenumiii{\localecounter{व्यंजन}{enumiii}}
+\def\theenumiv{\localecounter{अंक}{enumiii}}
+\IfLanguageName{marathi}{%
+ \ekvset{udiss}{%
+ rmfont = {Mukta-Regular.ttf},%
+ rmitfont = {Mukta-Regular.ttf},%
+ rmbffont = {Mukta-Bold.ttf},%
+ rmbfitfont = {Mukta-Bold.ttf},%
+ rmfeatures = {%
+ Script = {Devanagari}%
+ },%
+ sffont = {Mukta-Regular.ttf},%
+ sfitfont = {Mukta-Regular.ttf},%
+ sfbffont = {Mukta-Bold.ttf},%
+ sfbfitfont = {Mukta-Bold.ttf},%
+ sffeatures = {%
+ Script = {Devanagari}%
+ },%
+ ttfont = {Mukta-Regular.ttf},%
+ ttitfont = {Mukta-Regular.ttf},%
+ ttbffont = {Mukta-Bold.ttf},%
+ ttbfitfont = {Mukta-Bold.ttf},%
+ sffeatures = {%
+ Script = {Devanagari}%
+ }%
+ }%
+}{%
+ \babelfont[marathi]{rm}[%
+ IgnoreFontspecFile,%
+ ItalicFont = {Mukta-Regular.ttf},%
+ BoldFont = {Mukta-Bold.ttf},%
+ BoldItalicFont = {Mukta-Bold.ttf},%
+ Language = {Marathi},%
+ Script = {Devanagari},%
+ Numbers = {OldStyle},%
+ \ifLuaTeX
+ Renderer = {HarfBuzz}%
+ \fi
+ ]{Mukta-Regular.ttf}
+ \babelfont[marathi]{sf}[%
+ IgnoreFontspecFile,%
+ ItalicFont = {Mukta-Regular.ttf},%
+ BoldFont = {Mukta-Bold.ttf},%
+ BoldItalicFont = {Mukta-Bold.ttf},%
+ Language = {Marathi},%
+ Script = {Devanagari},%
+ Numbers = {OldStyle},%
+ \ifLuaTeX
+ Renderer = {HarfBuzz}%
+ \fi
+ ]{Mukta-Regular.ttf}
+ \babelfont[marathi]{tt}[%
+ IgnoreFontspecFile,%
+ ItalicFont = {Mukta-Regular.ttf},%
+ BoldFont = {Mukta-Bold.ttf},%
+ BoldItalicFont = {Mukta-Bold.ttf},%
+ Language = {Marathi},%
+ Script = {Devanagari},%
+ Numbers = {OldStyle},%
+ \ifLuaTeX
+ Renderer = {HarfBuzz}%
+ \fi
+ ]{Mukta-Regular.ttf}%
+}
+%</babel-mr>
+% \end{macrocode}
+%
+% \begin{macrocode}
+%<*babel-en>
+\babelfont[english]{rm}[%
+ IgnoreFontspecFile,%
+ Extension = {.otf},%
+ ItalicFont = {NewCM10-BookItalic},%
+ BoldFont = {NewCM10-Bold},%
+ BoldItalicFont = {NewCM10-BoldItalic},%
+ SlantedFont = {NewCM10-Book},%
+ BoldSlantedFont = {NewCM10-Bold},%
+ Numbers = {OldStyle},%
+ CharacterVariant = {6},%
+ \ifLuaTeX
+ Renderer = {HarfBuzz}%
+ \fi
+]{NewCM10-Book}
+\babelfont[english]{sf}[%
+ IgnoreFontspecFile,%
+ Extension = {.otf},%
+ ItalicFont = {NewCMSans10-BookOblique},%
+ BoldFont = {NewCMSans10-Bold},%
+ BoldItalicFont = {NewCMSans10-BoldOblique},%
+ SlantedFont = {NewCMSans10-Book},%
+ BoldSlantedFont = {NewCMSans10-Bold},%
+ Numbers = {OldStyle},%
+ CharacterVariant = {6},%
+ \ifLuaTeX
+ Renderer = {HarfBuzz}%
+ \fi
+]{NewCMSans10-Book}
+\babelfont[english]{tt}[%
+ IgnoreFontspecFile,%
+ Extension = {.otf},%
+ BoldFont = {NewCMMono10-Bold},%
+ ItalicFont = {NewCMMono10-Italic},%
+ \ifLuaTeX
+ Renderer = {HarfBuzz}%
+ \fi
+]{NewCMMono10-Book}
+%</babel-en>
+% \end{macrocode}
+%
+% Hindi and Marathi share the script, but the language
+% variants Marathi needs are not required by Hindi. So we
+% use the same font, but with a little different settings
+% for Hindi.
+%
+% \begin{macrocode}
+%<*babel-hi>
+\IfLanguageName{hindi}{%
+ \ekvset{udiss}{%
+ rmfont = {Mukta-Regular.ttf},%
+ rmitfont = {Mukta-Regular.ttf},%
+ rmbffont = {Mukta-Bold.ttf},%
+ rmbfitfont = {Mukta-Bold.ttf},%
+ rmfeatures = {%
+ Script = {Devanagari}%
+ },%
+ sffont = {Mukta-Regular.ttf},%
+ sfitfont = {Mukta-Regular.ttf},%
+ sfbffont = {Mukta-Bold.ttf},%
+ sfbfitfont = {Mukta-Bold.ttf},%
+ sffeatures = {%
+ Script = {Devanagari}%
+ },%
+ ttfont = {Mukta-Regular.ttf},%
+ ttitfont = {Mukta-Regular.ttf},%
+ ttbffont = {Mukta-Bold.ttf},%
+ ttbfitfont = {Mukta-Bold.ttf},%
+ sffeatures = {%
+ Script = {Devanagari}%
+ }%
+ }%
+}{%
+ \babelfont[hindi]{rm}[%
+ IgnoreFontspecFile,%
+ ItalicFont = {Mukta-Regular.ttf},%
+ BoldFont = {Mukta-Bold.ttf},%
+ BoldItalicFont = {Mukta-Bold.ttf},%
+ Language = {Hindi},%
+ Script = {Devanagari},%
+ Numbers = {OldStyle},%
+ \ifLuaTeX
+ Renderer = {HarfBuzz}%
+ \fi
+ ]{Mukta-Regular.ttf}
+ \babelfont[hindi]{sf}[%
+ IgnoreFontspecFile,%
+ ItalicFont = {Mukta-Regular.ttf},%
+ BoldFont = {Mukta-Bold.ttf},%
+ BoldItalicFont = {Mukta-Bold.ttf},%
+ Language = {Hindi},%
+ Script = {Devanagari},%
+ Numbers = {OldStyle},%
+ \ifLuaTeX
+ Renderer = {HarfBuzz}%
+ \fi
+ ]{Mukta-Regular.ttf}
+ \babelfont[hindi]{tt}[%
+ IgnoreFontspecFile,%
+ ItalicFont = {Mukta-Regular.ttf},%
+ BoldFont = {Mukta-Bold.ttf},%
+ BoldItalicFont = {Mukta-Bold.ttf},%
+ Language = {Hindi},%
+ Script = {Devanagari},%
+ Numbers = {OldStyle},%
+ \ifLuaTeX
+ Renderer = {HarfBuzz}%
+ \fi
+ ]{Mukta-Regular.ttf}
+}
+%</babel-hi>
+% \end{macrocode}
+%
+% In this tag, we set three main variables for the |ukerala|
+% dissertation-style. This is just a sample. These style
+% files can contain much more than this. In the experimental
+% release, we start with a small sample. We will be
+% expanding this more.
+%
+% \begin{macrocode}
+%<*ukerala>
+\ekvset{udiss}{%
+ university = {University of Kerala},%
+ logo = {udiss-logo-ukerala.png},%
+ logoheight = {0.11}%
+}
+%</ukerala>
+% \end{macrocode}
+% \end{implementation}
+% \PrintIndex
+% \Finale
diff --git a/Master/texmf-dist/source/latex/udiss/udiss.ins b/Master/texmf-dist/source/latex/udiss/udiss.ins
new file mode 100644
index 00000000000..3a3023dbb14
--- /dev/null
+++ b/Master/texmf-dist/source/latex/udiss/udiss.ins
@@ -0,0 +1,75 @@
+% File: udiss.ins
+\input l3docstrip.tex
+
+\keepsilent
+\askforoverwritefalse
+
+\preamble
+---------------------------------------------------------
+Bundle: udiss
+Version: v0.1 (October 1, 2024)
+Author: Indian TeX Users Group
+Description: A LaTeX bundle for typesetting dissertations
+Bugs: puszcza.gnu.org.ua/bugs/?group=udiss
+Licenses: GPLv3+, GFDLv1.3+
+---------------------------------------------------------
+
+The LaTeX bundle udiss v0.1
+Copyright © 2024 Indian TeX Users Group
+
+This program is free software: you can redistribute it
+and/or modify it under the terms of the GNU General
+Public License as published by the Free Software
+Foundation, either version 3 of the License, or (at your
+option) any later version.
+
+This program is distributed in the hope that it will be
+useful, but WITHOUT ANY WARRANTY; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A
+PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public
+License along with this program. If not, see
+<https://www.gnu.org/licenses/>.
+---------------------------------------------------------
+\endpreamble
+\usedir{tex/latex/\jobname}
+\generate{%
+ \file{\jobname.cls}{\from{\jobname.dtx}{class}}%
+}
+% ----------------------------------------------------------
+% BEGIN GENERATING UDISS BABEL FILES
+\generate{%
+ \file{\jobname-fonts-malayalam.tex}{%
+ \from{\jobname.dtx}{babel-ml}%
+ }%
+}
+\generate{%
+ \file{\jobname-fonts-marathi.tex}{%
+ \from{\jobname.dtx}{babel-mr}%
+ }%
+}
+\generate{%
+ \file{\jobname-fonts-english.tex}{%
+ \from{\jobname.dtx}{babel-en}%
+ }%
+}
+\generate{%
+ \file{\jobname-fonts-hindi.tex}{%
+ \from{\jobname.dtx}{babel-hi}%
+ }%
+}
+\generate{%
+ \file{\jobname-style-ukerala.tex}{%
+ \from{\jobname.dtx}{ukerala}%
+ }%
+}
+% END GENERATING UDISS BABEL FILES
+% ----------------------------------------------------------
+\nopreamble\nopostamble
+\usedir{doc/latex/\jobname}
+\generate{%
+ \file{README.txt}{\from{\jobname.dtx}{readme}}%
+}
+\endbatchfile
diff --git a/Master/texmf-dist/tex/latex/udiss/udiss.cls b/Master/texmf-dist/tex/latex/udiss/udiss.cls
new file mode 100644
index 00000000000..52567f5923c
--- /dev/null
+++ b/Master/texmf-dist/tex/latex/udiss/udiss.cls
@@ -0,0 +1,1868 @@
+%%
+%% This is file `udiss.cls',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% udiss.dtx (with options: `class')
+%% ---------------------------------------------------------
+%% Bundle: udiss
+%% Version: v0.1 (October 1, 2024)
+%% Author: Indian TeX Users Group
+%% Description: A LaTeX bundle for typesetting dissertations
+%% Bugs: puszcza.gnu.org.ua/bugs/?group=udiss
+%% Licenses: GPLv3+, GFDLv1.3+
+%% ---------------------------------------------------------
+%%
+%% The LaTeX bundle udiss v0.1
+%% Copyright © 2024 Indian TeX Users Group
+%%
+%% This program is free software: you can redistribute it
+%% and/or modify it under the terms of the GNU General
+%% Public License as published by the Free Software
+%% Foundation, either version 3 of the License, or (at your
+%% option) any later version.
+%%
+%% This program is distributed in the hope that it will be
+%% useful, but WITHOUT ANY WARRANTY; without even the
+%% implied warranty of MERCHANTABILITY or FITNESS FOR A
+%% PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public
+%% License along with this program. If not, see
+%% <https://www.gnu.org/licenses/>.
+%% ---------------------------------------------------------
+\ProvidesClass{udiss}[2024/10/01 v0.1
+ A LaTeX bundle for typesetting dissertations (TUGIndia)]
+\RequirePackage{expkv-def,expkv-opt}
+\newif\ifudiss@pronouns
+\newif\ifudiss@blind
+\NewDocumentCommand{ \pronouns }{ m }{%
+ \ifudiss@blind
+ \else
+ \def\udiss@pronouns{#1}%
+ \fi
+}
+\ekvdefinekeys{udiss}{%
+ code pronouns = {%
+ \ifudiss@blind
+ \else
+ \def\udiss@pronouns{(#1)}%
+ \fi
+ \udiss@pronounstrue
+ }%
+}
+\newif\ifudiss@title
+\def\udiss@blank@title@err{%
+ \ClassError{udiss}{%
+ The `title' field cannot be blank%
+ }{%
+ You have provided an empty argument to the `title'
+ field. This is not\MessageBreak permitted by the class.%
+ }%
+}
+\def\udiss@blank@author@err{%
+ \ClassError{udiss}{%
+ The `author' field cannot be blank%
+ }{%
+ You have provided an empty argument to the `author'
+ field. This is not\MessageBreak permitted by the class.%
+ }%
+}
+\ekvdefinekeys{udiss}{%
+ code title = {%
+ \def\udiss@tmp@title{#1}%
+ \ifx\udiss@tmp@title\empty
+ \def\udiss@title{-NoValidTitle-}%
+ \udiss@blank@title@err
+ \else
+ \def\udiss@title{#1}%
+ \fi
+ },%
+ code author = {%
+ \def\udiss@tmp@author{#1}%
+ \ifx\udiss@tmp@author\empty
+ \def\udiss@author{-NoValidAuthor-}%
+ \udiss@blank@author@err
+ \else
+ \def\udiss@author{#1}%
+ \fi
+ }%
+}
+\newif\ifudiss@subtitle
+\newif\ifudiss@shorttitle
+\ekvdefinekeys{udiss}{%
+ code subtitle = {%
+ \IfBlankTF{#1}{%
+ \def\udiss@subtitle{-NoValidSubtitle-}%
+ \udiss@subtitletrue
+ }{%
+ \def\udiss@subtitle{#1}%
+ \udiss@subtitletrue
+ }%
+ },%
+ code shorttitle = {%
+ \IfBlankTF{#1}{%
+ \def\udiss@shorttitle{-NoValidSubtitle-}%
+ \udiss@shorttitletrue
+ }{%
+ \def\udiss@shorttitle{#1}%
+ \udiss@shorttitletrue
+ }%
+ }%
+}
+\NewDocumentCommand{ \subtitle }{ m }{%
+ \def\udiss@subtitle{#1}%
+ \udiss@subtitletrue
+}
+\NewDocumentCommand{ \shorttitle }{ m }{%
+ \def\udiss@shorttitle{#1}%
+ \udiss@shorttitletrue
+}
+\newif\ifudiss@stream
+\def\udiss@blank@stream@err{%
+ \ClassError{udiss}{%
+ The `stream' field cannot be blank%
+ }{%
+ You have provided an empty argument to the `stream'
+ field. This is not\MessageBreak permitted by the class.%
+ }%
+}
+\newif\ifudiss@discipline
+\def\udiss@blank@discipline@err{%
+ \ClassError{udiss}{%
+ The `discipline' field cannot be blank%
+ }{%
+ You have provided an empty argument to the `discipline'
+ field. This is not\MessageBreak permitted by the class.%
+ }%
+}
+\newif\ifudiss@degree
+\def\udiss@blank@degree@err{%
+ \ClassError{udiss}{%
+ The `degree' field cannot be blank%
+ }{%
+ You have provided an empty argument to the `degree'
+ field. This is not\MessageBreak permitted by the class.%
+ }%
+}
+\ekvdefinekeys{udiss}{%
+ code stream = {%
+ \def\udiss@tmp@stream{#1}%
+ \ifx\udiss@tmp@stream\empty
+ \def\udiss@stream{-NoValidStream-}%
+ \udiss@blank@stream@err
+ \else
+ \def\udiss@stream{#1}%
+ \fi
+ },%
+ code discipline = {%
+ \def\udiss@tmp@discipline{#1}%
+ \ifx\udiss@tmp@discipline\empty
+ \def\udiss@discipline{-NoValidDiscipline-}%
+ \udiss@blank@discipline@err
+ \else
+ \def\udiss@discipline{#1}%
+ \fi
+ },%
+ code degree = {%
+ \def\udiss@tmp@degree{#1}%
+ \ifx\udiss@tmp@degree\empty
+ \def\udiss@degree{-NoValidDegree-}%
+ \udiss@blank@degree@err
+ \else
+ \def\udiss@degree{#1}%
+ \fi
+ }%
+}
+\NewDocumentCommand{ \stream }{ m }{%
+ \IfBlankTF{#1}{%
+ \udiss@blank@stream@err
+ \def\udiss@stream{-NoValidStream-}%
+ }{%
+ \def\udiss@stream{#1}%
+ }%
+ \IfBlankTF{#1}{%
+ \udiss@streamtrue
+ }{%
+ \def\udiss@stream{#1}%
+ \udiss@streamtrue
+ }%
+}
+\NewDocumentCommand{ \discipline }{ m }{%
+ \IfBlankTF{#1}{%
+ \udiss@blank@discipline@err
+ \def\udiss@discipline{-NoValidDiscipline-}%
+ }{%
+ \def\udiss@discipline{#1}%
+ }%
+ \IfBlankTF{#1}{%
+ \udiss@disciplinetrue
+ }{%
+ \def\udiss@discipline{#1}%
+ \udiss@disciplinetrue
+ }%
+}
+\NewDocumentCommand{ \degree }{ m }{%
+ \IfBlankTF{#1}{%
+ \udiss@blank@degree@err
+ \def\udiss@degree{-NoValidDegree-}%
+ }{%
+ \def\udiss@degree{#1}%
+ }%
+ \IfBlankTF{#1}{%
+ \udiss@degreetrue
+ }{%
+ \def\udiss@degree{#1}%
+ \udiss@degreetrue
+ }%
+}
+\newif\ifudiss@supervisor
+\newif\ifudiss@university
+\newif\ifudiss@department
+\def\udiss@blank@supervisor@err{%
+ \ClassError{udiss}{%
+ The `supervisor' field cannot be blank%
+ }{%
+ You have provided an empty argument to the `supervisor'
+ field. This is not\MessageBreak permitted by the class.%
+ }%
+}
+\def\udiss@blank@university@err{%
+ \ClassError{udiss}{%
+ The `university' field cannot be blank%
+ }{%
+ You have provided an empty argument to the `university'
+ field. This is not\MessageBreak permitted by the class.%
+ }%
+}
+\def\udiss@blank@department@err{%
+ \ClassError{udiss}{%
+ The `department' field cannot be blank%
+ }{%
+ You have provided an empty argument to the `department'
+ field. This is not\MessageBreak permitted by the class.%
+ }%
+}
+\ekvdefinekeys{udiss}{%
+ code supervisor = {%
+ \def\udiss@tmp@supervisor{#1}%
+ \ifx\udiss@tmp@supervisor\empty
+ \def\udiss@supervisor{-NoValidSupervisor-}%
+ \udiss@blank@supervisor@err
+ \else
+ \def\udiss@supervisor{#1}%
+ \fi
+ },%
+ code university = {%
+ \def\udiss@tmp@university{#1}%
+ \ifx\udiss@tmp@university\empty
+ \def\udiss@university{-NoValidUniversity-}%
+ \udiss@blank@university@err
+ \else
+ \def\udiss@university{#1}%
+ \fi
+ },%
+ code department = {%
+ \def\udiss@tmp@department{#1}%
+ \ifx\udiss@tmp@department\empty
+ \def\udiss@department{-NoValidDepartment-}%
+ \udiss@blank@department@err
+ \else
+ \def\udiss@department{#1}%
+ \fi
+ }%
+}
+\NewDocumentCommand{ \supervisor }{ m }{%
+ \IfBlankTF{#1}{%
+ \udiss@blank@supervisor@err
+ \def\udiss@supervisor{-NoValidSupervisor-}%
+ }{%
+ \def\udiss@supervisor{#1}%
+ }%
+ \IfBlankTF{#1}{%
+ \udiss@supervisortrue
+ }{%
+ \def\udiss@supervisor{#1}%
+ \udiss@supervisortrue
+ }%
+}
+\NewDocumentCommand{ \university }{ m }{%
+ \IfBlankTF{#1}{%
+ \udiss@blank@university@err
+ \def\udiss@author{-NoValidUniversity-}%
+ }{%
+ \def\udiss@university{#1}%
+ }%
+ \IfBlankTF{#1}{%
+ \udiss@universitytrue
+ }{%
+ \def\udiss@university{#1}%
+ \udiss@universitytrue
+ }%
+}
+\NewDocumentCommand{ \department }{ m }{%
+ \IfBlankTF{#1}{%
+ \udiss@blank@department@err
+ \def\udiss@author{-NoValidDepartment-}%
+ }{%
+ \def\udiss@department{#1}%
+ }%
+ \IfBlankTF{#1}{%
+ \udiss@departmenttrue
+ }{%
+ \def\udiss@department{#1}%
+ \udiss@departmenttrue
+ }%
+}
+\newif\ifudiss@logo
+\newif\ifudiss@texlogo
+\NewDocumentCommand{ \logo }{ s +m }{%
+ \IfBooleanTF{#1}{%
+ \def\udiss@texlogo{#2}%
+ \udiss@texlogotrue
+ }{%
+ \def\udiss@logo{#2}%
+ }%
+ \udiss@logotrue
+}
+\ekvdefinekeys{udiss}{%
+ code logo = {%
+ \def\udiss@logo{#1}%
+ \udiss@logotrue
+ },%
+ code logo* = {%
+ \def\udiss@texlogo{#1}%
+ \udiss@logotrue
+ \udiss@texlogotrue
+ }%
+}
+\newcounter{udiss@langbabel}
+\stepcounter{udiss@langbabel}
+\def\udiss@int@langbabel#1{%
+ \expandafter\edef
+ \csname
+ udiss@langbabel@\alph{udiss@langbabel}%
+ \endcsname{#1}%
+ \stepcounter{udiss@langbabel}%
+}
+\NewDocumentCommand\udiss@lgbbl{ >{ \SplitList{,} } m }{%
+ \ProcessList{#1}{\udiss@int@langbabel}%
+}
+\newif\ifudiss@lg@used
+\newif\ifudiss@ldfbabel
+\ekvdefinekeys{udiss}{%
+ code language = {%
+ \udiss@lgbbl{#1}%
+ \udiss@lg@usedtrue
+ },%
+ code ldfbabel = {%
+ \def\udiss@ldfbabel@list{#1}%
+ \udiss@lg@usedtrue
+ \udiss@ldfbabeltrue
+ },%
+ invbool nofontwarning = {\ifudiss@font@warning}%
+}
+\newif\ifudiss@free@culture
+\newif\ifudiss@ccbysa
+\newif\ifudiss@gfdl
+\ekvdefinekeys{udiss}{%
+ choice license = {%
+ all-rights-reserved = {%
+ \def\udiss@license@notice{%
+ All rights reserved.\textLF
+ }%
+ },%
+ CC-BY-SA = {%
+ \def\udiss@license@notice{%
+ This work is available under the "Creative Commons
+ Attribution ShareAlike 4.0 International" license.%
+ }%
+ \def\udiss@free@license@url{%
+ https://creativecommons.org/licenses/%
+ by-sa/4.0/legalcode.txt%
+ }%
+ \udiss@free@culturetrue
+ \udiss@ccbysatrue
+ },%
+ GFDL = {%
+ \def\udiss@license@notice{%
+ Permission is granted to copy, distribute and/or
+ modify this document under the terms of the GNU Free
+ Documentation License, Version 1.3 or any later
+ version published by the Free Software Foundation;
+ with no Invariant Sections, no Front-Cover Texts,
+ and no Back-Cover Texts. A copy of the license is
+ included in the section entitled “GNU Free
+ Documentation License”.%
+ }%
+ \def\udiss@free@license@url{%
+ https://www.gnu.org/licenses/fdl-1.3.txt%
+ }%
+ \udiss@free@culturetrue
+ \udiss@gfdltrue
+ },%
+ },%
+ initial license = {all-rights-reserved},%
+ store copyright-yrs = {\udiss@copyrightable@years},%
+ initial copyright-yrs = {\the\year},%
+ store localcopyright = {\udiss@local@copyright},%
+ initial localcopyright = {Copyright},%
+ nmeta placeholders = {%
+ title = {%
+ A groundbreaking dissertation%
+ },%
+ author = {%
+ Jane Doe%
+ },%
+ pronouns = {She/her},%
+ subtitle = {%
+ A milestone study on a longstanding question
+ in a discipline%
+ },%
+ shorttitle = {A Milestone study},%
+ stream = {intriguing stream},%
+ discipline = {rigorous discipline},
+ degree = {enriching degree},%
+ supervisor = {A kind supervisor},%
+ university = {An ideal university},%
+ department = {A homely department},%
+ license = {CC-BY-SA},%
+ copyright-yrs = {2022, 2023, 2024}%
+ }%
+}
+\ekvdefinekeys{udiss}{%
+ bool lot = {\ifudiss@lot},%
+ bool lof = {\ifudiss@lof},%
+ bool declaration = {\ifudiss@declaration},%
+ long
+ store declarationtxt = {\udiss@declaration},%
+ initial declarationtxt = {%
+ \noindent As required by the university regulations, I
+ wish to state that the work embodied in this thesis
+ titled \enquote{\udiss@title: \udiss@subtitle} forms
+ my own contribution to the research work carried out
+ under the guidance of \udiss@supervisor\ at the
+ \udiss@university, \udiss@department.
+
+ This work has not been submitted for any other degree
+ of this or any other university. Whenever references
+ have been made to previous works of others, it has
+ been clearly indicated as such and included in the
+ bibliography.
+
+ \bigskip
+ \flushright{%
+ Date: \today
+
+ \vspace{4em}%
+
+ Name: \udiss@author
+ }%
+
+ \bigskip\bigskip
+ \flushleft{%
+ Certified by:%
+
+ \vspace{4em}%
+
+ \udiss@supervisor
+ }%
+ },%
+ store decllocal = {\udiss@decllocal},%
+ initial decllocal = {Declaration}%
+}
+\ekvdefinekeys{udiss}{%
+ bool print = {\ifudiss@print},%
+ invbool norefcolors = {\ifudiss@colors},%
+ store udisslinkclr = {\udiss@int@link@color},%
+ initial udisslinkclr = {udisslink},%
+ store udissurlclr = {\udiss@int@url@color},%
+ initial udissurlclr = {udissurl},%
+ store udissciteclr = {\udiss@int@cite@color},%
+ initial udissciteclr = {udisscite}%
+}
+\ekvdefinekeys{udiss}{%
+ bool blind = {\ifudiss@blind}%
+}
+\ekvdefinekeys{udiss}{%
+ bool framed-title = {\ifudiss@ftitle}%
+}
+\ekvdefinekeys{udiss}{%
+ invbool oldstylenumoff = {\ifudiss@oldstylenum},%
+ bool oldone = {\ifudiss@oldone}%
+}
+\ekvdefinekeys{udiss}{%
+ bool explicitext = {\ifudiss@explicitext},%
+ invbool ignorefsoff = {\ifudiss@ignorefontspec}%
+}
+\ekvdefinekeys{udiss}{%
+ store fulfilment = {\udiss@fulfilment},%
+ initial fulfilment = {%
+ A dissertation submitted in the partial fulfilment of
+ the requirements for the \udiss@degree\ program in
+ \udiss@discipline.%
+ }%
+}
+\ekvdefinekeys{udiss}{%
+ store rmfont = {\udiss@rmfont},%
+ initial rmfont = {NewCM10-Book.otf},%
+ store rmbffont = {\udiss@rmbffont},%
+ initial rmbffont = {NewCM10-Bold.otf},%
+ store rmitfont = {\udiss@rmitfont},%
+ initial rmitfont = {NewCM10-BookItalic.otf},%
+ store rmbfitfont = {\udiss@rmbfitfont},%
+ initial rmbfitfont = {NewCM10-BoldItalic.otf},%
+ store rmslfont = {\udiss@rmslfont},%
+ initial rmslfont = {NewCM10-Book.otf},%
+ store rmbfslfont = {\udiss@rmbfslfont},%
+ initial rmbfslfont = {NewCM10-Bold.otf},%
+ store sffont = {\udiss@sffont},%
+ initial sffont = {NewCMSans10-Book.otf},%
+ store sfbffont = {\udiss@sfbffont},%
+ initial sfbffont = {NewCMSans10-Bold.otf},%
+ store sfitfont = {\udiss@sfitfont},
+ initial sfitfont = {NewCMSans10-BookOblique.otf},%
+ store sfbfitfont = {\udiss@sfbfitfont},%
+ initial sfbfitfont = {NewCMSans10-BoldOblique.otf},%
+ store sfslfont = {\udiss@sfslfont},%
+ initial sfslfont = {NewCMSans10-BookOblique.otf},%
+ store sfbfslfont = {\udiss@sfbfslfont},%
+ initial sfbfslfont = {NewCMSans10-BoldOblique.otf},%
+ store ttfont = {\udiss@ttfont},%
+ initial ttfont = {NewCMMono10-Book.otf},%
+ store ttbffont = {\udiss@ttbffont},
+ initial ttbffont = {NewCMMono10-Bold.otf},%
+ store ttitfont = {\udiss@ttitfont},%
+ initial ttitfont = {NewCMMono10-BookItalic.otf},%
+ store ttbfitfont = {\udiss@ttbfitfont},%
+ initial ttbfitfont = {NewCMMono10-BoldOblique.otf},%
+ store ttslfont = {\udiss@ttslfont},%
+ initial ttslfont = {NewCM10-Book.otf},%
+ store ttbfslfont = {\udiss@ttbfslfont},%
+ initial ttbfslfont = {NewCMMono10-BoldOblique.otf},%
+ store mathfont = {\udiss@mathfont},%
+ initial mathfont = {NewCMMath-Book.otf},%
+ store mathbffont = {\udiss@mathbffont},%
+ initial mathbffont = {NewCMMath-Bold.otf},%
+ store rmfeatures = {\udiss@rmfeatures},%
+ choice rmfntext = {%
+ ttf = {%
+ \ifudiss@explicitext
+ \def\udiss@rmfntext{ttf}%
+ \else
+ \ClassError{udiss}{%
+ Option `explicitext' is needed for adding
+ font extensions%
+ }{%
+ You have loaded font-option `rmfntext' to
+ add extension to font-names.
+ This\MessageBreak option is supposed to be
+ used only with the `explicitext' option.
+ E.g., for\MessageBreak loading, say,
+ FreeSerif, you may choose one of the
+ following two methods:%
+ \MessageBreak\MessageBreak
+ 1. The recommended method:%
+ \MessageBreak
+ \space\space\space
+ ----8<---------------8<----%
+ \MessageBreak
+ \space\space\space
+ \string\documentclass[\@percentchar
+ \MessageBreak
+ \space\space\space\space\space
+ rmfont = {FreeSerif.ttf}\@percentchar
+ \MessageBreak
+ \space\space\space
+ ]{udiss}\MessageBreak
+ \space\space\space
+ ----8<---------------8<----%
+ \MessageBreak\MessageBreak
+ 2. The alternative:%
+ \MessageBreak
+ \space\space\space
+ ----8<------------8<----%
+ \MessageBreak
+ \space\space\space
+ \string\documentclass[\@percentchar
+ \MessageBreak
+ \space\space\space\space\space
+ explicitext,\@percentchar
+ \MessageBreak
+ \space\space\space\space\space
+ rmfont = {FreeSerif},\@percentchar
+ \MessageBreak
+ \space\space\space\space\space
+ rmfntext = {ttf}\@percentchar
+ \MessageBreak
+ \space\space\space
+ ]{udiss}%
+ \MessageBreak
+ \space\space\space
+ ----8<------------8<----%
+ }%
+ \fi
+ },%
+ otf = {%
+ \ifudiss@explicitext
+ \def\udiss@rmfntext{otf}%
+ \else
+ \ClassError{udiss}{%
+ Option `explicitext' is needed for adding
+ font extensions%
+ }{%
+ You have loaded font-option `rmfntext' to
+ add extension to font-names.
+ This\MessageBreak option is supposed to be
+ used only with the `explicitext' option.
+ E.g., for\MessageBreak loading, say,
+ KpRoman-Regular.otf, you may choose one of
+ the following two\MessageBreak
+ methods:%
+ \MessageBreak\MessageBreak
+ 1. The recommended method:%
+ \MessageBreak
+ \space\space\space
+ ----8<---------------------8<----%
+ \MessageBreak
+ \space\space\space
+ \string\documentclass[\@percentchar
+ \MessageBreak
+ \space\space\space\space\space
+ rmfont = {KpRoman-Regular.otf}%
+ \@percentchar
+ \MessageBreak
+ \space\space\space
+ ]{udiss}\MessageBreak
+ \space\space\space
+ ----8<---------------------8<----%
+ \MessageBreak
+ \MessageBreak
+ 2. The alternative:%
+ \MessageBreak
+ \space\space\space
+ ----8<------------------8<----%
+ \MessageBreak
+ \space\space\space
+ \string\documentclass[\@percentchar
+ \MessageBreak
+ \space\space\space\space\space
+ explicitext,\@percentchar
+ \MessageBreak
+ \space\space\space\space\space
+ rmfont = {KpRoman-Regular},%
+ \@percentchar
+ \MessageBreak
+ \space\space\space\space\space
+ rmfntext = {otf}\@percentchar
+ \MessageBreak
+ \space\space\space
+ ]{udiss}%
+ \MessageBreak
+ \space\space\space
+ ----8<------------------8<----%
+ }%
+ \fi
+ }%
+ },%
+ store sffeatures = {\udiss@sffeatures},%
+ choice sffntext = {%
+ ttf = {%
+ \ifudiss@explicitext
+ \def\udiss@sffntext{ttf}%
+ \else
+ \ClassError{udiss}{%
+ Option `explicitext' is needed for adding
+ font extensions%
+ }{%
+ You have loaded font-option `sffntext' to
+ add extension to font-names.
+ This\MessageBreak option is supposed to be
+ used only with the `explicitext' option.
+ E.g., for\MessageBreak loading, say,
+ FreeSans, you may choose one of the
+ following two methods:%
+ \MessageBreak\MessageBreak
+ 1. The recommended method:%
+ \MessageBreak
+ \space\space\space
+ ----8<---------------8<----%
+ \MessageBreak
+ \space\space\space
+ \string\documentclass[\@percentchar
+ \MessageBreak
+ \space\space\space\space\space
+ sffont = {FreeSans.ttf}\@percentchar
+ \MessageBreak
+ \space\space\space
+ ]{udiss}\MessageBreak
+ \space\space\space
+ ----8<---------------8<----%
+ \MessageBreak\MessageBreak
+ 2. The alternative:%
+ \MessageBreak
+ \space\space\space
+ ----8<------------8<----%
+ \MessageBreak
+ \space\space\space
+ \string\documentclass[\@percentchar
+ \MessageBreak
+ \space\space\space\space\space
+ explicitext,\@percentchar
+ \MessageBreak
+ \space\space\space\space\space
+ sffont = {FreeSans},\@percentchar
+ \MessageBreak
+ \space\space\space\space\space
+ sffntext = {ttf}\@percentchar
+ \MessageBreak
+ \space\space\space
+ ]{udiss}%
+ \MessageBreak
+ \space\space\space
+ ----8<------------8<----%
+ }%
+ \fi
+ },%
+ otf = {%
+ \ifudiss@explicitext
+ \def\udiss@sffntext{otf}%
+ \else
+ \ClassError{udiss}{%
+ Option `explicitext' is needed for adding
+ font extensions%
+ }{%
+ You have loaded font-option `sffntext' to
+ add extension to font-names.
+ This\MessageBreak option is supposed to be
+ used only with the `explicitext' option.
+ E.g., for\MessageBreak loading, say,
+ KpSans-Regular.otf, you may choose one of
+ the following two\MessageBreak
+ methods:%
+ \MessageBreak\MessageBreak
+ 1. The recommended method:%
+ \MessageBreak
+ \space\space\space
+ ----8<---------------------8<----%
+ \MessageBreak
+ \space\space\space
+ \string\documentclass[\@percentchar
+ \MessageBreak
+ \space\space\space\space\space
+ sffont = {KpSans-Regular.otf}%
+ \@percentchar
+ \MessageBreak
+ \space\space\space
+ ]{udiss}\MessageBreak
+ \space\space\space
+ ----8<---------------------8<----%
+ \MessageBreak
+ \MessageBreak
+ 2. The alternative:%
+ \MessageBreak
+ \space\space\space
+ ----8<------------------8<----%
+ \MessageBreak
+ \space\space\space
+ \string\documentclass[\@percentchar
+ \MessageBreak
+ \space\space\space\space\space
+ explicitext,\@percentchar
+ \MessageBreak
+ \space\space\space\space\space
+ sffont = {KpSans-Regular},%
+ \@percentchar
+ \MessageBreak
+ \space\space\space\space\space
+ sffntext = {otf}\@percentchar
+ \MessageBreak
+ \space\space\space
+ ]{udiss}%
+ \MessageBreak
+ \space\space\space
+ ----8<------------------8<----%
+ }%
+ \fi
+ }%
+ },%
+ store ttfeatures = {\udiss@ttfeatures},%
+ choice ttfntext = {%
+ ttf = {%
+ \ifudiss@explicitext
+ \def\udiss@ttfntext{ttf}%
+ \else
+ \ClassError{udiss}{%
+ Option `explicitext' is needed for adding
+ font extensions%
+ }{%
+ You have loaded font-option `ttfntext' to
+ add extension to font-names.
+ This\MessageBreak option is supposed to be
+ used only with the `explicitext' option.
+ E.g., for\MessageBreak loading, say,
+ FreeMono, you may choose one of the
+ following two methods:%
+ \MessageBreak\MessageBreak
+ 1. The recommended method:%
+ \MessageBreak
+ \space\space\space
+ ----8<---------------8<----%
+ \MessageBreak
+ \space\space\space
+ \string\documentclass[\@percentchar
+ \MessageBreak
+ \space\space\space\space\space
+ ttfont = {FreeMono.ttf}\@percentchar
+ \MessageBreak
+ \space\space\space
+ ]{udiss}\MessageBreak
+ \space\space\space
+ ----8<---------------8<----%
+ \MessageBreak\MessageBreak
+ 2. The alternative:%
+ \MessageBreak
+ \space\space\space
+ ----8<------------8<----%
+ \MessageBreak
+ \space\space\space
+ \string\documentclass[\@percentchar
+ \MessageBreak
+ \space\space\space\space\space
+ explicitext,\@percentchar
+ \MessageBreak
+ \space\space\space\space\space
+ ttfont = {FreeMono},\@percentchar
+ \MessageBreak
+ \space\space\space\space\space
+ ttfntext = {ttf}\@percentchar
+ \MessageBreak
+ \space\space\space
+ ]{udiss}%
+ \MessageBreak
+ \space\space\space
+ ----8<------------8<----%
+ }%
+ \fi
+ },%
+ otf = {%
+ \ifudiss@explicitext
+ \def\udiss@ttfntext{otf}%
+ \else
+ \ClassError{udiss}{%
+ Option `explicitext' is needed for adding
+ font extensions%
+ }{%
+ You have loaded font-option `ttfntext' to
+ add extension to font-names.
+ This\MessageBreak option is supposed to be
+ used only with the `explicitext' option.
+ E.g., for\MessageBreak loading, say,
+ KpMono-Regular.otf, you may choose one of
+ the following two\MessageBreak
+ methods:%
+ \MessageBreak\MessageBreak
+ 1. The recommended method:%
+ \MessageBreak
+ \space\space\space
+ ----8<---------------------8<----%
+ \MessageBreak
+ \space\space\space
+ \string\documentclass[\@percentchar
+ \MessageBreak
+ \space\space\space\space\space
+ ttfont = {KpMono-Regular.otf}%
+ \@percentchar
+ \MessageBreak
+ \space\space\space
+ ]{udiss}\MessageBreak
+ \space\space\space
+ ----8<---------------------8<----%
+ \MessageBreak
+ \MessageBreak
+ 2. The alternative:%
+ \MessageBreak
+ \space\space\space
+ ----8<------------------8<----%
+ \MessageBreak
+ \space\space\space
+ \string\documentclass[\@percentchar
+ \MessageBreak
+ \space\space\space\space\space
+ explicitext,\@percentchar
+ \MessageBreak
+ \space\space\space\space\space
+ ttfont = {KpMono-Regular},%
+ \@percentchar
+ \MessageBreak
+ \space\space\space\space\space
+ ttfntext = {otf}\@percentchar
+ \MessageBreak
+ \space\space\space
+ ]{udiss}%
+ \MessageBreak
+ \space\space\space
+ ----8<------------------8<----%
+ }%
+ \fi
+ }%
+ },%
+ store mathfeatures = {\udiss@mathfeatures},%
+ choice mathfntext = {%
+ ttf = {%
+ \ifudiss@explicitext
+ \def\udiss@mathfntext{ttf}%
+ \else
+ \ClassError{udiss}{%
+ Option `explicitext' is needed for adding
+ font extensions%
+ }{%
+ You have loaded font-option `mathfntext'
+ to add extension to font-names.
+ This\MessageBreak option is supposed to be
+ used only with the `explicitext' option.
+ E.g., for\MessageBreak loading, say,
+ NotoSansMath-Regular, you may choose one
+ of the following two\MessageBreak
+ methods:%
+ \MessageBreak\MessageBreak
+ 1. The recommended method:%
+ \MessageBreak
+ \space\space\space
+ ----8<----------------------------8<----%
+ \MessageBreak
+ \space\space\space
+ \string\documentclass[\@percentchar
+ \MessageBreak
+ \space\space\space\space\space
+ mathfont = {NotoSansMath-Regular.ttf}%
+ \@percentchar
+ \MessageBreak
+ \space\space\space
+ ]{udiss}\MessageBreak
+ \space\space\space
+ ----8<----------------------------8<----%
+ \MessageBreak\MessageBreak
+ 2. The alternative:%
+ \MessageBreak
+ \space\space\space
+ ----8<-------------------------8<----%
+ \MessageBreak
+ \space\space\space
+ \string\documentclass[\@percentchar
+ \MessageBreak
+ \space\space\space\space\space
+ explicitext,\@percentchar
+ \MessageBreak
+ \space\space\space\space\space
+ mathfont = {NotoSansMath-Regular},%
+ \@percentchar
+ \MessageBreak
+ \space\space\space\space\space
+ mathfntext = {ttf}\@percentchar
+ \MessageBreak
+ \space\space\space
+ ]{udiss}%
+ \MessageBreak
+ \space\space\space
+ ----8<-------------------------8<----%
+ }%
+ \fi
+ },%
+ otf = {%
+ \ifudiss@explicitext
+ \def\udiss@mathfntext{otf}%
+ \else
+ \ClassError{udiss}{%
+ Option `explicitext' is needed for adding
+ font extensions%
+ }{%
+ You have loaded font-option `mathfntext'
+ to add extension to font-names.
+ This\MessageBreak option is supposed to be
+ used only with the `explicitext' option.
+ E.g., for\MessageBreak loading, say,
+ XITSMath-Regular, you may choose one of
+ the following two\MessageBreak methods:%
+ \MessageBreak\MessageBreak
+ 1. The recommended method:%
+ \MessageBreak
+ \space\space\space
+ ----8<----------------------------8<----%
+ \MessageBreak
+ \space\space\space
+ \string\documentclass[\@percentchar
+ \MessageBreak
+ \space\space\space\space\space
+ mathfont = {XITSMath-Regular.otf}%
+ \@percentchar
+ \MessageBreak
+ \space\space\space
+ ]{udiss}\MessageBreak
+ \space\space\space
+ ----8<----------------------------8<----%
+ \MessageBreak\MessageBreak
+ 2. The alternative:%
+ \MessageBreak
+ \space\space\space
+ ----8<-------------------------8<----%
+ \MessageBreak
+ \space\space\space
+ \string\documentclass[\@percentchar
+ \MessageBreak
+ \space\space\space\space\space
+ explicitext,\@percentchar
+ \MessageBreak
+ \space\space\space\space\space
+ mathfont = {XITSMath-Regular},%
+ \@percentchar
+ \MessageBreak
+ \space\space\space\space\space
+ mathfntext = {otf}\@percentchar
+ \MessageBreak
+ \space\space\space
+ ]{udiss}%
+ \MessageBreak
+ \space\space\space
+ ----8<-------------------------8<----%
+ }%
+ \fi
+ }%
+ },%
+}
+\ekvdefinekeys{udiss}{%
+ store titleshape = {\udiss@title@shape},%
+ initial titleshape = {\bfseries},%
+ store titlefont = {\udiss@title@font},%
+ store titlesize = {\udiss@title@size},%
+ initial titlesize = {\udiss@int@huge},%
+ store titlecolor = {\udiss@title@color},%
+ initial titlecolor = {black},%
+ store titleffeat = {\udiss@title@fontfeats},%
+ initial titleffeat = {}%
+}
+\ekvdefinekeys{udiss}{%
+ store subtitleshape = {\udiss@subtitle@shape},%
+ initial subtitleshape = {\normalfont},%
+ store subtitlefont = {\udiss@subtitle@font},%
+ store subtitlesize = {\udiss@subtitle@size},%
+ initial subtitlesize = {\udiss@int@large},%
+ store subtitlecolor = {\udiss@subtitle@color},%
+ initial subtitlecolor = {black},%
+ store subtitleffeat = {\udiss@subtitle@fontfeats},%
+ initial subtitleffeat = {}%
+}
+\ekvdefinekeys{udiss}{%
+ store authorshape = {\udiss@author@shape},%
+ initial authorshape = {\normalfont},%
+ store authorfont = {\udiss@author@font},%
+ store authorsize = {\udiss@author@size},%
+ initial authorsize = {\udiss@int@large},%
+ store authorcolor = {\udiss@author@color},%
+ initial authorcolor = {black},%
+ store authorffeat = {\udiss@author@fontfeats},%
+ initial authorffeat = {}%
+}
+\ekvdefinekeys{udiss}{%
+ store unishape = {\udiss@uni@shape},%
+ initial unishape = {\itshape},%
+ store unifont = {\udiss@uni@font},%
+ store unisize = {\udiss@uni@size},%
+ initial unisize = {\normalsize},%
+ store unicolor = {\udiss@uni@color},%
+ initial unicolor = {black},%
+ store uniffeat = {\udiss@uni@fontfeats}%
+}
+\ekvdefinekeys{udiss}{%
+ store deptshape = {\udiss@dept@shape},%
+ initial deptshape = {\normalfont},%
+ store deptfont = {\udiss@dept@font},%
+ store deptsize = {\udiss@dept@size},%
+ initial deptsize = {\udiss@int@small},%
+ store deptcolor = {\udiss@dept@color},%
+ initial deptcolor = {black},%
+ store deptffeat = {\udiss@dept@fontfeats},%
+ initial deptffeat = {}%
+}
+\ekvdefinekeys{udiss}{%
+ store ffshape = {\udiss@fulfilment@shape},%
+ initial ffshape = {\normalfont},%
+ store fffont = {\udiss@fulfilment@font},%
+ store ffsize = {\udiss@fulfilment@size},%
+ initial ffsize = {\udiss@int@small},%
+ store ffcolor = {\udiss@fulfilment@color},%
+ initial ffcolor = {black},%
+ store fffeat = {\udiss@fulfilment@fontfeats},%
+ initial fffeat = {}%
+}
+\ekvdefinekeys{udiss}{%
+ store logowidth = {\udiss@logo@width},%
+ initial logowidth = {0.3},%
+ store logoheight = {\udiss@logo@hght},%
+ initial logoheight = {0.075}%
+}
+\ekvoProcessGlobalOptions{udiss}
+\NewDocumentCommand{ \dissertationstyle }{ m }{%
+ \AddToHook{begindocument/before}{%
+ \input{udiss-style-#1}%
+ }%
+}
+\ifudiss@print
+\else
+ \PassOptionsToClass{oneside}{memoir}%
+\fi
+\LoadClass{memoir}
+\RenewDocumentCommand{ \title }{ m }{%
+ \IfBlankTF{#1}{%
+ \udiss@blank@title@err
+ \def\udiss@title{-NoValidTitle-}%
+ }{%
+ \def\udiss@title{#1}%
+ }%
+}
+\RenewDocumentCommand{ \author }{ m }{%
+ \IfBlankTF{#1}{%
+ \udiss@blank@author@err
+ \def\udiss@author{-NoValidAuthor-}%
+ }{%
+ \def\udiss@author{#1}%
+ }%
+}
+\RequirePackage{iftex}
+\RequireTUTeX
+\def\udiss@int@HUGE{%
+ \addfontfeature{Scale={2.5}}%
+}
+\def\udiss@int@Huge{%
+ \addfontfeature{Scale={2}}%
+}
+\def\udiss@int@huge{%
+ \addfontfeature{Scale={1.7}}%
+}
+\def\udiss@int@LARGE{%
+ \addfontfeature{Scale={1.4}}%
+}
+\def\udiss@int@Large{%
+ \addfontfeature{Scale={1.2}}%
+}
+\def\udiss@int@large{%
+ \addfontfeature{Scale={1.1}}%
+}
+\def\udiss@int@small{%
+ \addfontfeature{Scale={0.9}}%
+}
+\def\udiss@int@footnotesize{%
+ \addfontfeature{Scale={0.8}}%
+}
+\def\udiss@int@scriptsize{%
+ \addfontfeature{Scale={0.7}}%
+}
+\def\udiss@int@tiny{%
+ \addfontfeature{Scale={0.6}}%
+}
+\def\udiss@int@miniscule{%
+ \addfontfeature{Scale={0.5}}%
+}
+\ifudiss@lg@used
+ \ifudiss@ldfbabel
+ \PassOptionsToPackage{%
+ \udiss@ldfbabel@list
+ }{babel}%
+ \fi
+\else
+ \PassOptionsToPackage{english,provide*=*}{babel}%
+\fi
+\RequirePackage{babel}
+\RequirePackage{iflang}
+\newcounter{udiss@tmp@langcnt}
+\ifudiss@ldfbabel
+\else
+ \ifudiss@lg@used
+ \ifnum\theudiss@langbabel=2\relax
+ \addtocounter{udiss@langbabel}{-1}%
+ \ifLuaTeX
+ \babelprovide[%
+ main,%
+ import,%
+ onchar ={ids fonts}%
+ ]{%
+ \csname
+ udiss@langbabel@\alph{udiss@langbabel}%
+ \endcsname
+ }%
+ \else
+ \babelprovide[main,import]{%
+ \csname
+ udiss@langbabel@\alph{udiss@langbabel}%
+ \endcsname
+ }%
+ \fi
+ \fi
+ \ifnum\theudiss@langbabel>2\relax
+ \setcounter{udiss@tmp@langcnt}{%
+ \numexpr\theudiss@langbabel -1\relax
+ }%
+ \setcounter{udiss@langbabel}{1}%
+ \loop
+ \ifLuaTeX
+ \babelprovide[%
+ import,%
+ onchar ={ids fonts}%
+ ]{%
+ \csname
+ udiss@langbabel@\alph{udiss@langbabel}%
+ \endcsname
+ }%
+ \else
+ \babelprovide[import]{%
+ \csname
+ udiss@langbabel@\alph{udiss@langbabel}%
+ \endcsname
+ }%
+ \fi
+ \ifnum\theudiss@tmp@langcnt=1\relax
+ \else
+ \addtocounter{udiss@langbabel}{1}%
+ \fi
+ \ifnum\theudiss@langbabel<\theudiss@tmp@langcnt
+ \relax
+ \repeat
+ \fi
+ \ifnum\theudiss@langbabel=1\relax
+ \else
+ \ifLuaTeX
+ \babelprovide[%
+ main,%
+ import,%
+ onchar ={ids fonts}%
+ ]{%
+ \csname
+ udiss@langbabel@\alph{udiss@langbabel}%
+ \endcsname
+ }%
+ \else
+ \babelprovide[main,import]{%
+ \csname
+ udiss@langbabel@\alph{udiss@langbabel}%
+ \endcsname
+ }%
+ \fi
+ \fi
+ \setcounter{udiss@tmp@langcnt}{%
+ \numexpr\theudiss@langbabel + 1\relax
+ }%
+ \setcounter{udiss@langbabel}{1}%
+ \loop
+ \IfFileExists{%
+ udiss-fonts-\csname
+ udiss@langbabel@\alph{udiss@langbabel}%
+ \endcsname
+ }{%
+ \input{%
+ udiss-fonts-\csname
+ udiss@langbabel@\alph{udiss@langbabel}%
+ \endcsname
+ }%
+ }{%
+ \ifudiss@font@warning
+ \ClassWarningNoLine{udiss}{%
+ We don't support \csname
+ udiss@langbabel@\alph{udiss@langbabel}%
+ \endcsname\space yet.%
+ \MessageBreak
+ It requires a font-setup. You may add the fonts
+ directly\MessageBreak to your preamble using:%
+ \MessageBreak\MessageBreak
+ \space\space\string\babelfont[%
+ \csname
+ udiss@langbabel@\alph{udiss@langbabel}%
+ \endcsname
+ ]{rm}{main font}%
+ \MessageBreak
+ \space\space\string\babelfont[%
+ \csname
+ udiss@langbabel@\alph{udiss@langbabel}%
+ \endcsname
+ ]{sf}{sans font}%
+ \MessageBreak
+ \space\space\string\babelfont[%
+ \csname
+ udiss@langbabel@\alph{udiss@langbabel}%
+ \endcsname
+ ]{tt}{mono font}%
+ \MessageBreak\MessageBreak
+ Read more about this in the documentation of
+ `udiss' in a\MessageBreak section called
+ `multilingual typesetting'. Consider%
+ \MessageBreak contacting us with a support
+ request and let us know some\MessageBreak
+ suitable free (libre) fonts for this
+ language. If you\MessageBreak don't wish to see
+ this warning again, use the option%
+ \MessageBreak `nofontwarning' to suppress it%
+ }%
+ \fi
+ }%
+ \addtocounter{udiss@langbabel}{1}%
+ \ifnum\theudiss@langbabel<\theudiss@tmp@langcnt\relax
+ \repeat
+ \fi
+\fi
+\babelfont{rm}[%
+ \ifudiss@ignorefontspec
+ IgnoreFontspecFile,%
+ \fi
+ \ifudiss@explicitext
+ Extension = {.\udiss@rmfntext},%
+ \fi
+ BoldFont = {\udiss@rmbffont},%
+ ItalicFont = {\udiss@rmitfont},%
+ BoldItalicFont = {\udiss@rmbfitfont},%
+ SlantedFont = {\udiss@rmslfont},%
+ BoldSlantedFont = {\udiss@rmbfslfont},%
+ \ifudiss@oldstylenum
+ Numbers = {OldStyle},%
+ \ifudiss@oldone
+ CharacterVariant = {6},%
+ \fi
+ \fi
+ \ifLuaTeX
+ Renderer = {HarfBuzz},%
+ \fi
+ \udiss@rmfeatures
+]{\udiss@rmfont}
+\babelfont{sf}[%
+ \ifudiss@ignorefontspec
+ IgnoreFontspecFile,%
+ \fi
+ \ifudiss@explicitext
+ Extension = {.\udiss@sffntext},%
+ \fi
+ BoldFont = {\udiss@sfbffont},%
+ ItalicFont = {\udiss@sfitfont},%
+ BoldItalicFont = {\udiss@sfbfitfont},%
+ SlantedFont = {\udiss@sfslfont},%
+ BoldSlantedFont = {\udiss@sfbfslfont},%
+ \ifudiss@oldstylenum
+ Numbers = {OldStyle},%
+ \ifudiss@oldone
+ CharacterVariant = {6},%
+ \fi
+ \fi
+ \ifLuaTeX
+ Renderer = {HarfBuzz},%
+ \fi
+ \udiss@sffeatures
+]{\udiss@sffont}
+\babelfont{tt}[%
+ \ifudiss@ignorefontspec
+ IgnoreFontspecFile,%
+ \fi
+ \ifudiss@explicitext
+ Extension = {.\udiss@ttfntext},%
+ \fi
+ BoldFont = {\udiss@ttbffont},%
+ ItalicFont = {\udiss@ttitfont},%
+ BoldItalicFont = {\udiss@ttbfitfont},%
+ SlantedFont = {\udiss@ttslfont},%
+ BoldSlantedFont = {\udiss@ttbfslfont},%
+ \ifLuaTeX
+ Renderer = {HarfBuzz},%
+ \fi
+ \udiss@ttfeatures
+]{\udiss@ttfont}
+\RequirePackage{unicode-math}
+\expanded{%
+ \setmathfont[%
+ \ifudiss@ignorefontspec%
+ IgnoreFontspecFile,%
+ \fi%
+ \ifudiss@explicitext
+ Extension = {.\udiss@mathfntext},%
+ \fi
+ BoldFont = {\udiss@mathbffont},%
+ SlantedFont = {\udiss@mathfont},%
+ BoldSlantedFont = {\udiss@mathbffont},%
+ \udiss@mathfeatures%
+ ]{\udiss@mathfont}%
+}
+\RequirePackage{graphicx}
+\RequirePackage{xcolor}
+\RequirePackage{csquotes}
+\ifudiss@ccbysa
+ \RequirePackage[%
+ hyperxmp = {false},%
+ type = {CC},%
+ modifier = {by-sa},%
+ version = {4.0}%
+ ]{doclicense}
+\fi
+\ifudiss@colors
+ \colorlet{udisslink}{red!60!black}
+ \colorlet{udissurl}{blue!60!black}
+ \colorlet{udisscite}{green!60!black}
+\else
+ \colorlet{udisslink}{black}
+ \colorlet{udissurl}{black}
+ \colorlet{udisscite}{black}
+\fi
+\AddToHook{begindocument/before}{%
+ \ifdefined\udiss@title
+ \else
+ \def\udiss@title{\textbf{-NoValidTitle-}}%
+ \ClassError{udiss}{%
+ Title not given%
+ }{%
+ `title' is a compulsory field. Provide it in the
+ preamble like in the following:%
+ \MessageBreak
+ \MessageBreak
+ ----8<-----------------------8<----%
+ \MessageBreak\MessageBreak
+ \space\space\string\title{title-of-the-dissertation}%
+ \MessageBreak\MessageBreak
+ ----8<-----------------------8<----%
+ \MessageBreak
+ }%
+ \fi
+ \ifdefined\udiss@author
+ \else
+ \def\udiss@author{\textbf{-NoValidAuthor-}}%
+ \ClassError{udiss}{%
+ No author given in a normal (non-blind) document%
+ }{%
+ Do you want a blind document? If yes, then use the
+ package option `blind' like\MessageBreak in the
+ following:%
+ \MessageBreak
+ ----8<------------------8<----%
+ \MessageBreak\MessageBreak
+ \space\space\string\documentclass[blind]{udiss}%
+ \MessageBreak\MessageBreak
+ ----8<------------------8<----%
+ \MessageBreak
+ Otherwise, `author' is a compulsory field. Provide it
+ in the preamble like in\MessageBreak the following:%
+ \MessageBreak
+ ----8<-------------------------8<----%
+ \MessageBreak\MessageBreak
+ \space\space\string\author{author-name}%
+ \MessageBreak\MessageBreak
+ ----8<-------------------------8<----%
+ \MessageBreak
+ }%
+ \fi
+ \ifdefined\udiss@stream
+ \else
+ \def\udiss@stream{\textbf{-NoValidStream-}}%
+ \ClassError{udiss}{%
+ Stream not given%
+ }{%
+ `stream' is a compulsory field. Provide it in the
+ preamble like in the following:%
+ \MessageBreak
+ \MessageBreak
+ ----8<-----------------------8<----%
+ \MessageBreak\MessageBreak
+ \space\space\string\stream{stream-of-the-candidate}%
+ \MessageBreak\MessageBreak
+ ----8<-----------------------8<----%
+ \MessageBreak
+ }%
+ \fi
+ \ifdefined\udiss@discipline
+ \else
+ \def\udiss@discipline{\textbf{-NoValidDiscipline-}}%
+ \ClassError{udiss}{%
+ Discipline not given%
+ }{%
+ `discipline' is a compulsory field. Provide it in the
+ preamble like in the following:%
+ \MessageBreak
+ \MessageBreak
+ ----8<-----------------------8<----%
+ \MessageBreak\MessageBreak
+ \space\space\string\discipline%
+ {discipline-of-the-candidate}%
+ \MessageBreak\MessageBreak
+ ----8<-----------------------8<----%
+ \MessageBreak
+ }%
+ \fi
+ \ifdefined\udiss@degree
+ \else
+ \def\udiss@degree{\textbf{-NoValidDegree-}}%
+ \ClassError{udiss}{%
+ Degree not given%
+ }{%
+ `degree' is a compulsory field. Provide it in the
+ preamble like in the following:%
+ \MessageBreak
+ \MessageBreak
+ ----8<-----------------------8<----%
+ \MessageBreak\MessageBreak
+ \space\space\string\degree{degree-of-the-candidate}%
+ \MessageBreak\MessageBreak
+ ----8<-----------------------8<----%
+ \MessageBreak
+ }%
+ \fi
+ \ifdefined\udiss@supervisor
+ \else
+ \def\udiss@title{\textbf{-NoValidTitle-}}%
+ \ClassError{udiss}{%
+ No supervisor given in a normal (non-blind) document%
+ }{%
+ Do you want a blind document? If yes, then use the
+ package option `blind' like\MessageBreak in the
+ following:%
+ \MessageBreak
+ ----8<------------------8<----%
+ \MessageBreak\MessageBreak
+ \space\space\string\documentclass[blind]{udiss}%
+ \MessageBreak\MessageBreak
+ ----8<------------------8<----%
+ \MessageBreak
+ Otherwise, `supervisor' is a compulsory field. Provide
+ it in the preamble like\MessageBreak in the
+ following:%
+ \MessageBreak
+ ----8<-------------------------8<----%
+ \MessageBreak\MessageBreak
+ \space\space\string\supervisor{supervisor's-name}%
+ \MessageBreak\MessageBreak
+ ----8<-------------------------8<----%
+ \MessageBreak
+ }%
+ \fi
+ \ifdefined\udiss@university
+ \else
+ \def\udiss@university{\textbf{-NoValidUniversity-}}%
+ \ClassError{udiss}{%
+ No university given in a normal (non-blind) document%
+ }{%
+ Do you want a blind document? If yes, then use the
+ package option `blind' like\MessageBreak in the
+ following:%
+ \MessageBreak
+ ----8<------------------8<----%
+ \MessageBreak\MessageBreak
+ \space\space\string\documentclass[blind]{udiss}%
+ \MessageBreak\MessageBreak
+ ----8<------------------8<----%
+ \MessageBreak
+ Otherwise, `university' is a compulsory field. Provide
+ it in the preamble like\MessageBreak in the
+ following:%
+ \MessageBreak
+ ----8<-------------------------8<----%
+ \MessageBreak\MessageBreak
+ \space\space\string\university{university-name}%
+ \MessageBreak\MessageBreak
+ ----8<-------------------------8<----%
+ \MessageBreak
+ }%
+ \fi
+ \ifdefined\udiss@department
+ \else
+ \def\udiss@department{\textbf{-NoValidDepartment-}}%
+ \ClassError{udiss}{%
+ No department given in a normal (non-blind) document%
+ }{%
+ Do you want a blind document? If yes, then use the
+ package option `blind' like\MessageBreak in the
+ following:%
+ \MessageBreak
+ ----8<------------------8<----%
+ \MessageBreak\MessageBreak
+ \space\space\string\documentclass[blind]{udiss}%
+ \MessageBreak\MessageBreak
+ ----8<------------------8<----%
+ \MessageBreak
+ Otherwise, `department'\space is a compulsory field.
+ Provide it in the preamble like in\MessageBreak the
+ following:%
+ \MessageBreak
+ ----8<-------------------------8<----%
+ \MessageBreak\MessageBreak
+ \space\space\string\department{department-name}%
+ \MessageBreak\MessageBreak
+ ----8<-------------------------8<----%
+ \MessageBreak
+ }%
+ \fi
+ \ifudiss@print
+ \else
+ \RequirePackage{hyperref}%
+ \RequirePackage{hyperxmp}%
+ \hypersetup{%
+ unicode,%
+ colorlinks,%
+ pdftitle = {\udiss@title}%
+ }%
+ \ifudiss@subtitle
+ \hypersetup{%
+ pdfsubject = {\udiss@subtitle}%
+ }%
+ \fi
+ \ifudiss@blind
+ \else
+ \hypersetup{%
+ pdfauthor = {\udiss@author},%
+ pdfcopyright = {%
+ \udiss@title\textLF
+ \udiss@local@copyright\
+ ©
+ \udiss@copyrightable@years\
+ \udiss@author\textLF
+ \udiss@license@notice
+ },%
+ }%
+ \ifudiss@free@culture
+ \hypersetup{%
+ pdflicenseurl = {%
+ \udiss@free@license@url
+ }%
+ }%
+ \fi
+ \fi
+ \ifudiss@colors
+ \hypersetup{%
+ linkcolor = {\udiss@int@link@color},%
+ urlcolor = {\udiss@int@url@color},%
+ citecolor = {\udiss@int@cite@color}%
+ }%
+ \else
+ \hypersetup{%
+ hidelinks%
+ }%
+ \fi
+ \fi
+}
+\AddToHook{begindocument/end}{%
+ \begingroup
+ \thispagestyle{titlingpage}%
+ \ifudiss@ftitle
+ \setlength{\fboxsep}{25pt}%
+ \noindent\fbox{%
+ \begin{minipage}%
+ [c][\dimexpr\textheight-2\fboxsep-2\fboxrule]%
+ [c]{\dimexpr\linewidth-2\fboxsep-2\fboxrule}%
+ \fi
+ \hspace{0pt}%
+ \vspace{3em}%
+ \begin{center}
+ \begingroup
+ \udiss@title@shape
+ \ifx\udiss@title@font\empty
+ \else
+ \fontspec[\udiss@title@fontfeats]%
+ {\udiss@title@font}%
+ \fi
+ \udiss@title@size
+ \color{\udiss@title@color}%
+ \udiss@title
+ \endgroup
+
+ \medskip
+
+ \ifudiss@subtitle
+ \begingroup
+ \udiss@subtitle@shape
+ \ifx\udiss@subtitle@font\empty
+ \else
+ \fontspec[\udiss@subtitle@fontfeats]%
+ {\udiss@subtitle@font}%
+ \fi
+ \udiss@subtitle@size
+ \color{\udiss@subtitle@color}%
+ \udiss@subtitle
+ \endgroup
+ \fi
+
+ \vfill
+
+ \ifudiss@blind
+ \else
+ \begingroup
+ \udiss@author@shape
+ \ifx\udiss@author@font\empty
+ \else
+ \fontspec[\udiss@author@fontfeats]%
+ {\udiss@author@font}%
+ \fi
+ \udiss@author@size
+ \color{\udiss@author@color}%
+ \udiss@author
+ \ifudiss@pronouns
+ \begingroup
+ \space
+ \addfontfeature{Scale={0.6}}%
+ \udiss@pronouns
+ \endgroup
+ \fi
+ \endgroup
+
+ \vspace{2em}%
+ \fi
+
+ \begingroup
+ \udiss@fulfilment@shape
+ \ifx\udiss@fulfilment@font\empty
+ \else
+ \fontspec[\udiss@fulfilment@fontfeats]%
+ {\udiss@fulfilment@font}%
+ \fi
+ \udiss@fulfilment@size
+ \color{\udiss@fulfilment@color}%
+ \udiss@fulfilment
+ \endgroup
+
+ \vfill
+
+ \begingroup
+ \udiss@uni@shape
+ \ifx\udiss@uni@font\empty
+ \else
+ \fontspec[\udiss@university@fontfeats]%
+ {\udiss@uni@font}%
+ \fi
+ \udiss@uni@size
+ \color{\udiss@uni@color}%
+ \udiss@university
+ \endgroup
+
+ \vspace{0.5em}%
+
+ \begingroup
+ \udiss@dept@shape
+ \ifx\udiss@dept@font\empty
+ \else
+ \fontspec[\udiss@dept@fontfeats]%
+ {\udiss@dept@font}%
+ \fi
+ \udiss@dept@size
+ \color{\udiss@dept@color}%
+ \udiss@department
+ \endgroup
+
+ \ifudiss@logo
+ \bigskip
+ \ifudiss@texlogo
+ \udiss@texlogo
+ \fi
+ \includegraphics[%
+ width = {%
+ \udiss@logo@width\linewidth
+ },%
+ height = {%
+ \udiss@logo@hght\textheight
+ }%
+ ]{%
+ \udiss@logo
+ }%
+ \fi
+ \end{center}
+ \ifudiss@ftitle
+ \end{minipage}%
+ }%
+ \fi
+
+ \newpage
+
+ \ifudiss@blind
+ \else
+ \ifudiss@free@culture
+ \thispagestyle{titlingpage}%
+ \vspace*{\stretch{1}}
+ \begin{quote}
+ \setlength{\parindent}{0pt}%
+ \begingroup
+ \begin{minipage}{\linewidth}
+ \bfseries
+ \udiss@title
+
+ \udiss@local@copyright\
+ ©
+ \udiss@copyrightable@years\
+ \udiss@author
+
+ \medskip
+ \noindent\hrule \linewidth 0.4pt\relax
+ \end{minipage}
+ \endgroup
+
+ \ifudiss@gfdl
+ Permission is granted to copy, distribute and/or
+ modify this document under the terms of the GNU
+ Free Documentation License, Version 1.3 or any
+ later version published by the Free Software
+ Foundation; with no Invariant Sections, no
+ Front-Cover Texts, and no Back-Cover Texts. A copy
+ of the license is included in the section entitled
+ \enquote{GNU Free Documentation License}.%
+ \fi
+ \ifudiss@ccbysa
+ \begin{minipage}{\linewidth}
+ \doclicenseThis
+ \end{minipage}
+ \fi
+ \vspace{\stretch{3}}
+ \end{quote}
+ \newpage
+ \fi
+ \fi
+
+ \tableofcontents*
+
+ \newpage
+
+ \ifudiss@blind
+ \else
+ \ifudiss@declaration
+ \thispagestyle{empty}%
+ \begin{center}%
+ {%
+ \LARGE\bfseries
+ \udiss@decllocal
+ }%
+ \end{center}%
+
+ \udiss@declaration
+ \fi
+ \fi
+
+ \newpage
+
+ \ifudiss@lot
+ \listoftables
+ \fi
+
+ \newpage
+
+ \ifudiss@lof
+ \listoffigures
+ \fi
+ \endgroup
+}%
+\ifudiss@blind
+\else
+ \ifudiss@gfdl
+ \AddToHook{enddocument}{%
+ \newpage
+ \begingroup
+ \pagestyle{plain}%
+ \addcontentsline{toc}%
+ {chapter}%
+ {GNU Free Documentation License}%
+ \input{gfdl-tex-1p3}%
+ \clearpage
+ \endgroup
+ }%
+ \fi
+\fi
+\endinput
+%%
+%% End of file `udiss.cls'.
diff --git a/Master/tlpkg/bin/tlpkg-ctan-check b/Master/tlpkg/bin/tlpkg-ctan-check
index e501e6c0b17..571d927e7a9 100755
--- a/Master/tlpkg/bin/tlpkg-ctan-check
+++ b/Master/tlpkg/bin/tlpkg-ctan-check
@@ -893,7 +893,7 @@ my @TLP_working = qw(
uaclasses uafthesis uantwerpendocs uassign ucalgmthesis
ucharcat ucharclasses ucbthesis ucdavisthesis ucph-revy
ucs ucsmonograph
- ucthesis udepcolor udes-genie-these udesoftec
+ ucthesis udepcolor udes-genie-these udesoftec udiss
uebungsblatt uestcthesis ufrgscca
uhhassignment uhrzeit uiucredborder uiucthesis
ukbill ukrhyph ulem ulqda ulthese
diff --git a/Master/tlpkg/tlpsrc/collection-publishers.tlpsrc b/Master/tlpkg/tlpsrc/collection-publishers.tlpsrc
index 590da318f24..e382e095bd3 100644
--- a/Master/tlpkg/tlpsrc/collection-publishers.tlpsrc
+++ b/Master/tlpkg/tlpsrc/collection-publishers.tlpsrc
@@ -257,6 +257,7 @@ depend ucsmonograph
depend ucthesis
depend udepcolor
depend udes-genie-these
+depend udiss
depend uestcthesis
depend ufrgscca
depend uhhassignment
diff --git a/Master/tlpkg/tlpsrc/udiss.tlpsrc b/Master/tlpkg/tlpsrc/udiss.tlpsrc
new file mode 100644
index 00000000000..e69de29bb2d
--- /dev/null
+++ b/Master/tlpkg/tlpsrc/udiss.tlpsrc