DEV Community

Cover image for Kenapa kompilasi skripsi LaTeX butuh lebih dari 10 detik?

Kenapa kompilasi skripsi LaTeX butuh lebih dari 10 detik?

Paket gratis Overleaf sekarang menghentikan kompilasi apa pun setelah 10 detik, dan banyak skripsi yang dulu bisa dikompilasi dengan lancar kini berada di sisi yang salah dari batas itu. Saran yang biasa adalah berlangganan atau memperkecil dokumen, tetapi panjang teks jarang menjadi penyebab waktu terbuang. Mengukur satu proyek nyata, varian demi varian, menunjukkan ke mana waktunya pergi.

Proyeknya adalah contoh tesis S2: empat bab, natbib dengan file .bib, daftar isi, dua grafik pgfplots, dan satu diagram TikZ. Dikompilasi dengan Tectonic 0.16.9 di Mac M1, memakai perintah yang sama dengan yang dijalankan tab LaTeX di aplikasi desktop osFoundry:

let mut cmd = Command::new(executable);
cmd.args(["-X", "compile", "--untrusted", "--outdir"])
    .arg(&root)
    .current_dir(&root)
    .env("TECTONIC_UNTRUSTED_MODE", "1")
    .kill_on_drop(true);
Enter fullscreen mode Exit fullscreen mode

--untrusted mematikan shell escape, yang penting di bagian bawah.

Satu kompilasi adalah tiga kali jalan TeX

Hal pertama yang terlihat di log: "kompilasi" bukan satu kali proses.

note: Running TeX ...
note: Running BibTeX on main.aux ...
note: Rerunning TeX because bibtex was run ...
note: Rerunning TeX because "main.aux" changed ...
note: Running xdvipdfmx ...
Enter fullscreen mode Exit fullscreen mode

Putaran pertama menulis kunci sitasi dan judul bagian ke main.aux. BibTeX mengubah kunci itu menjadi daftar pustaka, putaran kedua menyusunnya dan itu menggeser nomor halaman, lalu putaran ketiga memperbaiki daftar isi dan referensi. latexmk dan Overleaf menjalankan siklus yang sama. Apa pun yang lambat di dokumen dibayar tiga kali.

Ke mana waktunya pergi

Setiap varian dibangun dua kali dengan cache paket yang sudah hangat, dan diukur dengan loop kecil:

for d in full samples-100 csv-table no-figures; do
  ( cd "$d"
    start=$(python3 -c 'import time; print(time.time())')
    TECTONIC_UNTRUSTED_MODE=1 tectonic -X compile --untrusted main.tex > run.log 2>&1
    python3 -c "import time; print('$d', round(time.time() - $start, 1), 's')"
    grep -c 'Running TeX\|Rerunning TeX' run.log )
done
Enter fullscreen mode Exit fullscreen mode
Varian Seluruh build Putaran TeX
Tesis lengkap, grafik dengan samples=500 dan samples=300 14.4–15.4 s 3
Grafik yang sama dengan samples=200 dan samples=100 9.2–9.4 s 3
Grafik yang sama dengan samples=100 dan samples=60 7.8 s 3
Kurva yang sama dibaca dari file CSV, semua titik dipertahankan 6.7–6.8 s 3
Tanpa gambar (setiap tikzpicture diganti kotak) 5.5–5.9 s 3
Versi Jepang dari tesis lengkap (xeCJK, font Hiragino) 22.8 s 3

Teks, daftar pustaka, dan daftar isi digabung memakan waktu kurang dari 6 detik. Gambar menghabiskan 9 detik sisanya, dan hampir semuanya adalah pgfplots yang menghitung kurva. Fungsi seperti {40 + 35*exp(-((mod(x,24)-8)^2)/3) + ...} dievaluasi titik demi titik dengan aritmetika fixed-point bawaan TeX, di setiap dari ketiga putaran. Menggambar 500 titik yang sama dari file hanya memakan sekitar satu detik secara total.

Mengurangi samples adalah cara yang paling jelas, dan memang berhasil, tetapi hasilnya terlihat. Pada 100 sampel, puncak jam sibuk di grafik mingguan berubah menjadi sudut. Pada 200 build turun tepat di bawah 10 detik dan kurvanya hampir sama, meski beberapa gelombang kecil hilang. Membaca titik dari CSV mempertahankan semuanya dan lebih cepat daripada keduanya:

Grafik permintaan mingguan dengan samples=500, dengan samples=100, dan digambar dari CSV 500 baris; waktu adalah untuk seluruh build tesis

% before: computed on every pass
\addplot[domain=0:168, samples=500, thick, blue]
  {41 + 33*exp(-((mod(x,24)-8)^2)/3.2) + ...};
% after: the same 500 points, written once by the script that made the data
\addplot[thick, blue] table[x=hour, y=model, col sep=comma]{week.csv};
Enter fullscreen mode Exit fullscreen mode

Untuk tesis, ini biasanya cara yang lebih jujur juga, karena nilai yang digambar memang berasal dari Python atau R sejak awal.

Versi Jepang adalah biaya terukur lainnya: dengan gambar yang identik, waktunya sekitar 50% lebih lama daripada versi Inggris, dan satu-satunya perbedaan adalah teks Jepang, xeCJK, dan font sistem yang dimuatnya. Di mesin yang masih dingin ada satu lagi: menjalankan Tectonic pertama kali dengan cache kosong mengunduh 427 file paket dan font, 46 MB, sebelum menyusun apa pun.

Perbaikan yang biasa butuh shell escape

Halaman bantuan Overleaf tentang timeout kompilasi menyarankan mengeksternalisasi gambar TikZ, sehingga setiap gambar dibangun sekali dan dipakai ulang sebagai PDF. Library external milik tikz melakukannya dengan membuat TeX menjalankan proses TeX kedua untuk setiap gambar, yaitu perintah shell. Di bawah --untrusted, itu ditolak:

warning: chapters/method.tex:20: runsystem(xelatex -halt-on-error -interaction=batchmode -jobname "main-figure0" ...)...disabled.
error: chapters/method.tex:20: Package tikz Error: Sorry, the system call 'xelatex ...' did NOT result in a usable output file 'main-figure0'
Enter fullscreen mode Exit fullscreen mode

Itu disengaja. Shell escape membuat file .tex bisa menjalankan perintah apa pun, yang tidak masalah untuk skripsi sendiri tetapi tidak untuk ZIP kiriman orang lain. Tanpa itu, efek yang sama bisa dicapai manual dalam dua langkah: taruh setiap gambar di dokumen standalone sendiri, kompilasi sekali, lalu masukkan PDF-nya ke tesis dengan \includegraphics.

Mencari error di proyek multi-file

Bagian lambat terakhir ada pada manusia. TeX melaporkan error di file \input mana pun yang sedang dibacanya, dan Tectonic mencetaknya sebagai error: chapters/results.tex:50: Undefined control sequence. Log build di aplikasi mengubahnya menjadi baris yang bisa diklik dengan satu regular expression, lalu beralih ke format TeX klasik, di mana error diawali ! dan nomor baris muncul beberapa baris kemudian sebagai l.50:

const tectonic = /^error:\s+(.+?):(\d+):\s*(.+)$/.exec(line)
if (tectonic) return [{ file: tectonic[1].replace(/^\.\//, ''), line: Number(tectonic[2]), message: tectonic[3] }]
if (!line.startsWith('! ')) return []
const next = lines.slice(index + 1, index + 5).find((part) => /^l\.\d+/.test(part.trim()))
Enter fullscreen mode Exit fullscreen mode

Log build dengan baris error yang sudah diurai di atas keluaran mentah Tectonic

Dikompilasi di komputer sendiri, tesis lengkap ini tidak pernah menyentuh batas 10 detik. Di paket gratis Overleaf, membuat grafik dari file data, bukan dari rumus, yang membuat tesis ini kembali di bawah batas. Aplikasi desktop yang menjalankan build ini gratis di halaman unduhan osFoundry.

Top comments (0)