> 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/ar/qaadh-almarfh/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 كبير مُضمَّن في 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.

ملف Overleaf `LatexMk` يحتوي الملف على تعليمات برمجية للمعالجة الخاصة بـ Overleaf بالإضافة إلى قواعد للمعاجم، والتسمية الاصطلاحية، وحِزم أخرى شائعة الاستخدام. وقد يُظهر ملف Overleaf `LatexMk` بعض الاختلاف بين إصدارات TeX Live لمواكبة التغييرات والتحديثات التي تُجرى على الحِزم وأدوات البرمجيات داخل TeX Live نفسه.

### تغيير نمط تجميع LaTeX

افتراضيًا، يوجّه Overleafُ latexmk لاستخدام نمط تجميع نشير إليه نحن (Overleaf) باسم **حاول التجميع رغم الأخطاء** . في نمط التجميع هذا لا يتوقف مُصرّف LaTeX، رغم مواجهته لـ [أخطاء تجميع LaTeX](/latex/ar/asasyat-latex/05-errors.md)؛ فقد يُنتَج ملف PDF حتى لو كان يحتوي على مخرجات غير صحيحة. وغالبًا ما تكون أخطاء التجميع خطيرة جدًا، أو كثيرة جدًا، بحيث لا يستطيع مُصرّف LaTeX إصلاحها، لذلك قد «ينسحب» أيضًا دون إنتاج ملف PDF.

يمكنك تغيير نمط تجميع LaTeX بحيث يتوقف التجميع فور مواجهة أول خطأ: راجع مقال المساعدة [استخدام نمط التجميع الإيقاف عند أول خطأ](/latex/ar/qaadh-almarfh/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 نصي قد يختلف قليلًا بحسب إصدار \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) أو إلى الرسم التوضيحي التالي:

![اختيار إصدار Overleaf TeX Live](/files/f42418e91ce2d7e1ad5187891e41949e678ac2ff)

إذا كنت تريد بناء مشروع Overleaf الخاص بك دون اتصال باستخدام latexmk، فقد ترغب في استخدام نسخة من ملف LatexMk الخاص بـ Overleaf لضمان تطبيقه لعملية البناء الخاصة بـ Overleaf — لاحظ أن اسم مهمة Overleaf مضبوط على output.

يقوم Overleaf بتجميع المشاريع باستخدام `-cd` العلم الخاص بسطر الأوامر في latexmk، ويُشغَّل التجميع دائمًا من الدليل الجذر للمشروع. لاحظ أن بعض `latexmk` الخيارات غير متوافقة مع Overleaf — وعلى وجه الخصوص، إذا ضبطت الخيارين `$preview_continuous_mode` أو `$output_dir` فقد يؤدي ذلك إلى تعطيل المعاينة في Overleaf.

لمزيد من المعلومات حول `latexmkrc` الملفات المقروءة، اقرأ المقال [كيفية استخدام latexmkrc مع Overleaf](/latex/ar/mqalat-mtamqh/28-how-to-use-latexmkrc-with-overleaf.md) والذي يتضمن نصائح وحيلًا مفيدة من خبراء TeX الودودين لدينا في Overleaf.

## سرد ملف LatexMk الخاص بـ Overleaf (2023)

للتسهيل، يعرض السرد التالي ملف Overleaf `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) {
        print "جارٍ ترقيع ملف 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/ar/qaadh-almarfh/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.
