486 lines
17 KiB
TeX
486 lines
17 KiB
TeX
\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 '<original label>_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 |