%% \iffalse meta-comment
%%
%% SPDX-FileCopyrightText: 2026 Ichlasul Affan, et al.
%% SPDX-License-Identifier: LPPL-1.3c
%%
%% This work consists of the files uithesis.dtx, uithesis-doc.dtx, uithesis.ins,
%% and the derived file uithesis.cls.
%%
%% This file may be distributed and/or modified under the conditions of the
%% LaTeX Project Public License, either version 1.3c of this license or
%% (at your option) any later version.  The latest version of this license
%% is in:
%%
%%   https://www.latex-project.org/lppl.txt
%%
%% and version 1.3c or later is part of all distributions of LaTeX
%% version 2008 or later.
%%
%% \fi
%%
%% \iffalse
%<*driver>
\documentclass{l3doc}
\EnableCrossrefs
\CodelineIndex
\RecordChanges
\usepackage[indonesian,english]{babel}
\usepackage{booktabs}
\usepackage{longtable}
\usepackage{url}
\usepackage{xcolor}
\usepackage{enumitem}
\usepackage{bookmark}
\begin{document}
  \setlength{\emergencystretch}{3em}
  \tolerance=9999\relax
  \DocInput{uithesis-doc.dtx}
  \PrintChanges
  \PrintIndex
\end{document}
%</driver>
%% \fi
%%
%% \title{Universitas Indonesia Thesis (\textsf{uithesis}) Document Class\\
%%        \large User and Maintainer Documentation / Dokumentasi Pengguna dan Maintainer}
%% \author{Ichlasul Affan \and contributors}
%% \date{Version 3.0.0, 2026/08/20}
%%
%% \maketitle
%%
%% \tableofcontents
%%
%% \newpage
%%
%% %-----------------------------------------------------------------------
%% \section{How to Read This Documentation / Cara Membaca Dokumentasi Ini}
%% %-----------------------------------------------------------------------
%%
%% \subsection*{English}
%%
%% This document has two explicit parts with different audiences:
%%
%% \begin{itemize}
%%   \item \textbf{Part I - User Guide}: for students, lecturers, and
%%         professors who need to write or supervise a thesis using
%%         \textsf{uithesis}.
%%   \item \textbf{Part II - Maintainer Guide}: for contributors who need
%%         to modify class code, update internals, improve tests, and
%%         submit merge requests.
%% \end{itemize}
%%
%% The user part follows the thesis PDF lifecycle from installation,
%% metadata setup, front matter generation, content formatting,
%% appendices, glossary, and code listings.
%%
%% \subsection*{Bahasa Indonesia}
%%
%% Dokumen ini dibagi menjadi dua bagian utama dengan sasaran yang berbeda:
%%
%% \begin{itemize}
%%   \item \textbf{Bagian I - Panduan Pengguna}: untuk mahasiswa,
%%         dosen, dan pembimbing yang perlu menulis atau membimbing
%%         tugas akhir dengan \textsf{uithesis}.
%%   \item \textbf{Bagian II - Panduan Maintainer}: untuk kontributor
%%         yang perlu mengubah kode kelas, memperbarui komponen internal,
%%         meningkatkan pengujian, dan mengirim merge request.
%% \end{itemize}
%%
%% Bagian pengguna mengikuti alur siklus PDF tugas akhir, dimulai dari
%% instalasi, pengisian metadata, penyusunan halaman awal, pemformatan isi,
%% lampiran, glosarium, hingga daftar kode program.
%%
%% \newpage
%%
%% %-----------------------------------------------------------------------
%% \part{User Guide / Panduan Pengguna}
%% %-----------------------------------------------------------------------
%%
%% \subsection*{English}
%%
%% Recommended reading path for first-time users:
%%
%% \begin{enumerate}
%%   \item Installation
%%   \item Required packages
%%   \item Class options
%%   \item Metadata commands
%%   \item Front matter
%%   \item Content layout and content commands
%%   \item Appendices, glossary, and code listings
%% \end{enumerate}
%%
%% \subsection*{Bahasa Indonesia}
%%
%% Alur baca yang direkomendasikan untuk pengguna baru:
%%
%% \begin{enumerate}
%%   \item Instalasi
%%   \item Paket yang dibutuhkan
%%   \item Opsi kelas
%%   \item Perintah metadata
%%   \item Halaman awal
%%   \item Tata letak isi dan perintah konten
%%   \item Lampiran, glosarium, dan daftar kode program
%% \end{enumerate}
%%
%% \newpage
%%
%% %-----------------------------------------------------------------------
%% \section{Abstract / Abstrak}
%% %-----------------------------------------------------------------------
%%
%% \subsection*{English}
%%
%% The \textsf{uithesis} document class provides a configurable
%% \LaTeX{} template for writing undergraduate theses (\emph{Skripsi}),
%% master's theses (\emph{Tesis}), doctoral dissertations
%% (\emph{Disertasi}), internship reports (\emph{Laporan Kerja Praktik}),
%% and independent-study reports (\emph{Kampus Merdeka}) at Universitas
%% Indonesia (UI).  Front matter, body layout, bilingual typesetting
%% (Indonesian and English), citation styles, glossary integration, and
%% code-listing support are all handled by the class.
%%
%% \subsection*{Bahasa Indonesia}
%%
%% Kelas dokumen \textsf{uithesis} menyediakan templat \LaTeX{} yang
%% dapat dikonfigurasi untuk penulisan skripsi, tesis,
%% disertasi, laporan kerja praktik, dan laporan Kampus Merdeka di
%% Universitas Indonesia (UI).  Halaman awal, tata letak isi,
%% pengetikan dwibahasa (Indonesia dan Inggris), gaya sitasi,
%% integrasi glosarium, dan tampilan kode program ditangani oleh kelas.
%%
%% \newpage
%%
%% %-----------------------------------------------------------------------
%% \section{Installation / Instalasi}
%% %-----------------------------------------------------------------------
%%
%% \subsection{From TeX Live / CTAN (Dari TeX Live / CTAN)}
%%
%% \subsubsection*{English}
%%
%% Once the package is available on CTAN, install via TeX Live:
%%
%% \begin{verbatim}
%%   tlmgr install uithesis
%% \end{verbatim}
%%
%% This places \texttt{uithesis.cls} and the companion Makara logo images
%% on the TeX search path automatically.
%%
%% \subsubsection*{Bahasa Indonesia}
%%
%% Setelah paket tersedia di CTAN, instal melalui TeX Live:
%%
%% \begin{verbatim}
%%   tlmgr install uithesis
%% \end{verbatim}
%%
%% Perintah ini menempatkan \texttt{uithesis.cls} dan gambar logo
%% Makara ke dalam \emph{search path} TeX secara otomatis.
%%
%% \subsection{Manual Installation from Source / Instalasi Manual dari Sumber}
%%
%% \subsubsection*{English}
%%
%% \begin{enumerate}
%%   \item Clone the repository or download the source archive.
%%   \item Run \texttt{tex uithesis.ins} in the repository root.
%%         This extracts \texttt{uithesis.cls} from \texttt{uithesis.dtx}.
%%   \item Copy \texttt{uithesis.cls} and companion Makara image files
%%         to the same directory as your thesis \texttt{.tex} file,
%%         or install them to your local \texttt{TEXMFHOME} tree.
%% \end{enumerate}
%%
%% \subsubsection*{Bahasa Indonesia}
%%
%% \begin{enumerate}
%%   \item Clone repositori atau unduh arsip sumber.
%%   \item Jalankan \texttt{tex uithesis.ins} di direktori root repositori.
%%         Perintah ini mengekstrak \texttt{uithesis.cls} dari
%%         \texttt{uithesis.dtx}.
%%   \item Salin \texttt{uithesis.cls} dan berkas gambar Makara pendamping
%%         ke direktori yang sama dengan berkas
%%         \texttt{.tex} tesis, atau instal ke pohon
%%         \texttt{TEXMFHOME} lokal.
%% \end{enumerate}
%%
%% \newpage
%%
%% %-----------------------------------------------------------------------
%% \section{Required Packages / Paket yang Dibutuhkan}
%% %-----------------------------------------------------------------------
%%
%% \textsf{uithesis} loads the packages in the table below.
%% The third column is bilingual so English and Indonesian descriptions
%% stay aligned.
%%
%% Jika diinstal melalui \texttt{tlmgr install uithesis}, TeX Live akan
%% menyelesaikan dependensi secara otomatis. Pada MiKTeX, paket yang belum
%% tersedia biasanya ditawarkan saat kompilasi.
%%
%% \medskip\noindent
%% {\small
%% \begin{longtable}{@{}l l p{\dimexpr\linewidth-6.2cm\relax}@{}}
%%   \toprule
%%   \textbf{Package (.sty)}  & \textbf{TeX Live package}  & \textbf{Role (EN) / Keterangan (ID)} \\
%%   \midrule
%%   \endhead
%%   \bottomrule
%%   \endfoot
%%   \texttt{xkeyval}         & \texttt{xkeyval}           & Class option parsing / parsing opsi kelas \\
%%   \texttt{pslatex}         & \texttt{psnfss}            & Times New Roman font / font Times New Roman \\
%%   \texttt{setspace}        & \texttt{setspace}          & Line spacing control / pengaturan spasi baris \\
%%   \texttt{geometry}        & \texttt{geometry}          & Page margins and paper size / margin halaman dan ukuran kertas \\
%%   \texttt{babel}           & \texttt{babel}             & Multilingual support (Indonesian + English) / dukungan multibahasa (Indonesia + Inggris) \\
%%   \texttt{afterpage}       & \texttt{afterpage}         & Deferred commands after page break / penjadwalan perintah setelah pindah halaman \\
%%   \texttt{changepage}      & \texttt{changepage}        & Per-page margin adjustment / penyesuaian margin per halaman \\
%%   \texttt{tocbibind}       & \texttt{tocbibind}         & Adds bibliography to table of contents / menambahkan daftar pustaka ke daftar isi \\
%%   \texttt{tocloft}         & \texttt{tocloft}           & Custom table of contents formatting / kustomisasi format daftar isi \\
%%   \texttt{fancyhdr}        & \texttt{fancyhdr}          & Header and footer customisation / kustomisasi header dan footer \\
%%   \texttt{pdfpages}        & \texttt{pdfpages}          & Inserting external PDF pages / menyisipkan halaman PDF eksternal \\
%%   \texttt{hyperref}        & \texttt{hyperref}          & PDF hyperlinks and metadata / hyperlink dan metadata PDF \\
%%   \texttt{url}             & \texttt{url}               & URL typesetting / penulisan URL \\
%%   \texttt{booktabs}        & \texttt{booktabs}          & Publication-quality table rules / garis tabel kualitas publikasi \\
%%   \texttt{multirow}        & \texttt{multirow}          & Multi-row table cells / sel tabel multi-baris \\
%%   \texttt{longtable}       & \texttt{tools}             & Multi-page tables (monograph) / tabel multi-halaman (monograf) \\
%%   \texttt{supertabular}    & \texttt{supertabular}      & Multi-column long tables (2-column journal) / tabel panjang lintas kolom (jurnal dua kolom) \\
%%   \texttt{array}           & \texttt{tools}             & Extended column specifiers / spesifikasi kolom lanjutan \\
%%   \texttt{tabularx}        & \texttt{tools}             & Auto-width table columns / kolom tabel dengan lebar otomatis \\
%%   \texttt{multicol}        & \texttt{tools}             & Multi-column layout / tata letak multi-kolom \\
%%   \texttt{colortbl}        & \texttt{colortbl}          & Coloured table cells / pewarnaan sel tabel \\
%%   \texttt{tcolorbox}       & \texttt{tcolorbox}         & Coloured and framed boxes / kotak berwarna dan berbingkai \\
%%   \texttt{graphicx}        & \texttt{graphics}          & Image inclusion / penyisipan gambar \\
%%   \texttt{wrapfig}         & \texttt{wrapfig}           & Text-wrapped figures / gambar dengan teks mengalir \\
%%   \texttt{float}           & \texttt{float}             & Float placement control / pengaturan peletakan float \\
%%   \texttt{tikz}            & \texttt{pgf}               & Vector graphics (cover page layout) / grafik vektor (tata letak sampul) \\
%%   \texttt{tikzpagenodes}   & \texttt{pgf}               & TikZ page node anchors / anchor node halaman TikZ \\
%%   \texttt{amsmath}         & \texttt{amsmath}           & Mathematical environments / lingkungan matematika \\
%%   \texttt{amsfonts}        & \texttt{amsfonts}          & AMS mathematical fonts / font matematika AMS \\
%%   \texttt{amssymb}         & \texttt{amsfonts}          & AMS mathematical symbols / simbol matematika AMS \\
%%   \texttt{bm}              & \texttt{tools}             & Bold mathematical symbols / simbol matematika tebal \\
%%   \texttt{listings}        & \texttt{listings}          & Source code typesetting / penataan kode sumber \\
%%   \texttt{xcolor}          & \texttt{xcolor}            & Colour support / dukungan warna \\
%%   \texttt{xparse}          & \texttt{xparse}            & Advanced command definitions / definisi perintah lanjutan \\
%%   \texttt{inputenc}        & (base)                     & UTF-8 input encoding / encoding masukan UTF-8 \\
%%   \texttt{csquotes}        & \texttt{csquotes}          & Context-sensitive quotation marks (biblatex) / tanda kutip kontekstual (biblatex) \\
%%   \texttt{biblatex}        & \texttt{biblatex}          & Bibliography management; requires \texttt{biber} / manajemen bibliografi; memerlukan \texttt{biber} \\
%%   \texttt{enumitem}        & \texttt{enumitem}          & List customisation / kustomisasi daftar \\
%%   \texttt{everyshi}        & \texttt{everyshi}          & Page-level processing on each shipout / pemrosesan tingkat halaman pada setiap shipout \\
%%   \texttt{environ}         & \texttt{environ}           & Content-collecting environments / lingkungan pengumpul konten \\
%%   \texttt{etoolbox}        & \texttt{etoolbox}          & LaTeX programming utilities / utilitas pemrograman LaTeX \\
%%   \texttt{subcaption}      & \texttt{caption}           & Sub-figure and sub-table captions / caption sub-gambar dan sub-tabel \\
%%   \texttt{glossaries-extra}& \texttt{glossaries-extra}  & Glossary and acronym management / manajemen glosarium dan akronim \\
%%   \texttt{pdflscape}       & \texttt{pdflscape}         & Landscape pages in PDF output / halaman lanskap pada keluaran PDF \\
%%   \texttt{CJKutf8}         & \texttt{CJK}               & CJK character support / dukungan karakter CJK \\
%%   \texttt{indentfirst}     & \texttt{tools}             & Indents the first paragraph after headings / membuat paragraf pertama setelah judul masuk \\
%%   \texttt{dblfloatfix}     & \texttt{dblfloatfix}       & Improves placement of \texttt{figure*}/\texttt{table*} / memperbaiki peletakan \texttt{figure*}/\texttt{table*} \\
%%   \texttt{cuted}           & \texttt{sttools}           & Provides \env{strip} for full-width blocks / menyediakan \env{strip} untuk blok penuh-lebar \\
%%   \texttt{flushend}        & \texttt{flushend}          & Balances the last-page columns / menyeimbangkan kolom pada halaman terakhir \\
%% \end{longtable}
%% }
%%
%% \bigskip
%%
%% \textbf{Two-column journal-only packages.}
%% In \texttt{format=journal, columns=2}, the following packages are used
%% for layout behavior:
%% \begin{itemize}
%%   \item \texttt{dblfloatfix}: improves placement rules for \texttt{figure*}/\texttt{table*}.
%%   \item \texttt{cuted}: provides \env{strip}, used by \env{UIwideblock} for full-width non-float blocks.
%%   \item \texttt{flushend}: balances the last-page column heights in two-column mode.
%% \end{itemize}
%%
%% \textbf{Paket khusus jurnal dua kolom.}
%% Pada \texttt{format=journal, columns=2}, paket berikut dipakai untuk
%% perilaku tata letak:
%% \begin{itemize}
%%   \item \texttt{dblfloatfix}: memperbaiki peletakan \texttt{figure*}/\texttt{table*}.
%%   \item \texttt{cuted}: menyediakan \env{strip} untuk blok penuh-lebar non-float.
%%   \item \texttt{flushend}: menyeimbangkan kolom pada halaman terakhir.
%% \end{itemize}
%%
%% \textbf{External engine:} \texttt{biber} must be available on the
%% \texttt{PATH} for bibliography processing.  It is shipped with TeX Live
%% (\texttt{tlmgr install biber}) and MiKTeX.
%%
%% \emph{\textbf{Engine eksternal:} \texttt{biber} harus tersedia di
%% \texttt{PATH} untuk pemrosesan daftar pustaka.  Sudah disertakan dalam
%% instalasi TeX Live dan MiKTeX.}
%%
%% \newpage
%%
%% %-----------------------------------------------------------------------
%% \section{Class Options / Opsi Kelas}
%% %-----------------------------------------------------------------------
%%
%% Load the class with the following pattern.
%% Muat kelas dengan pola berikut.
%% \begin{verbatim}
%%   \documentclass[<options>]{uithesis}
%% \end{verbatim}
%%
%% \medskip\noindent
%% {\small
%% \begin{longtable}{@{}p{2.55cm} p{3.1cm} p{1.65cm} p{\dimexpr\linewidth-7.3cm-6\tabcolsep\relax}@{}}
%%   \toprule
%%   \textbf{Option} & \textbf{Values} & \textbf{Default}
%%     & \textbf{Description / Keterangan} \\
%%   \midrule
%%   \endhead
%%   \bottomrule
%%   \endfoot
%%   \texttt{format}  & \texttt{monograph}, \texttt{journal}
%%     & \texttt{monograph}
%%     & \textbf{EN}: Document layout format.
%%       \emph{monograph}: standard thesis layout.
%%       \emph{journal}: two-column journal-like layout. \newline
%%       \textbf{ID}: Format tata letak dokumen.
%%       \emph{monograph}: tata letak tugas akhir standar.
%%       \emph{journal}: tata letak mirip jurnal dua kolom. \\[4pt]
%%   \texttt{type}    & \texttt{Skripsi}, \texttt{Tesis},
%%     \texttt{Disertasi}, \texttt{Laporan Kerja Praktik},
%%     \texttt{Kampus Merdeka}
%%     & \texttt{Skripsi}
%%     & \textbf{EN}: Degree type shown on the cover and approval pages. \newline
%%       \textbf{ID}: Jenis karya yang ditampilkan pada sampul dan halaman pengesahan. \\[4pt]
%%   \texttt{jenjang} & \texttt{Sarjana}, \texttt{Magister},
%%     \texttt{Doktor}
%%     & \texttt{Sarjana}
%%     & \textbf{EN}: Degree level. Must be consistent with \texttt{type}. \newline
%%       \textbf{ID}: Jenjang pendidikan. Harus konsisten dengan \texttt{type}. \\[4pt]
%%   \texttt{lang}    & \texttt{indonesian}, \texttt{english}
%%     & \texttt{indonesian}
%%     & \textbf{EN}: Primary document language. Affects front-matter labels and
%%       hyphenation patterns. \newline
%%       \textbf{ID}: Bahasa utama dokumen. Mempengaruhi label halaman awal dan
%%       pola pemenggalan kata. \\[4pt]
%%   \texttt{citation}& \texttt{apa}, \texttt{ieee}, \texttt{acm},
%%     \texttt{vancouver}, \texttt{mla}, \texttt{harvard},
%%     \texttt{chicago}, \texttt{turabian}, \texttt{acs},
%%     \texttt{nature}, \texttt{science}, \texttt{aip},
%%     \texttt{oscola}, \texttt{custom}
%%     & \texttt{apa}
%%     & \textbf{EN}: Bibliography and citation style preset for document output. \newline
%%       \textbf{ID}: Preset gaya sitasi dan daftar pustaka untuk keluaran dokumen. \\[4pt]
%%   \texttt{print}   & \texttt{twoside}, \texttt{oneside}
%%     & \texttt{twoside}
%%     & \textbf{EN}: Page binding layout. Only valid with \texttt{format=monograph}.
%%       \emph{twoside}: alternating margins for book binding.
%%       \emph{oneside}: uniform margins, suitable for digital submission. \newline
%%       \textbf{ID}: Tata letak penjilidan halaman. Hanya valid dengan \texttt{format=monograph}.
%%       \emph{twoside}: margin bergantian untuk penjilidan buku.
%%       \emph{oneside}: margin seragam, cocok untuk pengumpulan digital. \\[4pt]
%%   \texttt{spacing} & \texttt{calibrated}, \texttt{semantic}
%%     & \texttt{calibrated}
%%     & \textbf{EN}: Line spacing mode.
%%       \emph{calibrated}: 1.4$\times$ baseline (matches UI regulation).
%%       \emph{semantic}: 1.5$\times$ baseline (more readable on screen). \newline
%%       \textbf{ID}: Mode spasi baris.
%%       \emph{calibrated}: baseline 1.4$\times$ (sesuai ketentuan UI).
%%       \emph{semantic}: baseline 1.5$\times$ (lebih nyaman dibaca di layar). \\[4pt]
%%   \texttt{paragraph} & \texttt{noindent}, \texttt{indent}
%%     & \texttt{noindent}
%%     & \textbf{EN}: Paragraph style.
%%       \emph{noindent}: no first-line indent with vertical paragraph spacing.
%%       \emph{indent}: first-line indent with zero paragraph spacing. \newline
%%       \textbf{ID}: Gaya paragraf.
%%       \emph{noindent}: tanpa inden baris pertama dan memakai jarak antarparagraf.
%%       \emph{indent}: dengan inden baris pertama dan tanpa jarak antarparagraf. \\[4pt]
%%   \texttt{columns} & \texttt{1}, \texttt{2}
%%     & \texttt{1}
%%     & \textbf{EN}: Number of body columns. Only valid with \texttt{format=journal}. \newline
%%       \textbf{ID}: Jumlah kolom isi dokumen. Hanya valid dengan \texttt{format=journal}. \\
%%   \texttt{plagiarismcheck} & \texttt{false}, \texttt{true}
%%     & \texttt{false}
%%     & \textbf{EN}: If \texttt{true}, all headers and footers are disabled for plagiarism-check submission copies. \newline
%%       \textbf{ID}: Jika \texttt{true}, seluruh header dan footer dimatikan untuk salinan pemeriksaan plagiarisme. \\
%% \end{longtable}
%% }
+
%%
%% \textbf{Advanced citation configuration.}
%% When \texttt{citation=custom} is set, or when the preset requires
%% fine-tuning, the following commands may be called in the preamble.
%%
%% \textbf{Konfigurasi sitasi lanjutan.}
%% Saat \texttt{citation=custom} dipakai, atau saat preset perlu penyesuaian,
%% perintah berikut dapat dipanggil di preamble.
%%
%% \begin{function}{\setuicitationpreset}
%%   \begin{syntax}
%%     \cs{setuicitationpreset}\marg{preset name}
%%   \end{syntax}
%%   Select a named citation preset (same values as the \texttt{citation}
%%   class option).  Call after \cs{documentclass} to change the preset at
%%   runtime without reloading the class.
%%   Memilih preset sitasi bernama (nilainya sama dengan opsi kelas
%%   \texttt{citation}). Panggil setelah \cs{documentclass} untuk mengubah
%%   preset tanpa memuat ulang kelas.
%% \end{function}
%%
%% \begin{function}{\setuicitestyle, \setuibibstyle, \setuibiblatexstyle}
%%   \begin{syntax}
%%     \cs{setuicitestyle}\marg{style}
%%     \cs{setuibibstyle}\marg{style}
%%     \cs{setuibiblatexstyle}\marg{style}
%%   \end{syntax}
%%   Override just the citation style (\cs{setuicitestyle}), bibliography
%%   style (\cs{setuibibstyle}), or set both to the same value
%%   (\cs{setuibiblatexstyle}).  These are applied on top of any preset.
%%   Menimpa gaya sitasi saja (\cs{setuicitestyle}), gaya daftar pustaka saja
%%   (\cs{setuibibstyle}), atau keduanya sekaligus
%%   (\cs{setuibiblatexstyle}). Semua diterapkan di atas preset aktif.
%% \end{function}
%%
%% \begin{function}{\setuicitationmapping, \setuibiblatexoptions}
%%   \begin{syntax}
%%     \cs{setuicitationmapping}\marg{mapping}
%%     \cs{setuibiblatexoptions}\marg{key=value list}
%%   \end{syntax}
%%   Override the \pkg{biblatex} driver mapping (\cs{setuicitationmapping})
%%   or pass extra options to the \pkg{biblatex} package load call
%%   (\cs{setuibiblatexoptions}).
%%   Menimpa \emph{driver mapping} \pkg{biblatex}
%%   (\cs{setuicitationmapping}) atau menambahkan opsi saat pemanggilan
%%   paket \pkg{biblatex} (\cs{setuibiblatexoptions}).
%% \end{function}
%%
%% \newpage
%%
%% %-----------------------------------------------------------------------
%% \section{Metadata Commands / Perintah Metadata}
%% %-----------------------------------------------------------------------
%%
%% \subsection*{English}
%%
%% All metadata commands are declared in the preamble (before
%% \cs{begin}\marg{document}) and are consumed by \cs{makefrontmatter}.
%%
%% \begin{function}{\judul}
%%   \begin{syntax}
%%     \cs{judul}\marg{Indonesian title}
%%   \end{syntax}
%%   Thesis title in Indonesian.
%% \end{function}
%%
%% \begin{function}{\judulInggris}
%%   \begin{syntax}
%%     \cs{judulInggris}\marg{English title}
%%   \end{syntax}
%%   Thesis title in English.
%% \end{function}
%%
%% \begin{function}{\penulis}
%%   \begin{syntax}
%%     \cs{penulis}\marg{Full name}
%%   \end{syntax}
%%   Author's full name.  Repeat for each co-author (group thesis).
%% \end{function}
%%
%% \begin{function}{\npm}
%%   \begin{syntax}
%%     \cs{npm}\marg{Student ID}
%%   \end{syntax}
%%   Student identification number (NPM).  Repeat alongside each \cs{penulis}.
%% \end{function}
%%
%% \begin{function}{\programStudi}
%%   \begin{syntax}
%%     \cs{programStudi}\marg{Indonesian name}\marg{English name}
%%   \end{syntax}
%%   Study programme name in both languages.  Repeat alongside each author.
%% \end{function}
%%
%% \begin{function}{\fakultas}
%%   \begin{syntax}
%%     \cs{fakultas}\marg{Indonesian name}\marg{English name}
%%   \end{syntax}
%%   Faculty or school name in both languages.
%% \end{function}
%%
%% \begin{function}{\gelar}
%%   \begin{syntax}
%%     \cs{gelar}\marg{degree}
%%   \end{syntax}
%%   Degree title (e.g., \emph{Sarjana Komputer (S.Kom.)}).
%% \end{function}
%%
%% \begin{function}{\bulanTahun}
%%   \begin{syntax}
%%     \cs{bulanTahun}\marg{Month Year}
%%   \end{syntax}
%%   Publication month and year (e.g., \emph{Mei 2026}).
%% \end{function}
%%
%% \begin{function}{\pembimbing}
%%   \begin{syntax}
%%     \cs{pembimbing}\marg{Name}
%%   \end{syntax}
%%   Supervisor's full name.  Repeat for each co-supervisor.
%% \end{function}
%%
%% \begin{function}{\penguji}
%%   \begin{syntax}
%%     \cs{penguji}\marg{Name}
%%   \end{syntax}
%%   Examiner's full name.  Repeat for each examiner.
%% \end{function}
%%
%% \begin{function}{\tanggalSiapSidang}
%%   \begin{syntax}
%%     \cs{tanggalSiapSidang}\marg{Date}
%%   \end{syntax}
%%   Date the document was submitted to examiners.
%% \end{function}
%%
%% \begin{function}{\tanggalLulus}
%%   \begin{syntax}
%%     \cs{tanggalLulus}\marg{Date}
%%   \end{syntax}
%%   Graduation date from the defence.
%% \end{function}
%%
%% \begin{function}{\kota}
%%   \begin{syntax}
%%     \cs{kota}\marg{kota}
%%   \end{syntax}
%%   City where you attended university (e.g., \emph{Depok}).
%% \end{function}
%%
%% \begin{function}{\setmakaraimage}
%%   \begin{syntax}
%%     \cs{setmakaraimage}\marg{path}
%%   \end{syntax}
%%   Override the Makara UI logo path.  Useful when the class is installed
%%   in a non-standard location.
%% \end{function}
%%
%% \begin{function}{\kampusMerdekaType}
%%   \begin{syntax}
%%     \cs{kampusMerdekaType}\marg{activity type}
%%   \end{syntax}
%%   Name of the Kampus Merdeka activity (e.g., \emph{MSIB Batch 7}).
%%   Used in the approval page when \texttt{type=Kampus Merdeka}.
%% \end{function}
%%
%% \begin{function}{\mitra}
%%   \begin{syntax}
%%     \cs{mitra}\marg{position}\marg{institution}
%%   \end{syntax}
%%   Partner supervisor details for the Kampus Merdeka approval page.
%%   \meta{position} is the supervisor's role (e.g., \emph{Cohort Manager})
%%   and \meta{institution} is the partner institution name
%%   (e.g., \emph{Bangkit Academy 2024}).
%% \end{function}
%%
%% \begin{function}{\aiplatform}
%%   \begin{syntax}
%%     \cs{aiplatform}\marg{platform name}
%%   \end{syntax}
%%   AI platform used during the preparation of this work
%%   (e.g., \emph{GitHub Copilot}).
%%   The AI-use declaration page is always included in the front matter.
%%   When \meta{platform name} is empty, the page contains a statement that
%%   no Artificial Intelligence technology was used.
%%   When non-empty, the page states that AI was used on the named platform
%%   for the purpose given by \cs{tujuanai}.
%% \end{function}
%%
%% \begin{function}{\tujuanai}
%%   \begin{syntax}
%%     \cs{tujuanai}\marg{purpose}
%%   \end{syntax}
%%   Purpose for which the AI platform was used
%%   (e.g., \emph{membantu penulisan kode}).
%%   Only rendered when \cs{aiplatform} is non-empty.
%% \end{function}
%%
%% \begin{function}{\tahunAkademik}
%%   \begin{syntax}
%%     \cs{tahunAkademik}\marg{academic year}
%%   \end{syntax}
%%   Academic-year text shown on the declaration letter page
%%   (\emph{Surat Pernyataan}).
%% \end{function}
%%
%% \begin{function}{\pengesahanPDF}
%%   \begin{syntax}
%%     \cs{pengesahanPDF}\marg{filename}
%%   \end{syntax}
%%   Supply an externally-signed approval page as a PDF file
%%   (filename without the \texttt{.pdf} extension).  When provided,
%%   the class replaces the auto-generated approval page layout with
%%   the given PDF.  Omit this command to use the generated layout.
%% \end{function}
%%
%% \begin{function}{\namaTipeTesis}
%%   \begin{syntax}
%%     \cs{namaTipeTesis}\marg{Indonesian name}\marg{English name}
%%   \end{syntax}
%%   Override the display name for the thesis type on cover and front-matter
%%   pages.  Use when the \texttt{type} option does not match the required
%%   title; both language variants must be supplied.
%% \end{function}
%%
%% \subsection*{Bahasa Indonesia}
%%
%% Semua perintah metadata dideklarasikan di preamble (sebelum
%% \cs{begin}\marg{document}) dan diproses oleh \cs{makefrontmatter}.
%%
%% \begin{itemize}
%%   \item \cs{judul}\marg{judul ID}: judul tesis dalam bahasa Indonesia.
%%   \item \cs{judulInggris}\marg{judul EN}: judul dalam bahasa Inggris.
%%   \item \cs{penulis}\marg{nama}: nama lengkap penulis; ulangi untuk
%%         setiap anggota (tugas akhir kelompok).
%%   \item \cs{npm}\marg{NPM}: nomor pokok mahasiswa; ulangi bersama
%%         setiap \cs{penulis}.
%%   \item \cs{programStudi}\marg{ID}\marg{EN}: nama program studi;
%%         ulangi bersama setiap anggota.
%%   \item \cs{fakultas}\marg{ID}\marg{EN}: nama fakultas/sekolah.
%%   \item \cs{gelar}\marg{gelar}: gelar yang diperoleh.
%%   \item \cs{bulanTahun}\marg{Bulan Tahun}: bulan dan tahun publikasi.
%%   \item \cs{tahunAkademik}\marg{tahun akademik}: teks tahun akademik
%%         untuk halaman surat pernyataan.
%%   \item \cs{pembimbing}\marg{nama}: nama dosen pembimbing;
%%         ulangi untuk ko-pembimbing.
%%   \item \cs{penguji}\marg{nama}: nama dosen penguji;
%%         ulangi untuk setiap penguji.
%%   \item \cs{tanggalSiapSidang}\marg{tanggal}: tanggal penyerahan
%%         ke penguji/sekretariat.
%%   \item \cs{tanggalLulus}\marg{tanggal}: tanggal kelulusan sidang.
%%   \item \cs{kota}\marg{kota}: kota tempat kuliah (contoh: \emph{Depok}).
%%         (bawaan: \texttt{Depok}).
%%   \item \cs{setmakaraimage}\marg{jalur}: mengganti jalur gambar
%%         logo Makara UI.
%%   \item \cs{pengesahanPDF}\marg{berkas}: lembar pengesahan dari PDF
%%         eksternal; menggantikan tata letak bawaan jika diisi.
%%   \item \cs{namaTipeTesis}\marg{ID}\marg{EN}: mengganti tampilan nama
%%         tipe karya pada halaman sampul dan halaman awal.
%%   \item \cs{kampusMerdekaType}\marg{nama kegiatan}: nama kegiatan Kampus Merdeka
%%         (contoh: \emph{MSIB Batch 7}); dipakai di halaman pengesahan
%%         saat \texttt{type=Kampus Merdeka}.
%%   \item \cs{mitra}\marg{jabatan}\marg{instansi}: data penanggung jawab mitra
%%         untuk halaman pengesahan Kampus Merdeka.
%%         Contoh: \cs{mitra}\texttt{\{Cohort Manager\}\{Bangkit Academy 2024\}}.
%%   \item \cs{aiplatform}\marg{nama platform}: nama platform AI yang dipakai
%%         (contoh: \emph{GitHub Copilot}).
%%         Halaman pernyataan AI selalu dicetak.
%%         Jika kosong, halaman menyatakan bahwa tidak ada AI yang digunakan.
%%         Jika berisi, halaman menyatakan penggunaan AI pada platform tersebut
%%         untuk tujuan yang diberikan oleh \cs{tujuanai}.
%%   \item \cs{tujuanai}\marg{tujuan}: tujuan penggunaan platform AI
%%         (contoh: \emph{membantu penulisan kode}).
%%         Hanya ditampilkan jika \cs{aiplatform} tidak kosong.
%% \end{itemize}
%%
%% \newpage
%%
%% %-----------------------------------------------------------------------
%% \section{Front Matter / Halaman Awal}
%% %-----------------------------------------------------------------------
%%
%% \subsection*{English}
%%
%% Content for the front-matter pages is declared before
%% \cs{begin}\marg{document} using the environments below, then rendered
%% all at once by \cs{makefrontmatter}.
%%
%% \begin{function}{abstrakID}
%%   \begin{syntax}
%%     \cs{begin}\marg{abstrakID} \ldots \cs{end}\marg{abstrakID}
%%     \cs{katakunci}\marg{keywords}
%%   \end{syntax}
%%   Indonesian abstract text.  \cs{katakunci} supplies the comma-separated
%%   keywords; it must follow immediately after \cs{end}\marg{abstrakID}.
%% \end{function}
%%
%% \begin{function}{abstractEN}
%%   \begin{syntax}
%%     \cs{begin}\marg{abstractEN} \ldots \cs{end}\marg{abstractEN}
%%     \cs{keywords}\marg{keywords}
%%   \end{syntax}
%%   English abstract text, with \cs{keywords} for the keyword list.
%% \end{function}
%%
%% \begin{function}{kataPengantar}
%%   \begin{syntax}
%%     \cs{begin}\marg{kataPengantar} \ldots \cs{end}\marg{kataPengantar}
%%   \end{syntax}
%%   Preface text.  Optional; typically omitted for \texttt{Kampus Merdeka}
%%   and internship reports.
%% \end{function}

%% \begin{function}{pernyataanOrisinalitas}
%%   \begin{syntax}
%%     \cs{begin}\marg{pernyataanOrisinalitas} \ldots \cs{end}\marg{pernyataanOrisinalitas}
%%   \end{syntax}
%%   Optional override body for the originality statement page.
%% \end{function}

%% \begin{function}{persetujuanPublikasi}
%%   \begin{syntax}
%%     \cs{begin}\marg{persetujuanPublikasi} \ldots \cs{end}\marg{persetujuanPublikasi}
%%   \end{syntax}
%%   Optional override body for the publication-consent page.
%% \end{function}
%%
%% \begin{function}{\makefrontmatter}
%%   Typesets all front-matter pages in the required order: cover, inner
%%   title page, approval page, originality statement, AI-use declaration,
%%   declaration letter, abstract pages, and list pages.
%%   Preface and publication-consent pages are included for thesis/dissertation
%%   flows (and omitted for internship and Kampus Merdeka flows).
%%   The AI-use declaration
%%   (states AI use if \cs{aiplatform} is set, otherwise states no AI was used),
%%   and table/list pages are always handled by this command.
%% \end{function}

%% \begin{function}{pernyataanAI}
%%   \begin{syntax}
%%     \cs{begin}\marg{pernyataanAI} \ldots \cs{end}\marg{pernyataanAI}
%%   \end{syntax}
%%   Optional override body for the AI-use declaration page.
%%   If this environment is omitted, the class generates the statement
%%   automatically from \cs{aiplatform} and \cs{tujuanai}.
%% \end{function}

%% \begin{function}{suratPernyataan}
%%   \begin{syntax}
%%     \cs{begin}\marg{suratPernyataan} \ldots \cs{end}\marg{suratPernyataan}
%%   \end{syntax}
%%   Optional override body for the declaration letter page.
%% \end{function}
%%
%% \begin{function}{\makebibliography}
%%   Prints the bibliography.  Call after all body chapters.
%% \end{function}
%%
%% \begin{function}{\makeglossarypage}
%%   Prints the glossary (monograph format only).
%%   Call after \cs{makebibliography}.
%% \end{function}
%%
%% \subsection*{Bahasa Indonesia}
%%
%% Konten halaman awal dideklarasikan menggunakan lingkungan di bawah
%% sebelum \cs{begin}\marg{document}, lalu dicetak sekaligus oleh
%% \cs{makefrontmatter}.
%%
%% \begin{itemize}
%%   \item Lingkungan \env{abstrakID}: teks abstrak bahasa Indonesia,
%%         diikuti \cs{katakunci}\marg{kata kunci}.
%%   \item Lingkungan \env{abstractEN}: teks abstrak bahasa Inggris,
%%         diikuti \cs{keywords}\marg{keywords}.
%%   \item Lingkungan \env{kataPengantar}: kata pengantar (opsional).
%%   \item Lingkungan \env{pernyataanOrisinalitas}: isi kustom untuk halaman
%%         pernyataan orisinalitas (opsional).
%%   \item Lingkungan \env{persetujuanPublikasi}: isi kustom untuk halaman
%%         persetujuan publikasi (opsional).
%%   \item \cs{makefrontmatter}: mencetak seluruh halaman awal secara
%%         berurutan: sampul, judul dalam, pengesahan, orisinalitas,
%%         pernyataan AI, surat pernyataan,
%%         abstrak, serta halaman daftar.
%%         Kata pengantar dan persetujuan publikasi dicetak pada alur
%%         Skripsi/Tesis/Disertasi, dan dilewati pada alur KP/MBKM.
%%   \item Lingkungan \env{pernyataanAI}: isi kustom untuk halaman
%%         pernyataan penggunaan AI (opsional).
%%   \item Lingkungan \env{suratPernyataan}: isi kustom untuk halaman
%%         surat pernyataan (opsional).
%%   \item \cs{makebibliography}: mencetak daftar referensi.
%%   \item \cs{makeglossarypage}: mencetak daftar istilah (hanya monograf).
%% \end{itemize}
%%
%% \newpage
%%
%% %-----------------------------------------------------------------------
%% \section{Content Layout / Tata Letak Isi}
%% %-----------------------------------------------------------------------
%%
%% \subsection{Document Spacing Behavior / Perilaku Spasi Dokumen}
%%
%% \subsubsection*{English}
%%
%% Spacing behavior is controlled by the public class option
%% \texttt{spacing=calibrated\textbar semantic}.
%%
%% \begin{itemize}
%%   \item \texttt{spacing=calibrated}: uses the spacing profile tuned to
%%         match current UI formatting expectations.
%%   \item \texttt{spacing=semantic}: uses semantic one-and-a-half spacing
%%         (more readable for iterative drafting).
%% \end{itemize}
%%
%% In normal usage, no manual spacing constant tuning is required.
%% Advanced spacing customisation is documented in Part II
%% (Maintainer Guide).
%%
%% \subsubsection*{Bahasa Indonesia}
%%
%% Perilaku spasi dikendalikan oleh opsi kelas publik
%% \texttt{spacing=calibrated\textbar semantic}.
%%
%% \begin{itemize}
%%   \item \texttt{spacing=calibrated}: memakai profil spasi yang sudah
%%         disetel agar sesuai ketentuan format UI saat ini.
%%   \item \texttt{spacing=semantic}: memakai spasi satu-setengah untuk
%%         kebutuhan penulisan dan telaah draf.
%% \end{itemize}
%%
%% Untuk pemakaian normal, pengguna tidak perlu melakukan penyetelan
%% konstanta spasi secara manual. Kustomisasi spasi lanjutan dijelaskan pada Bagian II
%% (Panduan Maintainer).
%%
%% \newpage
%%
%% %-----------------------------------------------------------------------
%% \section{Content Commands / Perintah Konten}
%% %-----------------------------------------------------------------------
%%
%% \subsection*{English}
%%
%% \subsubsection*{Label shorthand aliases.}
%% Expand to the localised label word; combine with \cs{ref} for
%% cross-references.
%%
%% \begin{function}{\bab, \sect, \pic, \tab, \equ, \lst, \apdx}
%%   Label words for chapters, sections, figures, tables, equations,
%%   code listings, and appendices, respectively.
%%   Example: \cs{pic}~\cs{ref}\{fig:example\} produces \emph{Gambar~1.1}.
%% \end{function}
%%
%% \subsubsection*{Text formatting.}
%%
%% \begin{function}{\f}
%%   \begin{syntax}
%%     \cs{f}\marg{term}
%%   \end{syntax}
%%   Foreign-language or domain-specific term in italic.
%% \end{function}
%%
%% \begin{function}{\bo}
%%   \begin{syntax}
%%     \cs{bo}\marg{text}
%%   \end{syntax}
%%   Bold text.
%% \end{function}
%%
%% \begin{function}{\bi}
%%   \begin{syntax}
%%     \cs{bi}\marg{text}
%%   \end{syntax}
%%   Bold italic text.
%% \end{function}
%%
%% \begin{function}{\code}
%%   \begin{syntax}
%%     \cs{code}\marg{snippet}
%%   \end{syntax}
%%   Inline code in typewriter font.
%% \end{function}
%%
%% \begin{function}{\m, \mc}
%%   \begin{syntax}
%%     \cs{m}\marg{expr}\quad \cs{mc}\marg{expr}
%%   \end{syntax}
%%   Bold-math inline (\cs{m}) and display (\cs{mc}).
%% \end{function}
%%
%% \subsubsection*{Utility.}
%%
%% \begin{function}{\todo}
%%   \begin{syntax}
%%     \cs{todo}\marg{text}
%%   \end{syntax}
%%   Highlighted placeholder box.  Remove all \cs{todo} calls before
%%   final submission.
%% \end{function}
%%
%% \begin{function}{\captionsource, \captionsourcecont}
%%   \begin{syntax}
%%     \cs{captionsource}\marg{caption}\marg{source}
%%     \cs{captionsourcecont}\marg{caption}\marg{source}
%%   \end{syntax}
%%   Caption with a source attribution line.  Use \cs{captionsourcecont}
%%   on continuation pages of multi-page tables. Caption text is 12pt;
%%   the source line is 10pt.
%% \end{function}
%%
%% \begin{function}{\inpdf, \putpdf}
%%   \begin{syntax}
%%     \cs{inpdf}\marg{filename}\quad \cs{putpdf}\marg{filename}
%%   \end{syntax}
%%   Insert an external PDF (filename without the \texttt{.pdf} extension).
%%   \cs{inpdf} preserves the running header; \cs{putpdf} inserts bare pages.
%% \end{function}
%%
%% \begin{function}{\blankpage}
%%   \begin{syntax}
%%     \cs{blankpage}
%%   \end{syntax}
%%   Insert a blank page (no header, footer, or page number).
%%   In \texttt{print=oneside} mode this is a no-op.
%% \end{function}
%%
%% \begin{function}{\addequtotoc}
%%   \begin{syntax}
%%     \cs{addequtotoc}\marg{label}\marg{caption text}
%%   \end{syntax}
%%   Manually register a labelled equation in the List of Equations.
%%   Call immediately after the equation environment, passing the
%%   \cs{label} key and the equation description.
%% \end{function}
%%
%% \begin{function}{\minimumListEntries}
%%   \begin{syntax}
%%     \cs{minimumListEntries}\marg{N}
%%   \end{syntax}
%%   Set the minimum number of entries a list must have before its page
%%   is included in the front matter.  The default is \texttt{0}
%%   (always include).  Call in the preamble.
%% \end{function}
%%
%% \subsubsection*{Page control.}
%%
%% \begin{function}{\clearchapter}
%%   Flush all floats, issue a page break, and advance to the correct
%%   physical side for the next chapter (odd page in two-sided print,
%%   accounting for intentionally unnumbered blank pages).  In journal
%%   format this is a no-op.  Called automatically between chapters;
%%   expose it explicitly only when the automatic call is insufficient.
%% \end{function}
%%
%% \begin{function}{\forceclearchapter}
%%   Like \cs{clearchapter} but always inserts a blank verso page in
%%   two-sided print regardless of the current page parity.  Use this
%%   when an unconditional physical blank page is required.  In journal
%%   format this is a no-op.
%% \end{function}
%%
%% \subsubsection*{Header and footer customization (monograph only).}
%%
%% The following three commands reconfigure the \pkg{fancyhdr} running
%% styles for chapter body pages.  They are stubs (no-ops) in journal
%% format.  Call them in the preamble or at the start of the body.
%%
%% \begin{function}{\setfirstheaderfooter}
%%   Configure the header and footer for the first page of each chapter
%%   (the page that uses the \texttt{plain} style).
%% \end{function}
%%
%% \begin{function}{\setoddevenheader}
%%   Configure the running header for chapter body pages.  In two-sided
%%   print, the page number appears on the outer margin of each page.
%% \end{function}
%%
%% \begin{function}{\setoddevenfooter}
%%   Configure the running footer for chapter body pages (institutional
%%   text placed on the outer margin in two-sided print).
%% \end{function}
%%
%% \subsubsection*{Table-of-contents customisation.}
%%
%% \begin{function}{\enableboldchapterintoc, \disableboldchapterintoc}
%%   Toggle bold formatting for chapter entries in the table of contents.
%%   The class default is bold; call \cs{disableboldchapterintoc} to
%%   revert to normal weight.
%% \end{function}
%%
%% \begin{function}{\CAPinToC, \noCAPinToC}
%%   Toggle all-caps rendering of chapter titles in the table of
%%   contents.  \cs{CAPinToC} is the default for Indonesian-language
%%   documents; \cs{noCAPinToC} is the default for English-language
%%   documents.
%% \end{function}
%%
%% \begin{function}{\enablechapterseparatorspaceinlists, \disablechapterseparatorspaceinlists}
%%   Toggle chapter-separator vertical spacing in list pages.  The default is
%%   enabled.  It applies to all list pages, including user-defined lists from
%%   \cs{newUIlist}, and excludes the appendix list (Daftar Lampiran).
%% \end{function}
%%
%% \subsubsection*{Custom lists.}
%%
%% \begin{function}{\newUIlist}
%%   Declares a new list-of-objects with a custom caption type.
%%   \begin{itemize}
%%     \item \meta{ext}: file-extension stem (e.g., \texttt{lotr}).
%%     \item \meta{type}: \cs{caption} type name
%%           (e.g., \texttt{transformationrule}).
%%     \item \meta{label}: label word used with \cs{ref}
%%           (e.g., \texttt{Aturan Transformasi}).
%%     \item \meta{list title}: list page heading
%%           (e.g., \texttt{Daftar Aturan Transformasi}).
%%   \end{itemize}
%%   Declare in the preamble; the list automatically appears in the
%%   front matter.
%% \end{function}
%%
%% \subsubsection*{Long tables.}
%%
%% \begin{function}{UIlongtable}
%%   \begin{syntax}
%%     \cs{UIlongtablecaption}\marg{caption text}
%%     \cs{UIlongtablelabel}\marg{label key}
%%     \cs{UIlongtablecols}\marg{N}
%%     \cs{UIlongtablefirsthead}\marg{header rows}
%%     \cs{UIlongtablehead}\marg{continuation header rows}
%%     \cs{UIlongtabletail}\marg{footer rows}
%%     \cs{UIlongtablelasttail}\marg{last-section footer rows}
%%     \cs{begin}\{UIlongtable\}\marg{column spec} \meta{rows} \cs{end}\{UIlongtable\}
%%   \end{syntax}
%%   Long table that can span pages or columns.
%%   Call the seven setup commands \emph{before} \cs{begin}\{UIlongtable\}.
%%   In one-column mode (\texttt{format=monograph}), behavior follows
%%   standard multi-page table flow.
%%   In two-column mode (\texttt{format=journal, columns=2}), the
%%   environment keeps table chunks readable across column/page continuations.
%%   \cs{UIlongtablecols}\marg{N} sets the total number of columns.
%%   When set, the class prepends
%%   \enquote{\tablename~N: caption~\textit{(sambungan)}}
%%   to \cs{UIlongtablehead} for continuation parts.
%%   If the caption is wider than the natural table width, continuation
%%   columns can expand. Omit \cs{UIlongtablecols} and define
%%   \cs{UIlongtablehead} manually to prevent this.
%%   The column specification uses the same syntax as \env{tabular}.
%% \end{function}
%%
%% \subsection*{Bahasa Indonesia}
%%
%% \subsubsection*{Label pintasan.}
%% Mengembang ke kata label yang sesuai bahasa dokumen;
%% gabungkan dengan \cs{ref} untuk referensi silang.
%%
%% \begin{function}{\bab, \sect, \pic, \tab, \equ, \lst, \apdx}
%%   Kata label untuk bab, subbab, gambar, tabel, persamaan,
%%   kode program, dan lampiran.
%%   Contoh: \cs{pic}~\cs{ref}\{fig:example\} menghasilkan
%%   \emph{Gambar~1.1}.
%% \end{function}
%%
%% \subsubsection*{Pemformatan teks.}
%%
%% \begin{function}{\f}
%%   \begin{syntax}
%%     \cs{f}\marg{istilah}
%%   \end{syntax}
%%   Istilah asing atau istilah domain dalam cetak miring.
%% \end{function}
%%
%% \begin{function}{\bo}
%%   \begin{syntax}
%%     \cs{bo}\marg{teks}
%%   \end{syntax}
%%   Cetak tebal.
%% \end{function}
%%
%% \begin{function}{\bi}
%%   \begin{syntax}
%%     \cs{bi}\marg{teks}
%%   \end{syntax}
%%   Cetak tebal-miring.
%% \end{function}
%%
%% \begin{function}{\code}
%%   \begin{syntax}
%%     \cs{code}\marg{cuplikan}
%%   \end{syntax}
%%   Kode sebaris dengan huruf mesin tik.
%% \end{function}
%%
%% \begin{function}{\m, \mc}
%%   \begin{syntax}
%%     \cs{m}\marg{ekspresi}\quad \cs{mc}\marg{ekspresi}
%%   \end{syntax}
%%   Persamaan matematika tebal untuk mode sebaris (\cs{m})
%%   dan mode tampilan (\cs{mc}).
%% \end{function}
%%
%% \subsubsection*{Utilitas.}
%%
%% \begin{function}{\todo}
%%   \begin{syntax}
%%     \cs{todo}\marg{teks}
%%   \end{syntax}
%%   Kotak placeholder berpenyorot. Semua \cs{todo} harus dihapus
%%   sebelum pengumpulan akhir.
%% \end{function}
%%
%% \begin{function}{\captionsource, \captionsourcecont}
%%   \begin{syntax}
%%     \cs{captionsource}\marg{judul}\marg{sumber}
%%     \cs{captionsourcecont}\marg{judul}\marg{sumber}
%%   \end{syntax}
%%   Caption dengan baris atribusi sumber.
%%   Gunakan \cs{captionsourcecont} pada halaman lanjutan tabel multi-halaman.
%%   Teks caption berukuran 12pt, baris sumber berukuran 10pt.
%% \end{function}
%%
%% \begin{function}{\inpdf, \putpdf}
%%   \begin{syntax}
%%     \cs{inpdf}\marg{berkas}\quad \cs{putpdf}\marg{berkas}
%%   \end{syntax}
%%   Menyisipkan PDF eksternal (nama berkas tanpa ekstensi \texttt{.pdf}).
%%   \cs{inpdf} mempertahankan header berjalan, sedangkan \cs{putpdf}
%%   menyisipkan halaman polos.
%% \end{function}
%%
%% \begin{function}{\blankpage}
%%   \begin{syntax}
%%     \cs{blankpage}
%%   \end{syntax}
%%   Menyisipkan halaman kosong (tanpa header, footer, atau nomor halaman).
%%   Pada mode \texttt{print=oneside}, perintah ini tidak melakukan apa pun.
%% \end{function}
%%
%% \begin{function}{\addequtotoc}
%%   \begin{syntax}
%%     \cs{addequtotoc}\marg{label}\marg{teks caption}
%%   \end{syntax}
%%   Mendaftarkan persamaan berlabel secara manual ke Daftar Persamaan.
%%   Panggil tepat setelah lingkungan persamaan, dengan memberikan
%%   kunci \cs{label} dan deskripsi persamaan.
%% \end{function}
%%
%% \begin{function}{\minimumListEntries}
%%   \begin{syntax}
%%     \cs{minimumListEntries}\marg{N}
%%   \end{syntax}
%%   Menetapkan jumlah minimum entri agar halaman daftar dimunculkan
%%   pada halaman awal. Nilai bawaan \texttt{0} (selalu ditampilkan).
%%   Panggil di preamble.
%% \end{function}
%%
%% \subsubsection*{Kontrol halaman.}
%%
%% \begin{function}{\clearchapter}
%%   Mengosongkan semua float, memutus halaman, lalu berpindah ke sisi
%%   fisik yang benar untuk bab berikutnya (halaman ganjil pada cetak dua sisi,
%%   dengan memperhitungkan halaman kosong tanpa nomor yang memang disisipkan).
%%   Pada format jurnal, perintah ini tidak melakukan apa pun.
%%   Dipanggil otomatis antar-bab, paparkan manual hanya jika pemanggilan
%%   otomatis belum cukup.
%% \end{function}
%%
%% \begin{function}{\forceclearchapter}
%%   Mirip \cs{clearchapter}, tetapi selalu menyisipkan halaman verso kosong
%%   pada cetak dua sisi tanpa melihat paritas halaman saat ini.
%%   Gunakan saat halaman kosong fisik harus selalu ada.
%%   Pada format jurnal, perintah ini tidak melakukan apa pun.
%% \end{function}
%%
%% \subsubsection*{Kustomisasi header dan footer (khusus monograf).}
%%
%% Tiga perintah berikut mengatur ulang gaya halaman berjalan \pkg{fancyhdr}
%% untuk halaman isi bab. Pada format jurnal, ketiganya adalah
%% \emph{no-op}.
%% Panggil di preamble atau di awal isi dokumen.
%%
%% \begin{function}{\setfirstheaderfooter}
%%   Mengatur header dan footer untuk halaman pertama setiap bab
%%   (halaman dengan gaya \texttt{plain}).
%% \end{function}
%%
%% \begin{function}{\setoddevenheader}
%%   Mengatur header berjalan untuk halaman isi bab.
%%   Pada cetak dua sisi, nomor halaman ditempatkan di margin luar.
%% \end{function}
%%
%% \begin{function}{\setoddevenfooter}
%%   Mengatur footer berjalan untuk halaman isi bab
%%   (teks institusi pada margin luar untuk cetak dua sisi).
%% \end{function}
%%
%% \subsubsection*{Kustomisasi daftar isi.}
%%
%% \begin{function}{\enableboldchapterintoc, \disableboldchapterintoc}
%%   Mengaktifkan/menonaktifkan format tebal untuk entri bab pada Daftar Isi.
%%   Bawaan kelas adalah tebal; panggil \cs{disableboldchapterintoc}
%%   untuk kembali ke bobot normal.
%% \end{function}
%%
%% \begin{function}{\CAPinToC, \noCAPinToC}
%%   Mengaktifkan/menonaktifkan kapital semua pada judul bab di Daftar Isi.
%%   \cs{CAPinToC} menjadi bawaan untuk dokumen berbahasa Indonesia;
%%   \cs{noCAPinToC} menjadi bawaan untuk dokumen berbahasa Inggris.
%% \end{function}
%%
%% \begin{function}{\enablechapterseparatorspaceinlists, \disablechapterseparatorspaceinlists}
%%   Mengaktifkan/menonaktifkan jarak vertikal pemisah antar-bab pada halaman
%%   daftar. Bawaan kelas adalah aktif. Berlaku untuk semua halaman daftar,
%%   termasuk daftar kustom dari \cs{newUIlist}, dan tetap mengecualikan
%%   Daftar Lampiran.
%% \end{function}
%%
%% \subsubsection*{Daftar kustom.}
%%
%% \begin{function}{\newUIlist}
%%   Mendeklarasikan daftar objek baru dengan tipe caption kustom.
%%   \begin{itemize}
%%     \item \meta{ext}: stem ekstensi berkas (mis.\ \texttt{lotr}).
%%     \item \meta{type}: nama tipe \cs{caption}
%%           (mis.\ \texttt{transformationrule}).
%%     \item \meta{label}: kata label untuk \cs{ref}
%%           (mis.\ \texttt{Aturan Transformasi}).
%%     \item \meta{list title}: judul halaman daftar
%%           (mis.\ \texttt{Daftar Aturan Transformasi}).
%%   \end{itemize}
%%   Deklarasikan di preamble; daftar otomatis muncul di halaman awal.
%% \end{function}
%%
%% \subsubsection*{Tabel panjang.}
%%
%% \begin{function}{UIlongtable}
%%   \begin{syntax}
%%     \cs{UIlongtablecaption}\marg{teks judul}
%%     \cs{UIlongtablelabel}\marg{kunci label}
%%     \cs{UIlongtablecols}\marg{N}
%%     \cs{UIlongtablefirsthead}\marg{baris header}
%%     \cs{UIlongtablehead}\marg{baris header lanjutan}
%%     \cs{UIlongtabletail}\marg{baris footer}
%%     \cs{UIlongtablelasttail}\marg{baris footer bagian akhir}
%%     \cs{begin}\{UIlongtable\}\marg{spesifikasi kolom} \meta{baris} \cs{end}\{UIlongtable\}
%%   \end{syntax}
%%   Tabel panjang yang dapat melintasi halaman atau kolom.
%%   Jalankan tujuh perintah setup \emph{sebelum}
%%   \cs{begin}\{UIlongtable\}.
%%   Pada mode satu kolom (\texttt{format=monograph}), perilaku mengikuti
%%   alur tabel multi-halaman standar.
%%   Pada mode dua kolom (\texttt{format=journal, columns=2}), lingkungan
%%   ini menjaga keterbacaan potongan tabel saat tabel berlanjut
%%   lintas kolom/halaman.
%%   \cs{UIlongtablecols}\marg{N} menetapkan jumlah total kolom.
%%   Jika diisi, kelas menambahkan otomatis
%%   \enquote{\tablename~N: judul~\textit{(sambungan)}}
%%   pada awal \cs{UIlongtablehead} untuk bagian lanjutan.
%%   Jika judul lebih lebar dari lebar alami tabel, kolom lanjutan bisa melebar.
%%   Hilangkan \cs{UIlongtablecols} dan definisikan \cs{UIlongtablehead}
%%   secara manual untuk mencegah hal ini.
%%   Spesifikasi kolom memakai sintaks yang sama dengan \env{tabular}.
%% \end{function}
%%
%% \newpage
%%
%% %-----------------------------------------------------------------------
%% \section{Appendices / Lampiran}
%% %-----------------------------------------------------------------------
%%
%% \subsection*{English}
%%
%% \begin{function}{lampiranBab}
%%   \begin{syntax}
%%     \cs{begin}\marg{lampiranBab}\marg{title}
%%     \ldots
%%     \cs{end}\marg{lampiranBab}
%%   \end{syntax}
%%   Numbered appendix environment.  Each \env{lampiranBab} increments the
%%   appendix counter (A, B, C, \ldots), registers an entry in the Appendix
%%   List, and (in monograph format) installs a two-line running header
%%   showing the appendix number and title.  Continuation pages show
%%   \emph{(lanjutan)} or \emph{(continued)} after the title.
%% \end{function}
%%
%% \subsection*{Bahasa Indonesia}
%%
%% \begin{itemize}
%%   \item Lingkungan \env{lampiranBab}\marg{judul}: lampiran bernomor. Setiap
%%         \env{lampiranBab} menambah penghitung lampiran (A, B, C, \ldots),
%%         mendaftarkan entri ke Daftar Lampiran, dan (format monograf)
%%         memasang \emph{header} berjalan dua baris berisi nomor dan judul
%%         lampiran. Halaman lanjutan menampilkan sufiks \emph{(lanjutan)}.
%% \end{itemize}
%%
%% \newpage
%%
%% %-----------------------------------------------------------------------
%% \section{Table Column Types / Jenis Kolom Tabel}
%% %-----------------------------------------------------------------------
%%
%% \subsection*{English}
%%
%% The class defines nine shorthand column types for common alignments.
%% All accept one argument specifying the column width.
%%
%% \begin{center}
%% \begin{tabular}{l l l}
%%   \toprule
%%   \textbf{Type} & \textbf{Vertical} & \textbf{Horizontal alignment} \\
%%   \midrule
%%   \texttt{P\{w\}} & top    & left  \\
%%   \texttt{L\{w\}} & middle & left  \\
%%   \texttt{B\{w\}} & bottom & left  \\
%%   \texttt{U\{w\}} & top    & centre \\
%%   \texttt{C\{w\}} & middle & centre \\
%%   \texttt{O\{w\}} & bottom & centre \\
%%   \texttt{E\{w\}} & top    & right \\
%%   \texttt{R\{w\}} & middle & right \\
%%   \texttt{T\{w\}} & bottom & right \\
%%   \bottomrule
%% \end{tabular}
%% \end{center}
%%
%% \subsection*{Bahasa Indonesia}
%%
%% Kelas mendefinisikan sembilan tipe kolom singkat untuk penyelarasan umum.
%% Semua menerima satu argumen berupa lebar kolom.
%%
%% \begin{center}
%% \begin{tabular}{l l l}
%%   \toprule
%%   \textbf{Tipe} & \textbf{Vertikal} & \textbf{Horizontal} \\
%%   \midrule
%%   \texttt{P\{l\}} & atas    & kiri \\
%%   \texttt{L\{l\}} & tengah  & kiri \\
%%   \texttt{B\{l\}} & bawah   & kiri \\
%%   \texttt{U\{l\}} & atas    & tengah \\
%%   \texttt{C\{l\}} & tengah  & tengah \\
%%   \texttt{O\{l\}} & bawah   & tengah \\
%%   \texttt{E\{l\}} & atas    & kanan \\
%%   \texttt{R\{l\}} & tengah  & kanan \\
%%   \texttt{T\{l\}} & bawah   & kanan \\
%%   \bottomrule
%% \end{tabular}
%% \end{center}
%%
%% \newpage
%%
%% %-----------------------------------------------------------------------
%% \section{Journal Format / Format Jurnal}
%% %-----------------------------------------------------------------------
%%
%% \subsection*{English}
%%
%% The following environments and switches are only relevant when
%% \texttt{format=journal}.  In monograph format they degrade gracefully
%% to standard \env{figure} and \env{table} wrappers.
%%
%% Journal layout rules applied by the class:
%% \begin{itemize}
%%   \item Front matter pages use 3cm margins on all sides.
%%   \item Body pages use 3cm top/bottom and 2cm left/right margins.
%%   \item Abstrak and Abstract pages use Arabic numbering starting from page 1.
%%   \item Paragraphs are fully justified; default paragraph style is \texttt{paragraph=noindent}.
%% \end{itemize}
%%
%% \begin{function}{UIwidetable, UIwidefigure}
%%   \begin{syntax}
%%     \cs{begin}\marg{UIwidetable}\oarg{placement} \ldots \cs{end}\marg{UIwidetable}
%%     \cs{begin}\marg{UIwidefigure}\oarg{placement} \ldots \cs{end}\marg{UIwidefigure}
%%   \end{syntax}
%%   Full-width float (\texttt{table*}/\texttt{figure*}) in two-column journal
%%   mode; falls back to single-column \env{table}/\env{figure} in monograph.
%% \end{function}
%%
%% \begin{function}{UIwideblock}
%%   \begin{syntax}
%%     \cs{begin}\marg{UIwideblock}\oarg{width} \ldots \cs{end}\marg{UIwideblock}
%%   \end{syntax}
%%   Full-width non-float block spanning both columns in two-column mode,
%%   using the \pkg{cuted}/\env{strip} mechanism.  The optional argument
%%   overrides the block width (default: \cs{textwidth}).
%% \end{function}
%%
%% \begin{function}{UIlandscape}
%%   \begin{syntax}
%%     \cs{begin}\marg{UIlandscape} \ldots \cs{end}\marg{UIlandscape}
%%   \end{syntax}
%%   Landscape single-column pages in two-column journal mode.
%% \end{function}
%%
%% \begin{function}{UIfullwidthpages}
%%   \begin{syntax}
%%     \cs{begin}\marg{UIfullwidthpages} \ldots \cs{end}\marg{UIfullwidthpages}
%%   \end{syntax}
%%   Temporarily switch to one-column mode so that enclosed content spans
%%   the full text width.  When the environment ends, two-column mode is
%%   restored.  \env{UIlandscape} is implemented on top of this environment.
%%   In monograph mode this environment is a no-op.
%% \end{function}
%%
%% \subsection*{Bahasa Indonesia}
%%
%% Lingkungan berikut hanya relevan pada \texttt{format=journal}.
%% Pada format monograf, semuanya terdegradasi ke \env{figure}/\env{table} biasa.
%%
%% Aturan tata letak jurnal yang diterapkan kelas:
%% \begin{itemize}
%%   \item Halaman awal memakai margin 3cm pada semua sisi.
%%   \item Halaman isi memakai margin atas/bawah 3cm dan kiri/kanan 2cm.
%%   \item Halaman Abstrak dan Abstract memakai nomor Arab mulai dari halaman 1.
%%   \item Paragraf rata kiri-kanan; default gaya paragraf adalah \texttt{paragraph=noindent}.
%% \end{itemize}
%%
%% \begin{itemize}
%%   \item Lingkungan \env{UIwidetable}\oarg{posisi} / \env{UIwidefigure}\oarg{posisi}
%%         : \textit{float} penuh-lebar (\texttt{table*}/\texttt{figure*})
%%         pada mode dua kolom. Pada monograf, kembali menjadi
%%         \env{table}/\env{figure} biasa.
%%   \item Lingkungan \env{UIwideblock}\oarg{lebar}: blok penuh-lebar non-\textit{float}
%%         yang mencakup kedua kolom. Blok ini memakai mekanisme
%%         \env{strip} dari \pkg{cuted}.
%%   \item Lingkungan \env{UIlandscape}: halaman landscape satu kolom di mode dua kolom.
%%   \item Lingkungan \env{UIfullwidthpages}: beralih sementara ke mode satu kolom
%%         agar konten di dalamnya mencakup penuh lebar teks. Mode dua kolom
%%         dipulihkan saat lingkungan ditutup. Pada mode monograf,
%%         lingkungan ini tidak melakukan apa-apa.
%% \end{itemize}
%%
%% \newpage
%%
%% %-----------------------------------------------------------------------
%% \section{Glossary Integration / Integrasi Glosarium}
%% %-----------------------------------------------------------------------
%%
%% \subsection*{English}
%%
%% The class pre-configures \pkg{glossaries-extra}.
%% Define entries in \texttt{config/glossary.tex} and load them in the
%% preamble with:
%% \begin{verbatim}
%%   \input{config/glossary}
%% \end{verbatim}
%%
%% A typical entry looks like:
%% \begin{verbatim}
%%   \newglossaryentry{ml}{
%%     name={machine learning},
%%     description={a field of AI that enables ...}}
%%   \newacronym{ml}{ML}{machine learning}
%% \end{verbatim}
%%
%% Use \cs{gls}\marg{key} to reference an entry: the first use expands
%% to the full form with the acronym in parentheses; subsequent uses
%% produce the short form.  \cs{Gls} capitalises the first letter;
%% \cs{glspl} produces the plural.
%%
%% Print the glossary with \cs{makeglossarypage} in the back matter.
%%
%% \begin{quotation}\noindent
%% \textbf{Note.}  Glossary entries are resolved by running
%% \texttt{makeglossaries} between two \LaTeX{} passes.  The
%% \texttt{latexmkrc} file included in \texttt{example/} configures
%% this automatically.
%% \end{quotation}
%%
%% \subsection*{Bahasa Indonesia}
%%
%% Kelas mengonfigurasi \pkg{glossaries-extra} secara otomatis.
%% Definisikan entri di \texttt{config/glossary.tex} dan muat di preamble
%% dengan \cs{input}\marg{config/glossary}.
%%
%% Contoh entri:
%% \begin{verbatim}
%%   \newglossaryentry{ml}{
%%     name={machine learning},
%%     description={bidang AI yang memungkinkan ...}}
%%   \newacronym{ml}{ML}{machine learning}
%% \end{verbatim}
%%
%% Gunakan \cs{gls}\marg{kunci} untuk merujuk entri; penggunaan pertama
%% mencetak bentuk lengkap dengan singkatan dalam tanda kurung, penggunaan
%% berikutnya hanya singkatan.  \cs{Gls} mengawali huruf kapital;
%% \cs{glspl} menghasilkan bentuk jamak.
%% Cetak daftar istilah di bagian belakang dengan \cs{makeglossarypage}.
%%
%% \begin{quotation}\noindent
%% \textbf{Catatan.}  Entri glosarium diselesaikan dengan menjalankan
%% \texttt{makeglossaries} di antara dua \textit{pass} \LaTeX{}.
%% Berkas \texttt{latexmkrc} yang disertakan di \texttt{example/}
%% mengonfigurasi ini secara otomatis.
%% \end{quotation}
%%
%% %-----------------------------------------------------------------------
%% \section{Code Listings / Tampilan Kode Program}
%% %-----------------------------------------------------------------------
%%
%% \subsection*{English}
%%
%% The class loads \pkg{listings} and pre-defines language styles for
%% Python, Java, C, C++, JavaScript, SQL, HTML, and Bash.  Additional
%% definitions can be placed in \texttt{config/proglangdef.sty}.
%%
%% \textbf{Listing from a file.}  Include a source file with:
%% \begin{verbatim}
%%   \lstinputlisting[language=Python, numbers=left,
%%     caption={My snippet}, label=code:snippet]
%%     {assets/codes/my-snippet.py}
%% \end{verbatim}
%%
%% \textbf{Inline listing.}  For a short snippet inside the text, use:
%% \begin{verbatim}
%%   \begin{lstlisting}[language=Java, caption={Hello World}]
%%   public class Hello { ... }
%%   \end{lstlisting}
%% \end{verbatim}
%%
%% \textbf{Inline code.}  For a single identifier or keyword in running
%% text, use \cs{code}\marg{text} (defined by the class as
%% \cs{lstinline}\texttt{|...|}).
%%
%% Refer to a listing with \cs{lstlistingname}~\cs{ref}\{code:snippet\}
%% or the shorter alias \cs{lst}~\cs{ref}\{code:snippet\}.
%%
%% \subsection*{Bahasa Indonesia}
%%
%% Kelas memuat \pkg{listings} dan mendefinisikan gaya untuk Python,
%% Java, C, C++, JavaScript, SQL, HTML, dan Bash.  Definisi bahasa
%% tambahan dapat diletakkan di \texttt{config/proglangdef.sty}.
%%
%% \textbf{Listing dari berkas.}  Sertakan berkas kode dengan:
%% \begin{verbatim}
%%   \lstinputlisting[language=Python, numbers=left,
%%     caption={Cuplikan saya}, label=code:cuplikan]
%%     {assets/codes/cuplikan.py}
%% \end{verbatim}
%%
%% \textbf{Listing langsung.}  Untuk cuplikan singkat di dalam teks,
%% gunakan lingkungan \texttt{lstlisting}.
%%
%% \textbf{Kode \textit{inline}.}  Gunakan \cs{code}\marg{teks} untuk
%% menampilkan kode pendek dalam kalimat.
%%
%% Rujuk daftar kode dengan \cs{lst}~\cs{ref}\{...\}.
%%
%% \newpage
%%
%% %-----------------------------------------------------------------------
%% \section{Known Limitations / Keterbatasan}
%% %-----------------------------------------------------------------------
%%
%% \subsection*{English}
%%
%% \begin{itemize}
%%   \item \texttt{columns=2} is only valid with \texttt{format=journal}.
%%   \item The Makara logo images (\texttt{uithesis-makara.png},
%%         \texttt{uithesis-makara-kuning.png}) must be on the \TeX{} search path.
%%         When installing from source, place those image files alongside
%%         \texttt{uithesis.cls}, or set \texttt{TEXINPUTS} accordingly.
%%   \item The class targets \texttt{pdflatex}.  Xe\LaTeX{} and
%%         Lua\LaTeX{} are untested.
%% \end{itemize}
%%
%% \subsection*{Bahasa Indonesia}
%%
%% \begin{itemize}
%%   \item Opsi \texttt{columns=2} hanya berlaku untuk
%%         \texttt{format=journal}.
%%   \item Gambar logo Makara (\texttt{uithesis-makara.png},
%%         \texttt{uithesis-makara-kuning.png}) harus tersedia di \emph{search path}
%%         \TeX{}. Jika diinstal dari sumber, tempatkan berkas gambar
%%         tersebut di lokasi yang sama dengan \texttt{uithesis.cls},
%%         atau atur variabel \texttt{TEXINPUTS}.
%%   \item Kelas ini ditujukan untuk \texttt{pdflatex}.  Xe\LaTeX{} dan
%%         Lua\LaTeX{} belum diuji.
%% \end{itemize}
%%
%% \newpage
%%
%% %-----------------------------------------------------------------------
%% \part{Maintainer Guide / Panduan Maintainer}
%% %-----------------------------------------------------------------------
%%
%% \subsection*{English}
%%
%% This part explains how to maintain and extend \textsf{uithesis}
%% safely.  It focuses on the source of truth files, internal code map,
%% build workflow, testing expectations, and contribution flow.
%%
%% \subsection*{Bahasa Indonesia}
%%
%% Bagian ini menjelaskan cara memelihara dan mengembangkan
%% \textsf{uithesis} secara aman. Fokus utamanya adalah berkas sumber
%% utama, peta kode internal, alur build, ekspektasi pengujian,
%% dan alur kontribusi.
%%
%% %-----------------------------------------------------------------------
%% \section{Maintainer Source of Truth / Sumber Kebenaran untuk Maintainer}
%% %-----------------------------------------------------------------------
%%
%% \subsection*{English}
%%
%% The authoritative source for class behavior is \texttt{uithesis.dtx}
%% (inside the \texttt{\%<*class>} and \texttt{\%</class>} guards).
%%
%% Do not edit \texttt{uithesis.cls} directly.  It is generated by
%% \texttt{tex uithesis.ins} or \texttt{l3build unpack}.
%%
%% Documentation source is \texttt{uithesis-doc.dtx}.  Student template
%% files live under \texttt{example/}.
%%
%% \subsection*{Bahasa Indonesia}
%%
%% Sumber utama perilaku kelas adalah \texttt{uithesis.dtx}
%% (di dalam guard \texttt{\%<*class>} dan \texttt{\%</class>}).
%%
%% \texttt{uithesis.cls} tidak boleh diedit langsung karena merupakan
%% berkas turunan yang dihasilkan oleh \texttt{tex uithesis.ins}
%% atau \texttt{l3build unpack}.
%%
%% Sumber dokumentasi adalah \texttt{uithesis-doc.dtx}.  Berkas templat
%% mahasiswa berada di subtree \texttt{example/}.
%%
%% %-----------------------------------------------------------------------
%% \section{Private API Boundary / Batas API Privat}
%% %-----------------------------------------------------------------------
%%
%% \subsection*{English}
%%
%% Maintainer-only symbols and topics are documented in this Part II.
%% Scope boundary used in this project:
%%
%% \begin{itemize}
%%   \item \textbf{Public API} (Part I): user commands/environments/options
%%         intended for thesis authors and supervisors.
%%   \item \textbf{Private API} (Part II): internal implementation symbols,
%%         internal data flow, and maintenance workflow topics.
%% \end{itemize}
%%
%% In \texttt{uithesis.dtx}, private implementation symbols follow
%% internal naming conventions such as \texttt{\string\UI@...} and
%% internal builder families (for example, page assembly helpers and
%% collector/storage helpers). These symbols are maintainer-facing only.
%%
%% \subsection*{Bahasa Indonesia}
%%
%% Simbol dan topik maintainer didokumentasikan di Bagian II ini.
%% Batas ruang lingkup yang dipakai pada proyek ini:
%%
%% \begin{itemize}
%%   \item \textbf{API publik} (Bagian I): perintah/lingkungan/opsi untuk
%%         penulis tugas akhir dan pembimbing.
%%   \item \textbf{API privat} (Bagian II): simbol implementasi internal,
%%         alur data internal, dan topik alur pemeliharaan.
%% \end{itemize}
%%
%% Di \texttt{uithesis.dtx}, simbol implementasi privat mengikuti konvensi
%% penamaan internal seperti \texttt{\string\UI@...} serta keluarga helper
%% internal (misalnya helper perakitan halaman dan helper pengumpul/penyimpan
%% konten). Simbol tersebut khusus untuk maintainer.
%%
%% %-----------------------------------------------------------------------
%% \section{Code Map of \texttt{uithesis.dtx} / Peta Kode \texttt{uithesis.dtx}}
%% %-----------------------------------------------------------------------
%%
%% \subsection*{English}
%%
%% The class source is grouped by named comment headers.
%% Maintainers should navigate by these section names:
%%
%% \medskip\noindent
%% {\small
%% \begin{longtable}{@{}p{5.1cm} p{7.8cm}@{}}
%%   \toprule
%%   \textbf{Header in \texttt{uithesis.dtx}} & \textbf{Maintainer role} \\
%%   \midrule
%%   \endhead
%%   \bottomrule
%%   \endfoot
%%   \texttt{IDENTIFIKASI KELAS} & Class identity and version metadata. \\
%%   \texttt{KEBIJAKAN KELAS (policy surface)} & Global policy switches and style knobs (spacing, print mode, paragraph style). \\
%%   \texttt{PEMROSESAN OPSI (xkeyval)} & Parsing of class options and default normalization. \\
%%   \texttt{KONFIGURASI BIBLATEX} & Citation preset mapping, biblatex options, and language-specific bibliography behavior. \\
%%   \texttt{IMPOR PAKET DEPENDENSI} / \texttt{KONFIGURASI PAKET} & Runtime dependencies and package-level setup. \\
%%   \texttt{TATA LETAK ISI: *} & Page geometry, heading styles, journal helpers, page styles, chapter management, i18n labels. \\
%%   \texttt{OBJEK ISI: *} & User content helpers (table column types, content commands, object handling). \\
%%   \texttt{FRONT-MATTER LISTS: *} and \texttt{FRONT MATTER: *} & Front-matter data model, list registration, collector environments, and page assembly internals. \\
%%   \texttt{METADATA API: *} & Public metadata commands consumed by front matter and headers. \\
%%   \texttt{MATERI BELAKANG: *} & Appendix, bibliography, glossary, and separators for back matter. \\
%%   \texttt{STYLING NON-ALUR: *} & Built-in code-listing language styles and color conventions. \\
%%   \texttt{HOOK \textbackslash AtBeginDocument} / \texttt{HOOK \textbackslash AtEndDocument} & Lifecycle hooks executed before and after document processing. \\
%% \end{longtable}
%% }
%%
%% \subsection*{Bahasa Indonesia}
%%
%% Sumber kelas dikelompokkan dengan header komentar bernama.
%% Navigasi maintainer sebaiknya mengikuti nama section tersebut,
%% bukan nomor baris.
%%
%% Ringkasnya, kelompok \texttt{TATA LETAK ISI:*} menangani aturan tata letak,
%% kelompok \texttt{FRONT MATTER:*} menangani perakitan halaman awal,
%% kelompok \texttt{METADATA API:*} menangani perintah publik,
%% dan kelompok \texttt{MATERI BELAKANG:*} menangani lampiran,
%% daftar pustaka, serta glosarium.
%%
%% %-----------------------------------------------------------------------
%% \section{Internal Behaviors and Caveats / Perilaku Internal dan Catatan Penting}
%% %-----------------------------------------------------------------------
%%
%% \subsection*{English}
%%
%% This section documents private behavior intentionally, for maintainers.
%% Public users should rely on Part I only.
%%
%% \medskip\noindent
%% {\small
%% \begin{longtable}{@{}p{4.6cm}p{4.7cm}p{\dimexpr\linewidth-9.3cm-4\tabcolsep\relax}@{}}
%%   \toprule
%%   \textbf{Area} & \textbf{Private behavior and rationale} & \textbf{Caveat} \\
%%   \midrule
%%   \endhead
%%   \bottomrule
%%   \endfoot
%%   \texttt{KEBIJAKAN KELAS} & Policy toggles (e.g., internal booleans for spacing, print mode, paragraph mode) centralize defaults and reduce duplicated conditional checks. & Keep policy changes centralized; avoid local ad-hoc overrides in page macros. \\
%%   \texttt{PEMROSESAN OPSI} & Option parsing normalizes values and fallback behavior before layout code runs. & Unknown options warn and fall back; ensure docs and fallback logic stay aligned. \\
%%   \texttt{KONFIGURASI BIBLATEX} & Citation preset resolution maps high-level option values to biblatex profiles and optional-package fallbacks. & Any new preset must update both parser and fallback map, with bilingual docs. \\
%%   \texttt{IMPOR/KONFIGURASI PAKET} & Runtime packages are grouped by responsibility (layout, references, tables, graphics, code, glossary). & When adding dependencies, update dependency tables and doc build deps. \\
%%   \texttt{TATA LETAK ISI: HALAMAN \& TIPOGRAFI} & Physical page parity uses shipout-based counters for reliable odd/even decisions. & Shipout counters reflect shipped pages; transition logic can require buffered-page handling. \\
%%   \texttt{TATA LETAK ISI: PENAMAAN \& I18N} & Label naming and language switching are centralized to keep bilingual output consistent. & Changing labels requires cross-checking list titles and refs in both languages. \\
%%   \texttt{OBJEK ISI} & Content helpers wrap common patterns and keep user syntax stable while internals evolve. & Preserve public command contracts when refactoring helper internals. \\
%%   \texttt{FRONT-MATTER LISTS} & Custom-list registration is data-driven so user-defined lists can be emitted uniformly. & Registration order affects output order; keep deterministic ordering rules. \\
%%   \texttt{FRONT MATTER: ENV PENGUMPUL KONTEN} & Collector environments store user blocks before assembly, separating data capture from rendering. & Ensure collector defaults are safe when users omit optional environments. \\
%%   \texttt{FRONT MATTER: PENYUSUNAN HALAMAN INTERNAL} & Typesetting internals compose mandatory pages with shared spacing and heading conventions. & Keep spacing/profile edits centralized to avoid drift among page builders. \\
%%   \texttt{METADATA API} & Public metadata commands feed internal accumulators consumed by front matter and headers. & New metadata fields require updates in API, renderers, and docs simultaneously. \\
%%   \texttt{MATERI BELAKANG} & Appendix/bibliography/glossary helpers enforce consistent separators and pagination behavior. & Verify twoside transitions and list entries after modifying appendix/page-style code. \\
%%   \texttt{HOOK \textbackslash AtBeginDocument / \textbackslash AtEndDocument} & Lifecycle hooks finalize runtime defaults and persist list counters across runs. & Multi-pass behavior means stale auxiliary files can hide or delay regressions. \\
%% \end{longtable}
%% }
%%
%% Internal spacing profile note:
%% low-level spacing lengths are grouped in the macro shown below.
%% This grouping exists so maintainers can tune typography in one place
%% without editing many page-rendering macros.
%%
%% \texttt{\string\UI@setDocumentSpacingDefaults}
%%
%% Internal pagination caveat note:
%% The macro below increments physical-page counters after page shipout.
%% For front-matter transitions where a page may still be buffered,
%% parity checks can require offset logic as implemented in the
%% class transition helpers.
%%
%% \texttt{\string\EveryShipout}
%%
%% \subsection*{Bahasa Indonesia}
%%
%% Section ini mendokumentasikan perilaku privat secara sengaja,
%% khusus untuk maintainer. Pengguna umum tetap mengacu ke Bagian I.
%%
%% Ringkasan area internal dan catatan utama:
%%
%% \begin{itemize}
%%   \item Pemrosesan opsi dan kebijakan kelas harus tetap terpusat,
%%         agar fallback dan perilaku default konsisten.
%%   \item Resolusi preset sitasi harus dijaga sinkron dengan fallback
%%         paket opsional serta dokumentasi dwibahasa.
%%   \item Perakitan front matter memakai pemisahan tahap:
%%         pengumpulan konten (environment) lalu penyusunan halaman.
%%   \item Kontrol spasi internal dipusatkan pada makro berikut
%%         untuk mencegah penyetelan tersebar di banyak makro.
%%
%%         \texttt{\string\UI@setDocumentSpacingDefaults}
%%
%%   \item Penentuan paritas halaman fisik bergantung pada penghitung
%%         berbasis shipout. Pada transisi tertentu, cek paritas dapat
%%         memerlukan logika offset karena halaman terakhir bisa masih
%%         berada di buffer TeX.
%%   \item Hook awal/akhir dokumen memengaruhi perilaku multi-pass,
%%         sehingga pembersihan berkas bantu dan validasi log tetap penting.
%% \end{itemize}
%%
%% %-----------------------------------------------------------------------
%% \section{Policy Toggles and Style Knobs / Tombol Kebijakan dan Kenop Gaya}
%% %-----------------------------------------------------------------------
%%
%% \subsection*{English}
%%
%% The \texttt{KEBIJAKAN KELAS} section defines global policy booleans and
%% style hook macros.  All booleans default to \texttt{false} and are set
%% exclusively by option parsing.  Maintainers should not set them directly
%% inside page-rendering macros; all policy-driven branching should test the
%% boolean rather than re-implementing the condition.
%%
%% \medskip\noindent
%% {\small
%% \begin{longtable}{@{}p{5.2cm}p{3.0cm}p{\dimexpr\linewidth-8.2cm-4\tabcolsep\relax}@{}}
%%   \toprule
%%   \textbf{Boolean} & \textbf{Default} & \textbf{Effect when true} \\
%%   \midrule
%%   \endhead
%%   \bottomrule
%%   \endfoot
%%   \cs{ifUI@calibratedspacing}  & false & 1.4\texttimes{} line spacing via \cs{setstretch}; false uses \cs{onehalfspacing} \\
%%   \cs{ifUI@twosideprint}       & false & Mirrors header/footer positions for twoside printing \\
%%   \cs{ifUI@paragraphindent}    & false & 1.5\,em paragraph indent and zero \cs{parskip}; false: zero indent and 12\,pt skip \\
%%   \cs{ifUI@plagiarismcheck}    & false & Clears all header and footer content from every named page style \\
%% \end{longtable}
%% }
%%
%% Style hook macros expose typographic choices as reassignable macros so
%% maintainers or advanced users can override them without touching rendering code.
%%
%% \medskip\noindent
%% {\small
%% \begin{longtable}{@{}p{5.5cm}p{7.2cm}@{}}
%%   \toprule
%%   \textbf{Hook macro} & \textbf{Default value and purpose} \\
%%   \midrule
%%   \endhead
%%   \bottomrule
%%   \endfoot
%%   \cs{UI@chapterHeadingStyle}          & \texttt{\textbackslash singlespacing\textbackslash centering\textbackslash rm\textbackslash bfseries} (applies to ConnyRevised chapter heading blocks) \\
%%   \cs{UI@sectionHeadingStyle}          & \texttt{\textbackslash normalfont\textbackslash fontsize\{12\}\{15\}\textbackslash bfseries} (monograph section headings at all levels) \\
%%   \cs{UI@journalSectionHeadingStyle}   & same default as \cs{UI@sectionHeadingStyle} (journal section headings) \\
%%   \cs{UI@applyFooterFont}              & no-op (override to change footer brand font) \\
%%   \cs{UI@applyPageNumberFont}          & \texttt{12\,pt Times Roman} (override to change page number font) \\
%% \end{longtable}
%% }
%%
%% The composed text macros \cs{UI@footerText} and \cs{UI@pageNumberText} call the
%% hooks at expansion time, so assigning \cs{UI@applyFooterFont} before
%% \cs{makefrontmatter} is sufficient to affect all pages.
%%
%% Spacing control macros:
%% \begin{itemize}
%%   \item \cs{UI@applyMainSpacing}: applies the active spacing mode
%%         (calibrated or one-half) as a side effect.
%%         Call after any \pkg{setspace} environment that overrides spacing.
%%   \item \cs{UI@restoreMainSpacing}: alias for \cs{UI@applyMainSpacing}.
%%         Used throughout page assembly to restore spacing after \texttt{singlespace} blocks.
%%   \item \cs{UI@applyParagraphLayout}: sets \cs{parindent}/\cs{parskip}
%%         according to the active \texttt{paragraph} option.
%%         Called once at class load; call again if you switch paragraph policy
%%         after the class is loaded (unusual).
%% \end{itemize}
%%
%% \subsection*{Bahasa Indonesia}
%%
%% Bagian \texttt{KEBIJAKAN KELAS} mendefinisikan boolean global dan makro kenop gaya.
%% Semua boolean bernilai \texttt{false} secara bawaan dan hanya diubah oleh
%% pemrosesan opsi.  Maintainer tidak boleh mengatur boolean ini secara langsung
%% di dalam makro penyusunan halaman; semua percabangan berbasis kebijakan cukup
%% dengan menguji kondisional yang sudah ada.
%%
%% Makro hook gaya mengekspos pilihan tipografi sebagai makro yang dapat
%% ditetapkan ulang, sehingga maintainer atau pengguna lanjutan dapat
%% mengganti gaya tanpa menyentuh kode rendering.
%%
%% Makro kontrol spasi: \cs{UI@applyMainSpacing} menerapkan mode spasi aktif;
%% \cs{UI@restoreMainSpacing} adalah alias-nya dan digunakan di seluruh
%% perakitan halaman untuk memulihkan spasi setelah blok \texttt{singlespace}.
%%
%% %-----------------------------------------------------------------------
%% \section{Option Parsing Internals / Internal Pemrosesan Opsi}
%% %-----------------------------------------------------------------------
%%
%% \subsection*{English}
%%
%% All keys belong to the \texttt{uithesis.cls} keyfamily, processed by
%% \pkg{xkeyval}.  Every key is declared with
%% \texttt{\string\define@choicekey*+}, which restricts values to an explicit
%% list, calls a ClassWarning via \cs{UI@warnUnknownChoice} for unknown values,
%% and falls back to the documented default.
%%
%% Available keys and their choices:
%%
%% \medskip\noindent
%% {\small
%% \begin{longtable}{@{}p{2.8cm}p{7.3cm}p{\dimexpr\linewidth-10.1cm-4\tabcolsep\relax}@{}}
%%   \toprule
%%   \textbf{Key} & \textbf{Accepted values} & \textbf{Default} \\
%%   \midrule
%%   \endhead
%%   \bottomrule
%%   \endfoot
%%   \texttt{format}        & \texttt{monograph}, \texttt{journal}                            & \texttt{monograph} \\
%%   \texttt{type}          & \texttt{Skripsi}, \texttt{Tesis}, \texttt{Disertasi}, \texttt{Laporan Kerja Praktik}, \texttt{Kampus Merdeka} & \texttt{Skripsi} \\
%%   \texttt{jenjang}       & \texttt{Sarjana}, \texttt{Magister}, \texttt{Doktor}             & \texttt{Sarjana} \\
%%   \texttt{lang}          & \texttt{indonesian}, \texttt{english}                            & \texttt{indonesian} \\
%%   \texttt{columns}       & \texttt{1}, \texttt{2}                                           & \texttt{1} \\
%%   \texttt{spacing}       & \texttt{calibrated}, \texttt{standard}                           & \texttt{calibrated} \\
%%   \texttt{paragraph}     & \texttt{indent}, \texttt{noindent}                               & \texttt{noindent} \\
%%   \texttt{plagiarismcheck} & \texttt{false}, \texttt{true}                                  & \texttt{false} \\
%%   \texttt{print}         & \texttt{oneside}, \texttt{twoside}                               & \texttt{twoside} \\
%%   \texttt{citation}      & 14 preset names (see citation preset section)                    & \texttt{apa} \\
%% \end{longtable}
%% }
%%
%% Keyless shortcut options (\cs{DeclareOptionX}) forward directly to
%% \texttt{\string\setkeys\{uithesis.cls\}\{...\}} so that, for example,
%% \texttt{[Skripsi,english]} works equivalently to \texttt{[type=Skripsi,lang=english]}.
%%
%% \cs{DeclareOptionX*} passes any unrecognized option to the \texttt{report}
%% base class.  This enables passing standard \texttt{report} options such as
%% \texttt{draft} without explicit forwarding.
%%
%% The base class is always loaded with fixed arguments:
%% \texttt{12pt,a4paper,onecolumn,twoside,final}.  Values for \texttt{columns}
%% and \texttt{print} do not affect these arguments; they control internal
%% class behavior instead.
%%
%% Adding a new class option:
%% \begin{enumerate}
%%   \item Add a \texttt{\string\define@choicekey*+} block with a
%%         \cs{UI@warnUnknownChoice} fallback.  For boolean flags, also add a
%%         corresponding \cs{newif}.
%%   \item Optionally add a \cs{DeclareOptionX} keyless shortcut.
%%   \item Add the option to the Class Options table in Part~I.
%%   \item Add a \texttt{\string\changes} entry in the Changelog.
%% \end{enumerate}
%%
%% \subsection*{Bahasa Indonesia}
%%
%% Semua kunci termasuk keyfamily \texttt{uithesis.cls} yang diproses oleh
%% \pkg{xkeyval}.  Setiap kunci dideklarasikan dengan
%% \texttt{\string\define@choicekey*+}, membatasi nilai ke daftar pilihan eksplisit,
%% dan memanggil ClassWarning via \cs{UI@warnUnknownChoice} untuk nilai yang tidak dikenal.
%%
%% Pintasan tanpa nilai (\cs{DeclareOptionX}) meneruskan langsung ke
%% \texttt{\string\setkeys}, sehingga \texttt{[Skripsi,english]} setara dengan
%% \texttt{[type=Skripsi,lang=english]}.
%%
%% Kelas dasar selalu dimuat dengan argumen tetap:
%% \texttt{12pt,a4paper,onecolumn,twoside,final}.  Nilai opsi \texttt{columns}
%% dan \texttt{print} tidak memengaruhi argumen ini; keduanya mengontrol perilaku
%% internal kelas.
%%
%% %-----------------------------------------------------------------------
%% \section{Citation Preset System / Sistem Preset Sitasi}
%% %-----------------------------------------------------------------------
%%
%% \subsection*{English}
%%
%% Citation configuration is resolved through a preset system before
%% \pkg{biblatex} is loaded.  Three factory macros construct the preset
%% commands:
%%
%% \begin{itemize}
%%   \item \cs{UI@bibDefinePreset}\marg{name}\marg{citestyle}\marg{bibstyle}\marg{mapping}:
%%         registers a simple preset that maps directly to a fixed
%%         \pkg{biblatex} profile.
%%   \item \cs{UI@bibDefinePresetWithFallback}\marg{name}\marg{.bbx-file}\marg{cs}\marg{bs}%
%%         \marg{cs-fallback}\marg{bs-fallback}\marg{lang}\marg{pkg}\marg{fb-desc}:
%%         tries to locate the \texttt{.bbx} file; if absent, attempts to
%%         install the optional package via \cs{RequirePackage}, then either
%%         uses the full profile or falls back to the provided \textit{cs-fallback}
%%         and \textit{bs-fallback} values.
%%   \item \cs{UI@bibDefineNumericFallbackPreset}\marg{name}\marg{.bbx}\marg{bsstyle}\marg{pkg}:
%%         shorthand for presets whose fallback is always
%%         \texttt{numeric-comp}/\texttt{numeric}.
%% \end{itemize}
%%
%% Resolution: \cs{UI@bibResolveConfiguration} dispatches to the preset handler
%% generated by the factory macro for the active \cs{UI@citationpreset}.
%% Override fields (\cs{UI@citationstyleoverride}, \cs{UI@bibstyleoverride},
%% \cs{UI@citationmappingoverride}) are applied after preset resolution if non-empty,
%% allowing fine-grained overrides without replacing the entire preset.
%%
%% Public override API (called in document preamble, after \verb|\documentclass|):
%%
%% \medskip\noindent
%% {\small
%% \begin{longtable}{@{}p{5.0cm}p{7.7cm}@{}}
%%   \toprule
%%   \textbf{Command} & \textbf{Effect} \\
%%   \midrule
%%   \endhead
%%   \bottomrule
%%   \endfoot
%%   \cs{setuicitationpreset\{name\}}   & Select a named preset \\
%%   \cs{setuicitestyle\{style\}}       & Override \texttt{citestyle} only \\
%%   \cs{setuibibstyle\{style\}}        & Override \texttt{bibstyle} only \\
%%   \cs{setuicitationmapping\{map\}}   & Override language mapping \\
%%   \cs{setuibiblatexoptions\{opts\}}  & Append extra \pkg{biblatex} load-time options \\
%%   \cs{setuibiblatexstyle\{style\}}   & Set both \texttt{citestyle} and \texttt{bibstyle} simultaneously \\
%% \end{longtable}
%% }
%%
%% The ACM preset receives special handling: it checks for both
%% \texttt{acm.bbx} and \texttt{acm.cbx} independently, because some
%% distributions ship only one file.  If the \texttt{cbx} is absent, the
%% \texttt{citestyle} falls back to \texttt{numeric-comp} while the
%% \texttt{bibstyle} remains \texttt{acm}.
%%
%% Adding a new preset:
%% \begin{enumerate}
%%   \item Add a \cs{UI@bibDefinePreset} or \cs{UI@bibDefinePresetWithFallback}
%%         call before \cs{UI@bibResolveConfiguration}.
%%   \item Add the preset name to the \texttt{citation} choice key list.
%%   \item Add a row to the citation preset table in Part~I.
%%   \item Document the required TeX Live package and fallback behavior.
%% \end{enumerate}
%%
%% \subsection*{Bahasa Indonesia}
%%
%% Konfigurasi sitasi diselesaikan melalui sistem preset sebelum \pkg{biblatex}
%% dimuat.  Tiga makro pabrik membuat perintah preset.  \cs{UI@bibDefinePreset}
%% mendaftarkan preset sederhana; \cs{UI@bibDefinePresetWithFallback} mencoba
%% menemukan berkas \texttt{.bbx} lalu menginstal paket opsional jika perlu,
%% atau menggunakan fallback numerik; \cs{UI@bibDefineNumericFallbackPreset}
%% adalah pintasan untuk fallback \texttt{numeric-comp}/\texttt{numeric}.
%%
%% Resolusi preset dipanggil oleh \cs{UI@bibResolveConfiguration}.  Bidang
%% override (\cs{UI@citationstyleoverride} dll.) diterapkan setelah resolusi
%% preset jika tidak kosong, memungkinkan penggantian sebagian tanpa mengubah
%% seluruh preset.
%%
%% %-----------------------------------------------------------------------
%% \section{Package Dependency Structure / Struktur Dependensi Paket}
%% %-----------------------------------------------------------------------
%%
%% \subsection*{English}
%%
%% All runtime packages are loaded via \cs{RequirePackage} in the
%% \texttt{IMPOR PAKET DEPENDENSI} section, organized by functional group.
%% Load order is significant: \pkg{inputenc} must precede \pkg{biblatex};
%% \pkg{babel} must precede \pkg{csquotes}; \pkg{hyperref} must follow
%% most other packages.
%%
%% Format-specific branches:
%% \begin{itemize}
%%   \item Monograph: \pkg{glossaries-extra} with
%%         \texttt{automake,acronyms,}\allowbreak\texttt{symbols,nonumberlist,nomain}, plus
%%         \cs{makeglossaries} to enable automatic run.
%%   \item Journal: \pkg{glossaries-extra} without \texttt{automake}; if
%%         \texttt{paragraph=indent}: \pkg{indentfirst}; if
%%         \texttt{columns=2}: \pkg{dblfloatfix}, \pkg{cuted},
%%         \pkg{balance}, \pkg{flushend}.
%% \end{itemize}
%%
%% \pkg{CJKutf8} is always loaded in both formats, enabling CJK text
%% anywhere in the document without format-specific guards.
%%
%% The \cs{UI@maxwidth} guard (defined in the graphics group) prevents
%% images wider than \cs{linewidth} from overflowing the text block:
%% \begin{center}
%% \texttt{\small\string\def\string\UI@maxwidth\{\string\ifdim\string\Gin@nat@width>\string\linewidth\string\linewidth\string\else\string\Gin@nat@width\string\fi\}}
%% \end{center}
%% This is applied globally via \texttt{\string\setkeys\{Gin\}\{width=\string\UI@maxwidth,keepaspectratio\}}.
%% Individual \cs{includegraphics} calls benefit from this silently.
%% Do not override it with a fixed width unless intentional.
%%
%% When adding a runtime dependency:
%% \begin{enumerate}
%%   \item Add \cs{RequirePackage\{pkgname\}} in the appropriate group.
%%   \item Add a row to the Dependencies longtable in Part~I.
%%   \item If the package is also needed to typeset the class documentation,
%%         add it to \texttt{typesetdeps} in \texttt{build.lua}.
%% \end{enumerate}
%%
%% \subsection*{Bahasa Indonesia}
%%
%% Semua paket runtime dimuat via \cs{RequirePackage} di bagian
%% \texttt{IMPOR PAKET DEPENDENSI}, diorganisasi per kelompok fungsional.
%% Urutan pemuatan penting: \pkg{inputenc} harus sebelum \pkg{biblatex},
%% \pkg{babel} harus sebelum \pkg{csquotes}, \pkg{hyperref} harus setelah
%% sebagian besar paket lain.
%%
%% Cabang spesifik format: monograf memuat \pkg{glossaries-extra} dengan
%% \texttt{automake}; jurnal memuat versi tanpa \texttt{automake} dan
%% tambahan paket dua-kolom jika \texttt{columns=2}.
%%
%% Penjaga \cs{UI@maxwidth} mencegah gambar yang lebih lebar dari
%% \cs{linewidth} membanjiri kolom teks.  Jangan timpa dengan lebar
%% tetap kecuali disengaja.
%%
%% %-----------------------------------------------------------------------
%% \section{Package Configuration / Konfigurasi Paket}
%% %-----------------------------------------------------------------------
%%
%% \subsection*{English}
%%
%% \textbf{Hyperref settings} (in \texttt{KONFIGURASI PAKET}):
%% \begin{itemize}
%%   \item \texttt{colorlinks=false}, \texttt{pdfborder=0 0 0}: no visible
%%         link borders in print output; color contrast is not needed for print.
%%   \item \texttt{pdfpagelabels=true}, \texttt{hypertexnames=false}: required
%%         for correct PDF bookmarks when page numbering switches from roman to arabic.
%%   \item \texttt{plainpages=false}: must accompany \texttt{pdfpagelabels}.
%%   \item \texttt{pdfstartview=FitH}: opens PDF fit-to-width by default.
%% \end{itemize}
%%
%% The \cs{contentsline} override patches the hyperref definition to ensure
%% all ToC and list entries (including custom lists from \cs{newUIlist}) use
%% \cs{hyper@linkstart}/\cs{hyper@linkend} for clickable links.  If
%% \pkg{hyperref} changes its \cs{contentsline} interface, this override
%% must be reviewed.
%%
%% \textbf{WCAG-compliant color palette} (all at contrast ratio~$\geq4.5{:}1$ on white):
%%
%% \medskip\noindent
%% {\small
%% \begin{longtable}{@{}p{2.5cm}p{3.6cm}p{2.2cm}p{\dimexpr\linewidth-8.3cm-6\tabcolsep\relax}@{}}
%%   \toprule
%%   \textbf{Macro} & \textbf{RGB value} & \textbf{Ratio} & \textbf{Used for} \\
%%   \midrule
%%   \endhead
%%   \bottomrule
%%   \endfoot
%%   \texttt{codegreen}    & (0, 0.50, 0)        & 5.1:1 & Comment color in \texttt{uistyle} \\
%%   \texttt{codegray}     & (0.35, 0.35, 0.35)  & 9.3:1 & Line-number color \\
%%   \texttt{codepurple}   & (0.58, 0, 0.82)     & 6.5:1 & String color in \texttt{uistyle} \\
%%   \texttt{keywordcolor} & NavyBlue (alias)     & $\geq$5.1:1 & Keywords in language definitions \\
%%   \texttt{typecolor}    & teal (alias)         & 4.5:1 & Type names (minimum AA) \\
%%   \texttt{greencomments}& OliveGreen (alias)   & 4.8:1 & Comments in language definitions \\
%% \end{longtable}
%% }
%%
%% When adding new code colors, verify the contrast ratio against white
%% (\texttt{\#FFFFFF}) before adding.  Tools such as the WebAIM Contrast
%% Checker may be used.  Assign the color as a named \cs{colorlet} alias
%% so language definitions can reference the semantic name rather than
%% raw RGB values.
%%
%% \textbf{\texttt{\textbackslash lstdefinestyle\{uistyle\}} key choices}:
%% \begin{itemize}
%%   \item \texttt{basicstyle=\textbackslash ttfamily\textbackslash small} ---
%%         one point smaller than body text for visual contrast.
%%   \item \texttt{columns=fullflexible}: proportional horizontal spacing;
%%         enables cleaner soft-wrapping in narrow columns.
%%   \item \texttt{breaklines=true, breakindent=1em}: automatic wrapping
%%         with a visual indent to distinguish continuation lines.
%%   \item \texttt{numbers=left, numbersep=5pt}: left-side line numbers
%%         at 5\,pt from the code column.
%%   \item \texttt{tabsize=2}: 2-space tabs match the UI source conventions.
%% \end{itemize}
%%
%% \textbf{Caption configuration}: the \texttt{uicaption} font is
%% \texttt{\string\fontsize\{12\}\{15\}} to match the body text size.
%% The \texttt{centering} justification is declared with
%% \texttt{\string\parfillskip\string\z@skip} so the last line of a
%% multi-line caption is also centred (standard \cs{centering} leaves the
%% last line ragged).
%%
%% \subsection*{Bahasa Indonesia}
%%
%% Pengaturan \pkg{hyperref}: \texttt{colorlinks=false} dan \texttt{pdfborder=0 0 0}
%% tidak menghasilkan bingkai tautan pada output cetak.
%% \texttt{pdfpagelabels=true} dan \texttt{plainpages=false} diperlukan agar
%% penomoran PDF benar saat beralih dari romawi ke arab.
%%
%% Override \cs{contentsline} memastikan semua entri daftar (termasuk daftar
%% kustom dari \cs{newUIlist}) menggunakan tautan PDF yang dapat diklik.
%%
%% Palet warna WCAG: semua warna memenuhi rasio kontras $\geq4.5{:}1$ pada
%% latar putih.  Saat menambah warna baru, verifikasi rasio kontras terlebih dahulu.
%%
%% Konfigurasi caption: font \texttt{uicaption} menggunakan
%% \texttt{\string\fontsize\{12\}\{15\}} agar sesuai ukuran teks tubuh.
%% Justifikasi \texttt{centering} memakai \texttt{\string\parfillskip=0pt}
%% agar baris terakhir caption panjang tetap rata tengah.
%%
%% %-----------------------------------------------------------------------
%% \section{Chapter Heading System (ConnyRevised) / Sistem Judul Bab (ConnyRevised)}
%% %-----------------------------------------------------------------------
%%
%% \subsection*{English}
%%
%% The chapter heading style is derived from fncychap~v1.34 (LPPL).  Only the
%% ConnyRevised configuration is retained; all other fncychap styles have been
%% removed.  The UI-specific adjustments (v2.2.0) tighten the vertical rhythm
%% to match the UI thesis style guide.
%%
%% \textbf{Conditionals} (defined before the \cs{if@UImonograph} block):
%% \begin{itemize}
%%   \item \cs{ifUCN}/\cs{ifLCN}: uppercase/lowercase mode for the chapter
%%         name label (e.g., ``BAB'').  ConnyRevised activates \cs{UCNtrue}.
%%   \item \cs{ifUCT}/\cs{ifLCT}: uppercase/lowercase mode for the chapter
%%         title.  ConnyRevised activates \cs{UCTtrue}.
%%   \item \cs{ifinapp}: true when inside the appendix; set by the patched
%%         \cs{appendix} command.
%%   \item \cs{if@mainmatter}: defined explicitly if not already present
%%         (since \texttt{report.cls} does not define it, unlike \texttt{book.cls}).
%% \end{itemize}
%%
%% \textbf{Style variant macros}:
%% \begin{itemize}
%%   \item \cs{CNV}/\cs{ChNameVar}: format for the chapter-name label.
%%   \item \cs{CNoV}/\cs{ChNumVar}: format for the chapter number.
%%   \item \cs{CTV}/\cs{ChTitleVar}: format for the chapter title text.
%%   \item \cs{FmN}/\cs{FmTi}: apply the case-conversion modes.
%% \end{itemize}
%%
%% \textbf{ConnyRevised vertical rhythm}:
%% \begin{itemize}
%%   \item \cs{DOCH}: \texttt{\small\string\vspace*\{-4.5em\}} pulls the entire
%%         heading block upward toward the top margin, followed by
%%         \texttt{\small\string\vspace*\{-1em\}} to compress the gap between the
%%         label line and the chapter number.
%%   \item \cs{DOTI}: chapter title line, ending with \texttt{\string\vskip 20pt}
%%         of space before body text.
%%   \item \cs{DOTIS}: unnumbered variant; compensates with
%%         \texttt{\string\vspace*\{-4em\}} and \texttt{\string\vspace*\{-1em\}}
%%         to match the numbered heading's visual rhythm.
%%   \item \cs{@makeschapterhead}: centered, uppercase, \texttt{\string\vskip 20pt}.
%% \end{itemize}
%%
%% Do not change the negative vspace values without recompiling
%% \texttt{example/thesis.tex} and verifying the visual rhythm.  These
%% values are calibrated to the UI~2025 formatting guidelines.
%%
%% \textbf{Journal chapter flow}: no \cs{clearpage}, uses
%% \texttt{\small\textbackslash par\textbackslash addvspace\{\textbackslash UI@journal@chapterbeforeskip\}}
%% to insert inline spacing.  \cs{section} and \cs{subsection} are redefined
%% with \cs{RenewDocumentCommand} to support a starred form with optional short
%% name for the ToC, enabling correct navigation entries without section numbering.
%%
%% \subsection*{Bahasa Indonesia}
%%
%% Gaya judul bab diturunkan dari fncychap~v1.34 (LPPL); hanya konfigurasi
%% ConnyRevised yang dipertahankan.
%%
%% Kondisional \cs{ifUCN}/\cs{ifLCN} (huruf besar/kecil label bab) dan
%% \cs{ifUCT}/\cs{ifLCT} (huruf besar/kecil judul bab) didefinisikan sebelum
%% blok \cs{if@UImonograph} agar aman pada mode \emph{skip-mode} TeX.
%%
%% Ritme vertikal ConnyRevised: \cs{DOCH} menarik blok heading ke atas dengan
%% \texttt{\string\vspace*\{-4.5em\}}, sedangkan \cs{DOTIS} mengompensasi header
%% tak bernomor agar ritme visualnya sama dengan header bernomor.  Jangan ubah
%% nilai vspace ini tanpa memverifikasi ulang visual pada \texttt{example/thesis.tex}.
%%
%% Pada format jurnal, alur bab bersifat \emph{inline} tanpa \cs{clearpage};
%% \cs{section}/\cs{subsection} didefinisikan ulang dengan
%% \cs{RenewDocumentCommand} untuk mendukung nama pendek opsional pada ToC.
%%
%% %-----------------------------------------------------------------------
%% \section{Page Geometry and Typography Policies / Kebijakan Geometri Halaman dan Tipografi}
%% %-----------------------------------------------------------------------
%%
%% \subsection*{English}
%%
%% \textbf{Margin policy}:
%% \begin{itemize}
%%   \item Monograph: 3\,cm on all four sides (UI~2025 guidelines).
%%   \item Journal: 2\,cm left/right, 3\,cm top/bottom (wider text block for
%%         two-column layout).
%%   \item \texttt{\string\addtolength\{\string\topmargin\}\{-14.5pt\}} corrects for
%%         \texttt{headheight=14.5pt} so the body area remains at the correct position.
%% \end{itemize}
%%
%% \texttt{\string\setlength\{\string\emergencystretch\}\{1.5em\}} allows up to
%% 1.5\,em of additional interword stretch before \TeX{} emits an overfull hbox.
%% This silently prevents many overfull warnings in narrow columns without
%% disabling hyphenation.
%%
%% \textbf{Typography hierarchy} (monograph):
%% \begin{itemize}
%%   \item \texttt{secnumdepth=3}: subsubsection numbered.
%%   \item \texttt{tocdepth=3}: subsubsection appears in ToC.
%%   \item All heading levels use \cs{@startsection} with zero before-skip
%%         and minimal after-skip; vertical rhythm is controlled entirely by
%%         body text leading rather than heading skip parameters.
%% \end{itemize}
%%
%% \textbf{Physical page counters}:
%% \begin{itemize}
%%   \item \texttt{chapterpagecount[chapter]}: resets each chapter; used for
%%         internal logic that needs per-chapter page counts.
%%   \item \texttt{UI@physicalpage}: never resets; incremented by
%%         \cs{EveryShipout} after every shipped page.  This provides reliable
%%         odd/even parity regardless of \cs{pagenumbering} resets (roman \textrightarrow{} arabic).
%% \end{itemize}
%%
%% \textbf{Utility macros and sentinels}:
%% \begin{itemize}
%%   \item \cs{blank}: empty sentinel macro; used in conditionals such as
%%         \texttt{\textbackslash ifx\textbackslash blank\textbackslash npmDua} to test whether a
%%         slot is unfilled.
%%   \item \cs{strcompare}\marg{string}\marg{macro}\marg{same}\marg{diff}: pure
%%         \LaTeX2e string equality: expands \textit{macro} with \cs{edef},
%%         compares with \cs{def}, then uses \cs{ifx}.  Safe when
%%         \textit{macro} contains only character tokens.
%%   \item \cs{UI@IfSingleAuthor\{one\}\{multi\}}: tests
%%         \cs{ifUI@allowmultiauthor} and \texttt{\textbackslash ifx\textbackslash blank\textbackslash npmDua}
%%         to distinguish single-author from group theses.
%%   \item \cs{UI@AppendIfPresent\{macro\}\{text\}}: appends \texttt{~/~text}
%%         only if \textit{macro} is not \cs{blank}.  Used for optional
%%         second/third author data in combined display strings.
%%   \item \cs{UI@makaraimage}: defaults to \texttt{uithesis-makara.png}.
%%         Override with \cs{setmakaraimage\{filename\}} in the document preamble.
%% \end{itemize}
%%
%% For journal format, \cs{include} is silently aliased to \cs{input}
%% (\texttt{\string\let\string\include\string\input}) so chapter files do not
%% produce page breaks between inclusions in the journal flow.
%%
%% \subsection*{Bahasa Indonesia}
%%
%% Kebijakan margin: monograf 3\,cm semua sisi; jurnal 2\,cm kiri/kanan dan
%% 3\,cm atas/bawah.  Koreksi \cs{topmargin} sebesar $-14{,}5\,\text{pt}$
%% diperlukan karena \texttt{headheight=14.5pt} pada pengaturan \pkg{geometry}.
%%
%% \cs{emergencystretch} diatur ke 1.5\,em untuk mencegah \emph{overfull hbox}
%% tanpa menonaktifkan \emph{hyphenation}.
%%
%% Hierarki tipografi monograf: \texttt{secnumdepth=3} dan \texttt{tocdepth=3};
%% semua level heading menggunakan skip nol di atas headings.
%%
%% Penghitung halaman fisik \texttt{UI@physicalpage} tidak pernah direset dan
%% diperbarui oleh \cs{EveryShipout}, memungkinkan deteksi paritas yang andal
%% saat penomoran halaman berganti dari romawi ke arab.
%%
%% Sentinel \cs{blank} dan pembanding \cs{strcompare} dipakai di seluruh
%% kelas untuk percabangan kondisional berdasarkan tipe dokumen dan jumlah penulis.
%%
%% %-----------------------------------------------------------------------
%% \section{Journal Two-Column Helpers / Pembantu Jurnal Dua Kolom}
%% %-----------------------------------------------------------------------
%%
%% \subsection*{English}
%%
%% Three modes are available for full-width content in the two-column journal
%% format.  In the monograph format, all three modes degrade gracefully to
%% standard float or text behavior.
%%
%% \textbf{Mode~A: wide floats} (\env{UIwidetable}, \env{UIwidefigure}):
%% \begin{itemize}
%%   \item Two-column: expands to \texttt{table*}/\texttt{figure*},
%%         placed by \TeX{} at the top or bottom of a spread.
%%   \item One-column: expands to \texttt{table}/\texttt{figure}.
%%   \item Both accept an optional placement specifier (default \texttt{tbp}).
%%   \item Use for content that is a true float and can be relocated by \TeX.
%% \end{itemize}
%%
%% \textbf{Mode~B: wide non-float blocks} (\env{UIwideblock}):
%% \begin{itemize}
%%   \item Two-column: wraps content in the \pkg{cuted} \texttt{strip} environment,
%%         inserting a full-width block at the inline position.
%%   \item \cs{ifUI@instrip} guards against nested \texttt{strip} environments.
%%   \item \pkg{cuted} is only loaded when \texttt{format=journal} and
%%         \texttt{columns=2}; using \env{UIwideblock} in other configurations
%%         silently degrades to a simple centered block.
%%   \item Use when content must appear at a specific inline position in text order.
%% \end{itemize}
%%
%% \textbf{Mode~C: full-width page sequences}
%% (\env{UIfullwidthpages}, \env{UIlandscape}, \env{UIlongtable}):
%% \begin{itemize}
%%   \item \env{UIfullwidthpages} calls \cs{clearpage}, switches to
%%         \cs{onecolumn}, typesets its body, then restores \cs{twocolumn}.
%%   \item \env{UIlandscape} wraps \env{UIfullwidthpages} with \pkg{pdflscape}'s
%%         \env{landscape} environment.
%%   \item \env{UIlongtable} uses \texttt{longtable} in one-column mode
%%         (monograph) and \texttt{mpsupertabular} in two-column mode (journal,
%%         because \texttt{longtable} is restricted to single-column mode).
%% \end{itemize}
%%
%% The seven setup commands for \env{UIlongtable} must be called before
%% \verb|\begin{UIlongtable}|:
%% \cs{UIlongtablecaption}, \cs{UIlongtablelabel}, \cs{UIlongtablecols},
%% \cs{UIlongtablefirsthead}, \cs{UIlongtablehead}, \cs{UIlongtabletail},
%% \cs{UIlongtablelasttail}.
%% All seven macros are reset to \cs{@empty} after \verb|\end{UIlongtable}|.
%%
%% \subsection*{Bahasa Indonesia}
%%
%% Tiga mode tersedia untuk konten lebar-penuh di format jurnal dua kolom.
%% Pada format monograf, semua mode tetap berfungsi secara wajar sebagai float
%% atau teks biasa.
%%
%% Mode~A (\env{UIwidetable}, \env{UIwidefigure}): float penuh-halaman di
%% atas/bawah halaman.  Mode~B (\env{UIwideblock}): blok non-float posisi-inline
%% menggunakan \pkg{cuted}.  Mode~C (\env{UIfullwidthpages}, \env{UIlandscape},
%% \env{UIlongtable}): urutan halaman lebar dengan peralihan kolom.
%%
%% Tujuh perintah setup \env{UIlongtable} harus dipanggil sebelum membuka
%% environment; semuanya direset ke kosong setelah environment ditutup.
%%
%% %-----------------------------------------------------------------------
%% \section{Page Style System / Sistem Gaya Halaman}
%% %-----------------------------------------------------------------------
%%
%% \subsection*{English}
%%
%% All page styles are built with \pkg{fancyhdr}.  Page-style configuration
%% follows a specific pattern:
%% \begin{enumerate}
%%   \item \cs{UI@syncPageStyleWidth} sets \cs{headwidth} equal to
%%         \cs{textwidth}.  This must be called once at class load and again
%%         after \cs{restoregeometry} in the journal flow (fancyhdr may retain
%%         a stale headwidth after geometry resets).
%%   \item Named styles are defined with \cs{fancypagestyle\{name\}\{...\}}.
%%   \item The twoside physical-page parity helpers are installed last.
%% \end{enumerate}
%%
%% \textbf{Physical parity helpers}:
%% \begin{description}
%%   \item[\cs{UI@showOnPhysOdd\{content\}}] renders \textit{content} only when
%%         the current page lands on an odd physical sheet.  The check uses
%%         \texttt{\string\numexpr\string\value\{UI@physicalpage\}+1\string\relax}
%%         because \texttt{UI@physicalpage} holds the count of the \emph{last
%%         shipped} page; the page being typeset has not yet been shipped.
%%   \item[\cs{UI@showOnPhysEven\{content\}}] analogous for even pages.
%% \end{description}
%%
%% \textbf{Named page styles and their use}:
%%
%% \medskip\noindent
%% {\small
%% \begin{longtable}{@{}p{2.8cm}p{4.3cm}p{\dimexpr\linewidth-7.1cm-4\tabcolsep\relax}@{}}
%%   \toprule
%%   \textbf{Style name} & \textbf{Format} & \textbf{Usage} \\
%%   \midrule
%%   \endhead
%%   \bottomrule
%%   \endfoot
%%   \texttt{onlypage}       & both    & Center page number only; no footer brand.  Used for mandatory front-matter pages in journal mode, and blank inserted pages. \\
%%   \texttt{plain}          & both    & Chapter first pages.  Monograph: center number~+ right UI footer (oneside). Journal: right header number~+ right footer UI. \\
%%   \texttt{standard}       & both    & Regular body pages.  Number~+ UI footer; twoside-aware in monograph. \\
%%   \texttt{first-pages}    & both    & Front-matter list pages (ToC, LoF, etc.).  Monograph: center number~+ twoside UI footer.  Journal: center number~+ right UI footer. \\
%%   \texttt{journal-front}  & journal & Roman-numbered journal mandatory pages (orisinalitas through publikasi); center number only. \\
%%   \texttt{lampiran-first} & monograph & First page of each \env{lampiranBab}; right header with running title (no continuation suffix). \\
%%   \texttt{lampiran}       & monograph & Continuation pages of an appendix; right header with running title plus ``(lanjutan)''. \\
%% \end{longtable}
%% }
%%
%% \cs{setfirstheaderfooter}, \cs{setoddevenheader}, \cs{setoddevenfooter}
%% are imperative helpers that rebuild fancyhdr slots for the current page
%% according to the active print mode.  They are called by \cs{clearchapter}
%% after every chapter break to reset the running header correctly.
%%
%% \texttt{plagiarismcheck=true} overrides ALL named styles to \cs{fancyhf\{\}}
%% with zero rule widths after all styles are defined, clearing every header
%% and footer from the compiled PDF for plagiarism detection tools.
%%
%% \subsection*{Bahasa Indonesia}
%%
%% Semua gaya halaman dibangun dengan \pkg{fancyhdr}.  Pembantu paritas fisik
%% \cs{UI@showOnPhysOdd} dan \cs{UI@showOnPhysEven} memeriksa \texttt{UI@physicalpage}+1
%% karena penghitung tersebut menyimpan halaman terakhir yang sudah dikirim,
%% bukan halaman yang sedang disusun.
%%
%% \cs{UI@syncPageStyleWidth} harus dipanggil ulang setelah \cs{restoregeometry}
%% di alur jurnal untuk menghindari drift \cs{headwidth}.
%%
%% \texttt{plagiarismcheck=true} menimpa semua gaya yang sudah terdefinisi
%% dengan \cs{fancyhf\{\}} kosong, membersihkan semua header/footer dari PDF
%% untuk kebutuhan pengecekan plagiarisme.
%%
%% %-----------------------------------------------------------------------
%% \section{Chapter and Page Management / Pengelolaan Bab dan Halaman}
%% %-----------------------------------------------------------------------
%%
%% \subsection*{English}
%%
%% \cs{ifUI@chapterautoclearenabled} controls whether the redefined \cs{chapter}
%% command automatically calls \cs{clearchapter} before each new chapter.  It
%% defaults to \texttt{false} during front matter assembly and is set to
%% \texttt{true} by \cs{makefrontmatter} immediately before switching to arabic
%% page numbering.  The first chapter after \cs{makefrontmatter} is handled
%% by \cs{ifUI@chapterstarted}, which suppresses the call on the very first
%% chapter to avoid an extra blank page at the start of the body.
%%
%% \cs{clearchapter} (monograph only):
%% \begin{enumerate}
%%   \item \cs{clearpage}: flushes all pending floats.
%%   \item If twoside and the current physical page is odd, inserts a blank
%%         page (\cs{thispagestyle\{empty\}}, \texttt{\string\addtocounter\{page\}\{-1\}})
%%         so the new chapter starts on a right-hand (odd) physical page.
%%   \item \cs{setoddevenheader} and \cs{setoddevenfooter} reinstall the correct
%%         running header and footer.
%% \end{enumerate}
%%
%% \cs{forceclearchapter} always inserts a blank page in twoside mode regardless
%% of current parity.  Use for structural gaps (e.g., the appendix separator).
%%
%% \cs{UI@insertdummyblank}: inserts a blank page only when the current physical
%% page is odd.  Used in monograph front matter to maintain the odd-page-start
%% invariant without consuming a logical page number.
%%
%% \cs{UI@insertdummyblankonlypage}: like \cs{UI@insertdummyblank} but also
%% applies \texttt{\string\thispagestyle\{onlypage\}} to the blank page.
%%
%% \cs{blankpage}: clears, inserting an empty page (empty style, no page
%% number), then clears again.  For explicit blank pages outside chapter context.
%%
%% \textbf{Journal \cs{clearpage} override}: when \texttt{columns=2}, \cs{clearpage}
%% is wrapped to call \cs{balance} before the clear and \cs{nobalance} after,
%% ensuring columns are balanced at all forced page breaks.
%%
%% \subsection*{Bahasa Indonesia}
%%
%% \cs{ifUI@chapterautoclearenabled} mengendalikan apakah \cs{chapter} memanggil
%% \cs{clearchapter} secara otomatis.  Nilai ini \texttt{false} selama perakitan
%% front matter dan diaktifkan oleh \cs{makefrontmatter} tepat sebelum penomoran arab.
%%
%% \cs{clearchapter} (monograf): (1) flush float via \cs{clearpage}, (2) sisipkan
%% halaman kosong jika halaman fisik saat ini ganjil sehingga bab baru mulai di
%% halaman kanan, (3) pasang ulang header/footer.
%%
%% \cs{forceclearchapter} selalu menyisipkan halaman kosong di mode dua sisi,
%% tanpa melihat paritas.  \cs{UI@insertdummyblank} dan
%% \cs{UI@insertdummyblankonlypage} hanya menyisipkan jika halaman fisik saat ini ganjil.
%%
%% Override \cs{clearpage} pada jurnal dua kolom membungkus panggilan asli dengan
%% \cs{balance}/\cs{nobalance} agar kolom selalu seimbang pada setiap \emph{page break} paksa.
%%
%% %-----------------------------------------------------------------------
%% \section{Vertical Spacing System / Sistem Spasi Vertikal}
%% %-----------------------------------------------------------------------
%%
%% \subsection*{English}
%%
%% All typography lengths are declared via \cs{newlength} and initialized in
%% \cs{UI@setDocumentSpacingDefaults}.  To change any spacing, set the
%% corresponding named length; do not inline \cs{setlength} calls inside
%% page-rendering macros.
%%
%% \cs{UI@setDocumentSpacingDefaults} is called once at class load.  A
%% document may call it again in the preamble to reset everything to defaults
%% before making selective adjustments.
%%
%% \medskip\noindent
%% {\small
%% \begin{longtable}{@{}p{6.4cm}p{2.2cm}p{\dimexpr\linewidth-8.6cm-4\tabcolsep\relax}@{}}
%%   \toprule
%%   \textbf{Length macro} & \textbf{Default} & \textbf{Purpose} \\
%%   \midrule
%%   \endhead
%%   \bottomrule
%%   \endfoot
%%   \multicolumn{3}{@{}l}{\textit{Cover and title pages}} \\[\smallskipamount]
%%   \cs{UI@title@metaRowGap}               & 0.3\,cm  & Gap between each metadata row on cover/title \\
%%   \cs{UI@coverLogoToUniversityGap}        & $-0.25$\,cm & Pulls ``UNIVERSITAS INDONESIA'' upward toward logo \\
%%   \cs{UI@coverUniversityToTitleGap}       & 0.5\,cm  & Between university name and thesis title \\
%%   \cs{UI@coverTitleToSubtitleGap}         & 0.8\,cm  & Between thesis title and type label \\
%%   \cs{UI@coverSubtitleToAuthorGap}        & 0.5\,cm  & Between type label and author block \\
%%   \cs{UI@titleInsideSubtitleToBodyGap}    & 0.3\,cm  & After type label on judulDalam page \\[\smallskipamount]
%%   \multicolumn{3}{@{}l}{\textit{Front page general rhythm}} \\[\smallskipamount]
%%   \cs{UI@frontpage@topskip}               & 0\,pt    & Vertical compensation before mandatory-page heading \\
%%   \cs{UI@frontpage@afterskip}             & 20\,pt   & Space after mandatory-page heading \\
%%   \cs{UI@frontpage@sectionGapXS}          & 0.1\,cm  & Extra-small gap \\
%%   \cs{UI@frontpage@sectionGapS}           & 0.2\,cm  & Small gap \\
%%   \cs{UI@frontpage@sectionGapM}           & 0.4\,cm  & Medium gap \\
%%   \cs{UI@frontpage@sectionGapL}           & 0.6\,cm  & Large gap \\[\smallskipamount]
%%   \multicolumn{3}{@{}l}{\textit{Signature block}} \\[\smallskipamount]
%%   \cs{UI@frontpage@bodyTopGap}            & 2.0\,cm  & Space above body text on pages with signature \\
%%   \cs{UI@frontpage@bodyToSignatureGap}    & 2.6\,cm  & Space from body text to signature table \\
%%   \cs{UI@frontpage@signatureDateGap}      & 1.8\,cm  & Space for handwritten signature above date \\[\smallskipamount]
%%   \multicolumn{3}{@{}l}{\textit{Pengesahan board}} \\[\smallskipamount]
%%   \cs{UI@approval@metaToStatementGap}     & 1.0\,cm  & Between metadata block and approval statement \\
%%   \cs{UI@approval@statementToBoardGap}    & 1.0\,cm  & Between approval statement and board table \\
%%   \cs{UI@approvalBoardRuleToNameGap}      & $-0.2$\,em & Pulls name upward under signature rule \\
%%   \cs{UI@approvalBoardNameToRoleGap}      & 0.8\,em  & Between name and role label \\
%%   \cs{UI@approvalBoardHeaderToRowsGap}    & 0.3\,cm  & Between "DEWAN PENGUJI" header and first row \\
%%   \cs{UI@approvalBoardInterRowGap}        & $-0.5$\,em & Tightens spacing between board rows \\
%%   \cs{UI@approvalMultiAuthorStudyGap}     & 0.2\,cm  & Between study program entries in multi-author Pengesahan \\
%%   \cs{UI@approvalMBKMStatementToBoardGap} & 2.0\,cm  & MBKM variant: statement to board gap \\[\smallskipamount]
%%   \multicolumn{3}{@{}l}{\textit{Surat Pernyataan}} \\[\smallskipamount]
%%   \cs{UI@suratParagraphGap}               & $0.6{\times}$ \cs{baselineskip} & Between paragraphs in Surat Pernyataan \\
%%   \cs{UI@suratHeadingTopskip}             & 0.15\,cm & Topskip override for Surat Pernyataan heading \\
%%   \cs{UI@suratHeadingAfterSkip}           & 24\,pt   & Afterskip for Surat Pernyataan heading \\
%%   \cs{UI@suratIdentityToMetaGap}          & 0.2\,cm  & Between body text and identity table \\[\smallskipamount]
%%   \multicolumn{3}{@{}l}{\textit{Kata Pengantar, Publikasi, list pages, back matter}} \\[\smallskipamount]
%%   \cs{UI@kataPengantarDateToNameGap}      & 0.1\,cm  & Between date and author name in Kata Pengantar \\
%%   \cs{UI@kataPengantarSingleAuthorSignGap}& 1.5\,cm  & Signature space above author name (single author) \\
%%   \cs{UI@publikasiHeadingAfterGap}        & 8\,pt    & After Publikasi double-rule heading \\
%%   \cs{UI@publikasiRuleInnerGap}           & 1\,pt    & Between the two rules in Publikasi heading \\
%%   \cs{UI@listChapterSeparatorSkip}        & 10\,pt   & Addvspace written to list files at each chapter \\
%%   \cs{UI@frontmatterTocPreskip}           & $-1$\,em & Pre-skip for front-matter ToC entries (counters the separator) \\
%%   \cs{UI@lt@continuedCaptionGap}          & 10\,pt   & Gap before continuation-caption row in UIlongtable \\
%%   \cs{UI@lampiranHeaderLineGap}           & 1\,em    & Gap between page number and running title in appendix header \\
%%   \cs{UI@appendixSeparatorTopGap}         & 6\,cm    & Top vspace on the "LAMPIRAN" separator page \\
%% \end{longtable}
%% }
%%
%% Journal-only abstract spacing lengths (\cs{UI@journalTitleToStudyGap},
%% \cs{UI@journalStudyToAbstrakGap}, \cs{UI@journalAbstrakToKeywordsGap},
%% \cs{UI@journalKeywordsToAbstractGap},
%% \cs{UI@journalAbstractToKeywordsGap}) and
%% monograph abstract spacing (\cs{UI@abstrakMonoMetaToBodyGap},
%% \cs{UI@abstrakMonoBodyToKeywordsGap}, \cs{UI@abstrakMonoAfterKeywordsGap},
%% and the EN variants) follow the same pattern but are omitted from the table
%% for brevity; their defaults are documented inline in the source.
%%
%% \subsection*{Bahasa Indonesia}
%%
%% Semua panjang tipografi dideklarasikan via \cs{newlength} dan diinisialisasi
%% dalam \cs{UI@setDocumentSpacingDefaults}.  Untuk mengubah spasi, tetapkan
%% panjang bernama yang sesuai; jangan menyisipkan \cs{setlength} langsung di
%% dalam makro penyusunan halaman.
%%
%% \cs{UI@setDocumentSpacingDefaults} dipanggil sekali saat kelas dimuat.
%% Dokumen dapat memanggilnya lagi di preamble untuk mereset ke nilai default
%% sebelum melakukan penyesuaian selektif.
%%
%% %-----------------------------------------------------------------------
%% \section{Internationalization Layer / Lapisan Internasionalisasi}
%% %-----------------------------------------------------------------------
%%
%% \subsection*{English}
%%
%% The label system stores all language-dependent strings in
%% \texttt{\string\def\string\UI@label@<name>\{...\}} macros.  Two parallel
%% sets of definitions exist: one inside the \texttt{if@UIenglish} branch and
%% one in the else branch.  Every label name must be defined in both branches;
%% missing definitions silently inherit the previous run's string.
%%
%% \textbf{Display helpers}:
%% \begin{itemize}
%%   \item \cs{UI@jenjang@display}: maps the internal jenjang code to a
%%         display string: English: Sarjana~$\to$ ``Bachelor's'',
%%         Magister~$\to$ ``Master's'', else~$\to$ ``Doctoral'';
%%         Indonesian: passthrough.
%%   \item \cs{UI@typeNameID} / \cs{UI@typeNameEN}: map the internal type
%%         code to display names.  \cs{namaTipeTesis\{ID\}\{EN\}} overrides both.
%%   \item \cs{UI@type@display}: single active-language type name; set to
%%         \cs{UI@typeNameID} or \cs{UI@typeNameEN} based on \cs{if@UIenglish}.
%%   \item \cs{UI@facultyDisplay}: resolved to \cs{fakultasID} or
%%         \cs{fakultasEN} based on active language.
%% \end{itemize}
%%
%% \textbf{Sensitive labels} that reference runtime metadata at expansion:
%% \begin{itemize}
%%   \item \cs{UI@label@approvedBody}: references \cs{UI@jenjang@display},
%%         \cs{studyProgramSatu}, and \cs{UI@facultyDisplay}.  This label must
%%         be re-evaluated after the metadata commands execute.  Because it is a
%%         \cs{def} (not \cs{edef}), it expands lazily and is safe.
%%   \item \cs{UI@label@aiBodyUsed}: references \cs{UI@aiplatform} and
%%         \cs{UI@tujuanai}.  Same lazy-expansion safety applies.
%% \end{itemize}
%%
%% To add a new document type:
%% \begin{enumerate}
%%   \item Add a \texttt{\string\strcompare\{New Type\}\{\string\UI@type\}...} link
%%         in the \cs{UI@typeNameEN} resolution chain.
%%   \item Add corresponding \cs{UI@label@*} strings in both language branches.
%%   \item Follow the \texttt{strcompare} pattern wherever conditionals dispatch
%%         on \cs{UI@type} (e.g., in \cs{makefrontmatter} and
%%         \cs{UI@typeset@pengesahan}).
%% \end{enumerate}
%%
%% Adding a display language beyond Indonesian and English would require a
%% third parallel branch of all label definitions.  The current architecture
%% does not structurally support more than two languages without significant
%% refactoring.
%%
%% \subsection*{Bahasa Indonesia}
%%
%% Sistem label menyimpan semua string berbahasa dalam makro
%% \texttt{\string\def\string\UI@label@<name>}.  Dua set definisi paralel ada:
%% satu di cabang \cs{if@UIenglish} dan satu di cabang else.  Setiap nama label
%% harus terdefinisi di kedua cabang; definisi yang hilang secara diam-diam
%% mewarisi string dari run sebelumnya.
%%
%% Label sensitif seperti \cs{UI@label@approvedBody} dan \cs{UI@label@aiBodyUsed}
%% mereferens metadata run-time (\cs{UI@jenjang@display}, \cs{UI@aiplatform}, dll.)
%% melalui \cs{def} (bukan \cs{edef}), sehingga evaluasinya ditunda hingga saat
%% digunakan dan aman terhadap urutan inisialisasi.
%%
%% Untuk menambah tipe dokumen baru, tambahkan link \cs{strcompare} pada rantai
%% resolusi \cs{UI@typeNameEN} dan label terkait di kedua cabang bahasa.
%%
%% %-----------------------------------------------------------------------
%% \section{Custom Table Column Types / Jenis Kolom Tabel Kustom}
%% %-----------------------------------------------------------------------
%%
%% \subsection*{English}
%%
%% Nine column types are defined via \cs{newcolumntype} with the \pkg{array}
%% package prefix mechanism.  All accept a mandatory width argument.
%%
%% \medskip\noindent
%% {\small
%% \begin{longtable}{@{}p{1.0cm}p{2.5cm}p{2.0cm}p{\dimexpr\linewidth-5.5cm-6\tabcolsep\relax}@{}}
%%   \toprule
%%   \textbf{Code} & \textbf{Alignment} & \textbf{Position} & \textbf{Mnemonic and use} \\
%%   \midrule
%%   \endhead
%%   \bottomrule
%%   \endfoot
%%   \texttt{P} & raggedright & p (top)    & \textbf{P}aragraph; standard left-aligned column \\
%%   \texttt{L} & raggedright & m (middle) & \textbf{L}eft, middle-anchored \\
%%   \texttt{B} & raggedright & b (bottom) & \textbf{B}ottom-left \\
%%   \texttt{U} & centering   & p (top)    & \textbf{U}pper-centered \\
%%   \texttt{C} & centering   & m (middle) & \textbf{C}entered, middle-anchored \\
%%   \texttt{O} & centering   & b (bottom) & l\textbf{O}wer-centered \\
%%   \texttt{E} & raggedleft  & p (top)    & north-\textbf{E}ast (right top) \\
%%   \texttt{R} & raggedleft  & m (middle) & \textbf{R}ight, middle-anchored \\
%%   \texttt{T} & raggedleft  & b (bottom) & \textbf{T}enggara (SE); bottom-right \\
%% \end{longtable}
%% }
%%
%% The \textit{position} argument (p/m/b from the \pkg{array} package) controls
%% vertical alignment in rows with mixed-height cells.  Use \texttt{m} variants
%% when columns in the same row may have different heights and vertical centering
%% is required.
%%
%% \cs{tabitem} expands to \texttt{\string~\string~\string\llap\{\string\textbullet\}\string~\string~},
%% a bullet point indented within a table cell.  Use in \texttt{p}/\texttt{m}/\texttt{b}
%% columns where nested \env{itemize} environments would not fit.
%%
%% \subsection*{Bahasa Indonesia}
%%
%% Sembilan jenis kolom tabel didefinisikan via \cs{newcolumntype} dengan mekanisme
%% prefiks \pkg{array}.  Semua memerlukan argumen lebar.  Kode kolom mengikuti
%% mnemonik: posisi vertikal (p/m/b dari \pkg{array}) dikombinasikan dengan
%% perataan horizontal.  Gunakan varian \texttt{m} saat kolom-kolom dalam satu
%% baris memiliki tinggi berbeda dan perataan vertikal tengah diperlukan.
%%
%% \cs{tabitem} menghasilkan item bergaya bullet yang terindentasi di dalam sel
%% tabel, berguna di kolom p/m/b yang terlalu sempit untuk \env{itemize} bersarang.
%%
%% %-----------------------------------------------------------------------
%% \section{User Content Commands / Perintah Konten Pengguna}
%% %-----------------------------------------------------------------------
%%
%% \subsection*{English}
%%
%% \textbf{Inline formatting}:
%%
%% \medskip\noindent
%% {\small
%% \begin{longtable}{@{}p{2.6cm}p{4.0cm}p{\dimexpr\linewidth-6.6cm-4\tabcolsep\relax}@{}}
%%   \toprule
%%   \textbf{Command} & \textbf{Expands to} & \textbf{Intended use} \\
%%   \midrule
%%   \endhead
%%   \bottomrule
%%   \endfoot
%%   \cs{f\{text\}}   & \cs{textit\{text\}}                               & Foreign terms, titles \\
%%   \cs{bi\{text\}}  & \cs{textbf\{\cs{textit\{text\}}\}}                 & Bold-italic emphasis \\
%%   \cs{bo\{text\}}  & \cs{textbf\{text\}}                               & Bold emphasis \\
%%   \cs{m\{expr\}}   & \texttt{\string\boldmath\{\string\(expr\string\)\}} & Bold inline math \\
%%   \cs{mc\{expr\}}  & \texttt{\string\boldmath\{\string\[expr\string\]\}} & Bold display math \\
%%   \cs{code\{text\}}& \cs{texttt\{text\}}                               & Inline code \\
%%   \cs{latex}       & \cs{LaTeX}                                        & Alias \\
%%   \cs{glo\{key\}}  & \cs{gls\{key\}} or \cs{key}                       & Glossary entry; uses defined macro if available \\
%% \end{longtable}
%% }
%%
%% \textbf{Placeholder markers}:
%% \begin{itemize}
%%   \item \cs{todo\{text\}}: monograph: styled red-shaded box; journal: inline
%%         colored text.  All \cs{todo} markers must be removed before final submission.
%%   \item \cs{todoCite}: marks a missing citation; same format as \cs{todo}.
%% \end{itemize}
%%
%% \textbf{PDF inclusion}:
%% \begin{itemize}
%%   \item \cs{inpdf\{filename\}}: includes all pages with \cs{thispagestyle\{fancy\}}.
%%   \item \cs{putpdf\{filename\}}: includes all pages without page style override.
%%   \item Both accept the filename without \texttt{.pdf} extension.
%% \end{itemize}
%%
%% \textbf{User-defined variables}:
%% \begin{itemize}
%%   \item \cs{var\{cmd\}\{val\}}: defines \textit{cmd} as \cs{newcommand};
%%         errors if already defined.
%%   \item \cs{Var\{cmd\}\{val\}}: defines \textit{cmd} as
%%         \texttt{\string\gdef} of the uppercase value.
%% \end{itemize}
%%
%% \textbf{Caption helpers}:
%% \begin{itemize}
%%   \item \cs{captionsource\{title\}\{source\}}: \cs{caption} with a 10\,pt
%%         source attribution line below the caption text.  Always uses centering
%%         justification.
%%   \item \cs{captionsourcecont\{title\}\{source\}}: continuation caption;
%%         appends ``(sambungan)'' suffix; does not add a list entry.
%%   \item \cs{captionsource\textit{cmd}} and
%%         \cs{captionsource\textit{cmd}cont}: analogous helpers generated by
%%         \cs{newUIlist} for user-defined list types.
%% \end{itemize}
%%
%% \textbf{Semantic cross-reference aliases}:
%% \cs{bab}, \cs{sect}, \cs{pic}, \cs{tab}, \cs{equ}, \cs{lst}, \cs{apdx} provide
%% Indonesian nouns for cross-reference type labels.  Use as
%% \texttt{\string\bab~\string\ref\{bab:1\}} rather than bare ``Bab~\ldots''.
%%
%% \subsection*{Bahasa Indonesia}
%%
%% Perintah pemformatan inline (\cs{f}, \cs{bi}, \cs{bo}, \cs{m}, \cs{mc},
%% \cs{code}, \cs{latex}) adalah pembungkus tipis untuk perintah \LaTeX{} standar.
%% \cs{glo\{key\}} adalah alias glossary ringkas yang mencoba memanggil makro
%% \cs{key} bila terdefinisi, atau \cs{gls\{key\}} sebagai fallback.
%%
%% \cs{todo} dan \cs{todoCite} adalah penanda placeholder yang bersifat kondisional
%% per format: monograf menggunakan kotak bergaya; jurnal menggunakan teks berwarna.
%% Semua penanda ini harus dihapus sebelum pengajuan akhir.
%%
%% Pembantu caption \cs{captionsource} dan \cs{captionsourcecont} selalu menggunakan
%% justifikasi centering dan memerlukan sumber dalam argumen kedua.  Varian
%% \textit{cont} tidak menambah entri ke daftar konten.
%%
%% Alias referensi silang (\cs{bab}, \cs{sect}, dll.) menyediakan nama benda
%% Indonesia untuk label tipe objek; gunakan bersama \cs{ref} untuk konsistensi.
%%
%% %-----------------------------------------------------------------------
%% \section{Front-Matter List System / Sistem Daftar Front Matter}
%% %-----------------------------------------------------------------------
%%
%% \subsection*{English}
%%
%% The front-matter list system provides a data-driven mechanism for
%% registering, counting, and conditionally generating list pages.  All
%% built-in and user-defined list types participate through the same registry.
%%
%% \textbf{Registries}:
%% \begin{itemize}
%%   \item \cs{UI@listExtRegistry}: comma-separated extensions of all known
%%         list files (lof, lot, lol, loe, lox, plus user-defined).  Used by
%%         \cs{UI@addchapterlistseparatorspacing} and \cs{AtEndDocument} counter
%%         persistence.  \cs{UI@registerListExt\{ext\}} appends to this.
%%   \item \cs{UI@frontmatterListRegistry}: subset of \cs{UI@listExtRegistry}
%%         holding only lists that receive a dedicated page in front matter.
%%         \cs{newUIlist} enrolls to both registries automatically.
%% \end{itemize}
%%
%% \textbf{Entry counting}: entries are counted at two independent sites ---
%% the \cs{addcontentsline} call site (via the replaced \cs{addcontentsline})
%% and the \cs{@writefile} call site (via the replaced \cs{@writefile}) ---
%% to ensure accurate counts regardless of which path other packages take.
%%
%% \textbf{Previous-run counts}: \cs{UI@prev@count@\textit{ext}} macros hold
%% entry totals from the prior run, written by \cs{AtEndDocument} to the
%% \texttt{.aux} file.  These govern \cs{UI@condListPage}.  After structural
%% edits, run \LaTeX{} at least twice to stabilize list-page decisions.
%%
%% \cs{minimumListEntries\{N\}} sets a threshold: list pages with fewer than
%% $N$ entries are suppressed.  Default is~0 (always generate).
%%
%% \textbf{Appendix ToC suppression}: \cs{UI@withAddcontentslineFilter}
%% drops appendix chapter entries from \texttt{toc} when \cs{ifinapp} is true,
%% preventing duplicate appearance of appendix chapters in both the main ToC
%% and the appendix list (Daftar Lampiran).
%%
%% \textbf{Chapter separator spacing}: \cs{ifUI@listchapterseparatorspacing}
%% controls whether an \texttt{\string\addvspace} entry is written to all
%% non-lox list files at each \cs{chapter} call.  This creates visual chapter
%% grouping in LoF, LoT, LoL, and LoE pages.  Disable with
%% \cs{disablechapterseparatorspaceinlists} if uniformity is preferred.
%%
%% \textbf{\cs{CAPinToC} / \cs{noCAPinToC}}: switch the active
%% \cs{addcontentsline} between the uppercase and normal variants.
%% CAP mode is active during front-matter page generation.
%%
%% \textbf{Bold chapter entries in ToC}: \cs{enableboldchapterintoc} and
%% \cs{disableboldchapterintoc} write tocloft formatting commands to the
%% \texttt{.toc} file at point of call, affecting only subsequent entries.
%% They do not retroactively reformat already-written entries.
%%
%% \textbf{\cs{newUIlist}\marg{ext}\marg{cmdbase}\marg{singular}\marg{listtitle}}
%% creates a complete list type in nine steps:
%% \begin{enumerate}
%%   \item Store list title in \texttt{\string\UI@UIlistname@ext}.
%%   \item Create counter \texttt{UI@count@ext}, initialize
%%         \cs{UI@prev@count@ext} to~0, enroll in both registries.
%%   \item Define \cs{cmdbase} as the singular noun command.
%%   \item Call \cs{newlistof}\marg{cmdbase}\marg{ext}\marg{listtitle} from \pkg{tocloft};
%%         add \cs{counterwithin}\marg{cmdbase}\marg{chapter} in monograph mode.
%%   \item Set tocloft formatting: indent=0\,pt, numwidth auto-calculated from
%%         label width, aftersnum=\texttt{.}, presnum=\cs{cmdbase}~.
%%   \item Define \cs{caption<cmdbase>}.
%%   \item Define \cs{captionsource<cmdbase>}.
%%   \item Define \cs{caption<cmdbase>cont} and \cs{captionsource<cmdbase>cont}.
%%   \item Store print macro \cs{UI@UIlist@print@ext} for the rendering loop.
%% \end{enumerate}
%%
%% \subsection*{Bahasa Indonesia}
%%
%% Sistem daftar front matter menyediakan mekanisme berbasis data untuk
%% mendaftarkan, menghitung, dan menghasilkan halaman daftar secara kondisional.
%%
%% Dua registri digunakan: \cs{UI@listExtRegistry} untuk semua ekstensi daftar
%% yang dikenal, dan \cs{UI@frontmatterListRegistry} untuk subset yang mendapat
%% halaman tersendiri di front matter.  \cs{newUIlist} mendaftar ke keduanya
%% secara otomatis.
%%
%% Penghitungan entri dilakukan di dua titik independen (situs \cs{addcontentsline}
%% dan situs \cs{@writefile}), sehingga jumlah akurat meskipun paket lain
%% menambal salah satu jalur.
%%
%% \cs{UI@prev@count@ext} menyimpan jumlah entri dari run sebelumnya dan
%% ditulis ke \texttt{.aux} oleh \cs{AtEndDocument}.  Setelah perubahan
%% struktural, jalankan \LaTeX{} minimal dua kali agar keputusan halaman daftar
%% stabil.
%%
%% Penekanan entri bab lampiran di ToC dilakukan oleh
%% \cs{UI@withAddcontentslineFilter} ketika \cs{ifinapp} bernilai benar.
%%
%% \cs{newUIlist} membuat jenis daftar lengkap dalam sembilan langkah,
%% termasuk counter, pendaftaran, perintah noun, format tocloft, dan
%% empat varian perintah caption.
%%
%% %-----------------------------------------------------------------------
%% \section{Content Collector Environments / Environment Pengumpul Konten}
%% %-----------------------------------------------------------------------
%%
%% \subsection*{English}
%%
%% All seven collector environments use \pkg{environ}'s \cs{NewEnviron}:
%% the full environment body is captured to the \cs{BODY} token and globally
%% stored in a designated macro.  Example:
%% \begin{center}
%%   \texttt{\small\string\NewEnviron\{abstrakID\}\{\string\global\string\let\string\UI@content@abstrakID\string\BODY\}}
%% \end{center}
%%
%% \medskip\noindent
%% {\footnotesize
%% \begin{longtable}{@{}p{3.8cm}p{4.2cm}p{\dimexpr\linewidth-8.0cm-4\tabcolsep\relax}@{}}
%%   \toprule
%%   \textbf{Environment} & \textbf{Storage macro} & \textbf{Rendered by} \\
%%   \midrule
%%   \endhead
%%   \bottomrule
%%   \endfoot
%%   \env{abstrakID}               & \cs{UI@content@abstrakID}    & \cs{UI@typeset@abstrak} \\
%%   \env{abstractEN}              & \cs{UI@content@abstractEN}   & \cs{UI@typeset@abstract} \\
%%   \env{kataPengantar}           & \cs{UI@content@kataPengantar}& \cs{UI@typeset@kataPengantar} \\
%%   \env{pernyataanOrisinalitas}  & \cs{UI@content@orisinalitas} & \cs{UI@typeset@orisinalitas} \\
%%   \env{persetujuanPublikasi}    & \cs{UI@content@publikasi}    & \cs{UI@typeset@publikasi} \\
%%   \env{pernyataanAI}            & \cs{UI@content@AI}           & \cs{UI@typeset@pernyataanAI} \\
%%   \env{suratPernyataan}         & \cs{UI@content@suratPernyataan} & \cs{UI@typeset@suratPernyataan} \\
%% \end{longtable}
%% }
%%
%% All collector environments are declared in the \emph{class} (not in
%% \cs{AtBeginDocument}), so they are available in the preamble before
%% \verb|\begin{document}|.
%%
%% \textbf{Safe-when-empty}: every \cs{UI@typeset@*} macro checks
%% \texttt{\textbackslash ifx\textbackslash UI@content@X\textbackslash empty} and renders a default
%% template when the user omits the corresponding environment.  Mandatory pages
%% are always generated; optional environments add an override.
%%
%% \cs{katakunci\{text\}} and \cs{keywords\{text\}} store keyword strings in
%% \cs{UI@keywords@ID} and \cs{UI@keywords@EN}.  If omitted, these macros remain
%% empty and the keywords line renders blank.
%%
%% \cs{UI@frontpageHead\{title\}} renders the mandatory-page heading:
%% \begin{itemize}
%%   \item Monograph: calls \cs{@makeschapterhead} directly without \cs{clearpage}.
%%         Sets \cs{thispagestyle\{onlypage\}}.
%%   \item Journal: \cs{clearpage}, centered uppercase bold title with controlled
%%         spacing, \cs{thispagestyle\{journal-front\}}.
%% \end{itemize}
%%
%% \subsection*{Bahasa Indonesia}
%%
%% Ketujuh environment pengumpul konten menggunakan \cs{NewEnviron} dari \pkg{environ}:
%% isi environment ditangkap ke \cs{BODY} dan disimpan secara global ke makro
%% penyimpanan yang sesuai.  Environment dideklarasikan di dalam kelas (bukan di
%% \cs{AtBeginDocument}), sehingga tersedia di preamble sebelum
%% \verb|\begin{document}|.
%%
%% Mekanisme aman-saat-kosong: setiap \cs{UI@typeset@*} memeriksa apakah
%% konten yang tersimpan kosong dan merender template default jika pengguna
%% menghilangkan environment opsional.  Halaman wajib selalu dihasilkan.
%%
%% \cs{katakunci} dan \cs{keywords} menyimpan kata kunci.  Jika tidak diisi,
%% baris kata kunci tetap dirender (kosong).
%%
%% \cs{UI@frontpageHead} merender heading halaman wajib secara berbeda per
%% format: monograf memanggil \cs{@makeschapterhead} langsung; jurnal melakukan
%% \cs{clearpage} lalu menampilkan judul tengah tebal.
%%
%% %-----------------------------------------------------------------------
%% \section{Front Matter Page Typesetting / Penyusunan Halaman Front~Matter}
%% %-----------------------------------------------------------------------
%%
%% \subsection*{English}
%%
%% \textbf{\cs{UI@sigTable}}: a three-column \texttt{tabular} with author Name,
%% NPM, and Signature rows.  Single-author: one set of rows.  Multi-author:
%% rows for authors~1 and~2 (and~3 if present, via \cs{UI@IfThirdAuthor}).
%% Always ends with a Date row showing \cs{tanggalSiapSidang}.
%%
%% \textbf{Counselor renderer selection}: \cs{UI@setupAbstrakCounselorRenderers}
%% selects the active renderer once during class load:
%% \begin{itemize}
%%   \item KP / MBKM: \cs{UI@abstrakCounselorRowsOne} (pembimbingSatu only).
%%   \item Disertasi: \cs{UI@abstrakCounselorRowsThree} (up to pembimbingTiga).
%%   \item All others: \cs{UI@abstrakCounselorRowsTwo} (pembimbingSatu + optional Dua).
%% \end{itemize}
%%
%% \textbf{\cs{UI@typeset@sampul}}: \texttt{titlepage} + \texttt{singlespace*}
%% + \texttt{center}; Makara logo (2.5\,cm), ``UNIVERSITAS INDONESIA'', thesis
%% title (uppercase via \cs{Judul}/\cs{JudulInggris}), type label, author(s)
%% with NPM, faculty block with combined study program, city, and date.
%%
%% \textbf{\cs{UI@typeset@judulDalam}}: identical structure to sampul but
%% inserts degree requirement text (\cs{UI@label@gelarText} + \cs{gelar})
%% between the type label and the author block.
%%
%% \textbf{\cs{UI@typeset@pengesahan}}, four variants:
%% \begin{itemize}
%%   \item KP: simplified metadata, single supervisor,
%%         \cs{UI@label@kpSupervisorTitle}.
%%   \item MBKM: one or two supervisors; if two, side-by-side \texttt{tabularx}
%%         showing partner position and organization.
%%   \item Doktor/S3: \texttt{longtable} board with Promotor~+
%%         Kopromotor~+ up to~6 Penguji with chair/member roles.
%%   \item S1/S2: \texttt{tabularx} board with up to~3 Penguji;
%%         multi-author layout uses vertical stacking with
%%         \cs{UI@approvalMultiAuthorStudyGap}.
%% \end{itemize}
%%
%% \textbf{External pengesahan PDF}: if \cs{pengesahanPDF\{filename\}} is used,
%% \cs{makefrontmatter} substitutes \cs{includepdf} for the built-in pengesahan
%% renderer; page style is applied via the \texttt{pagecommand} key.
%%
%% \textbf{\cs{UI@typeset@pernyataanAI}}: auto-selects
%% \cs{UI@label@aiBodyNone} or \cs{UI@label@aiBodyUsed} based on
%% \texttt{\textbackslash ifx\textbackslash blank\textbackslash UI@aiplatform}.  The user
%% \env{pernyataanAI} environment overrides both.
%%
%% \textbf{\cs{UI@typeset@suratPernyataan}}: renders identity block (name,
%% NPM, study program, academic year), plagiarism statement with the typeset
%% thesis title, sanction statement, and closing.  Override via
%% \env{suratPernyataan}.
%%
%% \textbf{\cs{UI@typeset@publikasi}}: custom double-rule heading
%% (two \cs{hrule}s with \cs{UI@publikasiRuleInnerGap} between), then the
%% standard publication agreement text.  Override via
%% \env{persetujuanPublikasi}.
%%
%% \textbf{\cs{UI@typeset@abstrak} / \cs{UI@typeset@abstract}}:
%% \begin{itemize}
%%   \item Monograph: \cs{chapter*} heading, single-spaced tabular metadata
%%         block, abstract body, keywords line.
%%   \item Journal: centered title (12\,pt bold), author list with counselors
%%         inline (\cs{UI@abstrakCounselorInline}), study program + faculty, bold
%%         heading, body, keywords.
%% \end{itemize}
%%
%% \subsection*{Bahasa Indonesia}
%%
%% \cs{UI@sigTable} merender tabel tanda tangan satu, dua, atau tiga penulis
%% secara kondisional.  Selalu diakhiri dengan baris tanggal.
%%
%% Pemilih renderer pembimbing (\cs{UI@setupAbstrakCounselorRenderers}) dipanggil
%% sekali saat kelas dimuat berdasarkan tipe dokumen.
%%
%% \cs{UI@typeset@pengesahan} memiliki empat varian tergantung tipe: KP
%% (penyelia satu), MBKM (penyelia satu atau dua dengan kolom mitra), Doktor
%% (longtable dengan promotor dan hingga enam penguji), S1/S2 (tabularx).
%%
%% \cs{pengesahanPDF} menggantikan renderer pengesahan bawaan dengan PDF
%% eksternal menggunakan \cs{includepdf}.
%%
%% \cs{UI@typeset@pernyataanAI} memilih teks ``tidak menggunakan AI'' atau
%% ``menggunakan AI'' secara otomatis berdasarkan apakah \cs{UI@aiplatform}
%% tidak kosong.
%%
%% %-----------------------------------------------------------------------
%% \section{\cs{makefrontmatter} Assembly Logic / Logika Perakitan \cs{makefrontmatter}}
%% %-----------------------------------------------------------------------
%%
%% \subsection*{English}
%%
%% \cs{makefrontmatter} is the single entry point that assembles and emits all
%% front-matter pages.  Its logic branches on the active format.
%%
%% \textbf{Monograph flow} (12 structural steps):
%% \begin{enumerate}
%%   \item Sampul~+ \cs{UI@insertdummyblank} (ensures sampul ends on a right page).
%%   \item \cs{pagenumbering\{roman\}}: roman numbering begins.
%%   \item Judul Dalam with \cs{addChapter} ToC entry (skipped for MBKM).
%%   \item Orisinalitas with \cs{addChapter} ToC entry (skipped for KP and MBKM).
%%   \item Page counter set: 2~for KP/MBKM (skip steps~3 and~4), 3~otherwise.
%%   \item Pengesahan: built-in renderer or \cs{includepdf} if
%%         \cs{UI@pengesahanPDFfile} is non-empty.
%%   \item PernyataanAI with \cs{addChapter}.
%%   \item SuratPernyataan with \cs{addChapter}.
%%   \item KataPengantar~+ Publikasi (skipped for KP and MBKM).
%%   \item Abstrak~+ Abstract.
%%   \item ToC~+ conditional LoF/LoT/LoL/LoE~+ always LoX~+ user-defined lists.
%%   \item Parity page~+ \cs{pagenumbering\{arabic\}}~+ \texttt{standard} style~+
%%         auto-clear enabled~+ running header install.
%% \end{enumerate}
%%
%% Page counter reasoning: judul Dalam occupies page i, orisinalitas occupies
%% page~ii, so pengesahan begins at counter~3.  KP and MBKM skip judulDalam and
%% orisinalitas, so the counter is set to~2.
%%
%% List-page decisions (step~11) use previous-run counts, for example:
%% \begin{center}
%% {\small\ttfamily\string\UI@condListPage\{\string\UI@prev@count@lof\}%
%% \{\string\addDefaultListPage\{\string\listoffigures\}\}}
%% \end{center}
%% After a clean build, all lists appear regardless of count.  On subsequent
%% runs, the prior-run count suppresses empty lists.
%%
%% \textbf{Journal flow} (8 structural steps):
%% \begin{enumerate}
%%   \item \cs{pagenumbering\{roman\}}~+ counter~1~+ \texttt{journal-front} style.
%%   \item \cs{newgeometry\{3cm~all\}}~+ sync page style width.
%%   \item Sampul~+ Judul Dalam.
%%   \item Orisinalitas (skipped for KP).
%%   \item Pengesahan~+ PernyataanAI~+ SuratPernyataan~+ Publikasi.
%%   \item \cs{restoregeometry}~+ arabic counter from~1~+ \texttt{first-pages} style.
%%   \item Abstrak~+ Abstract~+ \texttt{standard} style.
%%   \item If \texttt{columns=2}: set \texttt{columnsep=0.25in},
%%         \texttt{tabcolsep=4pt}, \cs{twocolumn}.
%% \end{enumerate}
%%
%% \cs{UI@chapterautoclearenabled} is set to \texttt{true} only at the end of
%% the monograph flow; journal flow leaves it \texttt{false} (no auto-clearpage
%% between chapters is needed in the inline journal layout).
%%
%% \subsection*{Bahasa Indonesia}
%%
%% \cs{makefrontmatter} adalah titik masuk tunggal untuk merakit semua halaman
%% front matter.  Logikanya bercabang berdasarkan format aktif.
%%
%% Alur monograf terdiri dari 12 langkah struktural.  Alasan counter halaman:
%% judulDalam menempati halaman~i, orisinalitas menempati halaman~ii, sehingga
%% pengesahan dimulai di counter~3.  KP/MBKM melewati langkah~3 dan~4,
%% sehingga counter diset ke~2.
%%
%% Keputusan halaman daftar menggunakan jumlah entri dari run sebelumnya; setelah
%% build bersih, semua daftar ditampilkan terlepas dari jumlah entri.
%%
%% Alur jurnal: 8 langkah.  \cs{newgeometry} mempersempit margin untuk
%% halaman front matter, kemudian \cs{restoregeometry} mengembalikan margin
%% sebelum abstrak.  Jika dua kolom, \cs{twocolumn} diaktifkan terakhir.
%%
%% \cs{UI@chapterautoclearenabled} hanya diaktifkan di akhir alur monograf;
%% jurnal membiarkannya \texttt{false} karena bab tidak memerlukan page break.
%%
%% %-----------------------------------------------------------------------
%% \section{Metadata Accumulator API / API Akumulator Metadata}
%% %-----------------------------------------------------------------------
%%
%% \subsection*{English}
%%
%% Metadata commands follow an accumulator pattern: counters track how many
%% items have been registered and dispatch to the appropriate named slot.
%%
%% \textbf{Author chain}: \cs{penulis}, \cs{npm}, \cs{programStudi} must be
%% called in this order for each author.  Each increments or reads
%% \texttt{@UI@penuliscount} and stores data in the *Satu/*Dua/*Tiga slots.
%% Maximum three authors.
%%
%% \textbf{Counselor chain}: \cs{pembimbing} stores up to three supervisors in
%% pembimbingSatu/Dua/Tiga.
%%
%% \textbf{Examiner chain}: \cs{penguji} stores up to six examiners in
%% pengujiSatu through pengujiEnam.
%%
%% \textbf{Combined, unique study program display}: \cs{UI@studyProgramUniqueDisplay}:
%% renders study program 1 always; appends ``~/~program~2'' only if
%% \cs{npmDua}~$\neq$~\cs{blank} \emph{and} \texttt{programDua}~$\neq$~\texttt{programSatu}
%% (de-duplicates identical programs for single-study group theses);
%% similarly for program~3.
%%
%% \textbf{Combined, non-unique study program display}: \cs{UI@studyProgramAllDisplay}:
%% renders study programs of all authors, without de-duplication.
%%
%% \textbf{Language-aware helpers}:
%% \begin{itemize}
%%   \item \cs{UI@studyProgramLabel\{Satu\}}: returns \cs{studyProgramSatu}
%%         (English) or \cs{programSatu} (Indonesian) based on \cs{if@UIenglish}.
%%   \item \cs{UI@studyProgramSatuDisplay} through \cs{UI@studyProgramTigaDisplay}:
%%         shorthand display macros.
%%   \item \cs{UI@StudyProgramSatuDisplay} (capital~S): uppercase variant.
%% \end{itemize}
%%
%% \textbf{Scalar commands}: \cs{judul}, \cs{judulInggris}, \cs{fakultas\{ID\}\{EN\}},
%% \cs{gelar}, \cs{bulanTahun}, \cs{tanggalSiapSidang}, \cs{tanggalLulus}
%% all use \cs{gdef} to self-redefine onto their storage macro.
%%
%% \cs{kota} defaults to ``Depok''.  Override with \cs{kota\{city\}} in the
%% preamble.  After \cs{begin\{document\}}, \cs{kota} is aliased to
%% \cs{UI@kota} (a plain string expansion rather than a setter).
%%
%% \cs{tahunAkademik\{text\}} stores the academic year string displayed in the
%% Surat Pernyataan.
%%
%% \cs{mitra\{position\}\{instance\}} stores partner organization data for the
%% MBKM approval page (two-supervisor variant showing partner details
%% side-by-side with the academic supervisor).
%%
%% \cs{pengesahanPDF\{file\}} sets \cs{UI@pengesahanPDFfile}; when non-empty,
%% \cs{makefrontmatter} substitutes \cs{includepdf} for the built-in pengesahan
%% renderer.
%%
%% \textbf{Uppercase convenience macros} (defined in \cs{AtBeginDocument}):
%% \cs{Judul}, \cs{JudulInggris}, \cs{Type}, \cs{PenulisSatu}, \cs{PenulisDua},
%% \cs{PenulisTiga}, \cs{Fakultas}, \cs{ProgramSatu}, \cs{ProgramDua},
%% \cs{ProgramTiga} are lazily evaluated wrappers that call \cs{MakeUppercase}
%% at expansion time.  They are defined late (in \cs{AtBeginDocument}) so that
%% any preceding setter commands are not masked.
%%
%% \subsection*{Bahasa Indonesia}
%%
%% Perintah metadata mengikuti pola akumulator: counter melacak berapa item yang
%% telah didaftarkan dan mengirimkan ke slot bernama yang sesuai.
%%
%% Rantai penulis (\cs{penulis}, \cs{npm}, \cs{programStudi}) harus dipanggil
%% berurutan untuk setiap penulis.  Maksimal tiga penulis.
%%
%% \cs{UI@studyProgramUniqueDisplay} menghapus duplikat program studi yang sama
%% untuk tesis kelompok dengan satu program studi.
%%
%% \cs{UI@studyProgramAllDisplay} menampilkan semua program studi tanpa proses
%% penghapusan duplikat.
%%
%% Makro huruf kapital (\cs{Judul}, \cs{PenulisSatu}, dll.) didefinisikan di
%% \cs{AtBeginDocument} sebagai pembungkus \cs{MakeUppercase} yang dievaluasi
%% saat digunakan.  Definisi terlambat ini mencegah perintah setter sebelumnya
%% tertutup oleh definisi makro kapital.
%%
%% \cs{kota} default ke ``Depok''; setelah \verb|\begin{document}|, makro ini
%% diubah menjadi ekspansi string biasa (bukan setter).
%%
%% %-----------------------------------------------------------------------
%% \section{Appendix and Back Matter / Lampiran dan Materi Belakang}
%% %-----------------------------------------------------------------------
%%
%% \subsection*{English}
%%
%% \textbf{Appendix page style system}:
%% \begin{itemize}
%%   \item \cs{UI@lampiran@header} stores the running header text for the current
%%         appendix (set by \env{lampiranBab}).
%%   \item \texttt{lampiran-first}: first page of each appendix section;
%%         twoside-aware header with the running title and no continuation suffix.
%%   \item \texttt{lampiran}: continuation pages; same header with ``(lanjutan)''
%%         appended via \cs{UI@label@lampiranCont}.
%%   \item Both styles are blank when \texttt{plagiarismcheck=true}.
%% \end{itemize}
%%
%% \textbf{\env{lampiranBab\{title\}} environment}:
%% \begin{enumerate}
%%   \item \cs{clearpage} (monograph only).
%%   \item \cs{addappendix\{title\}} registers the entry and increments
%%         the \texttt{appendix} counter.
%%   \item Sets \cs{UI@lampiran@header} to
%%         ``\textit{Lampiran}~\textit{n}: \textit{title}''.
%%   \item Saves current \cs{headheight} and sets a taller value
%%         ($2{\times}\text{baselineskip}+1\text{em}$) to accommodate the
%%         two-line header (page number + running title).
%%   \item Applies \texttt{lampiran-first} to the first page and
%%         \texttt{lampiran} to subsequent pages.
%%   \item On close: \cs{clearpage} and restore original \cs{headheight}.
%% \end{enumerate}
%% In journal format, \env{lampiranBab} renders the appendix heading via
%% \cs{@makeschapterhead} instead of page-style manipulation.
%%
%% \textbf{\cs{makeappendixseparator}}: inserts a blank right-page gap
%% (\cs{UI@insertdummyblank}), then a \texttt{titlepage} with centered
%% ``LAMPIRAN'' (or ``APPENDIX'') at \cs{UI@appendixSeparatorTopGap} from the
%% top.  The logical page counter is saved before and restored after the
%% separator so the appendix body pages continue their sequence uninterrupted.
%%
%% \textbf{\cs{makebibliography}}:
%% \begin{enumerate}
%%   \item \cs{clearpage} (non-twocolumn only; journal two-column continues inline).
%%   \item \cs{CAPinToC} activates uppercase ToC entry for the bibliography.
%%   \item \cs{printbibliography} with \texttt{heading=bibintoc} and language-appropriate title.
%%   \item \cs{clearchapter} ensures the next section starts on a right page.
%% \end{enumerate}
%%
%% \textbf{\cs{makeglossarypage}} (monograph only):
%% switches to single spacing, prints the
%% glossary via \cs{printglossaries}, restores main spacing, and calls
%% \cs{clearchapter}.  The built-in glossaries heading is used without a
%% manual ToC entry to prevent duplicate entries.
%%
%% \textbf{\cs{appendix} is patched in \cs{AtBeginDocument}}:
%% the patch prepends \cs{noCAPinToC} (so appendix entries are lowercase in
%% ToC) and, for monograph, calls \cs{makeappendixseparator}.  The original
%% \cs{appendix} then runs normally.
%%
%% \subsection*{Bahasa Indonesia}
%%
%% Sistem gaya halaman lampiran menggunakan dua gaya: \texttt{lampiran-first}
%% untuk halaman pertama setiap \env{lampiranBab} (tanpa sufiks lanjutan), dan
%% \texttt{lampiran} untuk halaman berikutnya (dengan suffix "lanjutan").
%% Keduanya kosong jika \texttt{plagiarismcheck=true}.
%%
%% Environment \env{lampiranBab} menyimpan dan memulihkan \cs{headheight}
%% karena header dua baris (nomor halaman + judul berjalan) membutuhkan tinggi
%% header lebih besar dari default.
%%
%% \cs{makeappendixseparator} menyisipkan halaman pemisah "LAMPIRAN" sebelum
%% lampiran pertama.  Counter halaman disimpan dan dipulihkan agar penomoran
%% tidak terganggu oleh halaman pemisah.
%%
%% \cs{makebibliography} mengaktifkan \cs{CAPinToC} agar entri daftar referensi
%% di ToC menggunakan huruf kapital, sesuai gaya UI.
%%
%% \cs{appendix} ditambal oleh \cs{AtBeginDocument} untuk memanggil
%% \cs{noCAPinToC} dan, pada monograf, \cs{makeappendixseparator} secara
%% otomatis.
%%
%% %-----------------------------------------------------------------------
%% \section{Code Listing Style and Language Definitions / Gaya Kode Program dan Definisi Bahasa Pemrograman}
%% %-----------------------------------------------------------------------
%%
%% \subsection*{English}
%%
%% All built-in language definitions follow a shared color convention using the
%% semantic aliases \texttt{keywordcolor}, \texttt{typecolor}, and
%% \texttt{greencomments}, defined in the \texttt{KONFIGURASI PAKET} section.
%% Using semantic aliases rather than raw colors ensures that changing the
%% palette in one place updates all language definitions simultaneously.
%%
%% Built-in languages are organized in six functional groups:
%%
%% \medskip\noindent
%% {\small
%% \begin{longtable}{@{}p{1.4cm}p{11.3cm}@{}}
%%   \toprule
%%   \textbf{Group} & \textbf{Languages} \\
%%   \midrule
%%   \endhead
%%   \bottomrule
%%   \endfoot
%%   (1) & ABS (Abstract Behavioural Specification), Acceleo, CSS \\
%%   (2) & D, Dart, Docker, F\#, GDScript, GLSL, HLSL \\
%%   (3) & Java (v9, ContextJ, DeltaJ, FOP dialects), Groovy, Kotlin \\
%%   (4) & JavaScript, ECMAScript2015, TypeScript, and aliases (TS, ES6, JS); Julia, Clojure, Scheme \\
%%   (5) & Compiled and general-purpose languages \\
%%   (6) & Configuration and data formats (YAML, TOML, etc.) \\
%% \end{longtable}
%% }
%%
%% To add a new language definition:
%% \begin{enumerate}
%%   \item Add a \cs{lstdefinelanguage}\marg{Name} block (or
%%         \cs{lstdefinelanguage}\marg{Name}\oarg{dialect}\marg{base} for a dialect) in
%%         the appropriate group within \texttt{STYLING NON-ALUR}.
%%   \item Use \texttt{keywordcolor}, \texttt{typecolor}, and
%%         \texttt{greencomments} for keyword, type, and comment colors.
%%   \item Verify all color contrast ratios meet WCAG~AA ($\geq4.5{:}1$).
%%   \item No changes to \pkg{listings} or \cs{lstset} are needed; all
%%         languages inherit the \texttt{uistyle} default.
%% \end{enumerate}
%%
%% Alias languages (e.g., \texttt{TypeScript}/\texttt{TS}, \texttt{ES6}/\texttt{JS})
%% are defined as empty dialects of an existing language:
%% \begin{center}
%%   \texttt{\small\string\lstdefinelanguage\{TS\}[]{TypeScript}\{\}}
%% \end{center}
%% This avoids duplicating keyword lists while providing the expected
%% language identifier to users.
%%
%% \subsection*{Bahasa Indonesia}
%%
%% Semua definisi bahasa bawaan menggunakan alias warna semantik
%% (\texttt{keywordcolor}, \texttt{typecolor}, \texttt{greencomments})
%% yang didefinisikan di bagian \texttt{KONFIGURASI PAKET}.  Menggunakan alias
%% semantik memastikan perubahan palet warna di satu tempat memperbarui semua
%% definisi bahasa secara serentak.
%%
%% Bahasa bawaan diorganisasi dalam enam kelompok fungsional: domain-spesifik dan
%% \emph{markup}; sistem, game, dan \emph{shader}; ekosistem JVM; skrip dan
%% fungsional; terkompilasi dan umum; konfigurasi dan data.
%%
%% Untuk menambah definisi bahasa baru, tambahkan blok \cs{lstdefinelanguage}
%% di kelompok yang sesuai dalam \texttt{STYLING NON-ALUR}.  Gunakan alias warna
%% semantik, verifikasi rasio kontras WCAG~AA, dan tidak ada perubahan pada
%% \cs{lstset} yang diperlukan.
%%
%% %-----------------------------------------------------------------------
%% \section{Document Lifecycle Hooks / Hook Siklus Hidup Dokumen}
%% %-----------------------------------------------------------------------
%%
%% \subsection*{English}
%%
%% Two lifecycle hooks finalize class behavior after the preamble
%% and after the document body.
%%
%% \textbf{\cs{AtBeginDocument}} performs:
%% \begin{enumerate}
%%   \item Installs \cs{UI@addtocontents} as \cs{addtocontents} so the
%%         counting filter is active after all package-level patches.
%%   \item Syncs \cs{cftbeforechapskip} to the active chapter-separator toggle.
%%   \item Patches \cs{@chapter} to call \cs{UI@addchapterlistseparatorspacing}
%%         before each numbered chapter, writing addvspace entries to all list files.
%%   \item Patches \cs{appendix} to prepend \cs{noCAPinToC} and (monograph)
%%         \cs{makeappendixseparator} before the original \cs{appendix} runs.
%%   \item Renames built-in string macros per active language:
%%         \cs{bibname}, \cs{contentsname}, \cs{listfigurename},
%%         \cs{listtablename}, \cs{lstlistlistingname}.
%%   \item Renames glossary strings (\cs{glossaryname}, \cs{acronymname}).
%%   \item Redefines \cs{kota} from a setter to a plain string expansion.
%%   \item Defines uppercase convenience macros: \cs{Judul}, \cs{JudulInggris},
%%         \cs{Type}, \cs{PenulisSatu}--\cs{PenulisTiga}, \cs{Fakultas},
%%         \cs{ProgramSatu}--\cs{ProgramTiga}, and study-program display helpers.
%%   \item Sets tocloft chapter leader dots (\cs{cftchapleader},
%%         \cs{cftchapaftersnum}).
%%   \item Sets tocloft LoF formatting: indent=0\,pt, numwidth=70\,pt,
%%         aftersnum=\texttt{.}, presnum=\cs{pic}~.
%%   \item Sets tocloft LoT formatting: indent=0\,pt, numwidth=60\,pt,
%%         aftersnum=\texttt{.}, presnum=\cs{tab}~.
%% \end{enumerate}
%%
%% \textbf{\cs{AtEndDocument}} writes all registered list entry counts to the
%% main \texttt{.aux} file for use on the next run:
%% \begin{center}
%% \texttt{\small\textbackslash immediate\textbackslash write\string\@mainaux\{\string\gdef\string\csname UI@prev@count@ext\string\endcsname\{n\}\}}
%% \end{center}
%% \texttt{\textbackslash immediate\textbackslash write} is used so the values are present even when build
%% tools stop after this pass and re-run separately.  The glossary counter
%% (\texttt{UI@count@glossary}) is written by separate logic.
%%
%% \textbf{Multi-pass implications}: list-page generation decisions depend on
%% counts from the prior run.  On the very first build, all list pages are
%% generated (threshold=0, count=0).  On subsequent builds, only lists with at
%% least \cs{UI@minListEntries} entries are generated.  After structural edits
%% that add or remove list entries, always run \LaTeX{} at least twice.
%%
%% \subsection*{Bahasa Indonesia}
%%
%% Hook \cs{AtBeginDocument} memfinalisasi perilaku kelas setelah semua paket
%% dimuat.  Pemasangan \cs{UI@addtocontents} sebagai \cs{addtocontents} dilakukan
%% di sini (bukan saat kelas dimuat) agar filter penghitung aktif setelah semua
%% patch tingkat paket selesai.
%%
%% Patch \cs{@chapter} menulis entri \texttt{addvspace} ke semua berkas daftar
%% saat setiap bab bernomor dimulai.  Patch \cs{appendix} menambahkan
%% \cs{noCAPinToC} dan halaman pemisah lampiran secara otomatis.
%%
%% Makro huruf kapital (\cs{Judul}, \cs{PenulisSatu}, dll.) didefinisikan di
%% sini agar tidak menimpa perintah setter dengan nama serupa di preamble.
%%
%% Hook \cs{AtEndDocument} menulis jumlah entri semua daftar ke \texttt{.aux}
%% menggunakan \texttt{\textbackslash immediate\textbackslash write} agar tersedia pada run berikutnya.
%% Karena keputusan halaman daftar bergantung pada jumlah dari run sebelumnya,
%% selalu jalankan \LaTeX{} minimal dua kali setelah perubahan struktural.
%%
%% %-----------------------------------------------------------------------
%% \section{Maintainer Workflow / Alur Kerja Maintainer}
%% %-----------------------------------------------------------------------
%%
%% \subsection*{English}
%%
%% Standard workflow for code changes:
%%
%% \begin{enumerate}
%%   \item Edit source files only: \texttt{uithesis.dtx},
%%         \texttt{uithesis-doc.dtx}, \texttt{uithesis.ins}, \texttt{build.lua},
%%         and \texttt{example/} when needed.
%%   \item Regenerate class with \texttt{l3build unpack}.
%%   \item Sync generated \texttt{uithesis.cls} to \texttt{example/uithesis.cls}.
%%   \item Sync internal assets from \texttt{internals/} to \texttt{example/}.
%%   \item Run sanity checks for leaked control-sequence text.
%%   \item Build \texttt{example/thesis.tex} silently, then inspect
%%         \texttt{example/thesis.log}.
%%   \item Run \texttt{l3build check} and inspect any
%%         \texttt{build/test/*.diff} files.
%% \end{enumerate}
%%
%% For documentation-only updates, run at least \texttt{l3build doc}.
%%
%% \subsection*{Bahasa Indonesia}
%%
%% Alur standar untuk perubahan kode:
%%
%% \begin{enumerate}
%%   \item Edit hanya berkas sumber: \texttt{uithesis.dtx},
%%         \texttt{uithesis-doc.dtx}, \texttt{uithesis.ins}, \texttt{build.lua},
%%         dan \texttt{example/} bila diperlukan.
%%   \item Bangun ulang kelas dengan \texttt{l3build unpack}.
%%   \item Sinkronkan \texttt{uithesis.cls} hasil build ke
%%         \texttt{example/uithesis.cls}.
%%   \item Sinkronkan aset internal dari \texttt{internals/} ke
%%         \texttt{example/}.
%%   \item Jalankan cek teks bocor untuk mendeteksi nama control sequence
%%         yang tercetak sebagai teks biasa.
%%   \item Kompilasi \texttt{example/thesis.tex} secara senyap,
%%         lalu baca \texttt{example/thesis.log}.
%%   \item Jalankan \texttt{l3build check} dan periksa berkas
%%         \texttt{build/test/*.diff} bila ada kegagalan.
%% \end{enumerate}
%%
%% Untuk pembaruan dokumentasi saja, minimal jalankan \texttt{l3build doc}.
%%
%% %-----------------------------------------------------------------------
%% \section{Maintaining Public APIs / Pemeliharaan API Publik}
%% %-----------------------------------------------------------------------
%%
%% \subsection*{English}
%%
%% When adding or changing public options/macros/environments:
%%
%% \begin{itemize}
%%   \item Update user-facing sections in this document
%%         (class options, metadata commands, content commands).
%%   \item Update examples in \texttt{example/} when behavior changes.
%%   \item Update tutorial snippets under
%%         \texttt{example/assets/codes/tutorial/} if affected.
%%   \item Avoid temporary compatibility aliases on active development branches.
%% \end{itemize}
%%
%% \subsection*{Bahasa Indonesia}
%%
%% Saat menambah atau mengubah opsi/makro/lingkungan publik:
%%
%% \begin{itemize}
%%   \item Perbarui section dokumentasi pengguna pada dokumen ini
%%         (opsi kelas, perintah metadata, perintah konten).
%%   \item Perbarui contoh pada \texttt{example/} jika perilaku berubah.
%%   \item Perbarui cuplikan tutorial pada
%%         \texttt{example/assets/codes/tutorial/} jika terdampak.
%%   \item Hindari alias kompatibilitas sementara pada branch pengembangan aktif.
%% \end{itemize}
%%
%% %-----------------------------------------------------------------------
%% \section{Contribution Flow / Alur Kontribusi}
%% %-----------------------------------------------------------------------
%%
%% \subsection*{English}
%%
%% Contribution flow in this project:
%%
%% \begin{enumerate}
%%   \item Open an issue or discuss the planned change.
%%   \item Create a feature branch from the active development branch.
%%   \item Implement changes in source files, not generated files.
%%   \item Run build and checks according to scope.
%%   \item Update documentation and tutorial snippets when behavior changes.
%%   \item Submit a merge request on GitLab with:
%%         scope summary, test evidence, and migration notes if needed.
%%   \item Address review comments and keep the branch rebased or merged
%%         according to repository policy.
%% \end{enumerate}
%%
%% The detailed policy document remains
%% \texttt{\_attributions/CONTRIBUTING.md}.
%%
%% \subsection*{Bahasa Indonesia}
%%
%% Alur kontribusi pada proyek ini:
%%
%% \begin{enumerate}
%%   \item Buka isu atau diskusikan perubahan yang direncanakan.
%%   \item Buat branch fitur dari branch pengembangan aktif.
%%   \item Implementasikan perubahan pada berkas sumber,
%%         bukan berkas turunan.
%%   \item Jalankan build dan pengujian sesuai ruang lingkup perubahan.
%%   \item Perbarui dokumentasi dan cuplikan tutorial bila perilaku berubah.
%%   \item Kirim merge request di GitLab dengan ringkasan ruang lingkup,
%%         bukti pengujian, dan catatan migrasi bila diperlukan.
%%   \item Tindak lanjuti komentar review dan sinkronkan branch
%%         sesuai kebijakan repositori.
%% \end{enumerate}
%%
%% Dokumen kebijakan rinci tetap berada pada
%% \texttt{\_attributions/CONTRIBUTING.md}.
%%
%% %-----------------------------------------------------------------------
%% \section{Testing Infrastructure / Infrastruktur Pengujian}
%% %-----------------------------------------------------------------------
%%
%% \subsection*{English}
%%
%% The package ships two complementary test systems: an automated
%% \textit{l3build} regression suite that catches logical regressions in
%% class options and public APIs, and a manual GitLab CI combination job
%% that produces rendered PDFs for human inspection.
%%
%% \subsection*{Bahasa Indonesia}
%%
%% Paket ini dilengkapi dua sistem pengujian: rangkaian regresi \textit{l3build}
%% otomatis yang mendeteksi regresi logis pada opsi kelas dan API publik,
%% serta satu \textit{job} kombinasi GitLab CI manual yang menghasilkan PDF
%% untuk diperiksa secara visual.
%%
%% %-----------------------------------------------------------------------
%% \subsubsection*{l3build Unit Tests / Uji Unit l3build}
%%
%% \subsection*{English}
%%
%% Run all log-based unit tests with \texttt{l3build check}.  Run a single
%% named test with \texttt{l3build check <testname>}.
%%
%% Test source files (\texttt{.lvt}) live in \texttt{tests/}.  Each file
%% begins with \verb|\input{regression-test.tex}| to load the l3build test
%% framework.  All unasserted output is suppressed with
%% \verb|\OMIT|~\ldots~\verb|\TIMO| so that \texttt{.tlg} reference files
%% contain only \verb|\TEST|/\verb|\ASSERTSTR| results.  This means package
%% version updates never cause spurious failures.
%%
%% File naming convention: \texttt{NN-group-description.lvt}, where
%% \texttt{NN} is a two-digit group number.  Current groups:
%%
%% \begin{description}
%%   \item[01] Class loading smoke tests --- one file per option
%%             combination of \texttt{format}, \texttt{type},
%%             \texttt{jenjang}, \texttt{lang}, and \texttt{print}.
%%   \item[02] Citation option smoke tests --- one file per
%%             \texttt{citation=} value.
%%   \item[03] Metadata command API tests --- \cs{ASSERTSTR} checks on
%%             \cs{penulisSatu}, \cs{pembimbingSatu}, \cs{pengujiSatu},
%%             and scalar fields.
%%   \item[04] Text formatting command tests --- \cs{ASSERTSTR} checks on
%%             \cs{f}, \cs{bo}, \cs{bi}, \cs{code}, and \cs{var}.
%%   \item[05] Spacing and paragraph option smoke tests.
%%   \item[06] \texttt{plagiarismcheck=true} smoke test.
%%   \item[07] Journal-specific environment tests --- definition checks and
%%             compilation of \env{UIwideblock}, \env{UIwidetable},
%%             \env{UIwidefigure}, \env{UIfullwidthpages}, and
%%             \env{UIlandscape}.
%% \end{description}
%%
%% Support files shared by all tests live in \texttt{tests/support/}.
%% After changing the class, regenerate a reference file with
%% \texttt{l3build save <testname>} and verify
%% \texttt{l3build check} passes before committing.
%%
%% High-maintenance patterns excluded from all tests: \cs{showbox},
%% \cs{showoutput}, and bibliography-formatted output capture.  These
%% break on unrelated package updates.
%%
%% \subsection*{Bahasa Indonesia}
%%
%% Jalankan seluruh uji unit dengan \texttt{l3build check}.  Jalankan
%% satu uji tertentu dengan \texttt{l3build check <testname>}.
%%
%% Berkas sumber uji (\texttt{.lvt}) berada di \texttt{tests/}.  Setiap
%% berkas diawali \verb|\input{regression-test.tex}| untuk memuat
%% kerangka uji l3build.  Seluruh keluaran yang tidak diuji ditekan
%% dengan \verb|\OMIT|~\ldots~\verb|\TIMO| agar berkas referensi
%% \texttt{.tlg} hanya berisi hasil \verb|\TEST|/\verb|\ASSERTSTR|.
%% Dengan demikian, pembaruan versi paket tidak menimbulkan kegagalan
%% uji palsu.
%%
%% Konvensi penamaan berkas: \texttt{NN-grup-deskripsi.lvt}, di mana
%% \texttt{NN} adalah nomor grup dua digit.  Setelah mengubah kelas,
%% perbarui berkas referensi dengan \texttt{l3build save <testname>} dan
%% pastikan \texttt{l3build check} lulus sebelum melakukan \textit{commit}.
%%
%% %-----------------------------------------------------------------------
%% \subsubsection*{PDF Comparison Tests / Uji Perbandingan PDF}
%%
%% \subsection*{English}
%%
%% PDF comparison tests detect visual layout regressions on critical page
%% types that log-based tests cannot verify.  Run them with
%% \texttt{l3build check -ctest-pdf}.
%%
%% Source files (\texttt{.pvt}) live in \texttt{tests/pvt/}.  Reference
%% files (\texttt{.tpf}) are committed to the repository after human
%% visual review.  The dedicated configuration \texttt{test-pdf.lua}
%% sets \texttt{testfiledir = "tests/pvt"} and
%% \texttt{checkengines = \{"pdftex"\}}.
%%
%% Current PDF tests:
%%
%% \begin{description}
%%   \item[\texttt{08-cover-monograph}] Monograph Skripsi cover and title
%%         pages -- the most visually critical output.
%%   \item[\texttt{08-cover-journal}] Journal article first page.
%%   \item[\texttt{08-chapter-opening}] Monograph chapter-opening page
%%         with margin, header, and footer.
%%   \item[\texttt{08-twocol-spread}] Two-column journal body page.
%% \end{description}
%%
%% To regenerate \texttt{.tpf} reference files locally:
%% \begin{quote}
%%   \texttt{l3build save -ctest-pdf <testname>}
%% \end{quote}
%% Inspect the rendered PDF in \texttt{build/test/}, confirm the visual
%% output looks correct, then commit the updated \texttt{.tpf} file.
%%
%% \subsection*{Bahasa Indonesia}
%%
%% Uji perbandingan PDF mendeteksi regresi tata letak visual pada
%% halaman-halaman penting yang tidak dapat diverifikasi oleh uji berbasis
%% log.  Jalankan dengan \texttt{l3build check -ctest-pdf}.
%%
%% Berkas sumber (\texttt{.pvt}) berada di \texttt{tests/pvt/}.  Berkas
%% referensi (\texttt{.tpf}) dikompilasi ke dalam repositori setelah
%% diperiksa secara visual.  Konfigurasi \texttt{test-pdf.lua}
%% mengatur \texttt{testfiledir = "tests/pvt"} dan
%% \texttt{checkengines = \{"pdftex"\}}.
%%
%% Untuk memperbarui berkas \texttt{.tpf} secara lokal:
%% \begin{quote}
%%   \texttt{l3build save -ctest-pdf <testname>}
%% \end{quote}
%% Periksa PDF yang dihasilkan di \texttt{build/test/}, pastikan tampilan
%% visual sudah benar, lalu lakukan \textit{commit} pada berkas \texttt{.tpf}
%% yang telah disetujui.
%%
%% %-----------------------------------------------------------------------
%% \subsubsection*{GitLab CI l3build Job / Job l3build di GitLab CI}
%%
%% \subsection*{English}
%%
%% The single manual job \texttt{test:l3build} (defined in
%% \texttt{.gitlab-ci/test-l3build.yml}) runs both log-based and PDF
%% comparison tests in the same CI environment used to build the class.
%%
%% Trigger via GitLab \textbf{Run pipeline} with the following variable:
%%
%% \begin{description}
%%   \item[\texttt{L3BUILD\_SAVE}] Set to \texttt{true} to also regenerate
%%         \texttt{.tpf} reference files after the check steps.  Defaults
%%         to \texttt{false}.
%% \end{description}
%%
%% When \texttt{L3BUILD\_SAVE=true} the regenerated \texttt{.tpf} files
%% and pre-normalization PDFs are uploaded as job artifacts (seven-day
%% retention).  Download the artifact bundle, inspect the PDFs in
%% \texttt{build/test/}, then commit the approved \texttt{.tpf} files to
%% \texttt{tests/pvt/}.  Automatic commit back to the repository is
%% intentionally not implemented: silently accepting a visual regression
%% as the new reference defeats the purpose of the test.
%%
%% \subsection*{Bahasa Indonesia}
%%
%% \textit{Job} manual \texttt{test:l3build} (didefinisikan di
%% \texttt{.gitlab-ci/test-l3build.yml}) menjalankan uji berbasis log dan
%% uji perbandingan PDF dalam satu lingkungan CI yang sama dengan yang
%% digunakan untuk membangun kelas.
%%
%% Picu melalui GitLab \textbf{Run pipeline} dengan variabel berikut:
%%
%% \begin{description}
%%   \item[\texttt{L3BUILD\_SAVE}] Diisi \texttt{true} untuk juga
%%         meregenerasi berkas \texttt{.tpf} setelah langkah pengujian.
%%         Nilai bawaan adalah \texttt{false}.
%% \end{description}
%%
%% Jika \texttt{L3BUILD\_SAVE=true}, berkas \texttt{.tpf} yang dihasilkan
%% dan PDF pra-normalisasi diunggah sebagai artefak \textit{job} (retensi tujuh
%% hari).  Unduh bundel artefak, periksa PDF di \texttt{build/test/}, lalu
%% lakukan \textit{commit} pada berkas \texttt{.tpf} yang telah disetujui ke
%% \texttt{tests/pvt/}.
%%
%% %-----------------------------------------------------------------------
%% \subsubsection*{GitLab CI Combination Tests / Uji Kombinasi di GitLab CI}
%%
%% \subsection*{English}
%%
%% The manual job \texttt{test:combinations:manual} (defined in
%% \texttt{.gitlab-ci/test-combinations.yml}) compiles arbitrary option
%% combinations and uploads the resulting PDFs as artifacts for human
%% inspection.
%%
%% Trigger via GitLab \textbf{Run pipeline}, then fill in the
%% \texttt{COMBINATION\_TESTS} variable.  One test case per line:
%%
%% \begin{quote}
%%   \texttt{[path/to/file.tex] option1, option2=value, \ldots}
%% \end{quote}
%%
%% Blank lines and lines starting with \verb|#| are ignored.  Example
%% value:
%%
%% \begin{quote}\small
%% \begin{verbatim}
%% [tests/minimal.tex] monograph, type=Skripsi, jenjang=Sarjana, lang=indonesian
%% [tests/minimal.tex] journal, columns=2, type=Tesis, jenjang=Magister, lang=english
%% [example/thesis.tex] monograph, print=oneside, type=Disertasi, jenjang=Doktor, lang=indonesian
%% \end{verbatim}
%% \end{quote}
%%
%% Artifacts (\texttt{combo-artifacts/}) contain one PDF and one log per
%% case, plus a summary \texttt{combination-results.zip}.
%%
%% \subsection*{Bahasa Indonesia}
%%
%% \textit{Job} manual \texttt{test:combinations:manual} (didefinisikan di
%% \texttt{.gitlab-ci/test-combinations.yml}) mengompilasi kombinasi opsi
%% sembarang dan mengunggah PDF yang dihasilkan sebagai artefak untuk
%% diperiksa secara visual.
%%
%% Picu melalui GitLab \textbf{Run pipeline}, lalu isi variabel
%% \texttt{COMBINATION\_TESTS}.  Satu kasus uji per baris:
%%
%% \begin{quote}
%%   \texttt{[path/to/file.tex] opsi1, opsi2=nilai, \ldots}
%% \end{quote}
%%
%% Baris kosong dan baris yang diawali \verb|#| diabaikan.  Artefak
%% (\texttt{combo-artifacts/}) berisi satu PDF dan satu \textit{log} per kasus,
%% serta ringkasan \texttt{combination-results.zip}.
%%
%% \newpage
%%
%% %-----------------------------------------------------------------------
%% \section{Changelog}
%% %-----------------------------------------------------------------------
%%
%% \changes{v1.0.3}{2010/12/03}{Initial public release by Andreas Febrian
%%   et al.\ as a \LaTeX{} style file (\texttt{uithesis.sty}), conforming
%%   to the 2008 Universitas Indonesia thesis formatting guidelines.}
%%
%% \changes{v2.0.0}{2020/01/29}{Major revision for the 2017 UI guidelines,
%%   developed at the Reliable Software Engineering Lab, Fasilkom UI\@.
%%   Switched citations to Bib\TeX{} with IEEE style.
%%   Added \pkg{listings} syntax highlighting support.}
%%
%% \changes{v2.0.1}{2020/05/08}{Added tutorial content; updated contribution
%%   guidelines.}
%%
%% \changes{v2.0.2}{2020/09/14}{Switched default citation style to APA\@.
%%   Added \pkg{babel} Indonesian hyphenation.
%%   Added \texttt{longtable} and Bib\TeX{} tutorials.}
%%
%% \changes{v2.0.3}{2020/09/15}{Added landscape orientation support.
%%   Introduced a separate appendix list; appendix entries no longer appear
%%   in the main table of contents.
%%   Added a custom list-of-objects mechanism.}
%%
%% \changes{v2.1.0}{2021/09/08}{Experimental CJK multi-language support.
%%   Added table cell alignment and word-wrapping.
%%   Added continuation suffix for multi-page tables.}
%%
%% \changes{v2.1.1}{2022/02/07}{Added \pkg{amsfonts} mathematical symbol support.
%%   Community contributions: GitLab CI improvements, attribution, and
%%   APA Indonesian citation fixes.}
%%
%% \changes{v2.1.2}{2022/08/13}{Revised front matter pages.
%%   Added non-standard approval page layouts for internship reports and
%%   dissertations.}
%%
%% \changes{v2.1.3}{2023/02/22}{Added support for group thesis and
%%   \emph{Kampus Merdeka} independent-study report formats.}
%%
%% \changes{v2.2.0}{2024/08/28}{Updated formatting to the latest UI thesis
%%   guidelines (cover page, originality statement, header/footer, appendix).}
%%
%% \changes{v2.2.1}{2024/12/16}{Fixed header/footer on two-sided output.
%%   Fixed \pkg{listings} auto-wrapping regression from v2.2.0.
%%   Fixed custom object and chapter numbering in the table of contents.
%%   Added \pkg{pdflscape} landscape support.
%%   Added \pkg{glossaries} glossary support.}
%%
%% \changes{v2.2.2}{2026/05/08}{Added \pkg{amssymb} advanced mathematical
%%   symbol support.
%%   Added \texttt{\textbackslash subfigure} support.
%%   Fixed automatic glossary generation with \texttt{makeglossaries}.}
%%
%% \changes{v3.0.0}{2026/08/20}{Rewritten as a \LaTeX{} document class
%%   (\texttt{uithesis.cls}); complies with the 2025 Universitas Indonesia
%%   thesis formatting guidelines.
%%   Added journal format, English language support, and AI-use declaration
%%   page.  Switched to \pkg{biblatex}/\pkg{biber}.  Published on CTAN.}
%%
