laporan-generator 2.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (109) hide show
  1. package/.agents/skills/laporan-generator/SKILL.md +132 -0
  2. package/.agents/skills/laporan-generator/agents/openai.yaml +3 -0
  3. package/.agents/skills/laporan-generator/references/campus-guide.md +120 -0
  4. package/.agents/skills/laporan-generator/references/metadata-schema.md +76 -0
  5. package/.agents/skills/laporan-generator/references/preset-schema.md +79 -0
  6. package/.agents/skills/laporan-generator/references/syntax-cheatsheet.md +122 -0
  7. package/.agents/skills/laporan-generator/references/template-guide.md +100 -0
  8. package/.agents/skills/laporan-generator/references/troubleshooting.md +105 -0
  9. package/.agents/skills/laporan-generator/resources/Makefile +90 -0
  10. package/.agents/skills/laporan-generator/resources/apa.csl +2273 -0
  11. package/.agents/skills/laporan-generator/resources/build-docx.sh +122 -0
  12. package/.agents/skills/laporan-generator/resources/build.sh +102 -0
  13. package/.agents/skills/laporan-generator/resources/chapters/bab1-pendahuluan.md +60 -0
  14. package/.agents/skills/laporan-generator/resources/chapters/bab2-tinjauan-pustaka.md +83 -0
  15. package/.agents/skills/laporan-generator/resources/chapters/bab3-metodologi.md +116 -0
  16. package/.agents/skills/laporan-generator/resources/chapters/bab4-hasil-dan-pembahasan.md +93 -0
  17. package/.agents/skills/laporan-generator/resources/chapters/bab5-penutup.md +27 -0
  18. package/.agents/skills/laporan-generator/resources/cover.md +50 -0
  19. package/.agents/skills/laporan-generator/resources/docx.lua +416 -0
  20. package/.agents/skills/laporan-generator/resources/laporan +464 -0
  21. package/.agents/skills/laporan-generator/resources/laporan.ps1 +552 -0
  22. package/.agents/skills/laporan-generator/resources/logo.jpg +0 -0
  23. package/.agents/skills/laporan-generator/resources/metadata.yml +35 -0
  24. package/.agents/skills/laporan-generator/resources/presets/itb-ta.yml +27 -0
  25. package/.agents/skills/laporan-generator/resources/presets/its-skripsi.yml +26 -0
  26. package/.agents/skills/laporan-generator/resources/presets/skripsi-4433.yml +26 -0
  27. package/.agents/skills/laporan-generator/resources/presets/standard.yml +26 -0
  28. package/.agents/skills/laporan-generator/resources/presets/ugm-skripsi.yml +26 -0
  29. package/.agents/skills/laporan-generator/resources/presets/ui-skripsi.yml +26 -0
  30. package/.agents/skills/laporan-generator/resources/presets/unpad-skripsi.yml +27 -0
  31. package/.agents/skills/laporan-generator/resources/reference.docx +0 -0
  32. package/.agents/skills/laporan-generator/resources/references.bib +115 -0
  33. package/.agents/skills/laporan-generator/resources/scripts/bundle.py +75 -0
  34. package/.agents/skills/laporan-generator/resources/scripts/docx-pagenum.py +192 -0
  35. package/.agents/skills/laporan-generator/resources/scripts/finalize-docx.py +291 -0
  36. package/.agents/skills/laporan-generator/resources/scripts/make-reference-docx.py +670 -0
  37. package/.agents/skills/laporan-generator/resources/scripts/report-doctor.py +211 -0
  38. package/.agents/skills/laporan-generator/resources/scripts/report-stats.py +149 -0
  39. package/.agents/skills/laporan-generator/resources/scripts/scan-preset.py +311 -0
  40. package/.agents/skills/laporan-generator/resources/scripts/setup-deps.ps1 +152 -0
  41. package/.agents/skills/laporan-generator/resources/scripts/setup-deps.sh +113 -0
  42. package/.agents/skills/laporan-generator/resources/scripts/test_scripts.py +128 -0
  43. package/.agents/skills/laporan-generator/resources/scripts/validate-preset.py +166 -0
  44. package/.agents/skills/laporan-generator/resources/template.typ +394 -0
  45. package/.agents/skills/laporan-generator/scripts/build.sh +78 -0
  46. package/.agents/skills/laporan-generator/scripts/bundle.py +75 -0
  47. package/.agents/skills/laporan-generator/scripts/docx-pagenum.py +192 -0
  48. package/.agents/skills/laporan-generator/scripts/finalize-docx.py +152 -0
  49. package/.agents/skills/laporan-generator/scripts/laporan +447 -0
  50. package/.agents/skills/laporan-generator/scripts/laporan.ps1 +529 -0
  51. package/.agents/skills/laporan-generator/scripts/make-reference-docx.py +630 -0
  52. package/.agents/skills/laporan-generator/scripts/report-doctor.py +211 -0
  53. package/.agents/skills/laporan-generator/scripts/report-stats.py +149 -0
  54. package/.agents/skills/laporan-generator/scripts/scan-preset.py +311 -0
  55. package/.agents/skills/laporan-generator/scripts/setup-deps.ps1 +152 -0
  56. package/.agents/skills/laporan-generator/scripts/setup-deps.sh +113 -0
  57. package/.agents/skills/laporan-generator/scripts/test_scripts.py +103 -0
  58. package/.agents/skills/laporan-generator/scripts/validate-preset.py +166 -0
  59. package/.agents/workflows/laporan-generator.md +8 -0
  60. package/LICENSE +21 -0
  61. package/Makefile +90 -0
  62. package/README.md +389 -0
  63. package/apa.csl +2273 -0
  64. package/bin/laporan-generator.js +71 -0
  65. package/build-docx.sh +122 -0
  66. package/build.sh +102 -0
  67. package/chapters/bab1-pendahuluan.md +60 -0
  68. package/chapters/bab2-tinjauan-pustaka.md +83 -0
  69. package/chapters/bab3-metodologi.md +116 -0
  70. package/chapters/bab4-hasil-dan-pembahasan.md +93 -0
  71. package/chapters/bab5-penutup.md +27 -0
  72. package/cover.md +50 -0
  73. package/docs/campus-guide.md +120 -0
  74. package/docs/metadata-schema.md +76 -0
  75. package/docs/preset-schema.md +79 -0
  76. package/docs/syntax-cheatsheet.md +122 -0
  77. package/docs/template-guide.md +100 -0
  78. package/docs/troubleshooting.md +105 -0
  79. package/docx.lua +416 -0
  80. package/laporan +464 -0
  81. package/laporan.ps1 +552 -0
  82. package/lib/init.js +118 -0
  83. package/lib/setup.js +33 -0
  84. package/lib/sync-hosts.js +194 -0
  85. package/lib/uninstall.js +123 -0
  86. package/logo.jpg +0 -0
  87. package/metadata.yml +35 -0
  88. package/package.json +65 -0
  89. package/presets/itb-ta.yml +27 -0
  90. package/presets/its-skripsi.yml +26 -0
  91. package/presets/skripsi-4433.yml +26 -0
  92. package/presets/standard.yml +26 -0
  93. package/presets/ugm-skripsi.yml +26 -0
  94. package/presets/ui-skripsi.yml +26 -0
  95. package/presets/unpad-skripsi.yml +27 -0
  96. package/reference.docx +0 -0
  97. package/references.bib +115 -0
  98. package/scripts/bundle.py +75 -0
  99. package/scripts/docx-pagenum.py +192 -0
  100. package/scripts/finalize-docx.py +291 -0
  101. package/scripts/make-reference-docx.py +670 -0
  102. package/scripts/report-doctor.py +211 -0
  103. package/scripts/report-stats.py +149 -0
  104. package/scripts/scan-preset.py +311 -0
  105. package/scripts/setup-deps.ps1 +152 -0
  106. package/scripts/setup-deps.sh +113 -0
  107. package/scripts/test_scripts.py +128 -0
  108. package/scripts/validate-preset.py +166 -0
  109. package/template.typ +394 -0
@@ -0,0 +1,122 @@
1
+ #!/usr/bin/env bash
2
+ set -e
3
+
4
+ DIR="$(cd "$(dirname "$0")" && pwd)"
5
+ if [ -n "$1" ]; then
6
+ OUTDIR="$1"
7
+ elif [ -f "$(pwd)/metadata.yml" ] && [ -d "$(pwd)/chapters" ]; then
8
+ OUTDIR="$(pwd)"
9
+ else
10
+ OUTDIR="$DIR"
11
+ fi
12
+ REPORT="$OUTDIR/Laporan.docx"
13
+
14
+ # Resolve Python (handle WindowsApps stub redirector on Windows)
15
+ PYTHON_BIN="python3"
16
+ if ! command -v python3 >/dev/null 2>&1 || ! python3 -V >/dev/null 2>&1; then
17
+ if command -v python >/dev/null 2>&1 && python -V >/dev/null 2>&1; then
18
+ PYTHON_BIN="python"
19
+ fi
20
+ fi
21
+
22
+ if [ ! -d "$OUTDIR/chapters" ]; then
23
+ echo "ERROR: Direktori chapters/ tidak ditemukan."
24
+ exit 1
25
+ fi
26
+
27
+ TMPDIR=$(mktemp -d)
28
+ trap 'rm -rf "$TMPDIR"' EXIT
29
+
30
+ FALLBACK_DIRS=(
31
+ "$OUTDIR"
32
+ "$DIR"
33
+ "$HOME/.agents/skills/laporan-generator/resources"
34
+ )
35
+
36
+ copy_asset() {
37
+ local asset="$1"
38
+ local dest="$2"
39
+ for base in "${FALLBACK_DIRS[@]}"; do
40
+ if [ -e "$base/$asset" ]; then
41
+ cp -r "$base/$asset" "$dest/"
42
+ return 0
43
+ fi
44
+ done
45
+ return 1
46
+ }
47
+
48
+ copy_asset "cover.md" "$TMPDIR" || true
49
+ copy_asset "logo.jpg" "$TMPDIR" || true
50
+ copy_asset "reference.docx" "$TMPDIR" || true
51
+ copy_asset "docx.lua" "$TMPDIR" || true
52
+ copy_asset "metadata.yml" "$TMPDIR" || true
53
+ copy_asset "references.bib" "$TMPDIR" || true
54
+ copy_asset "apa.csl" "$TMPDIR" || true
55
+ copy_asset "presets" "$TMPDIR" || true
56
+ copy_asset "scripts" "$TMPDIR" || true
57
+
58
+ if [ -d "$OUTDIR/gambar" ]; then
59
+ cp -r "$OUTDIR/gambar" "$TMPDIR/"
60
+ elif [ -d "$DIR/gambar" ]; then
61
+ cp -r "$DIR/gambar" "$TMPDIR/"
62
+ fi
63
+
64
+ cp "$OUTDIR/chapters"/*.md "$TMPDIR/" 2>/dev/null || true
65
+ CHAPTER_FILES=$(find "$TMPDIR" -maxdepth 1 -name "bab*.md" | sort -V)
66
+ if [ -z "$CHAPTER_FILES" ]; then
67
+ echo "ERROR: Tidak ada berkas bab*.md di direktori chapters/."
68
+ exit 1
69
+ fi
70
+ INPUT_FILES=("$TMPDIR/cover.md")
71
+ while IFS= read -r f; do
72
+ [ -n "$f" ] && INPUT_FILES+=("$f")
73
+ done < <(find "$TMPDIR" -maxdepth 1 -name "bab*.md" | sort -V)
74
+
75
+ cd "$TMPDIR"
76
+
77
+ PRESET_NAME=$(grep -E '^[[:space:]]*(preset|margin_preset):' "$TMPDIR/metadata.yml" 2>/dev/null | head -n 1 | cut -d: -f2- | tr -d '"'\''\r\n ')
78
+ PRESET_OPTS=()
79
+ if [ -n "$PRESET_NAME" ] && [ -f "$TMPDIR/presets/${PRESET_NAME}.yml" ]; then
80
+ PRESET_OPTS=("--metadata-file=$TMPDIR/presets/${PRESET_NAME}.yml")
81
+ elif [ -f "$TMPDIR/presets/standard.yml" ]; then
82
+ PRESET_OPTS=("--metadata-file=$TMPDIR/presets/standard.yml")
83
+ fi
84
+
85
+ pandoc \
86
+ "${INPUT_FILES[@]}" \
87
+ "${PRESET_OPTS[@]}" \
88
+ --metadata-file="metadata.yml" \
89
+ --citeproc \
90
+ --bibliography="references.bib" \
91
+ --csl="apa.csl" \
92
+ --metadata=reference-section-title="DAFTAR PUSTAKA" \
93
+ --top-level-division=chapter \
94
+ --reference-doc="reference.docx" \
95
+ --lua-filter="docx.lua" \
96
+ -o "$TMPDIR/Laporan-tmp.docx" 2>&1
97
+
98
+ FINALIZE_SCRIPT="$TMPDIR/scripts/finalize-docx.py"
99
+ PAGENUM_SCRIPT="$TMPDIR/scripts/docx-pagenum.py"
100
+ if [ ! -f "$FINALIZE_SCRIPT" ]; then
101
+ for base in "${FALLBACK_DIRS[@]}"; do
102
+ if [ -f "$base/scripts/finalize-docx.py" ]; then
103
+ FINALIZE_SCRIPT="$base/scripts/finalize-docx.py"
104
+ break
105
+ fi
106
+ done
107
+ fi
108
+ if [ ! -f "$PAGENUM_SCRIPT" ]; then
109
+ for base in "${FALLBACK_DIRS[@]}"; do
110
+ if [ -f "$base/scripts/docx-pagenum.py" ]; then
111
+ PAGENUM_SCRIPT="$base/scripts/docx-pagenum.py"
112
+ break
113
+ fi
114
+ done
115
+ fi
116
+
117
+ export PYTHONUTF8=1
118
+ "$PYTHON_BIN" "$FINALIZE_SCRIPT" "$TMPDIR/Laporan-tmp.docx" "$TMPDIR/Laporan-sect.docx"
119
+ "$PYTHON_BIN" "$PAGENUM_SCRIPT" "$TMPDIR/Laporan-sect.docx" "$REPORT"
120
+
121
+ echo "=== DOCX BERHASIL DIBUAT ==="
122
+ echo "Lokasi: $REPORT"
@@ -0,0 +1,102 @@
1
+ #!/usr/bin/env bash
2
+ set -e
3
+
4
+ DIR="$(cd "$(dirname "$0")" && pwd)"
5
+ if [ -n "$1" ]; then
6
+ OUTDIR="$1"
7
+ elif [ -f "$(pwd)/metadata.yml" ] && [ -d "$(pwd)/chapters" ]; then
8
+ OUTDIR="$(pwd)"
9
+ else
10
+ OUTDIR="$DIR"
11
+ fi
12
+ REPORT="$OUTDIR/Laporan.pdf"
13
+
14
+ TMPDIR=$(mktemp -d)
15
+ trap 'rm -rf "$TMPDIR"' EXIT
16
+
17
+ FALLBACK_DIRS=(
18
+ "$OUTDIR"
19
+ "$DIR"
20
+ "$HOME/.agents/skills/laporan-generator/resources"
21
+ )
22
+
23
+ copy_asset() {
24
+ local asset="$1"
25
+ local dest="$2"
26
+ for base in "${FALLBACK_DIRS[@]}"; do
27
+ if [ -e "$base/$asset" ]; then
28
+ cp -r "$base/$asset" "$dest/"
29
+ return 0
30
+ fi
31
+ done
32
+ return 1
33
+ }
34
+
35
+ copy_asset "cover.md" "$TMPDIR" || true
36
+ copy_asset "template.typ" "$TMPDIR" || true
37
+ copy_asset "logo.jpg" "$TMPDIR" || true
38
+ copy_asset "metadata.yml" "$TMPDIR" || true
39
+ copy_asset "references.bib" "$TMPDIR" || true
40
+ copy_asset "apa.csl" "$TMPDIR" || true
41
+ copy_asset "presets" "$TMPDIR" || true
42
+
43
+ if [ -d "$OUTDIR/chapters" ]; then
44
+ cp "$OUTDIR/chapters"/*.md "$TMPDIR/" 2>/dev/null || true
45
+ CHAPTER_FILES=$(find "$TMPDIR" -maxdepth 1 -name "bab*.md" | sort -V)
46
+ if [ -z "$CHAPTER_FILES" ]; then
47
+ echo "ERROR: Tidak ada berkas bab*.md di direktori chapters/."
48
+ exit 1
49
+ fi
50
+ INPUT_FILES=("$TMPDIR/cover.md")
51
+ while IFS= read -r f; do
52
+ [ -n "$f" ] && INPUT_FILES+=("$f")
53
+ done < <(find "$TMPDIR" -maxdepth 1 -name "bab*.md" | sort -V)
54
+ else
55
+ echo "ERROR: Direktori chapters/ tidak ditemukan."
56
+ echo "Buat folder chapters/ dengan file bab laporan (contoh: bab1-pendahuluan.md dst)."
57
+ exit 1
58
+ fi
59
+
60
+ if [ -d "$OUTDIR/gambar" ]; then
61
+ cp -r "$OUTDIR/gambar" "$TMPDIR/"
62
+ IM_CONV="convert"
63
+ command -v magick >/dev/null 2>&1 && IM_CONV="magick"
64
+ find "$TMPDIR/gambar" -type f \( -name "*.png" -o -name "*.PNG" \) -exec $IM_CONV {} -alpha off {} \; 2>/dev/null || true
65
+ fi
66
+
67
+ cd "$TMPDIR"
68
+
69
+ PRESET_NAME=$(grep -E '^[[:space:]]*(preset|margin_preset):' "$TMPDIR/metadata.yml" 2>/dev/null | head -n 1 | cut -d: -f2- | tr -d '"'\''\r\n ')
70
+ PRESET_OPTS=()
71
+ if [ -n "$PRESET_NAME" ] && [ -f "$TMPDIR/presets/${PRESET_NAME}.yml" ]; then
72
+ PRESET_OPTS=("--metadata-file=$TMPDIR/presets/${PRESET_NAME}.yml")
73
+ elif [ -f "$TMPDIR/presets/standard.yml" ]; then
74
+ PRESET_OPTS=("--metadata-file=$TMPDIR/presets/standard.yml")
75
+ fi
76
+
77
+ if ! pandoc \
78
+ "${INPUT_FILES[@]}" \
79
+ --template="template.typ" \
80
+ "${PRESET_OPTS[@]}" \
81
+ --metadata-file="metadata.yml" \
82
+ --citeproc \
83
+ --bibliography="references.bib" \
84
+ --csl="apa.csl" \
85
+ --metadata=reference-section-title="DAFTAR PUSTAKA" \
86
+ --top-level-division=chapter \
87
+ --pdf-engine=typst \
88
+ --syntax-highlighting=none \
89
+ -o "$REPORT" 2>&1; then
90
+ echo ""
91
+ echo "[ERROR] BUILD GAGAL: Terjadi kesalahan saat kompilasi Pandoc/Typst."
92
+ echo "Kemungkinan penyebab & solusi:"
93
+ echo " 1. Sintaks YAML di metadata.yml tidak valid -> Cek docs/metadata-schema.md"
94
+ echo " 2. Berkas gambar tidak ditemukan atau rusak -> Cek path gambar di chapters/"
95
+ echo " 3. Sintaks Markdown tidak didukung -> Cek docs/troubleshooting.md"
96
+ echo " 4. Gunakan Docker jika ada masalah dependensi lokal: docker compose run --rm laporan-generator"
97
+ exit 1
98
+ fi
99
+
100
+ echo ""
101
+ echo "=== PDF BERHASIL DIBUAT ==="
102
+ echo "Lokasi: $REPORT"
@@ -0,0 +1,60 @@
1
+ # PENDAHULUAN
2
+
3
+ ## Latar Belakang
4
+
5
+ Penulisan laporan akademik merupakan kegiatan fundamental dalam ekosistem pendidikan tinggi dan penelitian. Mahasiswa, dosen, dan peneliti secara berkala menyusun dokumen formal seperti laporan praktikum, laporan proyek rekayasa perangkat lunak, tugas akhir, skripsi, tesis, hingga makalah ilmiah [@apa2020manual]. Standarisasi laporan akademik menuntut tingkat konsistensi visual yang ketat, meliputi pengaturan geometri halaman (margin), tipografi, spasi baris, penomoran berjenjang, penataan tabel dan gambar, hingga keakuratan sitasi daftar pustaka.
6
+
7
+ Metode konvensional dalam penyusunan laporan akademik di Indonesia umumnya masih mengandalkan pengolah kata berbasis Graphical User Interface (GUI) seperti Microsoft Word. Meskipun populer dan mudah diakses, pendekatan ini memiliki sejumlah tantangan teknis:
8
+
9
+ 1. **Inkonsistensi Pemformatan dan Pergeseran Tata Letak** --- Penataan gaya (styles), margin, dan spasi yang dilakukan secara manual sering kali menghasilkan dokumen yang tidak seragam. Perubahan kecil pada paragraf awal kerap mengakibatkan pergeseran posisi gambar dan tabel pada halaman-halaman berikutnya (*layout drift*).
10
+
11
+ 2. **Kompleksitas Penomoran Ganda** --- Pedoman penulisan karya ilmiah di perguruan tinggi Indonesia mewajibkan struktur penomoran halaman ganda (*dual pagination*), yaitu angka Romawi kecil (*i, ii, iii*) untuk bagian pengantar (*front matter*) dan angka Arab (*1, 2, 3*) yang dimulai ulang (*restart*) dari angka 1 pada BAB I (*main body*). Pengaturan *section break* manual pada pengolah kata konvensional sering membingungkan dan rentan rusak saat dokumen disunting berulang kali [@iso2021openxml].
12
+
13
+ 3. **Ketiadaan Dukungan Version Control yang Efektif** --- Berkas dokumen biner atau XML terkompresi tidak dapat di-*diff* dan di-*merge* secara bersih menggunakan sistem kontrol versi seperti Git. Hal ini menyulitkan pelacakan riwayat revisi dan kolaborasi tim secara terdistribusi.
14
+
15
+ 4. **Ketergantungan dan Bobot Sistem Typesetting Tradisional** --- Penggunaan sistem typesetting klasik seperti LaTeX [@lamport1994latex; @knuth1984texbook] memberikan kualitas tipografi tinggi, namun memiliki kurva belajar yang curam serta ukuran instalasi distribusi TeX Live yang sangat besar (mencapai 4--5 GB) sehingga lambat dalam lingkungan CI/CD container.
16
+
17
+ Untuk mengatasi permasalahan tersebut, paradigma pemisahan konten dari penyajian (*separation of concerns*) diimplementasikan melalui pipeline otomatisasi dokumen modern. Konten ditulis menggunakan format teks ringan **Markdown** [@gruber2004markdown; @commonmark2021], kemudian dikonversi secara terpadu oleh **Pandoc** [@pandoc2024] ke dalam dua engine keluaran:
18
+
19
+ 1. **Typst Engine** [@typst2024] sebagai sistem typesetting mutakhir yang cepat dan ringan untuk menghasilkan dokumen PDF berkualitas percetakan.
20
+ 2. **Multi-Pass DOCX Engine** dengan filter Lua kustom [@krewinkel2020pandoc] untuk menghasilkan dokumen Microsoft Word resmi yang memenuhi aturan penomoran halaman akademik.
21
+
22
+ Pipeline ini diorkestrasi secara otomatis melalui antarmuka CLI terpadu dan skrip otomatisasi Bash [@gnu2024bash], serta didukung oleh lingkungan terisolasi yang dapat direproduksi (*reproducible*) menggunakan Nix Flakes [@dolstra2004nix] dan Docker [@merkel2014docker].
23
+
24
+ ## Rumusan Masalah
25
+
26
+ Berdasarkan latar belakang di atas, rumusan masalah dalam penelitian dan pengembangan pipeline ini adalah:
27
+
28
+ 1. Bagaimana merancang arsitektur pipeline otomatisasi konversi dokumen akademik dari format Markdown menjadi PDF dan Microsoft Word (DOCX)?
29
+ 2. Bagaimana mengintegrasikan engine typesetting Typst dan filter Pandoc Lua untuk menghasilkan format laporan yang mematuhi standar penomoran akademik Indonesia?
30
+ 3. Bagaimana mekanisme penanganan penomoran halaman ganda (Romawi kecil pada *front matter* dan Arab pada isi bab) secara otomatis pada berkas DOCX dan PDF?
31
+ 4. Bagaimana merancang sistem preset deklaratif yang fleksibel untuk memfasilitasi keberagaman aturan format di berbagai perguruan tinggi?
32
+ 5. Bagaimana membangun lingkungan pengembangan dan build yang sepenuhnya terisolasi dan *reproducible* menggunakan Nix Flakes dan Docker container?
33
+
34
+ ## Tujuan
35
+
36
+ Tujuan dari penyusunan laporan dan pengembangan sistem ini adalah:
37
+
38
+ 1. Menganalisis dan mengimplementasikan pipeline otomatisasi dokumen berbasis teks menggunakan Markdown, Pandoc, Typst, dan Lua Filters.
39
+ 2. Membangun template visual Typst (`template.typ`) dan template gaya Word (`reference.docx`) yang mematuhi standar tipografi akademik Indonesia (A4, margin standar/skripsi, Times New Roman/Libertinus Serif, spasi 1.5).
40
+ 3. Mengembangkan sistem injeksi OpenXML dan skrip dua tahap (*two-pass page numbering*) untuk menyinkronkan penomoran halaman aktual pada Daftar Isi dokumen DOCX.
41
+ 4. Mengembangkan sistem preset format kampus deklaratif (`presets/*.yml`) beserta modul linter dan pemindai otomatis (*PDF Guideline Scanner*).
42
+ 5. Mengintegrasikan test suite otomatis berorientasi assertions untuk memverifikasi keandalan struktur dan konten dokumen yang dihasilkan.
43
+
44
+ ## Manfaat
45
+
46
+ Manfaat yang diharapkan dari proyek dan laporan ini meliputi:
47
+
48
+ 1. **Efisiensi Waktu dan Produktivitas** --- Penulis dan mahasiswa dapat berfokus penuh pada substansi konten tanpa terbebani oleh pengaturan tata letak manual yang berulang.
49
+ 2. **Standardisasi dan Kualitas Dokumen** --- Menghasilkan keluaran dokumen PDF dan DOCX yang konsisten, rapi, dan mematuhi kaidah penulisan ilmiah serta gaya sitasi APA Edisi ke-7 [@apa2020manual].
50
+ 3. **Kemudahan Kolaborasi dan Version Control** --- Memungkinkan pelacakan perubahan baris per baris (*line-by-line diff*) pada repositori Git.
51
+ 4. **Portabilitas Tinggi** --- Dokumentasi dapat dibangun secara instan di berbagai sistem operasi (Linux, macOS, Windows) dengan dependensi ringan.
52
+
53
+ ## Batasan Masalah
54
+
55
+ Batasan masalah dalam implementasi sistem ini adalah:
56
+
57
+ 1. Format dokumen masukan menggunakan varian Pandoc Markdown dengan metadata berbasis YAML.
58
+ 2. Format keluaran utama mencakup dokumen PDF (dikompilasi melalui Typst) dan dokumen Microsoft Word (.docx).
59
+ 3. Standar sitasi dan daftar pustaka default mengacu pada Citation Style Language (CSL) APA Style Edisi ke-7.
60
+ 4. Pengujian otomatis dijalankan pada lingkungan sistem operasi berbasis Linux dan Nix/Docker container.
@@ -0,0 +1,83 @@
1
+ # TINJAUAN PUSTAKA
2
+
3
+ ## Markdown dan Standardisasi Dokumen Teks
4
+
5
+ ### Sejarah dan Filosofi Markdown
6
+
7
+ Markdown pertama kali diciptakan oleh John Gruber pada tahun 2004 sebagai format penulisan berbasis teks polos (*plain text*) yang dirancang agar mudah dibaca dan ditulis oleh manusia tanpa perlu proses kompilasi visual [@gruber2004markdown]. Filosofi dasar Markdown menempatkan keterbacaan (*human-readability*) sebagai prioritas tertinggi, di mana markup struktural tidak boleh mengaburkan arti teks substantif.
8
+
9
+ Seiring meluasnya penggunaan Markdown dalam ekosistem rekayasa perangkat lunak, inisiatif standardisasi melahirkan spesifikasi formal CommonMark [@commonmark2021]. Varian Pandoc Markdown memperluas spesifikasi ini dengan mendukung sintaks akademik tingkat lanjut seperti tabel bergaya *pipe*, blok kode beranotasi, catatan kaki (*footnotes*), persamaan matematika LaTeX inline maupun display, metadata berbasis YAML front matter, dan sitasi bibliografi terintegrasi [@pandoc2024].
10
+
11
+ ### Sintaks Penulisan Akademik dalam Markdown
12
+
13
+ Tabel berikut merangkum pemetaan sintaks Markdown yang digunakan dalam pipeline penyusunan laporan akademik:
14
+
15
+ | Elemen Struktur | Sintaks Markdown | Contoh Penulisan | Representasi Keluaran |
16
+ |:---|:---|:---|:---|
17
+ | Judul Bab (Level 1) | `# Judul` | `# PENDAHULUAN` | BAB I PENDAHULUAN |
18
+ | Sub-Bab (Level 2) | `## Sub Judul` | `## Latar Belakang` | 1.1. Latar Belakang |
19
+ | Sub-Sub-Bab (Level 3) | `### Rincian` | `### Identifikasi Masalah` | 1.1.1 Rincian Masalah |
20
+ | Sitasi Bibliografi | `[@citekey]` | `[@typst2024]` | (Mädje & Haug, 2024) |
21
+ | Tabel Akademik | Pipe & Header Syntax | `| Kolom 1 | Kolom 2 |` | Tabel formal bergaris 0.5pt |
22
+ | Gambar / Diagram | `![Keterangan](path)` | `![Arsitektur](gambar/flow.png)` | Gambar terpusat ber-caption |
23
+ | Persamaan Matematika | `$...$` / `$$...$$` | `$E = m c^2$` | Notasi rumus terformat presisi |
24
+
25
+ ## Sistem Typesetting Modern: Typst
26
+
27
+ ### Arsitektur dan Prinsip Kerja Typst
28
+
29
+ Typst adalah sistem typesetting berbasis markup yang dapat diprogram (*programmable markup-based typesetting system*) yang dikembangkan oleh Laurenz Mädje dan Martin Haug [@typst2024]. Typst dirancang sebagai respons terhadap keterbatasan sistem typesetting klasik seperti TeX dan LaTeX [@knuth1984texbook; @lamport1994latex] yang memiliki waktu kompilasi lambat, pesan galat yang sulit diurai, serta sintaks makro yang kompleks.
30
+
31
+ Typst mengadopsi model kompilasi inkremental modern berbasis bahasa pemrograman Rust. Karakteristik utama Typst mencakup:
32
+
33
+ 1. **Kecepatan Kompilasi Tinggi** --- Typst mampu mengompilasi puluhan halaman dokumen dalam hitungan milidetik, memungkinkan pengalaman pratinjau langsung (*live reload*) yang sangat responsif.
34
+ 2. **Binary Ringan dan Mandiri** --- Ukuran binary Typst hanya berkisar 25 MB dan tidak membutuhkan dependensi eksternal dari repositori paket yang besar.
35
+ 3. **Tipografi Bawaan yang Portabel** --- Typst menyertakan font berkualitas tinggi seperti Libertinus Serif dan DejaVu Sans Mono langsung di dalam binary, sehingga menjamin konsistensi render di semua platform tanpa isu font hilang (*missing fonts*).
36
+ 4. **Model Tata Letak Deklaratif** --- Pengaturan margin halaman, penomoran heading bertingkat, dan aturan jeda halaman (*pagebreak*) dikonfigurasi melalui fungsi bawaan yang elegan seperti `#set page()`, `#set heading()`, dan `#show heading()`.
37
+
38
+ ## Pandoc dan Pemrosesan Dokumen Abstrak
39
+
40
+ ### Universal Document Converter
41
+
42
+ Pandoc adalah perangkat lunak konversi dokumen universal yang dikembangkan oleh John MacFarlane [@pandoc2024]. Pandoc bekerja dengan membaca format masukan (seperti Markdown), mengonversinya ke dalam struktur pohon sintaks abstrak internal yang disebut *Abstract Syntax Tree* (AST), lalu mengekspor AST tersebut ke berbagai format target, termasuk Typst, HTML, EPUB, dan Microsoft Word (DOCX).
43
+
44
+ ### Filter Lua dan Ekstensibilitas AST
45
+
46
+ Sejak versi 2.0, Pandoc menyediakan mesin scripting tertanam berbasis bahasa pemrograman Lua yang memungkinkan manipulasi AST sebelum proses penulisan dokumen akhir dilakukan [@krewinkel2020pandoc]. Dalam proyek ini, berkas `docx.lua` berperan penting dalam:
47
+
48
+ 1. Mendeteksi elemen heading level 1, 2, dan 3 untuk menambahkan penomoran otomatis berformat Romawi (`BAB I`) dan Arab (`1.1.`, `1.1.1`).
49
+ 2. Menghasilkan struktur XML untuk halaman sampul formal dan Daftar Isi yang terhubung dengan tautan hiperteks internal (*hyperlink anchor*).
50
+ 3. Mencegah penomoran ganda pada bagian khusus seperti KATA PENGANTAR dan DAFTAR PUSTAKA.
51
+
52
+ ## Arsitektur Dokumen Office Open XML (DOCX)
53
+
54
+ Standar internasional ISO/IEC 29500 mendefinisikan Office Open XML (OpenXML) sebagai representasi berkas dokumen teks berbasis arsip ZIP yang berisi serangkaian berkas XML dan relasi strukturalnya [@iso2021openxml]. Berkas utama `word/document.xml` menyimpan seluruh elemen paragraf (`<w:p>`), teks (`<w:t>`), dan properti seksi (`<w:sectPr>`).
55
+
56
+ Pengaturan *section break* (`<w:sectPr>`) menentukan perilaku penomoran halaman pada setiap bagian dokumen. Agar mematuhi kaidah akademik Indonesia, dokumen DOCX dibagi menjadi tiga seksi:
57
+ 1. **Seksi Sampul**: Referensi footer dihapus sehingga halaman pertama bersih tanpa nomor.
58
+ 2. **Seksi Front Matter**: Properti penomoran diset ke format Romawi kecil (`w:fmt="lowerRoman"` dan `w:start="1"`).
59
+ 3. **Seksi Main Body (BAB I)**: Properti penomoran di-reset menjadi format angka Arab (`w:fmt="decimal"` dan `w:start="1"`).
60
+
61
+ ## Pemrosesan Citra Digital dengan ImageMagick
62
+
63
+ ImageMagick adalah rangkaian perangkat lunak untuk manipulasi citra digital via baris perintah [@imagemagick2024]. Pada pipeline dokumen ilmiah, diagram dan tangkapan layar sering kali berformat PNG dengan saluran transparansi (*alpha channel*). Saluran alfa yang tidak diatur dapat menimbulkan artefak visual seperti latar belakang hitam atau distorsi warna pada saat citra dirender ke dalam dokumen PDF. Pipeline menggunakan perintah normalisasi:
64
+
65
+ ```bash
66
+ convert input.png -alpha off output.png
67
+ ```
68
+
69
+ Perintah ini secara rekursif menonaktifkan transparansi dan menggantinya dengan latar belakang putih pekat, menjamin gambar tampil bersih pada media cetak.
70
+
71
+ ## Reproducibility dan Lingkungan Terisolasi
72
+
73
+ ### Manajemen Dependensi Berbasis Nix Flakes
74
+
75
+ Nix adalah manajer paket murni fungsional yang menjamin *reproducible builds* dengan menyimpan setiap dependensi dalam direktori unik berbasis *cryptographic hash* di `/nix/store` [@dolstra2004nix]. Melalui berkas konfigurasi `flake.nix` dan berkas pengunci `flake.lock`, seluruh dependensi toolchain (Pandoc, Typst, ImageMagick, poppler-utils, dan LibreOffice) dapat diinisialisasi secara deterministik di berbagai mesin pengembang tanpa konflik dependensi sistem operasi.
76
+
77
+ ### Kontainerisasi Menggunakan Docker
78
+
79
+ Docker menyediakan isolasi tingkat sistem operasi menggunakan teknologi Linux *cgroups* dan *namespaces* [@merkel2014docker; @love2010kernel]. Melalui `Dockerfile` multi-arsitektur (amd64 dan arm64), lingkungan kompilasi dokumen dapat dijalankan langsung pada platform apapun yang mendukung runtime container tanpa perlu instalasi perangkat lunak lokal.
80
+
81
+ ## Standar Sitasi Akademik APA Edisi ke-7
82
+
83
+ Karya ilmiah dan laporan akademik mengadopsi standar pengutipan dan penulisan daftar pustaka berdasarkan *Publication Manual of the American Psychological Association* (APA) Edisi ke-7 [@apa2020manual]. Standar APA menerapkan sistem pengutipan Nama Penulis dan Tahun Penerbitan (*Author-Date System*), misalnya `(MacFarlane, 2024)` untuk sitasi dalam kurung (*parenthetical*) atau `MacFarlane (2024)` untuk sitasi naratif. Pemrosesan sitasi pada pipeline dijalankan secara otomatis oleh mesin `pandoc-citeproc` menggunakan berkas definisi gaya `apa.csl` dan basis data pustaka BibTeX `references.bib`.
@@ -0,0 +1,116 @@
1
+ # METODOLOGI
2
+
3
+ ## Arsitektur Sistem dan Alur Kerja Pipeline
4
+
5
+ Pengembangan sistem **Laporan Generator** dirancang dengan prinsip modularitas tinggi dan pemisahan lapisan tugas (*separation of concerns*). Arsitektur sistem dibagi menjadi tiga lapisan utama: Lapisan Masukan (*Input Layer*), Lapisan Pemrosesan (*Processing Layer*), dan Lapisan Keluaran (*Output Layer*).
6
+
7
+ ```
8
+ +-------------------------------------------------------------------------+
9
+ | INPUT LAYER |
10
+ | chapters/bab*.md | cover.md | metadata.yml | presets/*.yml |
11
+ | references.bib | apa.csl | logo.jpg | gambar/* |
12
+ +-------------------------------------------------------------------------+
13
+ |
14
+ +-----------------------+-----------------------+
15
+ | |
16
+ v v
17
+ +---------------------------------------+ +-------------------------------+
18
+ | PIPELINE 1: TYPST (PDF) | | PIPELINE 2: DOCX MULTI-PASS |
19
+ | | | |
20
+ | 1. ImageMagick Alpha Normalization | | 1. Pandoc + docx.lua Filter |
21
+ | 2. Preset Metadata Extraction | | 2. Base reference.docx Styling|
22
+ | 3. Pandoc AST + Citeproc Processing | | 3. finalize-docx.py (3 Sect) |
23
+ | 4. Typst Typesetting Engine Render | | 4. docx-pagenum.py (Page Inj) |
24
+ +---------------------------------------+ +-------------------------------+
25
+ | |
26
+ v v
27
+ +---------------------------------------+ +-------------------------------+
28
+ | Laporan.pdf | | Laporan.docx |
29
+ | (Clean Vector, APA Style, Typst) | | (Roman Front, Arabic Body) |
30
+ +---------------------------------------+ +-------------------------------+
31
+ ```
32
+
33
+ ## Perancangan Template Visual Typst (`template.typ`)
34
+
35
+ Template visual Typst berfungsi sebagai pengatur tata letak halaman, tipografi, dan penomoran dokumen PDF. Template dirancang fleksibel untuk mendukung preset margin dinamis dan penomoran otomatis.
36
+
37
+ ### Pengaturan Geometri Halaman dan Margin
38
+
39
+ Geometri halaman diatur secara adaptif melalui blok evaluasi kondisi Typst:
40
+
41
+ ```typst
42
+ #set page(
43
+ paper: "a4",
44
+ margin: doc-margin,
45
+ numbering: none,
46
+ )
47
+ ```
48
+
49
+ Variabel `doc-margin` dievaluasi dari berkas konfigurasi preset (`margin_top`, `margin_bottom`, `margin_left`, `margin_right`) yang diinjeksikan oleh Pandoc pada saat kompilasi.
50
+
51
+ ### Penomoran Heading Bertingkat
52
+
53
+ Penomoran judul bab dan sub-bab ditangani melalui fungsi callback `#set heading()`:
54
+
55
+ ```typst
56
+ #set heading(numbering: (..ns) => {
57
+ if ns.len() == 1 {
58
+ "BAB " + numbering("I", ns.at(0))
59
+ } else if ns.len() == 2 {
60
+ numbering("1.1.", ..ns)
61
+ } else {
62
+ numbering("1.1.1", ..ns)
63
+ }
64
+ })
65
+ ```
66
+
67
+ Penanganan khusus diimplementasikan pada `#show heading.where(level: 1)` untuk menghasilkan jeda halaman otomatis (*pagebreak*) dan meletakkan nomor bab ("BAB I") di atas judul bab dengan gaya huruf kapital tebal 14pt di tengah halaman.
68
+
69
+ ### Algoritma Keseimbangan Judul Sampul (*Balanced Title Splitting*)
70
+
71
+ Untuk mencegah terjadinya fenomena kata menggantung sendirian di baris bawah (*orphan words*), template mengintegrasikan fungsi pembagi judul berbasis Dynamic Programming (`balance-split`). Algoritma ini mengevaluasi jumlah karakter per baris dan meminimalisir fungsi biaya (*cost function*) agar panjang tiap baris judul sampul depan simetris menyerupai bentuk piramida terbalik.
72
+
73
+ ## Perancangan Pipeline Dokumen Microsoft Word (DOCX)
74
+
75
+ Penyusunan dokumen DOCX resmi memerlukan integrasi tiga komponen pemrosesan berurutan:
76
+
77
+ ### Filter Lua docx.lua
78
+ Filter Lua mengintersepsi pohon sintaks abstrak (AST) Pandoc. Fungsi `Header(el)` menghitung indeks bab dan sub-bab serta menyusun entri Daftar Isi ber-hyperlink. Fungsi `Pandoc(doc)` membangun halaman sampul formal menggantikan title block bawaan Pandoc.
79
+
80
+ ### Partisi Tiga Seksi Dokumen finalize-docx.py
81
+ Skrip Python memanipulasi struktur OpenXML berkas `word/document.xml` dengan membagi dokumen ke dalam tiga penanda seksi (`w:sectPr`):
82
+ - **Seksi 1 (Sampul)**: Menghapus elemen `<w:footerReference>` sehingga nomor halaman tidak tampil pada sampul luar.
83
+ - **Seksi 2 (Front Matter)**: Menginjeksikan `<w:pgNumType w:fmt="lowerRoman" w:start="1"/>` agar halaman KATA PENGANTAR dan DAFTAR ISI diberi nomor *i, ii, iii*.
84
+ - **Seksi 3 (Main Body)**: Menginjeksikan `<w:pgNumType w:fmt="decimal" w:start="1"/>` sebelum judul BAB I agar penomoran dimulai ulang dari angka 1, 2, 3.
85
+
86
+ ### Sinkronisasi Nomor Halaman Aktual docx-pagenum.py
87
+ Untuk memastikan Daftar Isi pada dokumen DOCX menampilkan nomor halaman yang akurat di seluruh aplikasi pengolah kata, skrip `docx-pagenum.py` melakukan:
88
+ 1. Render headless berkas DOCX menjadi PDF temporer menggunakan LibreOffice (`soffice --headless`).
89
+ 2. Ekstraksi teks per halaman menggunakan utilitas `pdftotext`.
90
+ 3. Pencocokan teks heading dengan footer halaman aktual.
91
+ 4. Pengisian nilai cache pada field OpenXML `<w:instrText>PAGEREF</w:instrText>`.
92
+
93
+ ## Sistem Preset Kampus Deklaratif
94
+
95
+ Untuk memfasilitasi keberagaman pedoman penulisan skripsi di berbagai perguruan tinggi di Indonesia, arsitektur preset deklaratif (`presets/*.yml`) dibangun dengan skema standar:
96
+
97
+ | Kategori Parameter | Kunci Konfigurasi | Contoh Nilai | Keterangan |
98
+ |:---|:---|:---|:---|
99
+ | **Identitas** | `preset_id`, `name` | `ui-skripsi`, `itb-ta` | Identifikasi unik dan nama institusi |
100
+ | **Geometri Margin** | `margin_top`, `margin_left` | `4cm`, `3cm`, `2.5cm` | Batas tepi kertas A4 |
101
+ | **Tipografi** | `font_family`, `font_size` | `Libertinus Serif`, `12pt` | Jenis font dan ukuran teks isi |
102
+ | **Spasi & Indentasi** | `line_spacing`, `first_line_indent` | `0.75em`, `1.25cm` | Spasi 1.5 dan indent alinea |
103
+ | **Sampul (Cover)** | `cover_show_lecturer` | `true` / `false` | Pengaturan tampilan dosen pembimbing |
104
+
105
+ Sistem ini didukung oleh dua utilitas otomatis:
106
+ 1. **`scripts/scan-preset.py`**: Mengekstraksi aturan margin, spasi, dan font secara otomatis dari berkas PDF Buku Pedoman Skripsi kampus baru menggunakan regex heuristik.
107
+ 2. **`scripts/validate-preset.py`**: Melakukan validasi sintaks dan verifikasi skema pada seluruh berkas preset YAML sebelum digunakan pada proses kompilasi.
108
+
109
+ ## Metodologi Pengujian dan Verifikasi
110
+
111
+ Keandalan seluruh komponen pipeline diuji menggunakan test suite otomatis (`test.sh`) yang mencakup 20 kategori pengujian dan 78 *test assertions*. Pengujian memverifikasi:
112
+ 1. Ketersediaan dependensi dan kelengkapan struktur direktori proyek.
113
+ 2. Validitas metadata YAML dan integritas basis data sitasi BibTeX.
114
+ 3. Keterbacaan teks berkas PDF dan kelayakan ukuran berkas keluaran.
115
+ 4. Validitas struktur OpenXML dokumen DOCX (pemeriksaan 3 seksi, format nomor Romawi/Arab, gaya font Times New Roman, dan field TOC).
116
+ 5. Integritas sistem preset kampus, fungsionalitas scanner PDF, dan CLI helper.
@@ -0,0 +1,93 @@
1
+ # HASIL DAN PEMBAHASAN
2
+
3
+ ## Struktur Berkas dan Implementasi Sistem
4
+
5
+ Implementasi pipeline **Laporan Generator** menghasilkan struktur direktori yang modular dan terorganisasi secara sistematis:
6
+
7
+ ```
8
+ laporan-generator/
9
+ |-- laporan # CLI Helper terpadu (build, init, preset, check, test)
10
+ |-- build.sh # Skrip build utama PDF (Typst engine)
11
+ |-- Makefile # Target otomasi (build, docx, html, watch, view, clean)
12
+ |-- template.typ # Template visual Typst (font, margin, heading)
13
+ |-- docx.lua # Filter Lua penomoran bab & sampul DOCX
14
+ |-- reference.docx # Template gaya Microsoft Word (A4, TNR 12pt)
15
+ |-- metadata.yml # Konfigurasi judul, penulis, dosen, institusi, preset
16
+ |-- references.bib # Basis data daftar pustaka (format BibTeX)
17
+ |-- apa.csl # Aturan sitasi standar APA Edisi ke-7
18
+ |-- cover.md # Kata pengantar & outline front matter
19
+ |-- chapters/ # Konten laporan modular (BAB I s/d BAB V)
20
+ |-- presets/ # Konfigurasi format kampus (UI, ITB, UGM, ITS, Standard)
21
+ |-- scripts/ # Utilitas Python (scan-preset, validate, docx-pagenum)
22
+ |-- flake.nix / flake.lock # Lingkungan hermetik Nix Flake
23
+ |-- Dockerfile # Kontainer build multi-arsitektur (amd64 / arm64)
24
+ |-- docker-compose.yml # Orkestrasi kontainer Docker dengan pemetaan user
25
+ |-- prompt.md # Panduan instruksi agen AI (OpenCode, Claude, Antigravity)
26
+ \-- test.sh # Suite pengujian otomatis (78 assertions)
27
+ ```
28
+
29
+ ## Evaluasi Hasil Keluaran Dokumen PDF (Typst Engine)
30
+
31
+ Kompilasi dokumen PDF menggunakan Typst menghasilkan dokumen akademik dengan kualitas tipografi tingkat tinggi. Beberapa pencapaian visual utama meliputi:
32
+
33
+ 1. **Struktur Penomoran Bab Dua Baris** --- Sesuai dengan pedoman penulisan karya ilmiah di Indonesia, judul bab level 1 dirender dalam dua baris simetris: baris pertama berisi prefix angka Romawi tebal (contoh: `BAB I`), dan baris kedua berisi nama judul bab dalam huruf kapital tebal 14pt (contoh: `PENDAHULUAN`).
34
+ 2. **Kerapian Spasi dan Indentasi Paragraf** --- Teks isi menggunakan font Libertinus Serif 12pt dengan spasi baris 1.5 (`leading: 0.75em`) dan perataan rata kanan-kiri (*justified*). Baris pertama setiap alinea diindentasi secara presisi sebesar 1.25 cm.
35
+ 3. **Penyusunan Tabel dan Gambar yang Bersih** --- Seluruh gambar diposisikan di tengah halaman dengan keterangan caption di bagian bawah. Tabel akademik bergaris tipis 0.5pt abu-abu tanpa border vertikal berlebih.
36
+ 4. **Sitasi Otomatis Format APA** --- Seluruh pengutipan dalam teks seperti `(Mädje & Haug, 2024)` secara otomatis ditautkan ke bagian DAFTAR PUSTAKA di akhir dokumen dengan penataan *hanging indent* 1.25 cm.
37
+
38
+ ## Evaluasi Hasil Keluaran Dokumen Word (DOCX Multi-Pass)
39
+
40
+ Dokumen Microsoft Word (`Laporan.docx`) yang dihasilkan melalui proses multi-pass berhasil memenuhi persyaratan format formal:
41
+
42
+ 1. **Pemisahan Seksi dan Penomoran Halaman** --- Sampul depan tampil bersih tanpa nomor halaman. Bagian KATA PENGANTAR dan DAFTAR ISI memiliki penomoran angka Romawi kecil (*i, ii*). Pada awal BAB I, penomoran halaman berhasil dimulai ulang (*restart*) dari angka Arab 1 (*1, 2, 3...*).
43
+ 2. **Daftar Isi Otomatis Terhubung (Hyperlinked TOC)** --- Entri Daftar Isi dihubungkan dengan *hyperlink internal* dan menampilkan nomor halaman aktual secara presisi berkat proses injeksi nilai cache oleh `docx-pagenum.py`.
44
+ 3. **Konsistensi Gaya dan Font** --- Dokumen Word menggunakan font Times New Roman berukuran 12pt pada teks normal dan 14pt tebal pada Heading 1, memastikan paritas visual yang identik dengan dokumen PDF.
45
+
46
+ ## Analisis Komparasi Kinerja dan Efisiensi
47
+
48
+ Tabel berikut menyajikan perbandingan komprehensif antara pipeline **Laporan Generator (Typst Engine)**, pipeline berbasis **LaTeX Tradisional**, dan penyusunan manual menggunakan **Microsoft Word**:
49
+
50
+ | Parameter Evaluasi | Laporan Generator (Typst) | LaTeX Tradisional | Microsoft Word Manual |
51
+ |:---|:---|:---|:---|
52
+ | **Waktu Kompilasi Dokumen** | **< 1.0 detik** | 10 -- 30 detik | Tidak ada (Manual) |
53
+ | **Ukuran Toolchain / Instalasi** | **~25 MB** (Binary Typst) | ~4.5 GB (TeX Live) | ~2.5 GB (MS Office) |
54
+ | **Dukungan Version Control (Git)** | **Sangat Baik** (Plain Text) | Sangat Baik (Plain Text)| Sangat Buruk (Binary DOCX)|
55
+ | **Keluaran Format Ganda** | **PDF & DOCX Sinkron** | Hanya PDF | Hanya DOCX |
56
+ | **Penanganan Layout Drift** | **Deterministik & Otomatis** | Deterministik | Sering Bergeser Manual |
57
+ | **Konfigurasi Format Kampus** | **1 Baris YAML Preset** | Modifikasi .cls/macro | Setting Style GUI Manual |
58
+ | **Integrasi AI Agent** | **Terpadu (`prompt.md`)** | Kustom / Manual | Terbatas |
59
+
60
+ ## Hasil Pengujian Otomatis (Automated Test Suite)
61
+
62
+ Pengujian menyeluruh menggunakan skrip `test.sh` dilakukan untuk memverifikasi fungsionalitas seluruh komponen. Hasil eksekusi pengujian pada lingkungan terisolasi menghasilkan status lulus 100%:
63
+
64
+ ```
65
+ === Test Suite: Laporan Generator ===
66
+
67
+ [T1] Dependency check [OK] 3/3 tools
68
+ [T2] File structure check [OK] 8/8 files
69
+ [T3] Metadata check [OK] 2/2 checks
70
+ [T4] Template check [OK] 3/3 checks
71
+ [T5] .gitignore check [OK] 2/2 checks
72
+ [T6] Docker check [OK] 2/2 checks
73
+ [T7] Build PDF (Typst Engine) [OK] PDF Valid (458 KB)
74
+ [T8] No box-drawing characters [OK] Clean text
75
+ [T9] No manual numbering in headings [OK] Valid AST
76
+ [T10] Metadata fields check [OK] 2/2 fields
77
+ [T11] References check (BibTeX structure) [OK] Valid BibTeX
78
+ [T12] Makefile targets check [OK] Valid targets
79
+ [T13] Recursive image processing check [OK] Recursive find
80
+ [T14] PDF content readability check [OK] Readable text
81
+ [T15] Typst engine check [OK] Verified
82
+ [T16] DOCX export check (Styles, XML, Sect, Pages) [OK] 21/21 assertions
83
+ [T17] CLI Helper and Preset Guide check [OK] 4/4 checks
84
+ [T18] Preset Architecture & University Presets [OK] 10/10 checks
85
+ [T19] PDF Preset Scanner & Extractor check [OK] 5/5 checks
86
+ [T20] Preset Linter, Validator & Diff CLI check [OK] 4/4 checks
87
+
88
+ ========================================================================
89
+ Hasil Akhir: 78 assertions passed, 0 failed (100% Success Rate)
90
+ ========================================================================
91
+ ```
92
+
93
+ Seluruh 78 pengujian terotomatisasi berhasil dieksekusi tanpa galat, membuktikan bahwa pipeline memiliki stabilitas tinggi, kompatibilitas lintas platform yang solid, dan siap digunakan dalam produksi.
@@ -0,0 +1,27 @@
1
+ # PENUTUP
2
+
3
+ ## Kesimpulan
4
+
5
+ Berdasarkan perancangan, implementasi, dan serangkaian pengujian yang telah dilakukan pada proyek **Laporan Generator**, dapat ditarik beberapa kesimpulan utama:
6
+
7
+ 1. **Efektivitas Paradigma Pemisahan Konten dan Penyajian** --- Penerapan format teks ringan Markdown sebagai lapisan penulisan konten yang dipisahkan dari lapisan tata letak (*layout*) terbukti secara signifikan meningkatkan fokus penulis, mengeliminasi masalah pergeseran tata letak (*layout drift*), serta memudahkan kolaborasi tim melalui sistem kontrol versi Git.
8
+
9
+ 2. **Keunggulan Engine Typesetting Typst** --- Penggunaan Typst sebagai mesin kompilasi PDF utama berhasil memangkas ukuran dependensi sistem dari ~4.5 GB (distribusi TeX Live) menjadi hanya ~25 MB (binary mandiri Typst) dengan kecepatan kompilasi sub-detik, sembari tetap mempertahankan standar tipografi akademik profesional dan tata letak yang presisi.
10
+
11
+ 3. **Keberhasilan Solusi Multi-Pass DOCX** --- Pendekatan multi-pass yang menggabungkan filter Pandoc Lua (`docx.lua`), manipulasi struktur OpenXML (`finalize-docx.py`), dan sinkronisasi nomor halaman via LibreOffice headless (`docx-pagenum.py`) berhasil mewujudkan dokumen Microsoft Word resmi dengan pemisahan seksi yang tepat (sampul tanpa nomor, *front matter* bernomor Romawi *i, ii*, dan isi bab yang dimulai ulang dari angka Arab 1).
12
+
13
+ 4. **Fleksibilitas Sistem Preset Kampus dan Alat Bantu Otomasi** --- Kehadiran sistem preset deklaratif (`presets/*.yml`), didukung oleh pemindai pedoman PDF otomatis (`scan-preset.py`), linter validasi skema (`validate-preset.py`), serta antarmuka baris perintah terpadu (`./laporan`), memberikan kemudahan bagi sivitas akademika di berbagai universitas di Indonesia untuk menyesuaikan format laporan secara instan.
14
+
15
+ 5. **Keandalan dan Keterulangan Sistem (*Reproducibility*)** --- Dukungan konfigurasi Nix Flakes (`flake.nix`) dan kontainer Docker menjamin bahwa pipeline dapat dijalankan secara identik di seluruh sistem operasi pengembang (Linux, macOS, Windows) dengan tingkat kelulusan pengujian 100% pada 78 *test assertions*.
16
+
17
+ ## Saran
18
+
19
+ Beberapa peluang pengembangan lanjutan yang direkomendasikan untuk meningkatkan fungsionalitas dan adopsi proyek ini di masa depan antara lain:
20
+
21
+ 1. **Pengembangan Antarmuka Web (Web-Based Interactive Generator)** --- Membangun antarmuka berbasis web atau aplikasi WebAssembly (Wasm) agar pengguna tanpa akses terminal atau baris perintah dapat menyunting dan mengunduh laporan langsung melalui peramban.
22
+
23
+ 2. **Ekspansi Basis Data Preset Perguruan Tinggi** --- Menambahkan koleksi preset resmi untuk universitas-universitas besar lainnya di Indonesia, seperti Universitas Diponegoro (UNDIP), Universitas Airlangga (UNAIR), Universitas Brawijaya (UB), Universitas Telkom (Tel-U), dan BINUS University.
24
+
25
+ 3. **Penyediaan Wrapper Baris Perintah PowerShell (`laporan.ps1`)** --- Mengembangkan skrip pembungkus PowerShell native guna menyempurnakan pengalaman pengembang (*developer experience*) bagi pengguna sistem operasi Windows murni tanpa ketergantungan pada WSL atau Git Bash.
26
+
27
+ 4. **Integrasi Ekstensi Editor (VS Code / Antigravity IDE Plugin)** --- Menyediakan plugin editor yang menyertakan fitur cuplikan kode (*snippets*), validasi sitasi BibTeX otomatis, dan pratinjau dokumen (*live preview*) langsung di dalam lingkungan pengembangan terintegrasi.