% \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
