> 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/el/basi-gnoseon/064-how-does-overleaf-compile-my-project.md).

# Πώς μεταγλωττίζει το Overleaf το έργο μου;

## Αυτοματοποίηση της μεταγλώττισης LaTeX

Για να υποστηρίξει λειτουργίες όπως πίνακα περιεχομένων, καταλόγους σχημάτων, διασταυρούμενες παραπομπές, γλωσσάρια, ευρετηρίαση και βιβλιογραφικές παραπομπές, το LaTeX χρησιμοποιεί μια διαδικασία στοιχειοθεσίας πολλαπλών περασμάτων: τα δεδομένα που παράγονται σε ένα πέρασμα (μεταγλώττιση) εγγράφονται σε αρχεία και χρησιμοποιούνται ως είσοδος για τυχόν επόμενα περάσματα που μπορεί να απαιτηθούν. Το ακόλουθο βίντεο δείχνει τι συμβαίνει κάθε φορά που κάνετε κλικ στο κουμπί «Επαναμεταγλώττιση» στο έργο σας στο Overleaf:

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

Όταν εκτελείται χειροκίνητη μεταγλώττιση, συνήθως είναι προφανές αν απαιτείται άλλο ένα πέρασμα του LaTeX, αλλά η αυτοματοποίηση της μεταγλώττισης LaTeX παρουσιάζει μια σειρά δυσκολιών. Μια βασική πρόκληση για τις αυτοματοποιημένες λύσεις είναι να προσδιορίσουν *πόσα* περάσματα LaTeX (μεταγλωττίσεις) χρειάζονται για να επιλυθούν τυχόν εξαρτήσεις δεδομένων, διασφαλίζοντας έτσι ότι το τελικό στοιχειοθετημένο έγγραφο είναι ενημερωμένο και πλήρες. Μια άλλη πολυπλοκότητα είναι η σωστή αναγνώριση των εξωτερικών προγραμμάτων που πρέπει να εκτελεστούν για να προεπεξεργαστούν τμήματα του περιεχομένου του εγγράφου—όπως η εκτέλεση του BibTeX/BibLaTeX για τη δημιουργία λιστών αναφορών ή η εκτέλεση πιο εξειδικευμένων εφαρμογών γραφικών όπως [MetaPost](https://tug.org/metapost.html) ή [Asymptote](https://asymptote.sourceforge.io/).

## Εισαγωγή στο latexmk

Ένα καθιερωμένο πακέτο για την αυτοματοποίηση της μεταγλώττισης είναι [`latexmk`](https://ctan.org/pkg/latexmk?lang=en), ένα μεγάλο Perl script που περιλαμβάνεται στο TeX Live και χρησιμοποιείται από το Overleaf για τη μεταγλώττιση των LaTeX έργων σας. `latexmk` ενεργοποιεί αυτόματα τον απαιτούμενο αριθμό διελεύσεων LaTeX και εκτελεί τα εξωτερικά (βοηθητικά) προγράμματα που απαιτούνται για την επεξεργασία τμημάτων του περιεχομένου του εγγράφου σας.

### Προσαρμογή του latexmk

Αν και `latexmk` είναι εξαιρετικά ευέλικτο, τα διαφορετικά περιβάλλοντα μεταγλώττισης LaTeX και η τεράστια ποικιλία τύπων εγγράφων καθιστούν μη πρακτικό για `latexmk` να επιχειρήσει να παρέχει αυτοματοποιημένες λύσεις που να υποστηρίζουν πλήρως τις ανάγκες κάθε πιθανού εγγράφου LaTeX. Αντίθετα, η συμπεριφορά του `latexmk` μπορεί να προσαρμοστεί μέσω αρχείων ρυθμίσεων *υλοποιημένων σε **Perl***:

* ένα αρχείο ρυθμίσεων «σε επίπεδο συστήματος» που καλύπτει το συγκεκριμένο υπολογιστικό περιβάλλον/πλατφόρμα, και
* ένα αρχείο ρυθμίσεων σε επίπεδο χρήστη που χειρίζεται απαιτήσεις ειδικές για το έγγραφο

Η [`εγχειρίδιο latexmk`](http://mirrors.ctan.org/support/latexmk/latexmk.pdf) παρέχει περισσότερες λεπτομέρειες σχετικά με την εγκατάσταση και τη χρήση των αρχείων ρυθμίσεων.

## Το αρχείο LatexMk του Overleaf

Το «σε επίπεδο συστήματος» αρχείο ρυθμίσεων του Overleaf ακολουθεί `latexmk` τις συμβάσεις (για Linux): ονομάζεται `**LatexMk**` και βρίσκεται στον φάκελο `/usr/local/share/latexmk/`. **Σημείωση**: το αρχείο αυτό διαβάζεται *πριν* πριν από οποιαδήποτε αρχεία ρυθμίσεων σε επίπεδο χρήστη.

Τα αρχεία ρυθμίσεων σε επίπεδο χρήστη πρέπει να ονομάζονται `latexmkrc` και να προστεθούν στο έργο σας στο Overleaf, ώστε να παρέχουν προσαρμοσμένους κανόνες που αντιμετωπίζουν τις συγκεκριμένες απαιτήσεις του έργου/εγγράφου LaTeX σας στο Overleaf.

Το `LatexMk` αρχείο περιέχει κώδικα για επεξεργασία ειδική για το Overleaf, καθώς και κανόνες για γλωσσάρια, ονοματολογία και άλλα συχνά χρησιμοποιούμενα πακέτα. Το `LatexMk` αρχείο μπορεί να παρουσιάζει ορισμένες διαφορές μεταξύ εκδόσεων του TeX Live, ώστε να προσαρμόζεται σε αλλαγές και ενημερώσεις που γίνονται στα πακέτα και στα εργαλεία λογισμικού μέσα στο ίδιο το TeX Live.

### Αλλαγή της λειτουργίας μεταγλώττισης του LaTeX

Από προεπιλογή, το Overleaf δίνει εντολή στο latexmk να χρησιμοποιεί μια λειτουργία μεταγλώττισης την οποία εμείς (στο Overleaf) αποκαλούμε **Προσπάθεια μεταγλώττισης παρά τα σφάλματα**. Σε αυτή τη λειτουργία μεταγλώττισης ο μεταγλωττιστής LaTeX δεν σταματά, παρότι συναντά [σφάλματα μεταγλώττισης LaTeX](/latex/el/ta-vasika-toy-latex/05-errors.md)σφάλματα· μπορεί να παραχθεί ένα PDF, ακόμη κι αν περιέχει λανθασμένη έξοδο. Συχνά, τα σφάλματα μεταγλώττισης μπορεί να είναι πολύ σοβαρά ή πολυάριθμα για να τα διορθώσει ο μεταγλωττιστής LaTeX, οπότε μπορεί παρ’ όλα αυτά να «αποσυρθεί» χωρίς να παράγει PDF.

Μπορείτε να αλλάξετε τη λειτουργία μεταγλώττισης του LaTeX έτσι ώστε η μεταγλώττιση να σταματά αμέσως μόλις συναντηθεί το πρώτο σφάλμα: δείτε το άρθρο βοήθειας [Χρήση της λειτουργίας μεταγλώττισης «Διακοπή στο πρώτο σφάλμα»](/latex/el/basi-gnoseon/149-using-the-stop-on-first-error-compilation-mode.md) για περισσότερες πληροφορίες.

### Πώς να αποκτήσετε ένα αντίγραφο του αρχείου LatexMk του Overleaf

Ο ακόλουθος σύνδεσμος ανοίγει ένα έργο για τη στοιχειοθεσία του Overleaf `LatexMk` αρχείου που χρησιμοποιείται με τον μεταγλωττιστή LaTeX και την έκδοση TeX Live του έργου σας και το καθιστά επίσης διαθέσιμο για λήψη:

```latex
\documentclass[a4paper]{article}
\usepackage[margin=1cm]{geometry}
\usepackage{verbatim,shellesc}
\ShellEscape{cp /usr/local/share/latexmk/LatexMk ./LatexMk}
\begin{document}
\section*{Σχετικά με αυτό το έργο}
Αυτό το έργο παρέχει πρόσβαση στο αρχείο αρχικοποίησης (ρύθμισης) συστήματος \texttt{LatexMk} που χρησιμοποιεί το Overleaf.  Το \texttt{LatexMk} είναι ένα Perl script που μπορεί να διαφέρει ελαφρώς ανάλογα με την έκδοση του \TeX{} Live και τον μεταγλωττιστή που επιλέγεται για το έργο. Αν θέλετε να είστε 100\% βέβαιοι για το ποιο \texttt{LatexMk} χρησιμοποιείται, προσθέστε κώδικα από αυτό το έργο στο έργο σας και μεταγλωττίστε ώστε να στοιχειοθετηθεί μια παράθεση του \texttt{LatexMk} και να καταστεί διαθέσιμη για λήψη ως ένα από τα αρχεία εξόδου.
\section*{Παράθεση του αρχείου \texttt{LatexMk}}
\verbatiminput{./LatexMk}
\end{document}
```

[Ανοίξτε αυτόν τον κώδικα στο 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)

Μετά τη μεταγλώττιση του παραπάνω έργου, το `LatexMk` αρχείο μπορεί να ληφθεί μέσω του **Αρχεία καταγραφής και αρχεία εξόδου** κουμπιού, όπως φαίνεται στο ακόλουθο σύντομο βίντεο:

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

### Άλλες σημειώσεις και συμβουλές

Αν θέλετε να ορίσετε ή να ελέγξετε την έκδοση TeX Live που χρησιμοποιείται για τη μεταγλώττιση του έργου σας, ανατρέξτε σε αυτήν την [ανάρτηση του ιστολογίου του Overleaf](https://www.overleaf.com/blog/new-feature-select-your-tex-live-compiler-version#How-Switch) ή στο ακόλουθο γραφικό:

![Επιλογή της έκδοσης TeX Live του Overleaf](/files/733e6af98f729935eeab6cd5452ff8aeca9f88f5)

Αν θέλετε να δημιουργήσετε το έργο σας στο Overleaf εκτός σύνδεσης χρησιμοποιώντας το latexmk, ίσως θέλετε να χρησιμοποιήσετε ένα αντίγραφο του αρχείου LatexMk του Overleaf για να διασφαλίσετε ότι εφαρμόζει τη διαδικασία δημιουργίας του Overleaf—σημειώστε ότι το όνομα εργασίας του Overleaf έχει οριστεί σε output.

Το Overleaf μεταγλωττίζει έργα χρησιμοποιώντας το `-cd` σημαία της γραμμής εντολών και η μεταγλώττιση εκτελείται πάντα από τον ριζικό κατάλογο του έργου. Σημειώστε ότι ορισμένες `latexmk` επιλογές δεν είναι συμβατές με το Overleaf—ιδίως αν ορίσετε τις `$preview_continuous_mode` ή `$output_dir` επιλογές, αυτό μπορεί να σπάσει την προεπισκόπηση στο Overleaf.

Για περισσότερες πληροφορίες σχετικά με `latexmkrc` αρχεία διαβάστε το άρθρο [Πώς να χρησιμοποιήσετε το latexmkrc με το Overleaf](/latex/el/se-vathos-arthra/28-how-to-use-latexmkrc-with-overleaf.md) το οποίο περιέχει χρήσιμες συμβουλές και κόλπα από τους φιλικούς TeXperts του Overleaf.

## Παράθεση του αρχείου LatexMk του Overleaf (2023)

Για ευκολία, η ακόλουθη παράθεση δείχνει το `LatexMk` αρχείο όπως χρησιμοποιείται με το TeX Live 2023—χρησιμοποιήστε τον παραπάνω σύνδεσμο για να αποκτήσετε την πιο πρόσφατη έκδοση.

```perl
# Ρυθμίσεις
$xdvipdfmx = "xdvipdfmx -z 6 -i dvipdfmx-unsafe.cfg -o %D %O %S";

# Παράκαμψη για να επιτρέπεται η διαφάνεια pstricks (https://github.com/overleaf/issues/issues/3449)
$dvipdf = "dvipdf -dNOSAFER -dALLOWPSTRANSPARENCY %O %S %D";

###############################
# Μετα-επεξεργασία του αρχείου pdf #
###############################

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

# ισοδύναμο με την επιλογή -gt. Χρησιμοποιείται για να αποτρέψει το latexmk από το να παραλείπει την επαναμεταγλώττιση
# του output.log και του output.pdf
$go_mode = 3;

# ισοδύναμο με την επιλογή -bibtex. Εκτελεί το bibtex ανεπιφύλακτα όταν τα αρχεία bbl είναι
# παρωχημένα.
$bibtex_use = 2;

my $ORIG_PDF_AGE;

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

    # λήψη της ηλικίας του υπάρχοντος pdf, αν υπάρχει
    $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;

    # Αναζήτηση για αρχείο concordance του knitr
    my $concordance_file = "${source_without_ext}-concordance.tex";
    if (-e $concordance_file) {
        Επιδιόρθωση του αρχείου synctex για knitr...\n
        system("patchSynctex.R", $source_without_ext, $output_without_ext);
    }

    # Επιστροφή νωρίς αν το αρχείο pdf δεν υπάρχει ή δεν ενημερώθηκε
    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;

    # Εντοπισμός του qpdf
    $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});

    # Εκτέλεση του qpdf
    my $optimised_file = "${output_file}.opt";
    system($qpdf, split(' ', $qpdf_opts), $output_file, $optimised_file);
    $qpdf_exit_code = ($? >> 8);
    print "κωδικός εξόδου qpdf=$qpdf_exit_code\n";

    # Αντικατάσταση του αρχείου εξόδου αν το qpdf ήταν επιτυχές
    # το qpdf επιστρέφει 0 για επιτυχία, 3 για προειδοποιήσεις (το pdf εξόδου εξακολουθεί να δημιουργείται)
    return if !($qpdf_exit_code == 0 || $qpdf_exit_code == 3);
    print "Μετονομασία του βελτιστοποιημένου αρχείου σε $output_file\n";
    rename($optimised_file, $output_file);

    print "Εξαγωγή του πίνακα xref για το $output_file\n";
    my $xref_file = "${output_file}xref";
    system("$qpdf --show-xref ${output_file} > ${xref_file}");
    $qpdf_xref_exit_code = ($? >> 8);
    print "κωδικός εξόδου qpdf --show-xref=$qpdf_xref_exit_code\n";
}

##############
# Γλωσσάρια #
##############
add_cus_dep( 'glo', 'gls', 0, 'glo2gls' );
add_cus_dep( 'acn', 'acr', 0, 'glo2gls');  # από το Overleaf v1
sub glo2gls {
    system("makeglossaries $_[0]");
}

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

################
# ονοματολογία #
################
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: Files .* and (.*) not found:$');
add_cus_dep("mf", "tfm", 0, "mf_to_tfm");
sub mf_to_tfm { system("mf '\\mode:=laserjet; input $_[0]'"); }

push(@file_not_found, '^feynmf: Label file (.*) not found:$');
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: Could not find figure file (.*); continuing.$');
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  #  # από το 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;

    # εντοπισμός του κύριου αρχείου
    my $target = $ARGV[-1];
    my $file = basename($target);

    if ($file =~ /\.tex$/) {
        # αλλαγή καταλόγου για περιορισμένο εύρος
        my $orig_dir = cwd();
        my $subdir = dirname($target);
        chdir($subdir);
        # εκτέλεση του chktex στο κύριο αρχείο
        $status = system("/usr/local/bin/run-chktex.sh", $orig_dir, $file);
        # επιστροφή στον αρχικό κατάλογο
        chdir($orig_dir);

        # στη λειτουργία VALIDATE πάντα τερματίζουμε μετά την εκτέλεση του chktex
        # διαφορετικά τερματίζουμε αν έχει οριστεί το EXIT_ON_ERROR

        if ($ENV{'CHKTEX_EXIT_ON_ERROR'} || $ENV{'CHKTEX_VALIDATE'}) {
            # το chktex δεν μας επιτρέπει να προσπελάσουμε τις πληροφορίες σφάλματος μέσω του κωδικού εξόδου
            # οπότε εξετάζουμε την έξοδο
            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/el/basi-gnoseon/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.
