> For the complete documentation index, see [llms.txt](https://ayakaleaf-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://ayakaleaf-pro.ayaka.space/latex/ru/drugie-temy/02-algorithms.md).

# Алгоритмы

## Введение

*(Чтобы писать листинги программного кода, пожалуйста, вместо этого обратитесь к* [*эту страницу справки*](/latex/ru/formatirovanie/11-code-listing.md) *.)*

Чтобы оформить алгоритмы или псевдокод в LaTeX, можно использовать один из следующих вариантов:

* Выберите ОДИН из (`algpseudocode` ИЛИ `algcompatible` ИЛИ `algorithmic`) пакетов для оформления тела алгоритма, а пакет `algorithm` для оформления подписи к алгоритму.
* Это `algorithm2e` пакет.

**Обратите внимание, что следует выбрать только одну из указанных выше групп пакетов и использовать только команды и синтаксис, предоставляемые выбранным вами пакетом.** Эти пакеты нельзя загружать одновременно; иначе вы получите множество ошибок.

## Пакеты algpseudocode и algorithm

Это `algpseudocode` пакет предоставляет `algorithmic` окружение и некоторые полезные команды. Вы можете [открыть полный пример в Overleaf](https://www.overleaf.com/project/new/template/20763?id=71202437\&templateName=algpseudocode+%2B+algorithm+example\&latexEngine=pdflatex\&texImage=texlive-full%3A2020.1\&mainFile=) , и в этом разделе мы рассмотрим некоторые детали.

Вот наш первый алгоритм, использующий окружения и команды из `algpseudocode` пакета:

```latex
\documentclass{article}
\usepackage{algpseudocode}
\begin{document}
\begin{algorithmic}
\State $i \gets 10$
\If{$i\geq 5$}
    \State $i \gets i-1$
\Else
    \If{$i\leq 3$}
        \State $i \gets i+2$
    \EndIf
\EndIf
\end{algorithmic}

\end{document}
```

[Откройте этот короткий пример algpseudocode в Overleaf](https://www.overleaf.com/docs?engine=\&snip_name=algpseudocode+short+example\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cusepackage%7Balgpseudocode%7D%0A%5Cbegin%7Bdocument%7D%0A%5Cbegin%7Balgorithmic%7D%0A%5CState+%24i+%5Cgets+10%24%0A%5CIf%7B%24i%5Cgeq+5%24%7D+%0A++++%5CState+%24i+%5Cgets+i-1%24%0A%5CElse%0A++++%5CIf%7B%24i%5Cleq+3%24%7D%0A++++++++%5CState+%24i+%5Cgets+i%2B2%24%0A++++%5CEndIf%0A%5CEndIf+%0A%5Cend%7Balgorithmic%7D%0A%0A%5Cend%7Bdocument%7D)

Вот результат вывода:

![Algpseudocode-0.png](/files/e76763ab3382088559997594f481255adfac9160)

*Не следует загружать `algorithm2e`, `algcompatible`, `algorithmic` пакеты, если вы уже загрузили `algpseudocode`.*

Обратите внимание, что имена команд, предоставляемые `algpseudocode` обычно пишутся в формате Title Case, например `\State`, `\While`, `\EndWhile`.

Если вы хотите добавить номера строк к алгоритму, вы можете добавить номер первой строки в `algorithmic` окружение вот так: `\begin{algorithmic}[1]` и получить такой вывод:

![Algpseudocode-00.png](/files/c95913ba1ef336aaad789ef59e0ebe48c9857bd2)

Приведённый выше пример алгоритма не имеет подписи и не пронумерован. Если вам нужен алгоритм с подписью, вам также потребуется загрузить `algorithm` пакет и добавить

```latex
\begin{algorithm}
\caption{...}
...
\end{algorithm}
```

вокруг вашего `algorithmic` окружения. Вы можете использовать `\label{...}` после `\caption{...}`, чтобы номер алгоритма можно было ссылочно указать с помощью `\ref{...}`.

```latex
\documentclass{article}
\usepackage{algorithm}
\usepackage{algpseudocode}
\begin{document}
\begin{algorithm}
\caption{Алгоритм с подписью}\label{alg:cap}
\begin{algorithmic}
\Require $n \geq 0$
\Ensure $y = x^n$
\State $y \gets 1$
\State $X \gets x$
\State $N \gets n$
\While{$N \neq 0$}
\If{$N$ is even}
    \State $X \gets X \times X$
    \State $N \gets \frac{N}{2}$  \Comment{Это комментарий}
\ElsIf{$N$ is odd}
    \State $y \gets y \times X$
    \State $N \gets N - 1$
\EndIf
\EndWhile
\end{algorithmic}
\end{algorithm}

\end{document}
```

[Откройте этот короткий пример algorithm+algpseudocode в Overleaf](https://www.overleaf.com/docs?engine=\&snip_name=Captioned+algorithm%2Balgpseudocode+example\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cusepackage%7Balgorithm%7D%0A%5Cusepackage%7Balgpseudocode%7D%0A%5Cbegin%7Bdocument%7D%0A%5Cbegin%7Balgorithm%7D%0A%5Ccaption%7BAn+algorithm+with+caption%7D%5Clabel%7Balg%3Acap%7D%0A%5Cbegin%7Balgorithmic%7D%0A%5CRequire+%24n+%5Cgeq+0%24%0A%5CEnsure+%24y+%3D+x%5En%24%0A%5CState+%24y+%5Cgets+1%24%0A%5CState+%24X+%5Cgets+x%24%0A%5CState+%24N+%5Cgets+n%24%0A%5CWhile%7B%24N+%5Cneq+0%24%7D%0A%5CIf%7B%24N%24+is+even%7D%0A++++%5CState+%24X+%5Cgets+X+%5Ctimes+X%24%0A++++%5CState+%24N+%5Cgets+%5Cfrac%7BN%7D%7B2%7D%24++%5CComment%7BThis+is+a+comment%7D%0A%5CElsIf%7B%24N%24+is+odd%7D%0A++++%5CState+%24y+%5Cgets+y+%5Ctimes+X%24%0A++++%5CState+%24N+%5Cgets+N+-+1%24%0A%5CEndIf%0A%5CEndWhile%0A%5Cend%7Balgorithmic%7D%0A%5Cend%7Balgorithm%7D%0A%0A%5Cend%7Bdocument%7D)

![Algpseudocode-1.png](/files/d4ca112a45322489ea426774a52cbf118e11fed8)

Это `algorithm` окружение — это [float](/latex/ru/risunki-i-tablicy/02-positioning-images-and-tables.md) как `table` и `figure`, так что вы можете добавлять модификаторы размещения плавающих объектов `[hbt!]` после `\begin{algorithm}` если необходимо. Это также означает, что хотя длинное `algorithmic` окружение само по себе может разбиваться на несколько страниц, `algorithm` окружение — нет.

Это `algorithm` пакет также предоставляет `\listofalgorithms` команду, которая работает как `\listoffigures`, но для алгоритмов с подписью, вот так.

![Algpseudocode-2.png](/files/0bbac094748177e411f4a97dbf8a43bef0c9d66b)

[Откройте полный пример в Overleaf](https://www.overleaf.com/project/new/template/20763?id=71202437\&templateName=algpseudocode+%2B+algorithm+example\&latexEngine=pdflatex\&texImage=texlive-full%3A2020.1\&mainFile=)

## Пакеты algcompatible/algorithmic и algorithm

Это `algorithmic` пакет использует синтаксис, похожий на `algpseudocode`; **но** его имена команд пишутся в верхнем регистре, например `\STATE`, `\WHILE`, `\ENDWHILE`.

С другой стороны, `algcompatible` будет распознавать имена команд в верхнем регистре и в формате Title Case, так что `\STATE`, `\WHILE`, `\ENDWHILE`, `\State`, `\While`, `\EndWhile` все распознаются. Помимо имен команд, `algcompatible` и `algorithmic` команды используют тот же синтаксис аргументов, что и `algpseudocode`.

```latex
\documentclass{article}
\usepackage{algcompatible}
% ИЛИ \usepackage{algorithmic}
\begin{document}
\begin{algorithmic}
\STATE $i\gets 10$
\IF {$i\geq 5$}
  \STATE $i\gets i-1$
\ELSE
  \IF {$i\leq 3$}
    \STATE $i\gets i+2$
  \ENDIF
\ENDIF
\end{algorithmic}

\end{document}
```

[Откройте этот короткий пример algcompatible в Overleaf](https://www.overleaf.com/docs?engine=\&snip_name=algcompatible\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cusepackage%7Balgcompatible%7D%0A%25+OR+%5Cusepackage%7Balgorithmic%7D%0A%5Cbegin%7Bdocument%7D%0A%5Cbegin%7Balgorithmic%7D%0A%5CSTATE+%24i%5Cgets+10%24%0A%5CIF+%7B%24i%5Cgeq+5%24%7D+%0A++%5CSTATE+%24i%5Cgets+i-1%24%0A%5CELSE%0A++%5CIF+%7B%24i%5Cleq+3%24%7D%0A++++%5CSTATE+%24i%5Cgets+i%2B2%24%0A++%5CENDIF%0A%5CENDIF+%0A%5Cend%7Balgorithmic%7D%0A%0A%5Cend%7Bdocument%7D)

В некоторых старых шаблонах или классах документов может быть загружен `algorithmic`, поэтому вам придётся следовать указанному синтаксису и именам команд. *Не следует загружать `algorithm2e`, `algpseudocode` пакеты, если `algorithmic` или `algcompatible` пакет уже загружен.*

Это `algorithm` пакет можно использовать с `algorithmic`/`algcompatible` для добавления пронумерованных подписей к алгоритмам.

[Откройте полный пример в Overleaf](https://www.overleaf.com/project/new/template/20768?id=71235978\&templateName=algpseudocode+%2B+algorithm+example\&latexEngine=pdflatex\&texImage=texlive-full%3A2020.1\&mainFile=)

## Пакет algorithm2e

Это `algorithm2e` пакет имеет совершенно иную синтаксическую структуру, чем `algpseudocode`, `algcompatible` и `algorithmic` пакеты, поэтому вам нужно быть внимательными к тому, какой пакет вы хотите использовать или какой пакет уже загружен в вашем шаблоне.

Это `algorithm2e` пакет предоставляет `algorithm` среду:

```latex
\documentclass{article}
\usepackage{algorithm2e}
\begin{document}
\begin{algorithm}
$i\gets 10$\;
\eIf{$i\geq 5$}
{
    $i\gets i-1$\;
}{
    \If{$i\leq 3$}
    {
        $i\gets i+2$\;
    }
}
\end{algorithm}

\end{document}
```

[Откройте этот короткий пример algorithm2e в Overleaf](https://www.overleaf.com/docs?engine=\&snip_name=algorithm2e+example\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cusepackage%7Balgorithm2e%7D%0A%5Cbegin%7Bdocument%7D%0A%5Cbegin%7Balgorithm%7D%0A%24i%5Cgets+10%24%5C%3B%0A%5CeIf%7B%24i%5Cgeq+5%24%7D%0A%7B%0A++++%24i%5Cgets+i-1%24%5C%3B%0A%7D%7B%0A++++%5CIf%7B%24i%5Cleq+3%24%7D%0A++++%7B%0A++++++++%24i%5Cgets+i%2B2%24%5C%3B%0A++++%7D%0A%7D%0A%5Cend%7Balgorithm%7D%0A%0A%5Cend%7Bdocument%7D)

![Algorithm2e-0.png](/files/0f905b0f286e1a797f6de226a5b75079c7d4eece)

Каждая строка в вашем исходном коде *должны* должна заканчиваться на `\;` иначе ваш алгоритм продолжится на той же строке текста в выводе. Только строки с макросом, начинающим блок, не должны заканчиваться на `\;`.

При использовании `algorithm2e` вы можете использовать `\caption{...}\ref{...}` внутри этого `algorithm` окружения напрямую, без необходимости загружать какие-либо другие пакеты. Однако если вы хотите добавить комментарии в свой алгоритм, сначала нужно объявить имя команды, которую будете использовать:

```latex
%% Это объявляет команду \Comment
%% Аргумент будет заключён в /* ... */
\SetKwComment{Comment}{/* }{ */}

\begin{algorithm}
\caption{Алгоритм с подписью}\label{alg:two}
\KwData{$n \geq 0$}
\KwResult{$y = x^n$}
$y \gets 1$\;
$X \gets x$\;
$N \gets n$\;
\While{$N \neq 0$}{
  \eIf{$N$ is even}{
    $X \gets X \times X$\;
    $N \gets \frac{N}{2}$ \Comment*[r]{Это комментарий}
  }{\If{$N$ is odd}{
      $y \gets y \times X$\;
      $N \gets N - 1$\;
    }
  }
}
\end{algorithm}
```

[Откройте этот пример algorithm2e с подписью в Overleaf](https://www.overleaf.com/docs?engine=\&snip_name=Captioned+algorithm2e+example\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cusepackage%7Balgorithm2e%7D%0A%5Cbegin%7Bdocument%7D%0A%25%25+This+declares+a+command+%5CComment%0A%25%25+The+argument+will+be+surrounded+by+%2F%2A+...+%2A%2F%0A%5CSetKwComment%7BComment%7D%7B%2F%2A+%7D%7B+%2A%2F%7D%0A%0A%5Cbegin%7Balgorithm%7D%0A%5Ccaption%7BAn+algorithm+with+caption%7D%5Clabel%7Balg%3Atwo%7D%0A%5CKwData%7B%24n+%5Cgeq+0%24%7D%0A%5CKwResult%7B%24y+%3D+x%5En%24%7D%0A%24y+%5Cgets+1%24%5C%3B%0A%24X+%5Cgets+x%24%5C%3B%0A%24N+%5Cgets+n%24%5C%3B%0A%5CWhile%7B%24N+%5Cneq+0%24%7D%7B%0A++%5CeIf%7B%24N%24+is+even%7D%7B%0A++++%24X+%5Cgets+X+%5Ctimes+X%24%5C%3B%0A++++%24N+%5Cgets+%5Cfrac%7BN%7D%7B2%7D%24+%5CComment%2A%5Br%5D%7BThis+is+a+comment%7D%0A++%7D%7B%5CIf%7B%24N%24+is+odd%7D%7B%0A++++++%24y+%5Cgets+y+%5Ctimes+X%24%5C%3B%0A++++++%24N+%5Cgets+N+-+1%24%5C%3B%0A++++%7D%0A++%7D%0A%7D%0A%5Cend%7Balgorithm%7D%0A%0A%5Cend%7Bdocument%7D)

![Algorithm2e-1.png](/files/0b318826fa700d9ecc2be7001cc213d2994a0f20)

По умолчанию `plain` используется стиль algorithm. Но если вам больше нравятся линии вокруг алгоритма и подписи, вы можете добавить `ruled` параметр пакета при загрузке `algorithm2e`, или написать `\RestyleAlgo{ruled}` в вашем документе. Тогда ваши алгоритмы с подписью будут оформлены так:

![Algorithm2e-11.png](/files/ab436225a578c33d6552aeec8d50272291b1c445)

Это `algorithm2e` пакет предоставляет множество возможностей настройки. Например, если вы хотите убрать вертикальные линии, обозначающие блоки while—end while и if—end if, вы можете добавить `noline` параметр пакета при загрузке `algorithm2e`, или написать `\SetNoline`. Также `\listofalgorithms` команда также доступна в `algorithm2e`.

[Откройте полный пример в Overleaf](https://www.overleaf.com/project/new/template/20787?id=71277562\&templateName=algpseudocode+%2B+algorithm+example\&latexEngine=pdflatex\&texImage=texlive-full%3A2020.1\&mainFile=)

## Дополнительное чтение

* [`algpseudocode` документация пакета](https://texdoc.org/pkg/algorithmicx) (см. раздел 3.1)
* [`algorithmic` и `алгоритм` документация пакета](https://texdoc.org/pkg/algorithms)
* [`algorithm2e` документация пакета](https://texdoc.org/pkg/algorithm2e)


---

# 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://ayakaleaf-pro.ayaka.space/latex/ru/drugie-temy/02-algorithms.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.
