> 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/ru/podrobnye-stati/27-how-to-use-latexdiff-on-overleaf.md).

# Как использовать latexdiff в Overleaf

В этой статье демонстрируются два способа использования [latexdiff](https://ctan.org/pkg/latexdiff?lang=en) в Overleaf.

## Что такое latexdiff?

`latexdiff` — это скрипт на Perl, предназначенный для сравнения содержимого двух файлов LaTeX. Он генерирует код LaTeX, который наглядно показывает любые значимые различия между этими файлами.

Чтобы сравнить `new.tex` с `old.tex` и вывести результаты в файл с именем `diff.tex`, вы бы использовали `latexdiff` так:

```
latexdiff OPTIONS old.tex new.tex > diff.tex
```

`OPTIONS` — это параметры командной строки, которые можно использовать для настройки `latexdiff`поведения — см.  [`latexdiff` документацию](http://mirrors.ctan.org/support/latexdiff/doc/latexdiff-man.pdf) для списка доступных параметров.

## Как использовать latexdiff в Overleaf

Мы предлагаем два решения, оба опубликованы и обсуждены на tex.stackexchage.  [Первый способ](#david-carlisles-solution) был [предложен Дэвидом Карлайлом](https://tex.stackexchange.com/a/603311), а [второе решение](#tom-hejdas-solution) был [предложено Томом Хейдой](https://tex.stackexchange.com/a/603351), менеджером поддержки Overleaf.

### Решение Дэвида Карлайла

Исходные файлы для демонстрации этого решения перечислены ниже вместе со ссылками для их открытия как проекта Overleaf. См. [Как работает это первое решение](#how-this-first-solution-works) для краткого объяснения этого кода.

[Откройте решение Дэвида Карлайла в Overleaf.](https://www.overleaf.com/docs?engine=pdflatex\&snip_name\[]=main.tex\&snip\[]=%5Cdocumentclass%7Barticle%7D%0A%5Ctitle%7BDavid+Carlisle%27s+solution%7D%0A%5Cauthor%7Bme%7D%0A%5Cdate%7BMay+2024%7D%0A%5Cbegin%7Bdocument%7D%0A%5Cmaketitle%0A%5Csection%7BIntroduction%7D%0Azzz%0A%5Cend%7Bdocument%7D\&snip_name\[]=main2.tex\&snip\[]=%5Cdocumentclass%7Barticle%7D%0A%5Ctitle%7Blatexdiff%7D%0A%5Cauthor%7Bme%5Cand+you%7D%0A%5Cdate%7BMay+2023%7D%0A%0A%5Cbegin%7Bdocument%7D%0A%0A%5Cmaketitle%0A%0A%5Csection%7BIntroduction%7D%0Azzz+zzz%0A%0A%5Csection%7BSection%7D%0Azzz%0A%5Cend%7Bdocument%7D\&snip_name\[]=latexmkrc\&snip\[]=%24pdflatex+%3D+%22latexdiff+main.tex+main2.tex+%3E+main-d.tex%3B+pdflatex+%25O++main-d%22\&main_document=main.tex)

**main.tex**

```latex
\documentclass{article}
\title{Решение Дэвида Карлайла}
\author{me}
\date{May 2024}
\begin{document}
\maketitle
\section{Introduction}
zzz
\end{document}
```

**main2.tex**

```latex
\documentclass{article}
\title{latexdiff}
\author{me\and you}
\date{May 2023}

\begin{document}

\maketitle

\section{Introduction}
zzz zzz

\section{Section}
zzz
\end{document}
```

**latexmkrc**

```latex
$pdflatex = "latexdiff main.tex main2.tex > main-d.tex; pdflatex %O  main-d"
```

[Откройте решение Дэвида Карлайла в Overleaf.](https://www.overleaf.com/docs?engine=pdflatex\&snip_name\[]=main.tex\&snip\[]=%5Cdocumentclass%7Barticle%7D%0A%5Ctitle%7BDavid+Carlisle%27s+solution%7D%0A%5Cauthor%7Bme%7D%0A%5Cdate%7BMay+2024%7D%0A%5Cbegin%7Bdocument%7D%0A%5Cmaketitle%0A%5Csection%7BIntroduction%7D%0Azzz%0A%5Cend%7Bdocument%7D\&snip_name\[]=main2.tex\&snip\[]=%5Cdocumentclass%7Barticle%7D%0A%5Ctitle%7Blatexdiff%7D%0A%5Cauthor%7Bme%5Cand+you%7D%0A%5Cdate%7BMay+2023%7D%0A%0A%5Cbegin%7Bdocument%7D%0A%0A%5Cmaketitle%0A%0A%5Csection%7BIntroduction%7D%0Azzz+zzz%0A%0A%5Csection%7BSection%7D%0Azzz%0A%5Cend%7Bdocument%7D\&snip_name\[]=latexmkrc\&snip\[]=%24pdflatex+%3D+%22latexdiff+main.tex+main2.tex+%3E+main-d.tex%3B+pdflatex+%25O++main-d%22\&main_document=main.tex)

Этот пример выводит следующий результат:

![Иллюстрация, показывающая вывод, созданный latexdiff](/files/45c8cd04e799f0fe5709d136b0888e4903999ad5)

#### Как работает это первое решение

Это решение сравнивает файлы `main.tex` и `main2.tex` и записывает результаты в файл с именем `main-d.tex`. Обратите внимание, что поскольку `main-d.tex` файл — это *сгенерированный* файл, то есть созданный нашим кодом, он не будет виден (отображаться) в списке файлов проекта.

Он работает, используя файл с именем `latexmkrc` который содержит код Perl для настройки процесса компиляции Overleaf. Здесь команда компиляции с помощью pdfLaTeX переопределяется так, чтобы сначала запускать `latexdiff` затем запускать pdfLaTeX для компиляции `main-d.tex`, файл, сгенерированный `latexdiff`.

Как [отмечает автор решения](https://tex.stackexchange.com/a/603311), чтобы остановить выполнение `latexdiff` и верстать фактическое содержимое `main.tex` или `main2.tex`, просто добавьте `#`, маркер комментария Perl, к `latexmkrc` командной строке, чтобы это выглядело так:

```
# $pdflatex = "latexdiff main.tex main2.tex > main-d.tex; pdflatex %O  main-d"
```

Теперь вы можете компилировать `main.tex` или `main2.tex` чтобы верстать их фактическое содержимое, а не различия между ними.

Для получения дополнительной информации см. статью Overleaf [Как использовать `latexmkrc` с Overleaf](/latex/ru/podrobnye-stati/28-how-to-use-latexmkrc-with-overleaf.md).

### Решение Тома Хейды

Исходные файлы для демонстрации этого решения перечислены ниже вместе со ссылками для их открытия как проекта Overleaf. См. [Как работает это второе решение](#how-this-second-solution-works) для краткого объяснения этого кода.

[Откройте решение Тома Хейды в Overleaf.](https://www.overleaf.com/docs?engine=\&snip_name\[]=diff.tex\&snip\[]=%5CRequirePackage%7Bshellesc%7D%0A%5CShellEscape%7Blatexdiff+main.tex+main2.tex+%3E+main-d.tex%7D%0A%5Cinput%7Bmain-d%7D%0A%5Cdocumentclass%7Bdummy%7D%0A%5Ctitle%7BDemonstrating+latexdiff%7D\&snip_name\[]=main.tex\&snip\[]=%5Cdocumentclass%7Barticle%7D%0A%5Ctitle%7BTom+Hejda%27s+solution%7D%0A%5Cauthor%7Bme%7D%0A%5Cdate%7BMay+2024%7D%0A%5Cbegin%7Bdocument%7D%0A%5Cmaketitle%0A%5Csection%7BIntroduction%7D%0Azzz%0A%5Cend%7Bdocument%7D\&snip_name\[]=main2.tex\&snip\[]=%5Cdocumentclass%7Barticle%7D%0A%5Ctitle%7Blatexdiff%7D%0A%5Cauthor%7Bme%5Cand+you%7D%0A%5Cdate%7BMay+2023%7D%0A%0A%5Cbegin%7Bdocument%7D%0A%0A%5Cmaketitle%0A%0A%5Csection%7BIntroduction%7D%0Azzz+zzz%0A%0A%5Csection%7BSection%7D%0Azzz%0A%5Cend%7Bdocument%7D\&main_document=diff.tex)

**diff.tex**

```latex
\RequirePackage{shellesc}
\ShellEscape{latexdiff main.tex main2.tex > main-d.tex}
\input{main-d}
\documentclass{dummy}
\title{Demonstrating latexdiff}
```

**main.tex**

```latex
\documentclass{article}
\title{Tom Hejda's solution}
\author{me}
\date{May 2024}
\begin{document}
\maketitle
\section{Introduction}
zzz
\end{document}
```

**main2.tex**

```latex
\documentclass{article}
\title{latexdiff}
\author{me\and you}
\date{May 2023}

\begin{document}

\maketitle

\section{Introduction}
zzz zzz

\section{Section}
zzz
\end{document}
```

[Откройте решение Тома Хейды в Overleaf.](https://www.overleaf.com/docs?engine=\&snip_name\[]=diff.tex\&snip\[]=%5CRequirePackage%7Bshellesc%7D%0A%5CShellEscape%7Blatexdiff+main.tex+main2.tex+%3E+main-d.tex%7D%0A%5Cinput%7Bmain-d%7D%0A%5Cdocumentclass%7Bdummy%7D%0A%5Ctitle%7BDemonstrating+latexdiff%7D\&snip_name\[]=main.tex\&snip\[]=%5Cdocumentclass%7Barticle%7D%0A%5Ctitle%7BTom+Hejda%27s+solution%7D%0A%5Cauthor%7Bme%7D%0A%5Cdate%7BMay+2024%7D%0A%5Cbegin%7Bdocument%7D%0A%5Cmaketitle%0A%5Csection%7BIntroduction%7D%0Azzz%0A%5Cend%7Bdocument%7D\&snip_name\[]=main2.tex\&snip\[]=%5Cdocumentclass%7Barticle%7D%0A%5Ctitle%7Blatexdiff%7D%0A%5Cauthor%7Bme%5Cand+you%7D%0A%5Cdate%7BMay+2023%7D%0A%0A%5Cbegin%7Bdocument%7D%0A%0A%5Cmaketitle%0A%0A%5Csection%7BIntroduction%7D%0Azzz+zzz%0A%0A%5Csection%7BSection%7D%0Azzz%0A%5Cend%7Bdocument%7D\&main_document=diff.tex)

Этот пример выводит следующий результат:

![Иллюстрация, показывающая вывод, созданный latexdiff](/files/85e91809af981785059e591aafa77d17c1dd3c80)

#### Как работает это второе решение

Это решение сравнивает файлы `main.tex` и `main2.tex` и записывает результаты в файл с именем `main-d.tex`. Обратите внимание, что поскольку `main-d.tex` файл — это *сгенерированный* файл, то есть созданный нашим кодом, он не будет виден (отображаться) в списке файлов проекта.

Файл с именем `diff.tex` использует `\ShellEscape` команду, предоставляемую [`shellesc` пакет](https://ctan.org/pkg/shellesc?lang=en), чтобы выполнить `latexdiff`. Результаты сравнения, содержащиеся в `main-d.tex`, `\input` в `diff.tex` для верстки.

`diff.tex` содержит строку `\documentclass{dummy}` чтобы заставить компилятор Overleaf поверить `diff.tex` можно скомпилировать. Это работает, потому что процесс компиляции Overleaf проверяет текущий открытый файл на наличие `\documentclass`. Если он не находит его, Overleaf компилирует файл, указанный в меню как **Основной** файле.

Если вы выберете **Перекомпиляция** с `diff.tex` открыть в редакторе, будут выведены результаты сравнения. Вы можете выбрать и скомпилировать `main.tex` или `main2.tex` потому что оба содержат `\documentclass` команду.

Для получения дополнительной информации о `latexdiff` ознакомьтесь с [официальной документацией](http://mirrors.ctan.org/support/latexdiff/doc/latexdiff-man.pdf).


---

# 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/ru/podrobnye-stati/27-how-to-use-latexdiff-on-overleaf.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.
