> 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/uk/formatuvannya/11-code-listing.md).

# Лістинг коду

## Вступ

LaTeX широко використовується в науці, а програмування стало важливим аспектом у кількох галузях науки, тому виникає потреба в інструменті, який коректно відображає код. У цій статті пояснюється, як використовувати стандартний **verbatim** середовище, а також пакет **listings**, які надають більш просунуті можливості форматування коду. [Ця окрема стаття](/latex/uk/formatuvannya/12-code-highlighting-with-minted.md) розглядає `minted` пакет, який виконує підсвічування синтаксису з використанням Python `pygmentize` бібліотеки.

## Середовище verbatim

Типовим інструментом для відображення коду в LaTeX є `verbatim`, яке генерує вивід моноширинним шрифтом.

```latex
\begin{verbatim}
Текст, укладений у середовище \texttt{verbatim},
друкується безпосередньо
і всі команди \LaTeX{} ігноруються.
\end{verbatim}
```

[Відкрийте цей приклад в Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=verbatim+text+example\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cbegin%7Bdocument%7D%0A%5Cbegin%7Bverbatim%7D%0AText+enclosed+inside+%5Ctexttt%7Bverbatim%7D+environment+%0Ais+printed+directly+%0Aand+all+%5CLaTeX%7B%7D+commands+are+ignored.%0A%5Cend%7Bverbatim%7D%0A%5Cend%7Bdocument%7D)

Наведений вище код створює такий вивід:

![Verbatim1.png](/files/6b39160469f725e4b8bd847615ff84ff17467855)

Так само, як у прикладі у вступі, весь текст друкується зі збереженням розривів рядків і пробілів. Існує зіркова версія цієї команди, вивід якої дещо відрізняється.

```latex
\begin{verbatim*}
Текст, укладений у середовище \texttt{verbatim},
друкується безпосередньо
і всі команди \LaTeX{} ігноруються.
\end{verbatim*}
```

[Відкрийте цей приклад в Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=verbatim+text+example\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cbegin%7Bdocument%7D%0A%5Cbegin%7Bverbatim%2A%7D%0AText+enclosed+inside+%5Ctexttt%7Bverbatim%7D+environment+%0Ais+printed+directly+%0Aand+all+%5CLaTeX%7B%7D+commands+are+ignored.%0A%5Cend%7Bverbatim%2A%7D%0A%5Cend%7Bdocument%7D)

Наведений вище код створює такий вивід:

![Verbatim2.png](/files/ef7e36d2cdebaf1388ad0e49a3ea3e23f22b24e5)

У цьому випадку пробіли виділяються спеціальним символом «видимий пробіл»: **`␣`**.

Текст у стилі verbatim також можна використовувати в абзаці за допомогою `\verb` команду.

```latex
У каталозі \verb|C:\Windows\system32| ви можете знайти багато системних програм Windows
системи.

Команда \verb+\ldots+ створює \ldots
```

[Відкрийте цей приклад в Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=using+the+%5Cverb+command\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cbegin%7Bdocument%7D%0AIn+the+directory+%5Cverb%7CC%3A%5CWindows%5Csystem32%7C+you+can+find+a+lot+of+Windows+%0Asystem+applications.+%0A+%0AThe+%5Cverb%2B%5Cldots%2B+command+produces+%5Cldots%0A%5Cend%7Bdocument%7D)

Наведений вище код створює такий вивід:

![Verbatim3OLV2.png](/files/a1520c7cdc2c7903fc421fa39bc4aae17c1127d0)

Команда `\verb|C:\Windows\system32|` друкує текст усередині роздільників `|` у форматі verbatim. Будь-який символ, окрім літер і `*`, може використовуватися як роздільник. Наприклад `\verb+\ldots+` використовує `+` як роздільник.

## Використання listings для підсвічування коду

Щоб використовувати `lstlisting` середовище, вам потрібно додати такий рядок до преамбули документа:

```latex
\usepackage{listings}
```

Ось приклад використання `lstlisting` середовища з `listings` пакета:

```latex
\begin{lstlisting}
import numpy as np

def incmatrix(genl1,genl2):
    m = len(genl1)
    n = len(genl2)
    M = None #щоб стати матрицею інцидентності
    VT = np.zeros((n*m,1), int)  #фіктивна змінна

    #обчислити матрицю побітового xor
    M1 = bitxormatrix(genl1)
    M2 = np.triu(bitxormatrix(genl2),1)

    for i in range(m-1):
        for j in range(i+1, m):
            [r,c] = np.where(M2 == M1[i,j])
            for k in range(len(r)):
                VT[(i)*n + r[k]] = 1;
                VT[(i)*n + c[k]] = 1;
                VT[(j)*n + r[k]] = 1;
                VT[(j)*n + c[k]] = 1;

                if M is None:
                    M = np.copy(VT)
                else:
                    M = np.concatenate((M, VT), 1)

                VT = np.zeros((n*m,1), int)

    return M
\end{lstlisting}
```

[Відкрийте цей `listings` приклад з Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=listings+package+example\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cusepackage%7Blistings%7D%0A%5Cbegin%7Bdocument%7D%0A%5Cbegin%7Blstlisting%7D%0Aimport+numpy+as+np%0A++++%0Adef+incmatrix%28genl1%2Cgenl2%29%3A%0A++++m+%3D+len%28genl1%29%0A++++n+%3D+len%28genl2%29%0A++++M+%3D+None+%23to+become+the+incidence+matrix%0A++++VT+%3D+np.zeros%28%28n%2Am%2C1%29%2C+int%29++%23dummy+variable%0A++++%0A++++%23compute+the+bitwise+xor+matrix%0A++++M1+%3D+bitxormatrix%28genl1%29%0A++++M2+%3D+np.triu%28bitxormatrix%28genl2%29%2C1%29+%0A%0A++++for+i+in+range%28m-1%29%3A%0A++++++++for+j+in+range%28i%2B1%2C+m%29%3A%0A++++++++++++%5Br%2Cc%5D+%3D+np.where%28M2+%3D%3D+M1%5Bi%2Cj%5D%29%0A++++++++++++for+k+in+range%28len%28r%29%29%3A%0A++++++++++++++++VT%5B%28i%29%2An+%2B+r%5Bk%5D%5D+%3D+1%3B%0A++++++++++++++++VT%5B%28i%29%2An+%2B+c%5Bk%5D%5D+%3D+1%3B%0A++++++++++++++++VT%5B%28j%29%2An+%2B+r%5Bk%5D%5D+%3D+1%3B%0A++++++++++++++++VT%5B%28j%29%2An+%2B+c%5Bk%5D%5D+%3D+1%3B%0A++++++++++++++++%0A++++++++++++++++if+M+is+None%3A%0A++++++++++++++++++++M+%3D+np.copy%28VT%29%0A++++++++++++++++else%3A%0A++++++++++++++++++++M+%3D+np.concatenate%28%28M%2C+VT%29%2C+1%29%0A++++++++++++++++%0A++++++++++++++++VT+%3D+np.zeros%28%28n%2Am%2C1%29%2C+int%29%0A++++%0A++++return+M%0A%5Cend%7Blstlisting%7D%0A%5Cend%7Bdocument%7D)

Наведений вище код створює такий вивід:

![CodeListingEx1.png](/files/3a526656e08d27eabe4a132637647c7e8e693916)

У цьому прикладі вивід ігнорує всі команди LaTeX, а текст друкується зі збереженням усіх розривів рядків і введених пробілів. Давайте подивимося другий приклад:

```latex
\begin{lstlisting}[language=Python]
import numpy as np

def incmatrix(genl1,genl2):
    m = len(genl1)
    n = len(genl2)
    M = None #щоб стати матрицею інцидентності
    VT = np.zeros((n*m,1), int)  #фіктивна змінна

    #обчислити матрицю побітового xor
    M1 = bitxormatrix(genl1)
    M2 = np.triu(bitxormatrix(genl2),1)

    for i in range(m-1):
        for j in range(i+1, m):
            [r,c] = np.where(M2 == M1[i,j])
            for k in range(len(r)):
                VT[(i)*n + r[k]] = 1;
                VT[(i)*n + c[k]] = 1;
                VT[(j)*n + r[k]] = 1;
                VT[(j)*n + c[k]] = 1;

                if M is None:
                    M = np.copy(VT)
                else:
                    M = np.concatenate((M, VT), 1)

                VT = np.zeros((n*m,1), int)

    return M
\end{lstlisting}
```

[Відкрийте цей `listings` приклад з Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Python+listings+package+example\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cusepackage%7Blistings%7D%0A%5Cbegin%7Bdocument%7D%0A%5Cbegin%7Blstlisting%7D%5Blanguage%3DPython%5D%0Aimport+numpy+as+np%0A++++%0Adef+incmatrix%28genl1%2Cgenl2%29%3A%0A++++m+%3D+len%28genl1%29%0A++++n+%3D+len%28genl2%29%0A++++M+%3D+None+%23to+become+the+incidence+matrix%0A++++VT+%3D+np.zeros%28%28n%2Am%2C1%29%2C+int%29++%23dummy+variable%0A++++%0A++++%23compute+the+bitwise+xor+matrix%0A++++M1+%3D+bitxormatrix%28genl1%29%0A++++M2+%3D+np.triu%28bitxormatrix%28genl2%29%2C1%29+%0A%0A++++for+i+in+range%28m-1%29%3A%0A++++++++for+j+in+range%28i%2B1%2C+m%29%3A%0A++++++++++++%5Br%2Cc%5D+%3D+np.where%28M2+%3D%3D+M1%5Bi%2Cj%5D%29%0A++++++++++++for+k+in+range%28len%28r%29%29%3A%0A++++++++++++++++VT%5B%28i%29%2An+%2B+r%5Bk%5D%5D+%3D+1%3B%0A++++++++++++++++VT%5B%28i%29%2An+%2B+c%5Bk%5D%5D+%3D+1%3B%0A++++++++++++++++VT%5B%28j%29%2An+%2B+r%5Bk%5D%5D+%3D+1%3B%0A++++++++++++++++VT%5B%28j%29%2An+%2B+c%5Bk%5D%5D+%3D+1%3B%0A++++++++++++++++%0A++++++++++++++++if+M+is+None%3A%0A++++++++++++++++++++M+%3D+np.copy%28VT%29%0A++++++++++++++++else%3A%0A++++++++++++++++++++M+%3D+np.concatenate%28%28M%2C+VT%29%2C+1%29%0A++++++++++++++++%0A++++++++++++++++VT+%3D+np.zeros%28%28n%2Am%2C1%29%2C+int%29%0A++++%0A++++return+M%0A%5Cend%7Blstlisting%7D%0A%5Cend%7Bdocument%7D)

Наведений вище код створює такий вивід:

![CodeListingEx2.png](/files/9171b0478ad978e975a637147d4c42c6059dcdca)

Додатковий параметр у дужках `[language=Python]` вмикає підсвічування коду для цієї конкретної мови програмування (Python), спеціальні слова виділяються жирним шрифтом, а коментарі — курсивом. Дивіться [довідковий посібник](#reference-guide) для повного списку підтримуваних мов програмування.

## Імпорт коду з файлу

Код зазвичай зберігається у вихідному файлі, тому команда, яка автоматично бере код із файлу, стає дуже зручною.

```latex
Наступний код буде безпосередньо імпортовано з файлу

\lstinputlisting[language=Octave]{BitXorMatrix.m}
```

![CodeListingEx3.png](/files/c53cf1f803462326685a9eecfa3ce650d55a3eb2)

Команда `\lstinputlisting[language=Octave]{BitXorMatrix.m}` імпортує код із файлу *BitXorMatrix.m*, додатковий параметр у квадратних дужках вмикає підсвічування мови для мови програмування Octave. Якщо вам потрібно імпортувати лише частину файлу, ви можете вказати два параметри, розділені комою, у квадратних дужках. Наприклад, щоб імпортувати код з рядка 2 до рядка 12, попередня команда набуває вигляду

```latex
\lstinputlisting[language=Octave, firstline=2, lastline=12]{BitXorMatrix.m}
```

Якщо `firstline` або `lastline` якщо опущено, вважається, що значення відповідають початку файлу або, відповідно, його кінцю.

## Стилі та кольори коду

Форматування коду за допомогою **listing** є дуже гнучким. Давайте розглянемо приклад

```latex
\documentclass{article}
\usepackage{listings}
\usepackage{xcolor}

\definecolor{codegreen}{rgb}{0,0.6,0}
\definecolor{codegray}{rgb}{0.5,0.5,0.5}
\definecolor{codepurple}{rgb}{0.58,0,0.82}
\definecolor{backcolour}{rgb}{0.95,0.95,0.92}

\lstdefinestyle{mystyle}{
    backgroundcolor=\color{backcolour},
    commentstyle=\color{codegreen},
    keywordstyle=\color{magenta},
    numberstyle=\tiny\color{codegray},
    stringstyle=\color{codepurple},
    basicstyle=\ttfamily\footnotesize,
    breakatwhitespace=false,
    breaklines=true,
    captionpos=b,
    keepspaces=true,
    numbers=left,
    numbersep=5pt,
    showspaces=false,
    showstringspaces=false,
    showtabs=false,
    tabsize=2
}

\lstset{style=mystyle}

\begin{document}
Наступний код буде безпосередньо імпортовано з файлу

\lstinputlisting[language=Octave]{BitXorMatrix.m}
\end{document}
```

Наведений вище код створює такий вивід:

![CodeListingEx4.png](/files/53f9291108eb73d20718028408c808f450806587)

Як бачите, кольорове оформлення та стилізація коду значно покращують читабельність.

У цьому прикладі пакет **xcolor** імпортується, а потім команда `\definecolor{}{}{}` використовується для визначення нових кольорів у форматі rgb, які будуть використані пізніше. Докладніше дивіться: [використання кольорів у LaTeX](/latex/uk/formatuvannya/13-using-colors-in-latex.md)

По суті, є дві команди, що створюють стиль для цього прикладу:

**\lstdefinestyle{mystyle}{...}**

Визначає новий стиль списку коду під назвою «mystyle». Усередині другої пари фігурних дужок передаються параметри, що визначають цей стиль; див. довідник для повного опису цих та деяких інших параметрів.

**\lstset{style=mystyle}**

Увімкнути стиль «mystyle». Цю команду можна використовувати в документі, щоб за потреби перейти до іншого стилю.

## Підписи та список Listings

Так само, як у плаваючих елементах ([таблиці](/latex/uk/risunki-ta-tablici/01-tables.md) та [рисунки](/latex/uk/inshi-temi/27-inserting-images.md)), до списку коду можна додати підписи для більш зрозумілого подання.

```latex
\begin{lstlisting}[language=Python, caption=Python example]
import numpy as np

def incmatrix(genl1,genl2):
    m = len(genl1)
    n = len(genl2)
    M = None #щоб стати матрицею інцидентності
    VT = np.zeros((n*m,1), int)  #фіктивна змінна

    #обчислити матрицю побітового xor
    M1 = bitxormatrix(genl1)
    M2 = np.triu(bitxormatrix(genl2),1)

    for i in range(m-1):
        for j in range(i+1, m):
            [r,c] = np.where(M2 == M1[i,j])
            for k in range(len(r)):
                VT[(i)*n + r[k]] = 1;
                VT[(i)*n + c[k]] = 1;
                VT[(j)*n + r[k]] = 1;
                VT[(j)*n + c[k]] = 1;

                if M is None:
                    M = np.copy(VT)
                else:
                    M = np.concatenate((M, VT), 1)

                VT = np.zeros((n*m,1), int)

    return M
\end{lstlisting}
```

[Відкрийте цей `listings` приклад з Overleaf](/latex/uk/formatuvannya/11-code-listing.md)

Наведений вище код створює такий вивід:

![CodeListingEx5.png](/files/cbfc05d1c16c94b6e1e6b4a59ebd0153fbed3df9)

Додавання параметра, розділеного комою `caption=Python example` у квадратні дужки вмикає підпис. Пізніше цей підпис можна використати у списку Listings.

```latex
\lstlistoflistings
```

![CodeListingEx6OLV2.png](/files/a9a6203d051061b28a11b313e876792c6ff7fa92)

## Приклад проєкту Overleaf

Відкрийте це посилання, щоб [випробувати `listings` приклад пакета на Overleaf.](https://www.overleaf.com/project/new/template/20053?id=68266290\&templateName=listings+package+demo\&latexEngine=pdflatex\&texImage=texlive-full%3A2020.1\&mainFile=)

## Довідковий посібник

### Підтримувані мови

**підтримувані мови (а також їхні діалекти, якщо можливо; діалекти вказано в дужках, а діалекти за замовчуванням виділено курсивом):**

|                                                        |                                                  |
| ------------------------------------------------------ | ------------------------------------------------ |
| ABAP (R/2 4.3, R/2 5.0, R/3 3.1, R/3 4.6C, *R/3 6.10*) | ACSL                                             |
| Ada (*2005*, 83, 95)                                   | Algol (60, *68*)                                 |
| Ant                                                    | Assembler (Motorola68k, x86masm)                 |
| Awk (*gnu*, POSIX)                                     | bash                                             |
| Basic (Visual)                                         | C (*ANSI*, Handel, Objective, Sharp)             |
| C++ (ANSI, GNU, *ISO*, Visual)                         | Caml (*light*, Objective)                        |
| CIL                                                    | Clean                                            |
| Cobol (1974, *1985*, ibm)                              | Comal 80                                         |
| command.com (*WinXP*)                                  | Comsol                                           |
| csh                                                    | Delphi                                           |
| Eiffel                                                 | Elan                                             |
| erlang                                                 | Euphoria                                         |
| Fortran (77, 90, *95*)                                 | GCL                                              |
| Gnuplot                                                | Haskell                                          |
| HTML                                                   | IDL (empty, CORBA)                               |
| inform                                                 | Java (empty, AspectJ)                            |
| JVMIS                                                  | ksh                                              |
| Lingo                                                  | Lisp (empty, Auto)                               |
| Logo                                                   | make (empty, gnu)                                |
| Mathematica (1.0, 3.0, *5.2*)                          | Matlab                                           |
| Mercury                                                | MetaPost                                         |
| Miranda                                                | Mizar                                            |
| ML                                                     | Modula-2                                         |
| MuPAD                                                  | NASTRAN                                          |
| Oberon-2                                               | OCL (decorative, *OMG*)                          |
| Octave                                                 | Oz                                               |
| Pascal (Borland6, *Стандартний*, XSC)                  | Perl                                             |
| PHP                                                    | PL/I                                             |
| Plasm                                                  | PostScript                                       |
| POV                                                    | Prolog                                           |
| Promela                                                | PSTricks                                         |
| Python                                                 | R                                                |
| Reduce                                                 | Rexx                                             |
| RSL                                                    | Ruby                                             |
| S (empty, PLUS)                                        | SAS                                              |
| Scilab                                                 | sh                                               |
| SHELXL                                                 | Simula (*67*, CII, DEC, IBM)                     |
| SPARQL                                                 | SQL                                              |
| tcl (empty, tk)                                        | TeX (AlLaTeX, common, LaTeX, *plain*, primitive) |
| VBScript                                               | Verilog                                          |
| VHDL (empty, AMS)                                      | VRML (*97*)                                      |
| XML                                                    | XSLT                                             |

### Параметри для налаштування стилів списків коду

* **backgroundcolor** - колір фону. Потрібен зовнішній ***color*** або ***xcolor*** пакет.
* **commentstyle** - стиль коментарів у вихідній мові.
* **basicstyle** - розмір/сімейство шрифту тощо для вихідного коду (наприклад, `basicstyle=\ttfamily\small`)
* **keywordstyle** - стиль ключових слів у вихідній мові (наприклад, `keywordstyle=\color{red}`)
* **numberstyle** - стиль, що використовується для номерів рядків
* **numbersep** - відстань номерів рядків від коду
* **stringstyle** - стиль рядків у вихідній мові
* **showspaces** - виділяти пробіли в коді (true/false)
* **showstringspaces** - виділяти пробіли в рядках (true/false)
* **showtabs** - виділяти табуляції в коді (true/false)
* **номерів** - положення номерів рядків (ліворуч/праворуч/немає, тобто без номерів рядків)
* **prebreak** - позначка, що відображається в кінці рядка, який переноситься (наприклад, `prebreak=\raisebox{0ex}[0ex][0ex]{\ensuremath{\hookleftarrow}}`)
* **captionpos** - положення підпису (t/b)
* **рамки** - показ рамки навколо коду (none/leftline/topline/bottomline/lines/single/shadowbox)
* **breakatwhitespace** - визначає, чи автоматичні переноси мають відбуватися лише на пробілах
* **breaklines** - автоматичне перенесення рядків
* **keepspaces** - зберігати пробіли в коді, корисно для відступів
* **tabsize** - стандартний розмір табуляції
* **escapeinside** - вказати символи для виходу з вихідного коду до LaTeX (наприклад, `escapeinside={\%*}{*)}`)
* **rulecolor** - вказати колір рамки

## Додаткове читання

Докладніше див.:

* [Підсвічування коду за допомогою minted](/latex/uk/formatuvannya/12-code-highlighting-with-minted.md)
* [Використання кольорів у LaTeX](/latex/uk/formatuvannya/13-using-colors-in-latex.md)
* [Зміст](/latex/uk/struktura-dokumenta/02-table-of-contents.md)
* [Керування у великому проєкті](/latex/uk/struktura-dokumenta/07-management-in-a-large-project.md)
* [Багатофайлові проєкти LaTeX](/latex/uk/struktura-dokumenta/08-multi-file-latex-projects.md)
* [Розміри, гарнітури та стилі шрифтів](/latex/uk/shrifti/01-font-sizes-families-and-styles.md)
* [Гарнітури шрифтів](/latex/uk/shrifti/02-font-typefaces.md)
* [**listings** документація пакета](https://texdoc.org/serve/listings/0)
* [**listings** вебсайт CTAN](http://www.ctan.org/pkg/listings)


---

# 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/uk/formatuvannya/11-code-listing.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.
