\NeedsTeXFormat{LaTeX2e} \ProvidesClass{thesis}[2025/05/10 Bachelor Thesis Class] \newif\if@draftmark \@draftmarkfalse \@draftmarkfalse \DeclareOption{draftmark}{\@draftmarktrue} \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{hyperref} \RequirePackage{etoolbox} \RequirePackage{tocloft} \RequirePackage{tocbibind} \RequirePackage{amsmath,amsfonts,amssymb} \RequirePackage{svg} % Allows including SVG images directly \RequirePackage{indentfirst} % Makes first paragraph after headings indented \RequirePackage{float} % Provides [H] option to force figure/table placement \RequirePackage[style=apa, backend=biber, language=indonesian]{biblatex} \RequirePackage[acronym, nogroupskip, toc]{glossaries} % Polyglossia set language \setdefaultlanguage[variant=indonesian]{malay} % Proper Indonesian language setup \setotherlanguage{english} % Enables English as secondary language \DefineBibliographyStrings{english}{% % Customizes bibliography text andothers={dkk\adddot}, % Changes "et al." to "dkk." pages={hlm\adddot}, % Changes "pp." to "hlm." } % Conditionally load the watermark package and settings \if@draftmark \RequirePackage{draftwatermark} \SetWatermarkText{nuluh/thesis (wip) [draft: \today]} \SetWatermarkColor[gray]{0.8} % Opacity: 0.8 = 20% transparent \SetWatermarkFontSize{1.5cm} \SetWatermarkAngle{90} \SetWatermarkHorCenter{1.5cm} \RequirePackage[left]{lineno} \linenumbers \fi % Page layout \geometry{left=4cm, top=3cm, right=3cm, bottom=3cm} \setlength{\parskip}{0.5em} \onehalfspacing % Fonts \defaultfontfeatures{Ligatures=TeX} \setmainfont{Times New Roman} \setsansfont{Arial} \setmonofont{Courier New} \makeatletter % Extracting the Year from \today \newcommand{\theyear}{% \expandafter\@car\expandafter\@gobble\the\year\@nil } % Declare internal macros as initially empty \newcommand{\@authorid}{} \newcommand{\@firstadvisor}{} \newcommand{\@secondadvisor}{} \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{\firstadvisor}[1]{\gdef\@firstadvisor{#1}} \newcommand{\secondadvisor}[1]{\gdef\@secondadvisor{#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{\thefirstadvisor}{\@firstadvisor} \newcommand{\thesecondadvisor}{\@secondadvisor} \newcommand{\theheaddepartement}{\@headdepartement} \newcommand{\theheaddepartementid}{\@headdepartementid} \newcommand{\thefaculty}{\@faculty} \newcommand{\theprogram}{\@program} \newcommand{\theuniversity}{\@university} \newcommand{\theyearofsubmission}{\@yearofsubmission} \makeatother % % 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} } % Chapter formatting \titlespacing{\chapter}{0pt}{0cm}{*1.5} % 0pt→0cm: same value, different unit % 0pt = no space above chapter title % *1.5 = 1.5× line spacing after title \titleformat{\chapter}[display] {\normalsize\bfseries\centering} {BAB~\Roman{chapter}} % << display format {1ex} {\MakeUppercase} \titleformat{\section} {\normalsize\bfseries}{\thesection}{1em}{} \titleformat{\subsection} {\normalsize\bfseries}{\thesubsection}{1em}{} % Section numbering depth \setcounter{secnumdepth}{3} % Enables numbering for: % 1 = chapters, 2 = sections, 3 = subsections % Ensure chapter reference in TOC matches \renewcommand{\cftchappresnum}{BAB~} \renewcommand{\cftchapaftersnum}{\quad} % Chapter & Section format \renewcommand{\cftchapfont}{\normalsize\MakeUppercase} % \renewcommand{\cftsecfont}{} % \renewcommand{\cftsubsecfont}{\itshape} % \renewcommand{\thesection}{\textup{\Roman{chapter}}.\arabic{section}} % Dot leaders, spacing, indentation \setlength{\cftbeforetoctitleskip}{0cm} % Space above "DAFTAR ISI" title \setlength{\cftbeforeloftitleskip}{0cm} % Space above "DAFTAR GAMBAR" title \setlength{\cftbeforelottitleskip}{0cm} % Space above "DAFTAR TABEL" title \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}{5em} \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) Title styling \renewcommand{\cfttoctitlefont}{\hfill\bfseries\MakeUppercase} \renewcommand{\cftaftertoctitle}{\hfill} % https://tex.stackexchange.com/a/255699/394075 % List of Figures (LOF) Title styling \renewcommand{\cftloftitlefont}{\hfill\bfseries\MakeUppercase} \renewcommand{\cftafterloftitle}{\hfill} % List of Tables (LOT) Title styling \renewcommand{\cftlottitlefont}{\hfill\bfseries\MakeUppercase} \renewcommand{\cftafterlottitle}{\hfill} % \renewcommand{\cfttoctitlefont}{\bfseries\MakeUppercase} % \renewcommand{\cftaftertoctitle}{\vskip 2em} % Defines a new glossary called “notation” \newglossary[nlg]{notation}{not}{ntn}{Notation} % Define the header for the location column \providecommand*{\locationname}{Location} % Define the new glossary style called 'mylistalt' for main glossaries \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}\space [##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 new glossary style 'altlong3customheader' for notation \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' for acronyms glossaries \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 }% } \makeatother % A new command that enables us to enter bi-lingual (Bahasa Indonesia and English) terms % syntax: \addterm[options]{label}{Bahasa Indonesia}{Bahasa Indonesia first use}{English}{Bahasa Indonesia % 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 % (Bahasa Indonesia and English) long versions % syntax: \addacronym[options]{label}{abbreviation}{Bahasa Indonesia long}{Bahasa Indonesia first % use long}{English long}{Bahasa Indonesia 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 Bahasa Indonesia 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 % % } \endinput