\NeedsTeXFormat{LaTeX2e} \ProvidesClass{thesis}[2025/05/10 Bachelor Thesis Class] \newif\if@draftmark \@draftmarkfalse \newif\if@primarytitle \@primarytitletrue \newif\if@secondarytitle \@secondarytitletrue \DeclareOption{draftmark}{\@draftmarktrue} \DeclareOption{noprimarytitle}{\@primarytitlefalse} \DeclareOption{nosecondarytitle}{\@secondarytitlefalse} \ProcessOptions \relax \LoadClass[a4paper,12pt,oneside]{book} % Load common packages \RequirePackage{polyglossia} \RequirePackage{fontspec} \RequirePackage{titlesec} \RequirePackage{titling} \RequirePackage{fancyhdr} \RequirePackage{geometry} \RequirePackage{setspace} \RequirePackage{graphicx} \RequirePackage{svg} \RequirePackage{etoolbox} \RequirePackage[titles]{tocloft} \RequirePackage{tocbibind} \RequirePackage{indentfirst} \RequirePackage{float} \RequirePackage{amsmath,amsfonts,amssymb} \RequirePackage[style=apa,% % dateabbrev=false,% when false, don't abbreviate months/year divisions % julian=true,% convert dates before gregorianstart to Julian Calendar % gregorianstart=1582-10-15,% Default % alldates=short,% % alldates=ymd,% Year-Month-Day format % alldates=iso,% ISO8601 format % alldatesusetime=true, % print time components in non-compact date ranges % alltimes=12h,% alltimes=24h,% prints 24 hour format times (default) % alltimes=24hcomp,% prints 24 hour compressed format times % seconds=true,% uncomment to print seconds % timezones=true,% uncomment to print timezones datezeros=false,% pad date components with zeros? dateera=secular,% prints BCE/CE controlled by dateerauto, datezeros % dateera=christian,% prints BC/AD controlled by dateerauto, datezeros % dateera=astronomical,% prints astronomical dates, controlled by datezeros dateeraauto=600,% Sets the max year ceiling for automatic printing of era % abbreviate=false,% prints full date localisation strings dateuncertain=true,% datecirca=true,% sorting=none,% url=false,% doi=false,% isbn=false,% backend=biber]{biblatex} \RequirePackage{hyperref} \RequirePackage[acronym, nogroupskip, toc]{glossaries} % \RequirePackage{glossaries-extra} % \RequirePackage{hyperxmp} % Polyglossia set language \setmainlanguage[variant=indonesian]{malay} \setotherlanguage{english} % Change "Bibliography" to "Daftar Pustaka" for book class % \DefineBibliographyStrings{english}{% % andothers={dkk\adddot}, % pages ={hlm\adddot}, % } % \DefineBibliographyStrings{english}{ % bibliography = {Daftar Pustaka}, % } % \DefineBibliographyStrings{american-apa}{% % bibliography = {Daftar Pustaka}, % } % \renewcommand{\bibname}{DAFTAR PUSTAKA} % Conditionally load the watermark package and settings \if@draftmark \RequirePackage{draftwatermark} % All watermark settings in one place: \DraftwatermarkOptions{% text={\sffamily\bfseries DRAFT \href{https://github.com/nuluh/thesis}{% \color{magenta}\fbox{\bfseries\normalsize\texttt{ver.\ 2025.j5}}% }% \ \normalsize{Copyright~\textcopyright~Rifqi D. Panuluh}% }, color={[gray]{0.8}}, fontsize=1.5em, angle=90, % hanchor=c, hpos=20cm, % vanchor=m, vpos=20cm } \RequirePackage[left]{lineno} \linenumbers \fi % Page layout \geometry{left=4cm, top=3cm, right=3cm, bottom=3cm} \setlength{\parskip}{0.5em} % \setlength{\parindent}{0pt} % Fonts \defaultfontfeatures{Ligatures=TeX} \setmainfont{Times New Roman}[ SmallCapsFont = {Latin Modern Roman}, % fallback for \textsc ] \setsansfont{Arial} \setmonofont{Courier New} % Metadata commands % \input{metadata} % \newcommand{\setthesisinfo}[7]{% % \renewcommand{\thesistitle}{#1}% % \renewcommand{\studentname}{#2}% % \renewcommand{\studentid}{#3}% % \renewcommand{\program}{#4}% % \renewcommand{\faculty}{#5}% % \renewcommand{\university}{#6}% % \renewcommand{\yearofsubmission}{#7}% % } % % Header and footer \fancypagestyle{fancy}{% \fancyhf{} \fancyhead[R]{\nouppercase{\rightmark}} \fancyhead[L]{\nouppercase{\leftmark}} \fancyfoot[C]{\thepage} } \fancypagestyle{fancyplainfrontmatter}{% \renewcommand{\headrulewidth}{0pt} \fancyfoot[C]{\thepage} } \fancypagestyle{fancyplain}{% \fancyhf{} \renewcommand{\headrulewidth}{0pt} \fancyhead[R]{\thepage} } % change the behaviour of \backmatter to change page number into roman by continue frontmatter page counter (modified from original book.cls) \newcounter{savepagenumber} \renewcommand\mainmatter{% \cleardoublepage \setcounter{savepagenumber}{\value{page}} \@mainmattertrue \pagenumbering{arabic}% } \renewcommand\backmatter{% \if@openright \cleardoublepage \else \clearpage \fi \pagenumbering{roman}% \setcounter{page}{\value{savepagenumber}}% \@mainmatterfalse } % Chapter formatting \titlespacing{\chapter}{0pt}{0cm}{*1.5} \titleformat{\chapter}[display] {\normalsize\bfseries\centering} {\MakeUppercase\chaptername~\Roman{chapter}} % << display format {1ex} {\MakeUppercase} \titleformat{\section} {\normalsize\bfseries}{\thesection}{1em}{} \titleformat{\subsection} {\normalsize\bfseries}{\thesubsection}{1em}{} % Section numbering depth \setcounter{secnumdepth}{3} % Ensure chapter reference in TOC matches \renewcommand{\cftchappresnum}{\MakeUppercase\chaptername~} \renewcommand{\cftchapaftersnum}{\quad} % Redefine \maketitle \renewcommand{\maketitle}{% \if@primarytitle \input{frontmatter/maketitle}% \fi \if@secondarytitle \clearpage \input{frontmatter/maketitle_secondary}% \fi } % Chapter & Section format % thanks to https://latex.org/forum/viewtopic.php?p=83118&sid=a22ccb456531faabf65070c18af69680#p83118 for elegant solution \makeatletter \patchcmd{\l@chapter} {\cftchapfont #1}% original {\cftchapfont{#1}}% patched {}{} % success/failure handlers \makeatother \renewcommand{\cftchapfont}{\normalsize\MakeUppercase} % \renewcommand{\cftsecfont}{} % \renewcommand{\cftsubsecfont}{\itshape} % \renewcommand{\thesection}{\textup{\Roman{chapter}}.\arabic{section}} % Dot leaders, spacing, indentation \setlength{\cftbeforetoctitleskip}{0cm} \setlength{\cftbeforeloftitleskip}{0cm} \setlength{\cftbeforelottitleskip}{0cm} \setlength{\cftbeforechapskip}{0em} \setlength{\cftchapindent}{0pt} \setlength{\cftsecindent}{0em} \setlength{\cftsubsecindent}{2em} \setlength{\cftchapnumwidth}{3.5em} \setlength{\cftsecnumwidth}{2em} \setlength{\cftsubsecnumwidth}{2.5em} \setlength{\cftfignumwidth}{6em} \setlength{\cfttabnumwidth}{4em} \renewcommand \cftchapdotsep{1} % https://tex.stackexchange.com/a/273764 \renewcommand \cftsecdotsep{1} % https://tex.stackexchange.com/a/273764 \renewcommand \cftsubsecdotsep{1} % https://tex.stackexchange.com/a/273764 \renewcommand \cftfigdotsep{1.5} % https://tex.stackexchange.com/a/273764 \renewcommand \cfttabdotsep{1.5} % https://tex.stackexchange.com/a/273764 \renewcommand{\cftchapleader}{\normalfont\cftdotfill{\cftsecdotsep}} \renewcommand{\cftchappagefont}{\normalfont} % Add Prefix in the Lof and LoT entries \renewcommand{\cftfigpresnum}{\figurename~} \renewcommand{\cfttabpresnum}{\tablename~} % Ensure TOC and References Respect Custom Numbering \renewcommand{\thechapter}{\Roman{chapter}} \renewcommand\thesection{\arabic{chapter}.\arabic{section}} % Change figure numbering to include chapter (e.g., Figure 1.1, 1.2...) \renewcommand{\thefigure}{\arabic{chapter}.\arabic{figure}} \renewcommand{\thetable}{\arabic{chapter}.\arabic{table}} \renewcommand{\theequation}{\arabic{chapter}.\arabic{equation}} % Table of Content (TOC, LoF, LoT) Title styling % \renewcommand{\contentsname}{DAFTAR ISI} \renewcommand{\cfttoctitlefont}{\hfill\bfseries\MakeUppercase} \renewcommand{\cftaftertoctitle}{\hfill} % https://tex.stackexchange.com/a/255699/394075 \renewcommand{\cftloftitlefont}{\hfill\bfseries\MakeUppercase} \renewcommand{\cftafterloftitle}{\hfill} \renewcommand{\cftlottitlefont}{\hfill\bfseries\MakeUppercase} \renewcommand{\cftafterlottitle}{\hfill} % Defines a new glossary called “notation” \newglossary[nlg]{notation}{not}{ntn}{Notation} % Define the new glossary style called 'mylistalt' \makeatletter \newglossarystyle{mylistalt}{% % start the list, initializing glossaries internals \renewenvironment{theglossary}% {\glslistinit\begin{enumerate}}% {\end{enumerate}}% % suppress all headers/groupskips \renewcommand*{\glossaryheader}{}% \renewcommand*{\glsgroupheading}[1]{}% \renewcommand*{\glsgroupskip}{}% % main entries: let \item produce "1." etc., then break \renewcommand*{\glossentry}[2]{% \item \glstarget{##1}{\glossentryname{##1}}% \mbox{}\\ \glossentrydesc{##1} % [##2] % appears on page x }% % sub-entries as separate paragraphs, still aligned \renewcommand*{\subglossentry}[3]{% \par \glssubentryitem{##2}% \glstarget{##2}{\strut}\space \glossentrydesc{##2}\space ##3% }% } % Define the header for the location column \providecommand*{\locationname}{Location} % Define the new glossary style 'altlong3customheader' \newglossarystyle{altlong3customheader}{% % The glossary will be a longtable environment with three columns: % 1. Symbol (left-aligned) % 2. Description (paragraph, width \glsdescwidth) % 3. Location (paragraph, width \glspagelistwidth) \renewenvironment{theglossary}% {\begin{longtable}{lp{\glsdescwidth}p{\glspagelistwidth}}}% {\end{longtable}}% % Define the table header row \renewcommand*{\symbolname}{Simbol} \renewcommand*{\descriptionname}{Keterangan} \renewcommand*{\locationname}{Halaman} \renewcommand*{\glossaryheader}{% \bfseries\symbolname & \bfseries\descriptionname & \bfseries\locationname \tabularnewline\endhead}% % Suppress group headings (e.g., A, B, C...) \renewcommand*{\glsgroupheading}[1]{}% % Define how a main glossary entry is displayed % ##1 is the entry label % ##2 is the location list (page numbers) \renewcommand{\glossentry}[2]{% \glsentryitem{##1}% Inserts entry number if entrycounter option is used \glstarget{##1}{\glossentryname{##1}} & % Column 1: Symbol (with hyperlink target) \glossentrydesc{##1}\glspostdescription & % Column 2: Description (with post-description punctuation) ##2\tabularnewline % Column 3: Location list }% % Define how a sub-entry is displayed % ##1 is the sub-entry level (e.g., 1 for first sub-level) % ##2 is the entry label % ##3 is the location list \renewcommand{\subglossentry}[3]{% & % Column 1 (Symbol) is left blank for sub-entries to create an indented look \glssubentryitem{##2}% Inserts sub-entry number if subentrycounter is used \glstarget{##2}{\strut}\glossentrydesc{##2}\glspostdescription & % Column 2: Description (target on strut for hyperlink) ##3\tabularnewline % Column 3: Location list }% % Define the skip between letter groups (if group headings were enabled) % For 3 columns, we need 2 ampersands for a full blank row if not using \multicolumn \ifglsnogroupskip \renewcommand*{\glsgroupskip}{}% \else \renewcommand*{\glsgroupskip}{& & \tabularnewline}% \fi } % Define a new style 'supercol' based on 'super' \newglossarystyle{supercol}{% \setglossarystyle{super}% inherit everything from the original % override just the main-entry format: \renewcommand*{\glossentry}[2]{% \glsentryitem{##1}% \glstarget{##1}{\glossentryname{##1}}\space % <-- added colon here &: \glossentrydesc{##1}\glspostdescription\space ##2\tabularnewline }% % likewise for sub‐entries, if you want a colon there too: \renewcommand*{\subglossentry}[3]{% &: \glssubentryitem{##2}% \glstarget{##2}{\strut}\glossentryname{##2}\space % <-- and here \glossentrydesc{##2}\glspostdescription\space ##3\tabularnewline }% } % Define a new style 'supercolnoloc' based on 'super' \newglossarystyle{supercolnoloc}{% \setglossarystyle{super}% inherit everything from the original \renewenvironment{theglossary}% {\begin{longtable}{lp{0.8\textwidth}}}% {\end{longtable}}% % override just the main-entry format: \renewcommand*{\glossentry}[2]{% \glsentryitem{##1}% \glstarget{##1}{\glossentryname{##1}}\space % <-- added colon here &: \glossentrydesc{##1}\glspostdescription \tabularnewline }% % likewise for sub‐entries, if you want a colon there too: \renewcommand*{\subglossentry}[3]{% &: \glssubentryitem{##2}% \glstarget{##2}{\strut}\glossentryname{##2}\space % <-- and here \glossentrydesc{##2}\glspostdescription\space ##3\tabularnewline }% } \makeatother % A new command that enables us to enter bi-lingual (Slovene and English) terms % syntax: \addterm[options]{label}{Slovene}{Slovene first use}{English}{Slovene % description} \newcommand{\addterm}[6][]{ \newglossaryentry{#2}{ name={#3 (angl.\ #5)}, first={#4 (\emph{#5})}, text={#3}, sort={#3}, description={#6}, #1 % pass additional options to \newglossaryentry } } % A new command that enables us to enter (English) acronyms with bi-lingual % (Slovene and English) long versions % syntax: \addacronym[options]{label}{abbreviation}{Slovene long}{Slovene first % use long}{English long}{Slovene description} \newcommand{\addacronym}[7][]{ % Create the main glossary entry with \newacronym % \newacronym[key-val list]{label}{abbrv}{long} \newacronym[ name={#4 (angl.\ #6,\ #3)}, first={\emph{#5} (angl.\ \emph{#6},\ \emph{#3})}, sort={#4}, description={#7}, #1 % pass additional options to \newglossaryentry ] {#2}{#3}{#4} % Create a cross-reference from the abbreviation to the main glossary entry by % creating an auxiliary glossary entry (note: we set the label of this entry % to '_auxiliary' to avoid clashes) \newglossaryentry{#2_auxiliary}{ name={#3}, sort={#3}, description={\makefirstuc{#6}}, see=[See:]{#2} } } % Change the text of the cross-reference links to the Slovene long version. \renewcommand*{\glsseeitemformat}[1]{\emph{\acrlong{#1}}.} % % Apply a custom fancyhdr layout only on the first page of each \chapter, and use no header/footer elsewhere % % \let\oldchapter\chapter % % \renewcommand{\chapter}{% % % \cleardoublepage % % \pagestyle{fancyplainchapter}% % % \oldchapter % % \thispagestyle{fancyplainchapter} % ensure chapter start page uses it % % \pagestyle{fancyplain}% switch for subsequent pages % % } \makeatletter % Extracting the Year from \today \newcommand{\theyear}{% \expandafter\@car\expandafter\@gobble\the\year\@nil } % Declare internal macros as initially empty \newcommand{\@authorid}{} \newcommand{\@secondadvisor}{} \newcommand{\@firstexaminer}{} \newcommand{\@secondexaminer}{} \newcommand{\@headdepartement}{} \newcommand{\@headdepartementid}{} \newcommand{\@faculty}{} \newcommand{\@program}{} \newcommand{\@university}{} \newcommand{\@yearofsubmission}{} % Define user commands to set these values. \newcommand{\authorid}[1]{\gdef\@authorid{#1}} \newcommand{\secondadvisor}[1]{\gdef\@secondadvisor{#1}} \newcommand{\firstexaminer}[1]{\gdef\@firstexaminer{#1}} \newcommand{\secondexaminer}[1]{\gdef\@secondexaminer{#1}} \newcommand{\headdepartement}[1]{\gdef\@headdepartement{#1}} \newcommand{\headdepartementid}[1]{\gdef\@headdepartementid{#1}} \newcommand{\faculty}[1]{\gdef\@faculty{#1}} \newcommand{\program}[1]{\gdef\@program{#1}} \newcommand{\university}[1]{\gdef\@university{#1}} \newcommand{\yearofsubmission}[1]{\gdef\@yearofsubmission{#1}} % Now expose robust “the‑” getters to access the values \newcommand{\theauthorid}{\@authorid} \newcommand{\thesecondadvisor}{\@secondadvisor} \newcommand{\thefirstexaminer}{\@firstexaminer} \newcommand{\thesecondexaminer}{\@secondexaminer} \newcommand{\theheaddepartement}{\@headdepartement} \newcommand{\theheaddepartementid}{\@headdepartementid} \newcommand{\thefaculty}{\@faculty} \newcommand{\theprogram}{\@program} \newcommand{\theuniversity}{\@university} \newcommand{\theyearofsubmission}{\@yearofsubmission} % Ensure title/author/date get expanded correctly in hypersetup % \hypersetup{ % pdftitle={\@title}, % pdfauthor={\@author}, % pdfdate={\@date}, % pdfsubject={Bachelor Thesis}, % pdfkeywords={structural health monitoring, machine learning, stft, vibration, signal}, % pdfpublisher={Universitas Muhammadiyah Yogyakarta}, % pdfcontactemail={rifqi.damar.ft21@mail.umy.ac.id}, % pdflicenseurl={https://github.com/nuluh/thesis/blob/main/LICENSE}, % pdflang={id}, % pdfcreator={XeLaTeX with hyperref and hyperxmp}, % pdfproducer={TeX Live 2024}, % pdftrapped=False % } \makeatother \endinput