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,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.
package/cover.md ADDED
@@ -0,0 +1,50 @@
1
+ # KATA PENGANTAR {-}
2
+
3
+ Puji syukur kehadirat Tuhan Yang Maha Esa atas segala rahmat dan karunia-Nya sehingga laporan yang berjudul **"Otomatisasi Pembuatan Dokumen Laporan Akademik menggunakan Pandoc, Typst, dan Markdown"** dapat diselesaikan dengan baik.
4
+
5
+ Laporan ini disusun sebagai dokumentasi pipeline otomatisasi dokumen akademik yang dibangun menggunakan kombinasi teknologi Markdown, Pandoc, Typst, ImageMagick, dan Bash. Pipeline ini memungkinkan penulisan konten laporan dalam format Markdown yang sederhana, yang kemudian dikonversi menjadi PDF dengan format profesional melalui Pandoc dan Typst.
6
+
7
+ Penulis menyadari bahwa laporan ini tidak dapat terselesaikan tanpa bantuan dari berbagai pihak. Oleh karena itu, penulis mengucapkan terima kasih kepada semua pihak yang telah memberikan dukungan dalam penyelesaian laporan ini.
8
+
9
+ Penulis menyadari bahwa laporan ini masih jauh dari sempurna. Oleh karena itu, kritik dan saran yang membangun sangat diharapkan untuk perbaikan di masa mendatang. Semoga laporan ini dapat memberikan manfaat bagi pembaca dalam memahami konsep otomatisasi dokumen akademik.
10
+
11
+ ```{=typst}
12
+ #v(0.8cm)
13
+ #align(right)[
14
+ Agustus 2026
15
+
16
+ #v(1cm)
17
+ Tim Penyusun
18
+ ]
19
+ #pagebreak()
20
+ #outline(
21
+ title: [#align(center)[#text(size: 14pt, weight: "bold")[DAFTAR ISI]]],
22
+ depth: 3,
23
+ )
24
+ #context {
25
+ let imgs = query(figure.where(kind: image))
26
+ if imgs.len() > 0 {
27
+ pagebreak()
28
+ outline(
29
+ title: align(center)[#text(size: 14pt, weight: "bold")[DAFTAR GAMBAR]],
30
+ target: figure.where(kind: image),
31
+ )
32
+ }
33
+ let tbls = query(figure.where(kind: table))
34
+ if tbls.len() > 0 {
35
+ pagebreak()
36
+ outline(
37
+ title: align(center)[#text(size: 14pt, weight: "bold")[DAFTAR TABEL]],
38
+ target: figure.where(kind: table),
39
+ )
40
+ }
41
+ }
42
+ #pagebreak()
43
+ #set page(numbering: "1")
44
+ #counter(page).update(1)
45
+ ```
46
+
47
+ ```{=openxml}
48
+ <w:p><w:pPr><w:jc w:val="right"/><w:spacing w:before="454"/></w:pPr><w:r><w:t>Agustus 2026</w:t></w:r></w:p>
49
+ <w:p><w:pPr><w:jc w:val="right"/><w:spacing w:before="567"/></w:pPr><w:r><w:t>Tim Penyusun</w:t></w:r></w:p>
50
+ ```
@@ -0,0 +1,120 @@
1
+ # Panduan Preset & Kustomisasi Format Kampus
2
+
3
+ Dokumen ini berisi panduan untuk menyesuaikan format laporan akademik sesuai dengan pedoman penulisan di berbagai perguruan tinggi di Indonesia menggunakan sistem **Preset Declarative** (`presets/*.yml`).
4
+
5
+ ---
6
+
7
+ ## 1. Menggunakan Preset Kampus
8
+
9
+ Setiap perguruan tinggi memiliki aturan tata letak, margin, jenis huruf, dan gaya sampul tersendiri. Anda dapat memilih preset yang diinginkan melalui berkas `metadata.yml`:
10
+
11
+ ```yaml
12
+ preset: "itb-ta" # Ganti dengan ID preset kampus Anda
13
+ ```
14
+
15
+ Atau gunakan bantuan CLI interaktif:
16
+ ```bash
17
+ ./laporan preset list # Lihat semua preset yang tersedia
18
+ ./laporan preset show ui-skripsi # Lihat rincian konfigurasi preset
19
+ ./laporan preset apply itb-ta # Terapkan langsung ke metadata.yml
20
+ ```
21
+
22
+ > **Kompatibilitas**: Field lama `margin_preset: "skripsi-4433"` atau `margin_preset: "standard"` tetap didukung penuh.
23
+
24
+ ---
25
+
26
+ ## 2. Daftar Preset Kampus Bawaan
27
+
28
+ | ID Preset | Institusi / Format | Margin (Atas - Bawah - Kiri - Kanan) | Catatan Khusus |
29
+ |---|---|---|---|
30
+ | `standard` | Standar Modern | 2.0 cm - 3.0 cm - 2.5 cm - 2.5 cm | Format default tugas akhir, magang, praktikum |
31
+ | `skripsi-4433` | Skripsi Tradisional | 4.0 cm - 3.0 cm - 4.0 cm - 3.0 cm | Hardcover jilid tebal margin kiri 4cm |
32
+ | `ui-skripsi` | Universitas Indonesia (UI) | 2.5 cm - 2.5 cm - 2.5 cm - 2.5 cm | Sesuai Pedoman Karya Ilmiah UI |
33
+ | `itb-ta` | Institut Teknologi Bandung (ITB) | 4.0 cm - 3.0 cm - 4.0 cm - 3.0 cm | Cover minimalis (tanpa dosen pembimbing di cover luar) |
34
+ | `ugm-skripsi` | Universitas Gadjah Mada (UGM) | 4.0 cm - 3.0 cm - 4.0 cm - 3.0 cm | Full academic cover |
35
+ | `its-skripsi` | Institut Teknologi Sepuluh Nopember (ITS) | 4.0 cm - 3.0 cm - 4.0 cm - 3.0 cm | Standard Tugas Akhir & Tesis ITS |
36
+
37
+ ---
38
+
39
+ ## 3. Contoh Konfigurasi Berbagai Kampus
40
+
41
+ ### A. Format Universitas Indonesia (UI)
42
+ ```yaml
43
+ title: "IMPLEMENTASI DEEP LEARNING UNTUK DETEKSI PENYAKIT PADA CITRA MEDIS"
44
+ subtitle: "LAPORAN TUGAS AKHIR"
45
+ course: "Proyek Perangkat Lunak Lanjut"
46
+ lecturer: "Prof. Dr. Ir. Dosen Pengampu, M.Sc."
47
+ author:
48
+ - name: "Nama Mahasiswa"
49
+ nim: "2106012345"
50
+ institution: "UNIVERSITAS INDONESIA"
51
+ faculty: "FAKULTAS ILMU KOMPUTER"
52
+ year: "2026"
53
+ preset: "ui-skripsi"
54
+ ```
55
+
56
+ ### B. Format Institut Teknologi Bandung (ITB)
57
+ ```yaml
58
+ title: "RANCANG BANGUN SISTEM KONTROL DAN MONITORING SMART GRID BERBASIS IOT"
59
+ subtitle: "LAPORAN TUGAS AKHIR"
60
+ course: "Sistem Tertanam"
61
+ author:
62
+ - name: "Nama Mahasiswa"
63
+ nim: "13521001"
64
+ institution: "INSTITUT TEKNOLOGI BANDUNG"
65
+ faculty: "SEKOLAH TEKNIK ELEKTRO DAN INFORMATIKA"
66
+ year: "2026"
67
+ preset: "itb-ta"
68
+ ```
69
+
70
+ ### C. Format Universitas Gadjah Mada (UGM)
71
+ ```yaml
72
+ title: "ANALISIS PERFORMA ARSITEKTUR MICROSERVICES PADA CLOUD COMPUTING"
73
+ subtitle: "LAPORAN PRAKTIKUM LAPANGAN"
74
+ course: "Rekayasa Perangkat Lunak"
75
+ lecturer: "Dr. Dosen Pengampu, S.Kom., M.Cs."
76
+ author:
77
+ - name: "Mahasiswa Satu"
78
+ nim: "21/475123/TK/52123"
79
+ - name: "Mahasiswa Dua"
80
+ nim: "21/475124/TK/52124"
81
+ institution: "UNIVERSITAS GADJAH MADA"
82
+ faculty: "FAKULTAS TEKNIK"
83
+ year: "2026"
84
+ preset: "ugm-skripsi"
85
+ ```
86
+
87
+ ---
88
+
89
+ ## 4. Mengganti Logo Kampus
90
+ Cukup salin gambar logo resmi kampus Anda ke direktori utama dengan nama **`logo.jpg`** (atau format PNG yang dikonversi ke JPEG):
91
+ ```bash
92
+ cp /path/ke/logo-kampus.png logo.jpg
93
+ ```
94
+ Pipeline akan secara otomatis menyesuaikan ukuran dan memposisikannya secara proporsional di tengah halaman sampul sesuai konfigurasi `cover_logo_width` pada preset.
95
+
96
+ ---
97
+
98
+ ## 5. Memindai Otomatis Pedoman Kampus Baru (PDF Scanner)
99
+
100
+ Jika kampus Anda belum tersedia di daftar preset bawaan, Anda dapat memindai berkas PDF Buku Pedoman Penulisan Skripsi / Tugas Akhir kampus Anda secara otomatis:
101
+
102
+ ```bash
103
+ ./laporan preset scan /path/ke/pedoman-penulisan-kampus.pdf
104
+ ```
105
+
106
+ Sistem pemindai cerdas akan:
107
+ 1. Mengekstraksi teks dokumen dan mencari pasal format fisik/tata cara pengetikan.
108
+ 2. Mendeteksi margin (kiri, atas, kanan, bawah), jenis dan ukuran font, spasi baris, format penomoran bab/sub-bab, dan nama institusi.
109
+ 3. Menampilkan ringkasan temuan aturan format di terminal.
110
+ 4. Menyimpan konfigurasi otomatis ke berkas `presets/<preset-id>.yml`.
111
+
112
+ Contoh pemindaian dengan opsi khusus:
113
+ ```bash
114
+ ./laporan preset scan pedoman-unpad.pdf --preset-id unpad-skripsi --name "Universitas Padjadjaran" --apply
115
+ ```
116
+
117
+ ---
118
+
119
+ ## 6. Membuat Preset Kustom Secara Manual
120
+ Selain pemindaian otomatis, Anda juga dapat menulis berkas preset YAML baru secara manual di direktori `presets/`. Baca panduan lengkapnya di [docs/preset-schema.md](preset-schema.md).
@@ -0,0 +1,76 @@
1
+ # Spesifikasi Skema Metadata (metadata.yml)
2
+
3
+ File `metadata.yml` digunakan oleh Pandoc, template Typst (`template.typ`), dan filter DOCX (`docx.lua`) untuk mengisikan informasi sampul (cover page), judul laporan, identitas penyusun, dosen pengampu/pembimbing, serta abstrak laporan.
4
+
5
+ ---
6
+
7
+ ## Struktur File & Contoh Lengkap
8
+
9
+ ```yaml
10
+ ---
11
+ title: "Otomatisasi Pembuatan Dokumen Laporan Akademik Menggunakan Pandoc, Typst, dan Markdown"
12
+ subtitle: "Laporan Projek Akhir Pipeline Dokumentasi"
13
+ author:
14
+ - name: "Ahmad Dahlan"
15
+ nim: "101234567"
16
+ - name: "Budi Santoso"
17
+ nim: "101234568"
18
+ lecturer: "Dr. Ir. Hendra Wijaya, M.T."
19
+ lecturer_label: "Dosen Pengampu:" # Opsional: "Dosen Pembimbing:", "Pembimbing 1:", dll.
20
+ course: "Pengolahan Citra Digital dan Pembelajaran Mesin"
21
+ institution: "Universitas Gadjah Mada"
22
+ faculty: "Departemen Teknik Elektro dan Teknologi Informasi"
23
+ year: "2025/2026"
24
+ date: "Juli 2026"
25
+ abstract: |
26
+ Laporan ini membahas pipeline otomatisasi dokumen akademik
27
+ menggunakan Markdown, Pandoc, Typst, dan Bash. Pipeline ini
28
+ memungkinkan penulisan konten laporan dalam format Markdown
29
+ yang kemudian dikonversi menjadi PDF berkualitas percetakan
30
+ melalui Pandoc dan Typst serta berkas Microsoft Word (.docx).
31
+ ...
32
+ ```
33
+
34
+ ---
35
+
36
+ ## Penjelasan Field Metadata
37
+
38
+ | Field | Tipe Data | Wajib? | Keterangan |
39
+ |---|---|---|---|
40
+ | `title` | String | **Ya** | Judul utama laporan (tampil tebal di halaman sampul). |
41
+ | `subtitle` | String | Opsional | Sub-judul atau keterangan tambahan laporan. |
42
+ | `author` | List of Objects | **Ya** | Daftar penulis. Setiap entri memiliki `name` dan `nim`. |
43
+ | `author[].name` | String | **Ya** | Nama lengkap mahasiswa / penyusun. |
44
+ | `author[].nim` | String | **Ya** | Nomor Induk Mahasiswa (NIM / NPM / NISN). |
45
+ | `lecturer` | String | **Ya** | Nama lengkap dan gelar Dosen / Guru Pengampu / Pembimbing. |
46
+ | `lecturer_label` | String | Opsional | Label peran dosen (default: `"Dosen Pengampu:"`, bisa `"Dosen Pembimbing:"`). |
47
+ | `course` | String | **Ya** | Nama Mata Kuliah atau Mata Pelajaran. |
48
+ | `institution` | String | **Ya** | Nama Universitas, Institut, Politeknik, atau Sekolah. |
49
+ | `faculty` | String | **Ya** | Nama Fakultas, Departemen, atau Program Studi. |
50
+ | `year` | String | **Ya** | Tahun Ajaran (contoh: `2025/2026`). |
51
+ | `date` | String | Opsional | Bulan dan Tahun pembuatan (contoh: `Juli 2026`). |
52
+ | `abstract` | Multiline String | Opsional | Ringkasan/Abstrak laporan dalam Bahasa Indonesia. |
53
+
54
+ ---
55
+
56
+ ## Dukungan Multi-Author (Individu / Kelompok)
57
+
58
+ Skema ini mendukung jumlah penulis dinamis (1 orang hingga banyak orang):
59
+
60
+ * **Single Author (Individu)**:
61
+ ```yaml
62
+ author:
63
+ - name: "Budi Santoso"
64
+ nim: "101234567"
65
+ ```
66
+
67
+ * **Multi Author (Kelompok)**:
68
+ ```yaml
69
+ author:
70
+ - name: "Mahasiswa A"
71
+ nim: "101234561"
72
+ - name: "Mahasiswa B"
73
+ nim: "101234562"
74
+ - name: "Mahasiswa C"
75
+ nim: "101234563"
76
+ ```
@@ -0,0 +1,79 @@
1
+ # Spesifikasi Skema Preset Format Kampus (Preset Schema)
2
+
3
+ File preset format kampus disimpan di dalam direktori `presets/<preset-id>.yml`. File ini mendefinisikan aturan tata letak visual (*page geometry*), tipografi, gaya penomoran heading, serta susunan sampul (*cover page*) untuk dokumen PDF (Typst) dan Word (DOCX).
4
+
5
+ ---
6
+
7
+ ## Contoh Lengkap Skema Preset
8
+
9
+ ```yaml
10
+ # presets/itb-ta.yml
11
+ preset_id: "itb-ta"
12
+ name: "Institut Teknologi Bandung (ITB)"
13
+ description: "Format Tugas Akhir / Tesis sesuai Pedoman Penulisan Karya Ilmiah ITB."
14
+
15
+ # 1. Geometri & Margin Halaman
16
+ margin_top: 4cm
17
+ margin_bottom: 3cm
18
+ margin_left: 4cm
19
+ margin_right: 3cm
20
+
21
+ # 2. Tipografi & Spasi
22
+ font_family: "Libertinus Serif" # Font utama (Times New Roman standard)
23
+ font_size: 12pt # Ukuran teks isi
24
+ line_spacing: 0.75em # Spasi antar baris (1.5 spasi)
25
+ first_line_indent: 1.25cm # Indentasi awal paragraf
26
+
27
+ # 3. Penomoran Heading
28
+ heading_chapter_prefix: "BAB " # Prefix bab ("BAB ")
29
+ heading_chapter_num_format: "roman" # Angka Romawi ("roman") atau Arab ("arabic")
30
+ heading_sub_dot: true # true: "1.1." | false: "1.1"
31
+ heading_subsub_dot: false # true: "1.1.1." | false: "1.1.1"
32
+
33
+ # 4. Pengaturan Halaman Sampul (Cover)
34
+ cover_show_lecturer: false # true: tampilkan dosen | false: sembunyikan
35
+ cover_hide_lecturer: true # Flag pembantu untuk parser
36
+ cover_logo_width: 4.5cm # Lebar logo di sampul depan
37
+ ```
38
+
39
+ ---
40
+
41
+ ## Daftar Field & Tipe Data
42
+
43
+ | Kategori | Field | Tipe Data | Nilai Bawaan (Default) | Keterangan |
44
+ |---|---|---|---|---|
45
+ | **Identitas** | `preset_id` | String | *Nama file tanpa .yml* | ID unik preset (contoh: `ui-skripsi`). |
46
+ | | `name` | String | - | Nama lengkap format / institusi. |
47
+ | | `description` | String | - | Penjelasan singkat karakteristik preset. |
48
+ | **Margin** | `margin_top` | String / Satuan | `2cm` | Jarak batas atas halaman. |
49
+ | | `margin_bottom` | String / Satuan | `3cm` | Jarak batas bawah halaman. |
50
+ | | `margin_left` | String / Satuan | `2.5cm` | Jarak batas kiri halaman (misal: `4cm` untuk jilid). |
51
+ | | `margin_right` | String / Satuan | `2.5cm` | Jarak batas kanan halaman. |
52
+ | **Tipografi** | `font_family` | String | `Libertinus Serif` | Keluarga font dokumen (TNR standard Typst). |
53
+ | | `font_size` | String / pt | `12pt` | Ukuran font teks isi. |
54
+ | | `line_spacing` | String / em | `0.75em` | Jarak leading baris (0.75em = setara 1.5 line). |
55
+ | | `first_line_indent` | String / cm | `1.25cm` | Lebar indentasi baris pertama paragraf. |
56
+ | **Heading** | `heading_chapter_prefix` | String | `BAB ` | Awalan judul bab level 1. |
57
+ | | `heading_sub_dot` | Boolean | `true` | Apakah nomor sub-bab diakhiri titik (`1.1.` vs `1.1`). |
58
+ | | `heading_subsub_dot` | Boolean | `false` | Apakah nomor sub-sub-bab diakhiri titik (`1.1.1`). |
59
+ | **Cover** | `cover_show_lecturer` | Boolean | `true` | Tampilkan blok Dosen Pengampu di cover depan. |
60
+ | | `cover_logo_width` | String / cm | `4cm` | Lebar visual gambar logo di halaman cover. |
61
+
62
+ ---
63
+
64
+ ## Cara Membuat Preset Kampus Baru
65
+
66
+ 1. Buat berkas baru di direktori `presets/`, misalnya `presets/its-skripsi.yml`.
67
+ 2. Isi nilai sesuai buku pedoman kampus Anda.
68
+ 3. Terapkan preset pada dokumen dengan menambahkan field `preset` di `metadata.yml`:
69
+ ```yaml
70
+ preset: "its-skripsi"
71
+ ```
72
+ Atau gunakan perintah CLI helper:
73
+ ```bash
74
+ ./laporan preset apply its-skripsi
75
+ ```
76
+ 4. Jalankan kompilasi:
77
+ ```bash
78
+ ./laporan build
79
+ ```
@@ -0,0 +1,122 @@
1
+ # Cheatsheet Sintaks Markdown Akademik
2
+
3
+ Panduan referensi cepat sintaks Markdown yang kompatibel dan teruji untuk pipeline **Laporan Generator** (Typst PDF dan Microsoft Word DOCX).
4
+
5
+ ---
6
+
7
+ ## 1. Sitasi & Bibliografi (BibTeX APA)
8
+
9
+ Daftar pustaka dikelola melalui `references.bib` dan format APA melalui `apa.csl`.
10
+
11
+ | Sintaks Markdown | Hasil Tipografi | Keterangan |
12
+ |---|---|---|
13
+ | `[@knuth1984texbook]` | (Knuth, 1984) | Sitasi tanda kurung standar |
14
+ | `@knuth1984texbook menyatakan bahwa...` | Knuth (1984) menyatakan bahwa... | Sitasi naratif dalam kalimat |
15
+ | `[-@knuth1984texbook]` | (1984) | Hanya tahun penerbitan |
16
+ | `[@apa2020manual, hal. 45]` | (American Psychological Association, 2020, hal. 45) | Sitasi dengan nomor halaman |
17
+ | `[@apa2020manual; @pandoc2024]` | (American Psychological Association, 2020; Pandoc, 2024) | Multi-sitasi sekaligus |
18
+
19
+ ---
20
+
21
+ ## 2. Struktur Heading & Penomoran Bab
22
+
23
+ Gunakan heading Markdown tanpa menyisipkan angka manual. Engine Typst dan Lua filter DOCX akan menomori sub-bab secara otomatis:
24
+
25
+ ```markdown
26
+ # PENDAHULUAN
27
+ Heading Level 1 akan menjadi "BAB I PENDAHULUAN" secara otomatis.
28
+
29
+ ## Latar Belakang
30
+ Heading Level 2 akan menjadi "1.1 Latar Belakang".
31
+
32
+ ### Identifikasi Masalah
33
+ Heading Level 3 akan menjadi "1.1.1 Identifikasi Masalah".
34
+
35
+ # KATA PENGANTAR {-}
36
+ Gunakan atribut `{-}` atau `{.unnumbered}` untuk bagian front-matter tanpa nomor bab.
37
+ ```
38
+
39
+ ---
40
+
41
+ ## 3. Gambar & Diagram
42
+
43
+ Letakkan berkas gambar di dalam folder `gambar/`:
44
+
45
+ ```markdown
46
+ ![Arsitektur Sistem Multi-Engine](gambar/arsitektur.png){#fig:arsitektur width=80%}
47
+ ```
48
+
49
+ * **Penomoran Otomatis**: Menjadi `Gambar 1.1: Arsitektur Sistem Multi-Engine` (indeks bab otomatis).
50
+ * **Format yang Didukung**: `.png`, `.jpg`, `.jpeg`, `.webp`.
51
+ * **Transparansi Alpha**: Script `build.sh` otomatis menormalkan saluran alpha PNG agar optimal di Typst.
52
+
53
+ ---
54
+
55
+ ## 4. Tabel Formal Akademik
56
+
57
+ Gunakan format Pipe Table standar Pandoc:
58
+
59
+ ```markdown
60
+ : Ringkasan Pengujian Kompatibilitas {#tbl:pengujian}
61
+
62
+ | Platform | Versi Minimum | Status Dukungan |
63
+ |:---|:---:|:---|
64
+ | Linux (Ubuntu/Debian) | 20.04 LTS | Didukung Penuh (Nix / Native) |
65
+ | macOS | Monterey 12+ | Didukung Penuh (Apple Silicon & Intel) |
66
+ | Windows | 10 / 11 | Didukung Penuh (PowerShell native) |
67
+ ```
68
+
69
+ * Judul tabel diletakkan di atas dengan awalan titik dua `:`.
70
+ * Menjadi `Tabel 1.1: Ringkasan Pengujian Kompatibilitas` secara otomatis.
71
+
72
+ ---
73
+
74
+ ## 5. Persamaan Matematika (LaTeX Math)
75
+
76
+ * **Persamaan Inline**:
77
+ ```markdown
78
+ Nilai fungsi aktivasi dihitung dengan formula $f(x) = \frac{1}{1 + e^{-x}}$.
79
+ ```
80
+ * **Persamaan Blok (Display Math)**:
81
+ ```markdown
82
+ $$
83
+ MSE = \frac{1}{n} \sum_{i=1}^{n} (y_i - \hat{y}_i)^2
84
+ $$
85
+ ```
86
+ Persamaan blok secara otomatis diberi nomor indeks bab, misalnya `(1.1)`.
87
+
88
+ ---
89
+
90
+ ## 6. Blok Kode & Listing
91
+
92
+ ```markdown
93
+ ```python
94
+ def hitung_akurasi(y_true, y_pred):
95
+ return sum(t == p for t, p in zip(y_true, y_pred)) / len(y_true)
96
+ ```
97
+ ```
98
+
99
+ Typst akan membungkus blok kode dalam background abu-abu terang dengan font `DejaVu Sans Mono`.
100
+
101
+ ---
102
+
103
+ ## 7. Catatan Kaki & Kutipan Langsung
104
+
105
+ * **Kutipan Blok (Blockquote)**:
106
+ ```markdown
107
+ > "Rekayasa perangkat lunak bukan sekadar menulis kode, melainkan membangun sistem yang dapat diandalkan dan dipelihara dalam jangka panjang."
108
+ ```
109
+ * **Catatan Kaki (*Footnotes*)**:
110
+ ```markdown
111
+ Laporan ini menggunakan Pandoc[^pandoc_note] sebagai compiler dokumen universal.
112
+
113
+ [^pandoc_note]: Pandoc dikembangkan oleh John MacFarlane dan mendukung lebih dari 40 format dokumen.
114
+ ```
115
+
116
+ ---
117
+
118
+ ## 8. Tips Kompatibilitas Lintas Engine
119
+
120
+ 1. **Hindari Karakter Box-Drawing**: Jangan menggunakan karakter seperti `├──`, `└──`, atau `│` di dalam teks biasa; gunakan list Markdown (`-` atau `*`) atau blok kode monospace.
121
+ 2. **Jangan Mengetik Angka Bab Manual**: Jangan menulis `## 1.1 Latar Belakang` karena akan menghasilkan penomoran ganda `1.1 1.1 Latar Belakang`.
122
+ 3. **Nama File Gambar Tanpa Spasi**: Gunakan tanda hubung (`diagram-alur.png`) alih-alih spasi (`diagram alur.png`).
@@ -0,0 +1,100 @@
1
+ # Panduan Arsitektur Template Typst (template.typ)
2
+
3
+ File `template.typ` merupakan jantung dari pemformatan visual PDF pada **Laporan Generator**. Template ini dirancang untuk memenuhi standar penyusunan laporan akademik resmi di Indonesia, dan dikompilasi dengan **Typst** sebagai engine typesetting.
4
+
5
+ > **Catatan**: Pipeline utama sepenuhnya menggunakan **Typst** (`template.typ`). Template LaTeX lama diarsipkan pada branch `legacy/latex-engine`.
6
+
7
+ ---
8
+
9
+ ## Desain Arsitektur & Pemilihan Font
10
+
11
+ ### 1. Pemilihan Font (Libertinus Serif)
12
+ * Standardisasi karya ilmiah di Indonesia mewajibkan penggunaan font tipe *Times New Roman* 12pt.
13
+ * Untuk menjamin portabilitas kompilasi cross-platform tanpa dependensi font eksternal, template menggunakan **Libertinus Serif** (`Libertinus Serif`) yang sudah dibundel langsung di dalam binary Typst.
14
+ * Blok kode menggunakan **DejaVu Sans Mono** (juga font bawaan Typst).
15
+
16
+ ### 2. Pengaturan Margin & Spacing
17
+ ```typst
18
+ #set page(
19
+ paper: "a4",
20
+ margin: (top: 2cm, bottom: 3cm, left: 2.5cm, right: 2.5cm),
21
+ )
22
+ #set text(font: "Libertinus Serif", size: 12pt)
23
+ #set par(justify: true, leading: 1.5em)
24
+ ```
25
+ * Margin Kiri & Kanan: 2.5 cm
26
+ * Margin Atas: 2.0 cm
27
+ * Margin Bawah: 3.0 cm
28
+ * Spasi Antar Baris: 1.5 spasi (*one half spacing*)
29
+ * Paragraf rata kanan-kiri (*justify*)
30
+
31
+ ---
32
+
33
+ ## Penomoran Bab dan Halaman
34
+
35
+ ### 1. Format Bab & Heading
36
+ ```typst
37
+ #set heading(numbering: (..ns) => {
38
+ if ns.len() == 1 {
39
+ "BAB " + numbering("I", ns.at(0)) + linebreak()
40
+ } else if ns.len() == 2 {
41
+ numbering("1.1", ..ns)
42
+ } else {
43
+ numbering("1.1.1", ..ns)
44
+ }
45
+ })
46
+ ```
47
+ * **Bab**: Diformat dengan Angka Romawi (`BAB I`, `BAB II`, `BAB III`, dst). Angka Romawi dan judul dipisahkan oleh *line break*.
48
+ * **Sub-bab**: Diformat dengan Angka Arab (`1.1`, `1.2`, `2.1`).
49
+ * **Sub-sub-bab**: Diformat dengan Angka Arab 3 tingkat (`1.1.1`, `1.1.2`).
50
+ * **Heading tanpa nomor** (Kata Pengantar, Daftar Isi, Daftar Pustaka): menggunakan `{-}` di Markdown yang diterjemahkan Pandoc menjadi `#heading(level: 1, numbering: none)`.
51
+
52
+ > **Catatan**: Jangan menulis pola `"BAB I"` langsung sebagai format string `numbering(...)`. Typst menginterpretasikan rangkaian huruf `BAB` sebagai pola huruf dan memotong angka Romawinya. Selalu concat literal secara manual: `"BAB " + numbering("I", n)`.
53
+
54
+ ### 2. Penomoran Halaman (frontmatter vs mainmatter)
55
+ * **Bagian Depan** (Kata Pengantar, Daftar Isi): Menggunakan penomoran Romawi kapital (`I`, `II`, `III`) di bagian tengah bawah. Diatur di `cover.md`:
56
+ ```typst
57
+ #set page(numbering: "I")
58
+ ```
59
+ * **Bagian Utama** (BAB I hingga BAB V): Menggunakan penomoran Angka Arab (`1`, `2`, `3`) berurutan, di-reset ulang:
60
+ ```typst
61
+ #set page(numbering: "1")
62
+ #counter(page).update(1)
63
+ ```
64
+
65
+ ---
66
+
67
+ ## Halaman Sampul (Cover)
68
+
69
+ Bagian sampul dirender dari metadata `metadata.yml` dengan variabel: `title`, `subtitle`, `course`, `lecturer`, `authors`, `institution`, `logo`, `year`.
70
+
71
+ ```typst
72
+ #block(
73
+ width: 100%,
74
+ align(center)[
75
+ #image(logo, width: 4cm)
76
+ ...
77
+ ]
78
+ )
79
+ ```
80
+
81
+ ---
82
+
83
+ ## Pemrosesan Elemen Konten
84
+
85
+ ### 1. Tabel
86
+ ```typst
87
+ #show table: set stroke(0.75pt)
88
+ #show table.header: set text(weight: "bold")
89
+ ```
90
+ * Header tabel dicetak tebal, garis tabel 0.75pt.
91
+
92
+ ### 2. Gambar
93
+ * Caption gambar dirender di bawah gambar (`#show figure: set figure.caption(position: bottom)`).
94
+ * Gambar diproses oleh ImageMagick di `build.sh` (alpha channel dihapus) sebelum dikompilasi.
95
+
96
+ ### 3. Blok Kode
97
+ ```typst
98
+ #show raw: set text(font: "DejaVu Sans Mono", size: 9pt)
99
+ ```
100
+ * Blok kode menggunakan font monospaced 9pt dengan latar abu-abu muda (`#show raw: set block(fill: luma(240))`).
@@ -0,0 +1,105 @@
1
+ # Panduan Penanganan Masalah (Troubleshooting)
2
+
3
+ Dokumen ini berisi daftar masalah umum, kode kesalahan, dan solusi langkah-demi-langkah saat menjalankan **Laporan Generator**.
4
+
5
+ ---
6
+
7
+ ## 1. ImageMagick Security Policy Error
8
+
9
+ ### Gejala Error:
10
+ ```text
11
+ convert-im6.q16: attempt to perform an operation not allowed by the security policy 'PDF'
12
+ ```
13
+
14
+ ### Penyebab:
15
+ Kebijakan keamanan default ImageMagick pada beberapa distribusi Linux (seperti Ubuntu/Debian) membatasi pemrosesan berkas PDF/PNG untuk mencegah kerentanan keamanan.
16
+
17
+ ### Solusi:
18
+ 1. Buka file kebijakan ImageMagick dengan hak akses sudo:
19
+ ```bash
20
+ sudo nano /etc/ImageMagick-6/policy.xml
21
+ # atau untuk ImageMagick 7:
22
+ sudo nano /etc/ImageMagick-7/policy.xml
23
+ ```
24
+ 2. Cari baris berikut:
25
+ ```xml
26
+ <policy domain="coder" rights="none" pattern="PDF" />
27
+ ```
28
+ 3. Ubah `rights="none"` menjadi `rights="read|write"`:
29
+ ```xml
30
+ <policy domain="coder" rights="read|write" pattern="PDF" />
31
+ ```
32
+ 4. Simpan file (`Ctrl+O`, `Enter`) lalu keluar (`Ctrl+X`).
33
+
34
+ ---
35
+
36
+ ## 2. Font Tidak Ditemukan (Missing Font)
37
+
38
+ ### Gejala Error:
39
+ ```text
40
+ warning: font 'Nimbus Serif' not found, falling back to default
41
+ warning: failed to resolve font 'Times New Roman'
42
+ ```
43
+
44
+ ### Penyebab:
45
+ Font yang disebutkan di dalam `template.typ` tidak tersedia. Typst hanya memakai font yang dibundel di binary-nya (termasuk Libertinus Serif dan DejaVu Sans Mono) plus font yang terinstall di sistem.
46
+
47
+ ### Solusi:
48
+ 1. Gunakan font bawaan Typst: `Libertinus Serif`, `DejaVu Sans Mono`, atau `New Computer Modern`.
49
+ 2. Jika ingin font sistem lain, pastikan font tersebut sudah terinstall di OS/container.
50
+ 3. Cek daftar font yang tersedia:
51
+ ```bash
52
+ typst fonts
53
+ ```
54
+
55
+ ---
56
+
57
+ ## 3. Syntax Error Raw Typst di cover.md
58
+
59
+ ### Gejala Error:
60
+ ```text
61
+ error: expected `)`, found `]`
62
+ ┌─ cover.md:5:1
63
+ ```
64
+
65
+ ### Penyebab:
66
+ Blok raw Typst di dalam `cover.md` (diapit ``` ```typst ```) memiliki kesalahan sintaks. Contoh yang sering terjadi: `block(align: center)` (tidak valid di Typst, gunakan `align(center)[block(...)]`) atau `ns.first()` (dihapus sejak Typst 0.13, gunakan `ns.at(0)`).
67
+
68
+ ### Solusi:
69
+ Periksa pesan error Typst yang menyebutkan posisi baris, lalu perbaiki blok raw di `cover.md` atau konstruksi template di `template.typ`.
70
+
71
+ ---
72
+
73
+ ## 4. Citasi "Undefined Reference"
74
+
75
+ ### Gejala Error:
76
+ ```text
77
+ [WARNING] Citeproc: citation 'he2016deep' not found
78
+ ```
79
+
80
+ ### Penyebab:
81
+ Di dalam Markdown, sintaks sitasi tidak dikenali atau citekey tidak ada di `references.bib`.
82
+
83
+ ### Solusi:
84
+ Gunakan sintaks sitasi Pandoc `[@citekey]` atau `@citekey` di file Markdown:
85
+ - **Salah**: `Menurut \cite{he2016deep}...`
86
+ - **Benar**: `Menurut [@he2016deep]...`
87
+
88
+ ---
89
+
90
+ ## 5. Permission Denied pada Laporan.pdf (Docker Volume)
91
+
92
+ ### Gejala Error:
93
+ ```text
94
+ cannot create Laporan.pdf: Permission denied
95
+ ```
96
+
97
+ ### Penyebab:
98
+ Container Docker dijalankan sebagai user `root` sehingga menghalangi user lokal untuk mengubah atau menghapus file output.
99
+
100
+ ### Solusi:
101
+ Gunakan perintah `docker compose` yang sudah dikonfigurasi dengan variabel `UID/GID` lokal:
102
+ ```bash
103
+ docker compose run --rm laporan-generator
104
+ ```
105
+ *(File `docker-compose.yml` pada project ini secara otomatis memetakan `user: "${UID:-1000}:${GID:-1000}"`)*.