> For the complete documentation index, see [llms.txt](https://overleaf-pro.ayaka.space/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://overleaf-pro.ayaka.space/latex/id/basis-pengetahuan/064-how-does-overleaf-compile-my-project.md).

# Bagaimana Overleaf mengompilasi proyek saya?

## Mengotomatiskan kompilasi LaTeX

Untuk mendukung fitur seperti daftar isi, daftar gambar, referensi silang, glosarium, indeks, dan sitasi bibliografis, LaTeX menggunakan proses penataan huruf multi-lintasan: data yang dihasilkan pada satu lintasan (kompilasi) ditulis ke berkas dan digunakan sebagai masukan untuk lintasan-lintasan berikutnya yang mungkin diperlukan. Video berikut menunjukkan apa yang terjadi setiap kali Anda mengeklik tombol “Recompile” di proyek Overleaf Anda:

{% embed url="<https://videos.ctfassets.net/nrgyaltdicpt/Uo3I2FXEI8H6aFPBZq171/e2139f9575a4db6955dc2278dc08283c/latexmk-ol.mp4>" %}

Saat melakukan kompilasi manual biasanya terlihat jika diperlukan satu kali lintasan LaTeX (pass) lagi, tetapi mengotomatiskan kompilasi LaTeX menghadirkan sejumlah kesulitan. Tantangan utama bagi solusi otomatis adalah menentukan *berapa banyak* lintasan (kompilasi) LaTeX yang diperlukan untuk menyelesaikan ketergantungan data apa pun, sehingga memastikan dokumen hasil penataan akhir mutakhir dan lengkap. Kompleksitas lain adalah mengidentifikasi dengan benar program eksternal yang harus dijalankan untuk melakukan prapemrosesan bagian konten dokumen—seperti menjalankan BibTeX/BibLaTeX untuk menghasilkan daftar referensi atau menjalankan aplikasi grafis yang lebih khusus seperti [MetaPost](https://tug.org/metapost.html) atau [Asymptote](https://asymptote.sourceforge.io/).

## Memperkenalkan latexmk

Salah satu paket yang sudah mapan untuk mengotomatiskan kompilasi adalah [`latexmk`](https://ctan.org/pkg/latexmk?lang=en), sebuah skrip Perl besar yang disertakan dalam TeX Live dan digunakan oleh Overleaf untuk mengompilasi proyek LaTeX Anda. `latexmk` secara otomatis memicu jumlah proses LaTeX yang diperlukan dan menjalankan program eksternal (pendukung) yang diperlukan untuk memproses bagian konten dokumen Anda.

### Menyesuaikan latexmk

Meskipun `latexmk` sangat serbaguna, lingkungan kompilasi LaTeX yang berbeda, dan rentang jenis dokumen yang sangat luas, membuatnya tidak praktis bagi `latexmk` untuk mencoba menyediakan solusi otomatis yang sepenuhnya mendukung kebutuhan setiap dokumen LaTeX yang dapat dibayangkan. Sebagai gantinya, perilaku `latexmk` dapat disesuaikan melalui berkas konfigurasi *yang diimplementasikan dalam **Perl***:

* berkas konfigurasi “tingkat sistem” yang melayani lingkungan/platform komputasi tertentu, dan
* berkas konfigurasi tingkat pengguna yang menangani kebutuhan khusus dokumen

Fitur [`manual latexmk`](http://mirrors.ctan.org/support/latexmk/latexmk.pdf) memberikan lebih banyak detail tentang pemasangan dan penggunaan berkas konfigurasi.

## Berkas LatexMk milik Overleaf

Berkas konfigurasi “tingkat sistem” Overleaf mengikuti `latexmk` konvensi (untuk Linux): namanya adalah `**LatexMk**` dan terletak di folder `/usr/local/share/latexmk/`. **Catatan**: berkas tersebut dibaca *sebelum* sebelum berkas konfigurasi tingkat pengguna mana pun.

Berkas konfigurasi tingkat pengguna harus dinamai `latexmkrc` dan ditambahkan ke proyek Overleaf Anda untuk menyediakan aturan khusus yang menangani persyaratan spesifik proyek/dokumen LaTeX Overleaf Anda.

Berkas `LatexMk` milik Overleaf berisi kode untuk pemrosesan khusus Overleaf serta aturan untuk glosarium, nomenklatur, dan paket umum lainnya. Berkas milik Overleaf `LatexMk` mungkin menunjukkan beberapa variasi antara rilis TeX Live untuk mengakomodasi perubahan dan pembaruan yang dibuat pada paket dan alat perangkat lunak di dalam TeX Live itu sendiri.

### Mengubah mode kompilasi LaTeX

Secara default, Overleaf menginstruksikan latexmk untuk menggunakan mode kompilasi yang kami (Overleaf) sebut sebagai **Coba kompilasi meskipun ada kesalahan**. Pada mode kompilasi tersebut, kompiler LaTeX tidak berhenti, meskipun menemui [kesalahan kompilasi LaTeX](/latex/id/dasar-dasar-latex/05-errors.md); sebuah PDF mungkin dihasilkan, bahkan jika isinya salah. Sering kali, kesalahan kompilasi bisa terlalu serius, atau terlalu banyak, untuk diperbaiki oleh kompiler LaTeX sehingga ia mungkin masih “menyerah” tanpa menghasilkan PDF.

Anda dapat mengubah mode kompilasi LaTeX sehingga kompilasi berhenti segera saat menemui kesalahan pertama: lihat artikel bantuan [Menggunakan mode kompilasi Stop on First Error](/latex/id/basis-pengetahuan/149-using-the-stop-on-first-error-compilation-mode.md) untuk informasi lebih lanjut.

### Cara mengakses salinan berkas LatexMk Overleaf

Tautan berikut membuka sebuah proyek untuk menata huruf berkas Overleaf `LatexMk` yang digunakan dengan kompiler LaTeX proyek Anda dan versi TeX Live Anda serta juga membuatnya tersedia untuk diunduh:

```latex
\documentclass[a4paper]{article}
\usepackage[margin=1cm]{geometry}
\usepackage{verbatim,shellesc}
\ShellEscape{cp /usr/local/share/latexmk/LatexMk ./LatexMk}
\begin{document}
\section*{Tentang proyek ini}
Proyek ini menyediakan akses ke berkas inisialisasi (konfigurasi) sistem \texttt{LatexMk} yang digunakan oleh Overleaf. \texttt{LatexMk} adalah skrip Perl yang mungkin sedikit berbeda menurut versi \TeX{} Live dan kompiler yang dipilih untuk proyek. Jika Anda perlu 100\% yakin \texttt{LatexMk} mana yang sedang digunakan, tambahkan kode dari proyek ini ke proyek Anda dan kompilasi untuk menata huruf daftar \texttt{LatexMk} dan membuatnya tersedia untuk diunduh sebagai salah satu berkas keluaran.
\section*{Daftar berkas \texttt{LatexMk}}
\verbatiminput{./LatexMk}
\end{document}
```

[Buka kode ini di Overleaf.](https://www.overleaf.com/docs?engine=\&snip_name=Display+Overleaf+latexmkrc+file\&snip=%5Cdocumentclass%5Ba4paper%5D%7Barticle%7D%0A%5Cusepackage%5Bmargin%3D1cm%5D%7Bgeometry%7D%0A%5Cusepackage%7Bverbatim%2Cshellesc%7D%0A%5CShellEscape%7Bcp+%2Fusr%2Flocal%2Fshare%2Flatexmk%2FLatexMk+.%2FLatexMk%7D%0A%5Cbegin%7Bdocument%7D%0A%5Csection%2A%7BAbout+this+project%7D%0AThis+project+provides+access+to+the+system+%5Ctexttt%7BLatexMk%7D+initialization+%28configuration%29+file+used+by+Overleaf.++%5Ctexttt%7BLatexMk%7D+is+a+Perl+script+which+may+vary+slightly+according+to+the+%5CTeX%7B%7D+Live+version+and+compiler+chosen+for+the+project.+If+you+need+to+be+100%5C%25+certain+which++%5Ctexttt%7BLatexMk%7D+is+being+used%2C+add+code+from+this+project+to+your+project+and+compile+to+typeset+a+listing+of+%5Ctexttt%7BLatexMk%7D+and+make+it+available+for+download+as+one+of+the+output+files.%0A%5Csection%2A%7BListing+the+%5Ctexttt%7BLatexMk%7D+file%7D%0A%5Cverbatiminput%7B.%2FLatexMk%7D%0A%5Cend%7Bdocument%7D)

Setelah mengompilasi proyek di atas, berkas `LatexMk` dapat diunduh melalui **Log dan file output** tombol seperti yang ditunjukkan dalam klip video singkat berikut:

{% embed url="<https://videos.ctfassets.net/nrgyaltdicpt/1re6AeMUF2EQnlZ8Cse5ke/ae6ee91fa7e2b2efa8ffb27ad8bab1a0/latexmkrc.mp4>" %}

### Catatan dan saran lainnya

Jika Anda ingin menetapkan, atau memeriksa, versi TeX Live yang digunakan untuk mengompilasi proyek Anda, silakan merujuk ke [posting blog Overleaf ini](https://www.overleaf.com/blog/new-feature-select-your-tex-live-compiler-version#How-Switch) atau grafik berikut:

![Memilih versi TeX Live di Overleaf](/files/61b795e456cd2f4546b8f9b9a483464649f8fca5)

Jika Anda ingin membangun proyek Overleaf Anda secara luring menggunakan latexmk, Anda mungkin ingin menggunakan salinan berkas LatexMk Overleaf untuk memastikan bahwa berkas tersebut menerapkan proses build Overleaf—perhatikan bahwa nama job Overleaf diatur ke output.

Overleaf mengompilasi proyek menggunakan flag baris perintah latexmk `-cd` , dan kompilasi selalu dijalankan dari direktori root proyek. Perhatikan bahwa beberapa `latexmk` opsi tidak kompatibel dengan Overleaf—khususnya, jika Anda menetapkan `$preview_continuous_mode` atau `$output_dir` opsi, hal itu dapat merusak pratinjau di Overleaf.

Untuk informasi lebih lanjut tentang `latexmkrc` berkas, bacalah artikel [Cara menggunakan latexmkrc dengan Overleaf](/latex/id/artikel-mendalam/28-how-to-use-latexmkrc-with-overleaf.md) yang memiliki kiat dan trik bermanfaat dari TeXpert Overleaf kami yang ramah.

## Daftar berkas LatexMk Overleaf (2023)

Untuk kemudahan, daftar berikut menampilkan `LatexMk` berkas Overleaf sebagaimana digunakan dengan TeX Live 2023—gunakan tautan di atas untuk mengakses versi terbaru.

```perl
# Pengaturan
$xdvipdfmx = "xdvipdfmx -z 6 -i dvipdfmx-unsafe.cfg -o %D %O %S";

# Solusi sementara untuk mengizinkan transparansi pstricks (https://github.com/overleaf/issues/issues/3449)
$dvipdf = "dvipdf -dNOSAFER -dALLOWPSTRANSPARENCY %O %S %D";

###############################
# Pemrosesan pasca berkas pdf #
###############################

$compiling_cmd = "internal overleaf_pre_process %T %D";
$success_cmd = "internal overleaf_post_process %T %D";
$failure_cmd = $success_cmd;

# setara dengan opsi -gt. Digunakan untuk mencegah latexmk melewati kompilasi ulang
# dari output.log dan output.pdf
$go_mode = 3;

# setara dengan opsi -bibtex. Jalankan bibtex tanpa syarat ketika berkas bbl
# kedaluwarsa.
$bibtex_use = 2;

my $ORIG_PDF_AGE;

sub overleaf_pre_process {
    my $source_file = $_[0];
    my $output_file = $_[1];

    # dapatkan umur pdf yang ada jika ada
    $ORIG_PDF_AGE = -M $output_file
}

sub overleaf_post_process {
    my $source_file = $_[0];
    my $output_file = $_[1];
    my $source_without_ext = $source_file =~ s/\.tex$//r;
    my $output_without_ext = $output_file =~ s/\.pdf$//r;

    # Cari berkas concordance knitr
    my $concordance_file = "${source_without_ext}-concordance.tex";
    if (-e $concordance_file) {
        Menambal berkas synctex untuk knitr...\n
        system("patchSynctex.R", $source_without_ext, $output_without_ext);
    }

    # Kembali lebih awal jika berkas pdf tidak ada atau tidak diperbarui
    my $NEW_PDF_AGE = -M $output_file;
    return if !defined($NEW_PDF_AGE);
    return if defined($ORIG_PDF_AGE) && $NEW_PDF_AGE == $ORIG_PDF_AGE;

    # Cari di mana qpdf berada
    $qpdf //= "/usr/bin/qpdf";
    $qpdf = $ENV{QPDF} if defined($ENV{QPDF}) && -x $ENV{QPDF};
    return if ! -x $qpdf;
    $qpdf_opts //= "--linearize --newline-before-endstream";
    $qpdf_opts = $ENV{QPDF_OPTS} if defined($ENV{QPDF_OPTS});

    # Jalankan qpdf
    my $optimised_file = "${output_file}.opt";
    system($qpdf, split(' ', $qpdf_opts), $output_file, $optimised_file);
    $qpdf_exit_code = ($? >> 8);
    kode keluar qpdf=$qpdf_exit_code\n

    # Ganti berkas output jika qpdf berhasil
    # qpdf mengembalikan 0 untuk sukses, 3 untuk peringatan (pdf keluaran masih dibuat)
    return if !($qpdf_exit_code == 0 || $qpdf_exit_code == 3);
    Mengganti nama berkas yang dioptimalkan menjadi $output_file\n
    rename($optimised_file, $output_file);

    Mengekstrak tabel xref untuk $output_file\n
    my $xref_file = "${output_file}xref";
    system("$qpdf --show-xref ${output_file} > ${xref_file}");
    $qpdf_xref_exit_code = ($? >> 8);
    kode keluar qpdf --show-xref=$qpdf_xref_exit_code\n
}

##############
# Glosarium #
##############
add_cus_dep( 'glo', 'gls', 0, 'glo2gls' );
add_cus_dep( 'acn', 'acr', 0, 'glo2gls');  # dari Overleaf v1
sub glo2gls {
    system("makeglossaries $_[0]");
}

#############
# makeindex #
#############
@ist = glob("*.ist");
if (scalar(@ist) > 0) {
    $makeindex = "makeindex -s $ist[0] %O -o %D %S";
}

################
# nomenklatur #
################
add_cus_dep("nlo", "nls", 0, "nlo2nls");
sub nlo2nls {
        system("makeindex $_[0].nlo -s nomencl.ist -o $_[0].nls -t $_[0].nlg");
}

#########
# Knitr #
#########
add_cus_dep( 'Rtex', 'tex', 0, 'do_knitr');
add_cus_dep( 'Rnw', 'tex', 0, 'do_knitr');
sub do_knitr {
    Run_subst(qq{Rscript -e '
        library("knitr");
        opts_knit\$set(concordance=T);
        knitr::knit(%S, output=%D);
        '}
    );
}

##########
# feynmf #
##########
push(@file_not_found, '^feynmf: Berkas .* dan (.*) tidak ditemukan:$');
add_cus_dep("mf", "tfm", 0, "mf_to_tfm");
sub mf_to_tfm { system("mf '\\mode:=laserjet; input $_[0]'"); }

push(@file_not_found, '^feynmf: Berkas label (.*) tidak ditemukan:$');
add_cus_dep("mf", "t1", 0, "mf_to_label1");
sub mf_to_label1 { system("mf '\\mode:=laserjet; input $_[0]' && touch $_[0].t1"); }
add_cus_dep("mf", "t2", 0, "mf_to_label2");
sub mf_to_label2 { system("mf '\\mode:=laserjet; input $_[0]' && touch $_[0].t2"); }
add_cus_dep("mf", "t3", 0, "mf_to_label3");
sub mf_to_label3 { system("mf '\\mode:=laserjet; input $_[0]' && touch $_[0].t3"); }
add_cus_dep("mf", "t4", 0, "mf_to_label4");
sub mf_to_label4 { system("mf '\\mode:=laserjet; input $_[0]' && touch $_[0].t4"); }
add_cus_dep("mf", "t5", 0, "mf_to_label5");
sub mf_to_label5 { system("mf '\\mode:=laserjet; input $_[0]' && touch $_[0].t5"); }
add_cus_dep("mf", "t6", 0, "mf_to_label6");
sub mf_to_label6 { system("mf '\\mode:=laserjet; input $_[0]' && touch $_[0].t6"); }
add_cus_dep("mf", "t7", 0, "mf_to_label7");
sub mf_to_label7 { system("mf '\\mode:=laserjet; input $_[0]' && touch $_[0].t7"); }
add_cus_dep("mf", "t8", 0, "mf_to_label8");
sub mf_to_label8 { system("mf '\\mode:=laserjet; input $_[0]' && touch $_[0].t8"); }
add_cus_dep("mf", "t9", 0, "mf_to_label9");
sub mf_to_label9 { system("mf '\\mode:=laserjet; input $_[0]' && touch $_[0].t9"); }

##########
# feynmp #
##########
push(@file_not_found, '^dvipdf: Tidak dapat menemukan berkas gambar (.*); melanjutkan.$');
add_cus_dep("mp", "1", 0, "mp_to_eps");
sub mp_to_eps {
    system("mpost $_[0]");
    return 0;
}

#############
# asymptote #
#############

sub asy {return system("asy \"$_[0]\"");}
add_cus_dep("asy","eps",0,"asy");
add_cus_dep("asy","pdf",0,"asy");
add_cus_dep("asy","tex",0,"asy");

#############
# metapost  #  # dari Overleaf v1
#############
add_cus_dep('mp', '1', 0, 'mpost');
sub mpost {
    my $file = $_[0];
    my ($name, $path) = fileparse($file);
    pushd($path);
    my $return = system "mpost $name";
    popd();
    return $return;
}

##########
# chktex #
##########
unlink 'output.chktex' if -f 'output.chktex';
if (defined $ENV{'CHKTEX_OPTIONS'}) {
    use File::Basename;
    use Cwd;

    # identifikasi berkas utama
    my $target = $ARGV[-1];
    my $file = basename($target);

    if ($file =~ /\.tex$/) {
        # ubah direktori dalam cakupan terbatas
        my $orig_dir = cwd();
        my $subdir = dirname($target);
        chdir($subdir);
        # jalankan chktex pada berkas utama
        $status = system("/usr/local/bin/run-chktex.sh", $orig_dir, $file);
        # kembali ke direktori asli
        chdir($orig_dir);

        # dalam mode VALIDATE kami selalu keluar setelah menjalankan chktex
        # jika tidak, kami keluar jika EXIT_ON_ERROR disetel

        if ($ENV{'CHKTEX_EXIT_ON_ERROR'} || $ENV{'CHKTEX_VALIDATE'}) {
            # chktex tidak memungkinkan kami mengakses info kesalahan melalui status keluar
            # jadi lihat outputnya
            open(my $fh, "<", "output.chktex");
            my $errors = 0;
            {
                local $/ = "\n";
                while(<$fh>) {
                    if (/^\S+:\d+:\d+: Error:/) {
                        $errors++;
                        print;
                    }
                }
            }
            close($fh);
            exit(1) if $errors > 0;
            exit(0) if $ENV{'CHKTEX_VALIDATE'};
        }
    }
}
```


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://overleaf-pro.ayaka.space/latex/id/basis-pengetahuan/064-how-does-overleaf-compile-my-project.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
