Это многостраничный печатный вид этого раздела. Нажмите что бы печатать.

Вернуться к обычному просмотру страницы.

Latex

«TeX» — это созданная американским математиком и программистом Дональдом Кнутом (Donald E. Knuth) система для верстки текстов с формулами.

Сам по себе TEX представляет собой специализированный язык программирования (Кнут не только придумал язык, но и написал для него транслятор, причем таким образом, что он работает совершенно одинаково на самых разных компьютерах), на котором пишутся издательские системы, используемые на практике.

Точнее говоря, каждая издательская система на базе TEX’а представляет собой пакет макроопределений (макропакет) этого языка.

«LaTeX») — это созданная Лесли Лэмпортом (Leslie Lamport) издательская система на базе TEX’а.

1 - Библиотека цветных блоков и рамок tcolorbox для Latex

Этот пакет предоставляет окружение для цветных и обрамленных текстовых блоков с заголовком.

Официальное описание пакета по адресу: https://ctan.org/pkg/tcolorbox

tcolorbox – Цветные рамки для примеров и теорем в LaTeX и т. д.

Этот пакет предоставляет среду для цветных текстовых рамок с заголовком. По желанию, такая рамка может быть разделена на верхнюю и нижнюю части; таким образом, пакет может быть использован для настройки примеров LaTeX, где одна часть рамки отображает исходный код, а другая часть показывает результат. Другой распространенный случай использования – настройка теорем. Пакет поддерживает сохранение и повторное использование исходного кода и частей текста.

Пакет зависит от пакетов pgf, verbatim, environ и etoolbox.

Пример обложки документации
\documentclass[a4paper]{article}
\usepackage{tikz}
\usepackage[all]{tcolorbox}
\usepackage{incgraph}
\usepackage{lipsum}
\usepackage{accsupp} 
\begin{document}
\begin{inctext}
  \begin{tikzpicture}
    \definecolorseries{boxcol}{rgb}{last}{blue}{red}
    \resetcolorseries[28]{boxcol}
    \coordinate (A) at (0,0); \coordinate (B) at (21,29.7);
    \path[use as bounding box] (A) rectangle coordinate (C) (B);
    \node[transform shape,xslant=0.7,rotate=-10,xshift=0cm] at (C) {%
      \BeginAccSupp{method=plain,ActualText={}}%
      \begin{tcbraster}[raster columns=4,title=tcolorbox,
        fonttitle=\small\bfseries,raster width=50cm]
        \foreach \b in {1,...,28} {\begin{tcolorbox}[enhanced,
            watermark text=\thetcbrasternum,
            colframe=boxcol!30!white,
            colback=boxcol!25!white!30!white,
            colbacktitle=boxcol!!+!50!black!30!white,
            colupper=black!30!white]\lipsum[2]\end{tcolorbox}}
      \end{tcbraster}%
      \EndAccSupp{}%
    };
    \node at (C) {%
      \begin{tcbitemize}[title=tcolorbox ,fonttitle=\small\bfseries,
        enhanced jigsaw,opacityback=0.5,opacitybacktitle=0.75,
        halign=center,valign=center,arc=5mm,
        raster width=16cm,raster column skip=8mm,raster halign=center,
        raster force size=false,
        raster row 1/.style={height=6cm},
        raster row 2/.style={width=6cm,height=4cm},
        raster column 1/.style={flushright title,
          frame style={left color=yellow!50!black,right color=green!50!black},
          title style={left color=yellow!50!blue,right color=blue!50!green!50!black},
          interior style={left color=yellow!70,right color=green!70},
          underlay={\draw[line width=6mm,line cap=round,black!60]
            ([shift={(0.4,-0.15)}]frame.north east)
            --([shift={(0.4,0.15)}]frame.south east); }},
        raster column 2/.style={
          frame style={left color=green!50!black,right color=yellow!50!black},
          title style={left color=blue!50!green!50!black,right color=yellow!50!blue},
          interior style={left color=green!70,right color=yellow!70}}]
        \tcbitem[fontupper=\Huge\bfseries,sharp corners=east,
        underlay={\draw[line width=6mm,line cap=round,black!60]
          ([shift={(0.4,0.30)}]frame.north east)-- coordinate(A) +(0,0.2);
          \draw[line width=1mm,line cap=round,black!60](A) -- +(30:1.5cm);
          \draw[line width=1mm,line cap=round,black!60](A) -- +(150:1.5cm);}]
        tcolorbox
        \tcbitem[fontupper=\large\bfseries,sharp corners=west]
        Manual for
        \tcbitem[sharp corners=northeast]
        \tcbitem[sharp corners=northwest] Thomas F.~Sturm
      \end{tcbitemize}%
    };
  \end{tikzpicture}
\end{inctext}
\end{document}

Установка пакета

\usepackage{tcolorbox}

Пакет принимает ключи опций в синтаксисе “ключ-значение”. В качестве альтернативы вы можете использовать эти ключи позже в преамбуле с помощью команды \tcbuselibrary.

\tcbuselibrary{⟨key list⟩}

Вот перевод на русский язык с примерами, обернутыми в latex:


Следующие ключи используются внутри \tcbuselibrary соответственно \usepackage без ключа:

  • tree path /tcb/library/.

  • /tcb/library/skins (LIB skins)
    Загружает пакет tikzfill.image → CTAN и предоставляет дополнительные стили (skins) для внешнего вида цветных коробок;

    \tcbuselibrary{skins}
    
  • /tcb/library/vignette (LIB vignette)
    Предоставляет код для более орнаментального оформления;

    \tcbuselibrary{vignette}
    
  • /tcb/library/raster (LIB raster)
    Предоставляет дополнительные макросы и опции для наборки нескольких коробок, расположенных в виде растровой сетки;

    \tcbuselibrary{raster}
    
  • /tcb/library/listings (LIB listings)
    Загружает пакет listings → CTAN и предоставляет дополнительные макросы для наборки листингов

    \tcbuselibrary{listings}
    
  • /tcb/library/listingsutf8 (LIB listingsutf8)
    Загружает пакеты listings → CTAN и listingsutf8 для поддержки UTF-8.

    \tcbuselibrary{listingsutf8}
    
  • /tcb/library/minted (LIB minted)
    Загружает пакет minted → CTAN для наборки листингов с помощью инструмента Pygments;

    \tcbuselibrary{minted}
    
  • /tcb/library/theorems (LIB theorems)
    Предоставляет дополнительные макросы для наборки теорем

    \tcbuselibrary{theorems}
    
  • /tcb/library/breakable (LIB breakable)
    Предоставляет поддержку автоматического разбиения коробок с одной страницы на другую;

    \tcbuselibrary{breakable}
    
  • /tcb/library/magazine (LIB magazine)
    Предоставляет поддержку для хранения частей разбитых коробок для последующего использования или в измененном порядке;

    \tcbuselibrary{magazine}
    
  • /tcb/library/poster (LIB poster)
    Предоставляет поддержку для создания постеров;

    \tcbuselibrary{poster}
    
  • /tcb/library/fitting (LIB fitting)
    Предоставляет поддержку адаптации размера шрифта содержимого коробки к размерам коробки;

    \tcbuselibrary{fitting}
    
  • /tcb/library/hooks (LIB hooks)
    Расширяет несколько опций до “hookable” ключей;

    \tcbuselibrary{hooks}
    
  • /tcb/library/xparse (LIB xparse)
    Загружает пакет xparse → CTAN и считается устаревшей библиотекой, сохраненной для совместимости;

    \tcbuselibrary{xparse}
    
  • /tcb/library/external (LIB external)
    Предоставляет поддержку экстернализации для фрагментов документов, которые могут быть самостоятельными;

    \tcbuselibrary{external}
    
  • /tcb/library/documentation (LIB documentation)
    Предоставляет дополнительные макросы для наборки документации LATEX

Основные параметры рамок tcolorbox

Создание рамок

Команды tcolorbox и \tcbox

\begin{tcolorbox}
This is a \textbf{tcolorbox}.
\end{tcolorbox}
\begin{tcolorbox}[colback=red!5!white,colframe=red!75!black,title=My nice heading]
This is another \textbf{tcolorbox}.
\tcblower %разделитель бокса
Here, you see the lower part of the box.
\end{tcolorbox}

\tcblower

Используется внутри tcolorbox для разделения верхней части коробки от необязательной нижней части коробки. Верхняя и нижняя части рассматриваются как отдельные функциональные единицы. Если вы хотите просто провести линию, используйте \tcbline.

Пример использования:

\begin{tcolorbox}
    Верхняя часть коробки.
    \tcblower
    Нижняя часть коробки.
\end{tcolorbox}

\tcbset{⟨options⟩}

Устанавливает параметры для всех последующих tcolorbox внутри текущей группы TEX. По умолчанию это не применяется к вложенным коробкам.

Например, цвета коробок могут быть определены для всего документа следующим образом:

\tcbset{colback=red!5!white, colframe=red!75!black}

После этого все последующие tcolorbox будут использовать указанные цвета фона и рамки.

\tcbsetforeverylayer{⟨options⟩}

Устанавливает параметры для всех последующих tcolorbox внутри текущей группы TEX. В отличие от \tcbset, это также применяется к вложенным коробкам. Технически, параметры ⟨options⟩ добавляются к значениям по умолчанию для каждой tcolorbox, которые применяются с помощью /tcb/reset

Не следует использовать этот макрос, если вы не уверены, что хотите применять ⟨options⟩ также для коробок в коробках (в коробках в коробках и т.д.).

Пример использования:

\tcbset{colback=green!10!white}
\tcbsetforeverylayer{colframe=red!75!black}

В этом примере все последующие tcolorbox будут иметь зеленый фон и красную рамку, включая вложенные коробки.

\tcbox[⟨options⟩]{⟨box content⟩}

Создает цветную коробку, которая подгоняется по ширине к заданному содержимому ⟨box content⟩. В принципе, большинство ⟨options⟩ для tcolorbox могут быть использованы для \tcbox с некоторыми ограничениями. \tcbox не может иметь нижнюю часть и не может быть разбита.

Пример использования:

\tcbox[colback=blue!10!white, colframe=blue!75!black]{Это содержимое цветной коробки.}

В этом примере создается цветная коробка с заданным фоном и рамкой, подгоняющаяся по ширине к тексту внутри.

\tcboxverb[⟨options⟩]{⟨verbatim box content⟩}

Создает цветную коробку на основе \tcbox, которая подгоняется по ширине к заданному содержимому ⟨verbatim box content⟩. Основная \tcbox стилизована с помощью /tcb/verbatim плюс заданные ⟨options⟩. Разница с \tcbox заключается в том, что ⟨verbatim box content⟩ интерпретируется как текст без форматирования. Поэтому \tcboxverb действует аналогично \verb.

Пример использования:

\tcboxverb[colback=yellow!10!white, colframe=yellow!75!black]{\texttt{Это содержимое в verbatim-формате.}}

В этом примере создается цветная коробка с заданным фоном и рамкой, подгоняющаяся по ширине к тексту, который интерпретируется без форматирования.

Создание окружений и команд tcolorbox

\newtcolorbox[⟨init options⟩]{⟨name⟩}[⟨number⟩][⟨default⟩]{⟨options⟩}

Создает новое окружение ⟨name⟩ на основе tcolorbox. В принципе, \newtcolorbox работает как \newenvironment. Это означает, что новое окружение ⟨name⟩ может принимать ⟨number⟩ аргументов, где ⟨default⟩ — это значение по умолчанию для необязательного первого аргумента. Параметры ⟨options⟩ передаются основной tcolorbox. Обратите внимание, что /tcb/savedelimiter автоматически устанавливается на заданное ⟨name⟩. Параметры ⟨init options⟩ позволяют настроить автоматическую нумерацию.

Пример использования:

\newtcolorbox[auto numbered]{mybox}[2][default value]{colback=blue!5!white, colframe=blue!75!black, title=Заголовок}

В этом примере создается новое окружение mybox, которое может принимать два аргумента, где первый аргумент имеет значение по умолчанию “default value”. Параметры для tcolorbox задают цвет фона, цвет рамки и заголовок.

\newtcolorbox{mybox}{colback=red!5!white,
colframe=red!75!black}
\begin{mybox}
This is my own box.
\end{mybox}

\newtcolorbox{mybox}[1]{colback=red!5!white,
colframe=red!75!black,fonttitle=\bfseries,
title={#1}}
\begin{mybox}{Hello there}
This is my own box with a mandatory title.
\end{mybox}

\newtcolorbox{mybox}[2][]{colback=red!5!white,
colframe=red!75!black,fonttitle=\bfseries,
colbacktitle=red!85!black,enhanced,
attach boxed title to top center={yshift=-2mm},
title={#2},#1}
\begin{mybox}[colback=yellow]{Hello there}
This is my own box with a mandatory title
and options.
\end{mybox}

\newtcolorbox[auto counter,number within=section]{pabox}[2][]{%
colback=red!5!white,colframe=red!75!black,fonttitle=\bfseries,
title=Examp.~\thetcbcounter: #2,#1}

\begin{pabox}[colback=yellow]{Hello there}
This is my own box with a mandatory
numbered title and options.
\end{pabox}

\renewtcolorbox[⟨init options⟩]{⟨name⟩}[⟨number⟩][⟨default⟩]{⟨options⟩}

Работает аналогично \newtcolorbox, но основан на \renewenvironment вместо \newenvironment. Существующее окружение переопределяется.

Пример использования:

\renewtcolorbox[auto numbered]{mybox}[2][default value]{colback=green!5!white, colframe=green!75!black, title=Обновленный заголовок}

В этом примере существующее окружение mybox переопределяется с новыми параметрами, включая цвет фона, цвет рамки и заголовок. Теперь это окружение будет использовать новые настройки при каждом вызове.

\NewTColorBox[⟨init options⟩]{⟨name⟩}{⟨specification⟩}{⟨options⟩}

Создает новое окружение ⟨name⟩ на основе tcolorbox. В принципе, \NewTColorBox работает как \NewDocumentEnvironment. Это означает, что новое окружение ⟨name⟩ создается с заданным аргументом LATEX3 ⟨specification⟩. Если окружение с именем ⟨name⟩ уже было определено, будет выдана ошибка. Параметры ⟨options⟩ передаются основной tcolorbox. Обратите внимание, что /tcb/savedelimiter автоматически устанавливается на заданное ⟨name⟩. Параметры ⟨init options⟩ позволяют настроить автоматическую нумерацию.

Пример использования:

% counter из предыдущего примера pabox продолжается в этом стиле
\NewTColorBox[use counter from=pabox]{mybox}{ O{red} m d"" !O{} }
{enhanced,colframe=#1!75!black,colback=#1!5!white,
fonttitle=\bfseries,title={\thetcbcounter~#2},
IfValueT={#3}{watermark text={#3}},#4}

\begin{mybox}{My title}
This is a tcolorbox.
\end{mybox}

\begin{mybox}[blue]{My title}
This is a tcolorbox.
\end{mybox}

\begin{mybox}[green]{My title}"My Watermark"
This is a tcolorbox.
\end{mybox}

\begin{mybox}[yellow]{My title}[colbacktitle=yellow!50!white,coltitle=black]
This is a tcolorbox.
\end{mybox}

\begin{mybox}[purple]{My title}"All together"[coltitle=yellow]
This is a tcolorbox.
\end{mybox}

В этом примере создается новое окружение mynewbox с заданной спецификацией и параметрами, включая цвет фона, цвет рамки и заголовок. Если окружение с именем mynewbox уже существует, будет выдана ошибка.

\RenewTColorBox[⟨init options⟩]{⟨name⟩}{⟨specification⟩}{⟨options⟩}

Работает аналогично \NewTColorBox , но основан на \RenewDocumentEnvironment вместо \NewDocumentEnvironment. Существующее окружение переопределяется.

Пример использования:

\RenewTColorBox[auto numbered]{mybox}{m}{colback=red!10!white, colframe=red!75!black, title=Обновленный заголовок}

В этом примере существующее окружение mybox переопределяется с новыми параметрами.

\ProvideTColorBox[⟨init options⟩]{⟨name⟩}{⟨specification⟩}{⟨options⟩}

Работает аналогично \NewTColorBox, но основан на \ProvideDocumentEnvironment вместо \NewDocumentEnvironment. Окружение ⟨name⟩ создается только в том случае, если оно еще не определено.

Пример использования:

\ProvideTColorBox[auto numbered]{mybox}{m}{colback=green!10!white, colframe=green!75!black, title=Предоставленный заголовок}

В этом примере окружение mybox будет создано только если оно еще не существует.

\DeclareTColorBox[⟨init options⟩]{⟨name⟩}{⟨specification⟩}{⟨options⟩}

Работает аналогично \NewTColorBox, но основан на \DeclareDocumentEnvironment вместо \NewDocumentEnvironment. Новое окружение всегда создается, независимо от того, существует ли уже окружение с тем же именем.

Пример использования:

\DeclareTColorBox[auto numbered]{mybox}{m}{colback=blue!10!white, colframe=blue!75!black, title=Объявленный заголовок}

В этом примере окружение mybox будет создано, даже если оно уже существует, что может привести к ошибке.

\NewTotalTColorBox[⟨init options⟩]{\⟨name⟩}{⟨specification⟩}{⟨options⟩}{⟨content⟩}

Создает новую команду \⟨name⟩ на основе tcolorbox. В отличие от \NewTColorBox, также указывается ⟨content⟩ для tcolorbox. В принципе, \NewTotalTColorBox работает как \NewDocumentCommand. Это означает, что новая команда \⟨name⟩ создается с заданным аргументом LATEX3 ⟨specification⟩. Если \⟨name⟩ уже было определено, будет выдана ошибка. Параметры ⟨options⟩ передаются основной tcolorbox, которая заполняется указанным ⟨content⟩. Обратите внимание, что /tcb/savedelimiter автоматически устанавливается на заданное \⟨name⟩. Также обратите внимание, что /tcb/saveto, /tcb/savelowerto и /tcb/redirectlowerto не могут использоваться с \NewTotalTColorBox и аналогичными командами. Параметры ⟨init options⟩ позволяют настроить автоматическую нумерацию.

Пример использования:

\NewTotalTColorBox{\diabox}{ O{} v m }
{ bicolor,nobeforeafter,equal height group=diabox,width=5.7cm,
fonttitle=\bfseries\ttfamily,adjusted title={#2},center title,
colframe=blue!20!black,leftupper=0mm,rightupper=0mm,colback=black!75!white,#1}
{ \tikz\path[fill zoom image={#2}] (0,0) rectangle (\linewidth,4cm);%
\tcblower#3}

\diabox{blueshade.png}{Created with |GIMP|.\\\url{http://www.gimp.org}}
\diabox{goldshade.png}{Created with |GIMP|.\\\url{http://www.gimp.org}}

В этом примере создается новая команда mytotalbox, которая принимает содержимое и параметры, включая цвет фона и цвет рамки. Если команда с именем mytotalbox уже существует, будет выдана ошибка.

\RenewTotalTColorBox[⟨init options⟩]{\⟨name⟩}{⟨specification⟩}{⟨options⟩}{⟨content⟩}

Работает аналогично \NewTotalTColorBox, но основан на \RenewDocumentCommand вместо \NewDocumentCommand. Существующая команда переопределяется.

Пример использования:

\RenewTotalTColorBox[auto numbered]{mytotalbox}{m}{colback=purple!10!white, colframe=purple!75!black}{Обновленное содержимое команды.}

В этом примере существующая команда mytotalbox переопределяется с новыми параметрами и содержимым.

\ProvideTotalTColorBox[⟨init options⟩]{\⟨name⟩}{⟨specification⟩}{⟨options⟩}{⟨content⟩}

Работает аналогично \NewTotalTColorBox, но основан на \ProvideDocumentCommand вместо \NewDocumentCommand. Команда \⟨name⟩ создается только в том случае, если она еще не определена.

Пример использования:

\ProvideTotalTColorBox[auto numbered]{mytotalbox}{m}{colback=teal!10!white, colframe=teal!75!black}{Предоставленное содержимое команды.}

В этом примере команда mytotalbox будет создана только если она еще не существует.

\DeclareTotalTColorBox[⟨init options⟩]{\⟨name⟩}{⟨specification⟩}{⟨options⟩}{⟨content⟩}

Работает аналогично \NewTotalTColorBox, но основан на \DeclareDocumentCommand вместо \NewDocumentCommand. Новая команда всегда создается, независимо от того, существует ли уже команда с тем же именем.

Пример использования:

\DeclareTotalTColorBox[auto numbered]{mytotalbox}{m}{colback=cyan!10!white, colframe=cyan!75!black}{Объявленное содержимое команды.}

В этом примере команда mytotalbox будет создана, даже если она уже существует, что может привести к ошибке.

Создание команд на основе \tcbox

\newtcbox[⟨init options⟩]{\⟨name⟩}[⟨number⟩][⟨default⟩]{⟨options⟩}

Создает новый макрос \⟨name⟩ на основе \tcbox. В принципе, \newtcbox работает как \newcommand. Новый макрос \⟨name⟩ может принимать ⟨number⟩+1 аргументов (до 10), где ⟨default⟩ — это значение по умолчанию для необязательного первого аргумента. В дополнение к аргументам ⟨number⟩ есть автоматический последний (обязательный) аргумент \⟨name⟩, который принимает содержимое коробки. Параметры ⟨options⟩ передаются основной tcbox. Параметры ⟨init options⟩ позволяют настроить автоматическую нумерацию.

Пример использования:

\newtcbox{\mybox}[1][red]{on line,
arc=0pt,outer arc=0pt,colback=#1!10!white,colframe=#1!50!black,
boxsep=0pt,left=1pt,right=1pt,top=2pt,bottom=2pt,
boxrule=0pt,bottomrule=1pt,toprule=1pt}

\newtcbox{\xmybox}[1][red]{on line,
arc=7pt,colback=#1!10!white,colframe=#1!50!black,
before upper={\rule[-3pt]{0pt}{10pt}},boxrule=1pt,
boxsep=0pt,left=6pt,right=6pt,top=2pt,bottom=2pt}

The \mybox[green]{quick} brown \mybox{fox} \mybox[blue]{jumps} over the \mybox[green]{lazy} \mybox{dog}.\par
The \xmybox[green]{quick} brown \xmybox{fox} \xmybox[blue]{jumps} over the \xmybox[green]{lazy} \xmybox{dog}.

В этом примере создается новый макрос mytcbox, который может принимать два аргумента, где первый аргумент имеет значение по умолчанию “default value”. Параметры для tcbox задают цвет фона и цвет рамки.

\renewtcbox[⟨init options⟩]{\⟨name⟩}[⟨number⟩][⟨default⟩]{⟨options⟩}

Работает аналогично \newtcbox, но основан на \renewcommand вместо \newcommand. Существующий макрос переопределяется.

Пример использования:

\renewtcbox[auto numbered]{mytcbox}[2][default value]{colback=blue!10!white, colframe=blue!75!black}

В этом примере существующий макрос mytcbox переопределяется с новыми параметрами и значением по умолчанию для первого аргумента.

\NewTCBox[⟨init options⟩]{\⟨name⟩}{⟨specification⟩}{⟨options⟩}

Создает новую команду \⟨name⟩ на основе \tcbox. В принципе, \NewTCBox работает как \NewDocumentCommand. Это означает, что новая команда \⟨name⟩ создается с заданным аргументом LATEX3 ⟨specification⟩. В дополнение к аргументу ⟨specification⟩ есть автоматический последний (обязательный) аргумент \⟨name⟩, который принимает содержимое коробки. Таким образом, \⟨name⟩ может иметь до 10 аргументов в сумме. Если \⟨name⟩ уже было определено, будет выдана ошибка. Параметры ⟨options⟩ передаются основной \tcbox. Обратите внимание, что /tcb/savedelimiter автоматически устанавливается на заданное \⟨name⟩. Параметры ⟨init options⟩ позволяют настроить автоматическую нумерацию.

Пример использования:

\NewTCBox[auto numbered]{mynewtcbox}{m}{colback=green!10!white, colframe=green!75!black}

В этом примере создается новая команда mynewtcbox, которая принимает спецификацию и параметры, включая цвет фона и цвет рамки. Если команда с именем mynewtcbox уже существует, будет выдана ошибка.

\RenewTCBox[⟨init options⟩]{\⟨name⟩}{⟨specification⟩}{⟨options⟩}

Работает аналогично \NewTCBox, но основан на \RenewDocumentCommand вместо \NewDocumentCommand. Существующая команда переопределяется.

Пример использования:

\RenewTCBox[auto numbered]{mytcbox}{m}{colback=red!10!white, colframe=red!75!black}

В этом примере существующая команда mytcbox переопределяется с новыми параметрами.

\ProvideTCBox[⟨init options⟩]{\⟨name⟩}{⟨specification⟩}{⟨options⟩}

Работает аналогично \NewTCBox, но основан на \ProvideDocumentCommand вместо \NewDocumentCommand. Команда \⟨name⟩ создается только в том случае, если она еще не определена.

Пример использования:

\ProvideTCBox[auto numbered]{mytcbox}{m}{colback=green!10!white, colframe=green!75!black}

В этом примере команда mytcbox будет создана только если она еще не существует.

\DeclareTCBox[⟨init options⟩]{\⟨name⟩}{⟨specification⟩}{⟨options⟩}

Работает аналогично \NewTCBox, но основан на \DeclareDocumentCommand вместо \NewDocumentCommand. Новая команда всегда создается, независимо от того, существует ли уже команда с тем же именем.

Пример использования:

\DeclareTCBox[auto numbered]{mytcbox}{m}{colback=blue!10!white, colframe=blue!75!black}

В этом примере команда mytcbox будет создана, даже если она уже существует, что может привести к ошибке.

\NewTotalTCBox[⟨init options⟩]{\⟨name⟩}{⟨specification⟩}{⟨options⟩}{⟨content⟩}

Создает новую команду \⟨name⟩ на основе \tcbox. В отличие от \NewTCBox, также указывается ⟨content⟩ для tcbox. В принципе, \NewTotalTCBox работает как \NewDocumentCommand. Это означает, что новая команда \⟨name⟩ создается с заданным аргументом LATEX3 ⟨specification⟩. Если \⟨name⟩ уже было определено, будет выдана ошибка. Параметры ⟨options⟩ передаются основной \tcbox, которая заполняется указанным ⟨content⟩. Обратите внимание, что /tcb/savedelimiter автоматически устанавливается на заданное \⟨name⟩. Параметры ⟨init options⟩ позволяют настроить автоматическую нумерацию.

Пример использования:

\NewTotalTCBox[auto numbered]{mytotaltcbox}{m}{colback=yellow!10!white, colframe=yellow!75!black}{Это содержимое новой команды.}

В этом примере создается новая команда mytotaltcbox, которая принимает спецификацию и параметры, включая цвет фона и цвет рамки, а также содержимое коробки. Если команда с именем mytotaltcbox уже существует, будет выдана ошибка.

\NewTotalTCBox{\myverb}{ O{red} v !O{} }
{ fontupper=\ttfamily,nobeforeafter,tcbox raise base,arc=0pt,outer arc=0pt,
top=0pt,bottom=0pt,left=0mm,right=0mm,
leftrule=0pt,rightrule=0pt,toprule=0.3mm,bottomrule=0.3mm,boxsep=0.5mm,
colback=#1!10!white,colframe=#1!50!black,#3}{#2}

To set a word \textbf{bold} in \myverb{\LaTeX}, use
\myverb[green]{\textbf{bold}}. Alternatively, write
\myverb[yellow]{{\bfseries bold}}.
In \myverb[blue]{\LaTeX}[enhanced,fuzzy halo], other font settings are
done in the same way, e.\,g. \myverb{\textit}, \myverb{\itshape}\\
or \myverb[brown]{\texttt}, \myverb[brown]{\ttfamily}.

% \usepackage{listings} or \tcbuselibrary{listings}
\NewTotalTCBox{\commandbox}{ s v }
{verbatim,colupper=white,colback=black!75!white,colframe=black}
{\IfBooleanT{#1}{\textcolor{red}{\ttfamily\bfseries > }}%
\lstinline[language=command.com,keywordstyle=\color{blue!35!white}\bfseries]^#2^}

\commandbox*{cd "My Documents"} changes to directory \commandbox{My Documents}.

\commandbox*{dir /A} lists the directory content.

\commandbox*{copy example.txt d:\target} copies \commandbox{example.txt} to 
   \commandbox{d:\target}.

\RenewTotalTCBox[⟨init options⟩]{\⟨name⟩}{⟨specification⟩}{⟨options⟩}{⟨content⟩}

Работает аналогично \NewTotalTCBox, но основан на \RenewDocumentCommand вместо \NewDocumentCommand. Существующая команда переопределяется.

Пример использования:

\RenewTotalTCBox[auto numbered]{mytotaltcbox}{m}{colback=purple!10!white, colframe=purple!75!black}{Обновленное содержимое команды.}

В этом примере существующая команда mytotaltcbox переопределяется с новыми параметрами и содержимым.


\ProvideTotalTCBox[⟨init options⟩]{\⟨name⟩}{⟨specification⟩}{⟨options⟩}{⟨content⟩}
Работает аналогично \NewTotalTCBox, но основан на \ProvideDocumentCommand вместо \NewDocumentCommand. Команда \⟨name⟩ создается только в том случае, если она еще не определена.

Пример использования:

\ProvideTotalTCBox[auto numbered]{mytotaltcbox}{m}{colback=teal!10!white, colframe=teal!75!black}{Предоставленное содержимое команды.}

В этом примере команда mytotaltcbox будет создана только если она еще не существует.


\DeclareTotalTCBox[⟨init options⟩]{\⟨name⟩}{⟨specification⟩}{⟨options⟩}{⟨content⟩}
Работает аналогично \NewTotalTCBox, но основан на \DeclareDocumentCommand вместо \NewDocumentCommand. Новая команда всегда создается, независимо от того, существует ли уже команда с тем же именем.

Пример использования:

\DeclareTotalTCBox[auto numbered]{mytotaltcbox}{m}{colback=cyan!10!white, colframe=cyan!75!black}{Объявленное содержимое команды.}

В этом примере команда mytotaltcbox будет создана, даже если она уже существует, что может привести к ошибке.

Переопределение других сред (обертывание с помощью tcolorbox)

\tcolorboxenvironment{⟨name⟩}{⟨options⟩}

Существующая среда ⟨name⟩ переопределяется, чтобы быть обернутой внутри tcolorbox с заданными ⟨options⟩.

% tcbuselibrary{skins}
\newenvironment{myitemize}{%
\begin{itemize}}{\end{itemize}}
\tcolorboxenvironment{myitemize}{blanker,
before skip=6pt,after skip=6pt,
borderline west={3mm}{0pt}{red}}

Some text.
\begin{myitemize}
\item Alpha
\item Beta
\item Gamma
\end{myitemize}
More text.

1.1 - Ключи к командам tcolorbox

Полный список ключей для настройки боксов в tcolorbox

Ключи для TCB

Ключ Синтаксис Назначение
/tcb/ Префикс для ключей Обозначение пространства имен tcolorbox.
add to height add to height=<length> Добавляет фиксированную высоту к общему размеру бокса.
add to list add to list=<text> Регистрирует бокс в списке (например, для оглавления).
add to natural height add to natural height=<length> Увеличивает “естественную” высоту бокса (без учета boxsep и boxrule).
add to width add to width=<length> Добавляет фиксированную ширину к общему размеру бокса.
adjust text adjust text=<options> Настраивает параметры текста (например, hyphenation).
adjusted title adjusted title=<text> Заголовок с динамическим форматированием (например, для нумерации).
adjusted title after break adjusted title after break=<text> Заголовок после разрыва многостраничного бокса.
after after={<code>} Код TikZ/LaTeX, выполняемый после рисования бокса.
after app after app={<code>} Код, выполняемый после добавления бокса в приложении.
after doc body after doc body={<code>} Код, вставляемый после основного содержимого документа.
after doc body command after doc body command=<command> Команда LaTeX, выполняемая после тела документа.
after doc body environment after doc body env=<env> Окружение LaTeX, добавляемое после тела документа.
after doc body key after doc body key=<key> Ключ TikZ, применяемый после тела документа.
after doc body path after doc body path=<path> Путь TikZ, рисуемый после тела документа.
after float after float={<code>} Код, выполняемый после плавающего бокса (float).
after float app after float app={<code>} Аналог after float для приложений.
after float pre after float pre={<code>} Код перед плавающим боксом (для приложений).
after lower after lower={<code>} Код, выполняемый после нижней части (lower part) бокса.
after lower app after lower app={<code>} Аналог after lower для приложений.
after lower pre after lower pre={<code>} Код перед нижней частью (для приложений).
after lower* after lower*={<code>} Код после нижней части (без группировки в {}).
after pre after pre={<code>} Код перед завершением бокса (для приложений).
after skip after skip=<length> Вертикальный отступ после бокса.
after skip balanced after skip balanced=<length> Сбалансированный отступ (учитывает разрывы страниц).
after title after title={<code>} Код, выполняемый после заголовка.
after title app after title app={<code>} Аналог after title для приложений.
after title pre after title pre={<code>} Код перед заголовком (для приложений).
after title* after title*={<code>} Код после заголовка (без группировки в {}).
after upper after upper={<code>} Код, выполняемый после верхней части (upper part) бокса.
after upper app after upper app={<code>} Аналог after upper для приложений.
after upper pre after upper pre={<code>} Код перед верхней частью (для приложений).
after upper* after upper*={<code>} Код после верхней части (без группировки в {}).
alert alert Стиль для выделенных боксов (например, в Beamer).
alt alt=<text> Альтернативный текст (для PDF-тегов или подписей).
ams align ams align Включает окружение align из amsmath в основной части.
ams align lower ams align lower Аналог ams align для нижней части.
ams align upper ams align upper Аналог ams align для верхней части.
ams align* ams align* Версия align* (без нумерации).
ams equation ams equation Включает окружение equation из amsmath.
ams equation lower ams equation lower Аналог ams equation для нижней части.
ams equation upper ams equation upper Аналог ams equation для верхней части.
ams gather ams gather Включает окружение gather из amsmath.
ams nodisplayskip ams nodisplayskip Убирает отступы вокруг формул amsmath.
arc arc=<length> Радиус скругления углов.
arc is angular arc is angular Делает скругление углов “острым” (стиль TikZ).
arc is curved arc is curved Делает скругление плавным (по умолчанию).
at begin tikz at begin tikz={<code>} Код TikZ, выполняемый в начале рисования.
attach boxed title to bottom attach boxed title to bottom Размещает заголовок внизу бокса.
attach boxed title to top attach boxed title to top Размещает заголовок вверху бокса (по умолчанию).
attach title attach title Включает прикрепленный заголовок.
auto outer arc auto outer arc Автонастройка внешних дуг для сложных рамок.
autoparskip autoparskip Автоматически регулирует parskip внутри бокса.
baseline baseline=<length> Выравнивание бокса по базовой линии текста.
beamer beamer Стиль для презентаций Beamer.
beamer alerted beamer alerted Стиль для “alerted” боксов в Beamer.
beamer hidden beamer hidden Стиль для скрытых боксов в Beamer.
bean arc bean arc Альтернативный стиль скругления углов (“бобовый”).
before before={<code>} Код, выполняемый перед рисованием бокса.
before skip before skip=<length> Вертикальный отступ перед боксом.
bicolor bicolor Двухцветный стиль (разные цвета для верхней/нижней частей).
blank blank Пустой стиль (без рамок и фона).
blanker blanker Еще более минималистичный стиль, чем blank.
blankest blankest Максимально упрощенный стиль (только текст).
blend before title blend before title Смешивает фон перед заголовком с основным фоном.
bookmark bookmark=<text> Добавляет закладку PDF для бокса.
borderline borderline={<options>} Рисует дополнительные границы (например, тени).
bottomrule bottomrule=<length> Толщина нижней границы.
bottomrule at break bottomrule at break=<length> Толщина нижней границы на разрыве страницы.
box align box align=<baseline/top/bottom> Выравнивание содержимого внутри бокса.
boxed title size boxed title size=<options> Размеры рамки заголовка.
boxrule boxrule=<length> Толщина основной рамки.
boxsep boxsep=<length> Внутренний отступ содержимого от границ.
colback colback=<color> Цвет фона основной части.
colbacklower colbacklower=<color> Цвет фона нижней части (для bicolor).
colbacktitle colbacktitle=<color> Цвет фона заголовка.
colframe colframe=<color> Цвет рамки бокса.
collower collower=<color> Цвет текста в нижней части бокса.
color color color color=<name> Настройка цвета (внутренний ключ для управления цветами).
color command color command=<cmd> Команда для применения цвета.
color counter color counter=<ctr> Счетчик для генерации цветов.
color definition color definition={<code>} Определение нового цвета.
color environment color environment=<env> Окружение для применения цвета.
color fade color fade={<options>} Градиентная заливка фона.
color hyperlink color hyperlink={<options>} Цвет гиперссылок внутри бокса.
color key color key=<key> Ключ для доступа к цвету.
color length color length=<len> Длина цветового перехода.
color option color option={<opt>} Опции цвета.
color path color path={<path>} Путь TikZ для градиента.
color value color value=<val> Значение цвета (например, red!50).
coltext coltext=<color> Цвет основного текста.
coltitle coltitle=<color> Цвет текста заголовка.
colupper colupper=<color> Цвет текста в верхней части бокса.
comment comment={<text>} Добавляет комментарий внутри бокса.
comment above listing comment above listing={<text>} Комментарий над листингом кода.
comment above* listing comment above* listing={<text>} Комментарий над листингом (без форматирования).
comment and listing comment and listing={<text>} Комбинация комментария и листинга.
comment only comment only={<text>} Только комментарий (без листинга).
comment outside listing comment outside listing={<text>} Комментарий вне листинга (например, сбоку).
comment side listing comment side listing={<text>} Комментарий сбоку от листинга.
comment style comment style={<style>} Стиль оформления комментариев.
compilable listing compilable listing Листинг, который можно компилировать.
compress page compress page Сжимает страницу для экономии места.
ctan formatter ctan formatter={<code>} Форматирование для CTAN-документации.
default minted options default minted options={<opt>} Опции по умолчанию для пакета minted.
description color description color=<color> Цвет текста в описании.
description delimiters description delimiters={<left><right>} Разделители для описаний (например, скобки).
description delimiters none description delimiters none Убирает разделители описаний.
description delimiters parenthesis description delimiters parenthesis Использует круглые скобки для описаний.
description font description font={<font>} Шрифт для описаний.
description formatter description formatter={<code>} Функция форматирования описаний.
detach title detach title Отделяет заголовок от основного бокса.
do not store to box array do not store to box array Запрещает сохранение бокса в массив.
doc description doc description={<text>} Описание для документации.
doc head doc head={<text>} Заголовок раздела документации.
doc head command doc head command={<cmd>} Команда для заголовка документации.
doc head environment doc head environment={<env>} Окружение для заголовка документации.
doc head key doc head key={<key>} Ключ для заголовка документации.
doc head path doc head path={<path>} Путь TikZ для заголовка документации.
doc index doc index={<text>} Индекс для документации.
doc into index doc into index={<text>} Добавляет запись в индекс документации.
doc key prefix doc key prefix={<prefix>} Префикс для ключей документации.
doc keypath doc keypath={<path>} Путь к ключу документации.
doc label doc label={<label>} Метка для перекрестных ссылок.
doc left doc left={<text>} Текст слева в документации.
doc left indent doc left indent={<len>} Отступ слева в документации.
doc marginnote doc marginnote={<text>} Заметка на полях документации.
doc name doc name={<name>} Имя элемента документации.
doc new doc new Пометка нового элемента в документации.
doc new and updated doc new and updated Пометка нового и обновленного элемента.
doc no index doc no index Исключает элемент из индекса.
doc parameter doc parameter={<param>} Параметр для документации.
doc raster doc raster={<options>} Сетка (raster) для документации.
doc right doc right={<text>} Текст справа в документации.
doc right indent doc right indent={<len>} Отступ справа в документации.
doc sort index doc sort index={<key>} Ключ сортировки индекса.
doc updated doc updated Пометка обновленного элемента.
docexample docexample={<code>} Пример кода для документации.
documentation listing options documentation listing options={<opt>} Опции листинга в документации.
documentation listing style documentation listing style={<style>} Стиль листинга в документации.
documentation minted language documentation minted language={<lang>} Язык для minted в документации.
documentation minted options documentation minted options={<opt>} Опции minted для документации.
documentation minted style documentation minted style={<style>} Стиль minted для документации.
draft draft Черновой режим (упрощенное отображение).
draftmode draftmode Режим черновика с дополнительными опциями.
drop fuzzy midday shadow drop fuzzy midday shadow={<opt>} Размытая тень с эффектом “полдень”.
drop fuzzy shadow drop fuzzy shadow={<opt>} Размытая тень вокруг бокса.
drop large lifted shadow drop large lifted shadow={<opt>} Большая “приподнятая” тень.
drop lifted shadow drop lifted shadow={<opt>} Эффект приподнятого бокса с тенью.
drop midday shadow drop midday shadow={<opt>} Тень с акцентом на верхнюю границу.
drop shadow drop shadow={<opt>} Стандартная тень.
empty empty Полностью пустой бокс (без содержимого).
enforce breakable enforce breakable Принудительно разрешает разрыв бокса.
english language english language Устанавливает английский язык для текста.
enhanced enhanced Включает улучшенный режим рисования (с TikZ).
enhanced jigsaw enhanced jigsaw Режим “пазла” с закругленными углами.
enlarge bottom at break by enlarge bottom at break by=<len> Увеличивает нижний отступ при разрыве.
enlarge bottom by enlarge bottom by=<len> Увеличивает нижний отступ.
enlarge left by enlarge left by=<len> Увеличивает левый отступ.
enlarge right by enlarge right by=<len> Увеличивает правый отступ.
enlarge top at break by enlarge top at break by=<len> Увеличивает верхний отступ при разрыве.
enlarge top by enlarge top by=<len> Увеличивает верхний отступ.
enlargepage enlargepage Расширяет страницу для размещения бокса.
enlargepage flexible enlargepage flexible Гибкое расширение страницы.
environment lower environment lower={<env>} Окружение для нижней части бокса.
environment lower app environment lower app={<env>} Окружение для нижней части (для приложений).
environment lower args environment lower args={<args>} Аргументы для окружения нижней части.
environment lower args app environment lower args app={<args>} Аргументы окружения нижней части для приложений
environment lower args pre environment lower args pre={<args>} Аргументы окружения нижней части (предварительные)
environment lower pre environment lower pre={<env>} Окружение нижней части (предварительное)
environment title environment title={<env>} Окружение для заголовка
environment title app environment title app={<env>} Окружение заголовка для приложений
environment title args environment title args={<args>} Аргументы окружения заголовка
environment title args app environment title args app={<args>} Аргументы окружения заголовка для приложений
environment title args pre environment title args pre={<args>} Аргументы окружения заголовка (предварительные)
environment title pre environment title pre={<env>} Окружение заголовка (предварительное)
environment upper environment upper={<env>} Окружение верхней части
environment upper app environment upper app={<env>} Окружение верхней части для приложений
environment upper args environment upper args={<args>} Аргументы окружения верхней части
environment upper args app environment upper args app={<args>} Аргументы окружения верхней части для приложений
environment upper args pre environment upper args pre={<args>} Аргументы окружения верхней части (предварительные)
environment upper pre environment upper pre={<env>} Окружение верхней части (предварительное)
equal height group equal height group=<name> Группа боксов с одинаковой высотой
every box every box={<options>} Стиль для всех боксов
every box on higher layers every box on higher layers={<options>} Стиль для боксов на верхних слоях
every box on layer n every box on layer n={<options>} Стиль для боксов на конкретном слое
every float every float={<options>} Стиль для плавающих боксов
every listing line every listing line={<options>} Стиль для каждой строки листинга
every listing line* every listing line*={<options>} Альтернативный стиль строк листинга
extend freelance extend freelance={<options>} Расширение freelance-стиля
extend freelancefirst extend freelancefirst={<options>} Расширение для первого freelance-бокса
extend freelancelast extend freelancelast={<options>} Расширение для последнего freelance-бокса
extend freelancemiddle extend freelancemiddle={<options>} Расширение для средних freelance-боксов
external external={<options>} Внешнее содержимое бокса
externalize example externalize example Внешний пример (без форсирования)
externalize example! externalize example! Внешний пример (с форсированием)
externalize listing externalize listing Внешний листинг (без форсирования)
externalize listing! externalize listing! Внешний листинг (с форсированием)
extras extras={<options>} Дополнительные стили
extras broken extras broken={<options>} Стили для разорванного бокса
extras broken pre extras broken pre={<options>} Предварительные стили для разорванного бокса
extras first extras first={<options>} Стили для первой части
extras first and middle extras first and middle={<options>} Стили для первой и средней частей
extras first and middle pre extras first and middle pre={<options>} Предварительные стили для первой и средней частей
extras first pre extras first pre={<options>} Предварительные стили для первой части
extras last extras last={<options>} Стили для последней части
extras last pre extras last pre={<options>} Предварительные стили для последней части
extras middle extras middle={<options>} Стили для средней части
extras middle and last extras middle and last={<options>} Стили для средней и последней частей
extras middle and last pre extras middle and last pre={<options>} Предварительные стили для средней и последней частей
extras middle pre extras middle pre={<options>} Предварительные стили для средней части
extras pre extras pre={<options>} Предварительные дополнительные стили
extras title after break extras title after break={<options>} Стили заголовка после разрыва
extras unbroken extras unbroken={<options>} Стили для неразорванного бокса
extras unbroken and first extras unbroken and first={<options>} Стили для неразорванного и первого бокса
extras unbroken and first pre extras unbroken and first pre={<options>} Предварительные стили для неразорванного и первого бокса
extras unbroken and last extras unbroken and last={<options>} Стили для неразорванного и последнего бокса
extras unbroken and last pre extras unbroken and last pre={<options>} Предварительные стили для неразорванного и последнего бокса
extras unbroken pre extras unbroken pre={<options>} Предварительные стили для неразорванного бокса
extrude bottom by extrude bottom by=<length> Выступ снизу бокса
extrude by extrude by=<length> Выступ со всех сторон
extrude left by extrude left by=<length> Выступ слева
extrude right by extrude right by=<length> Выступ справа
extrude top by extrude top by=<length> Выступ сверху
fill downwards fill downwards Заполнение содержимого сверху вниз
finish finish={<options>} Завершающие стили
finish broken finish broken={<options>} Завершающие стили для разорванного бокса
finish broken pre finish broken pre={<options>} Предварительные завершающие стили для разорванного бокса
finish fading vignette finish fading vignette={<options>} Завершение fading vignette-эффекта
finish first finish first={<options>} Завершающие стили для первой части
finish first and middle finish first and middle={<options>} Завершающие стили для первой и средней частей
finish first and middle pre finish first and middle pre={<options>} Предварительные завершающие стили для первой и средней частей
finish first pre finish first pre={<options>} Предварительные завершающие стили для первой части
finish last finish last={<options>} Завершающие стили для последней части
finish last pre finish last pre={<options>} Предварительные завершающие стили для последней части
finish middle finish middle={<options>} Завершающие стили для средней части
finish middle and last finish middle and last={<options>} Завершающие стили для средней и последней частей
finish middle and last pre finish middle and last pre={<options>} Предварительные завершающие стили для средней и последней частей
finish middle pre finish middle pre={<options>} Предварительные завершающие стили для средней части
finish pre finish pre={<options>} Предварительные завершающие стили
finish raised fading vignette finish raised fading vignette={<options>} Завершение raised fading vignette-эффекта
finish unbroken finish unbroken={<options>} Завершающие стили для неразорванного бокса
finish unbroken and first finish unbroken and first={<options>} Завершающие стили для неразорванного и первого бокса
finish unbroken and first pre finish unbroken and first pre={<options>} Предварительные завершающие стили для неразорванного и первого бокса
finish unbroken and last finish unbroken and last={<options>} Завершающие стили для неразорванного и последнего бокса
finish unbroken and last pre finish unbroken and last pre={<options>} Предварительные завершающие стили для неразорванного и последнего бокса
finish unbroken pre finish unbroken pre={<options>} Предварительные завершающие стили для неразорванного бокса
finish vignette finish vignette={<options>} Завершение vignette-эффекта
fit fit={<options>} Подгонка размера содержимого
fit algorithm fit algorithm=<name> Алгоритм подгонки
fit basedim fit basedim=<length> Базовый размер для подгонки
fit fontsize macros fit fontsize macros={<names>} Макросы размера шрифта для подгонки
fit height from fit height from={<code>} Вычисление высоты из кода
fit height plus fit height plus={<length>} Дополнительная высота при подгонке
fit maxfontdiff fit maxfontdiff=<value> Максимальная разница шрифтов
fit maxfontdiffgap fit maxfontdiffgap=<value> Максимальный промежуток разницы шрифтов
fit maxstep fit maxstep=<value> Максимальное количество шагов
fit maxwidthdiff fit maxwidthdiff=<value> Максимальная разница ширины
fit maxwidthdiffgap fit maxwidthdiffgap=<value> Максимальный промежуток разницы ширины
fit skip fit skip={<options>} Пропуск элементов при подгонке
fit to fit to={<dimensions>} Подгонка к указанным размерам
fit to height fit to height={<height>} Подгонка по высоте
fit warning fit warning={<options>} Предупреждения при подгонке
fit width from fit width from={<code>} Вычисление ширины из кода
fit width plus fit width plus={<length>} Дополнительная ширина при подгонке
flip title flip title Переворот заголовка
float float Плавающий бокс
float* float* Альтернативный плавающий бокс
floatplacement floatplacement={<placement>} Позиционирование плавающего бокса
flush left flush left Выравнивание по левому краю
flush right flush right Выравнивание по правому краю
flushleft lower flushleft lower Выравнивание нижней части по левому краю
flushleft title flushleft title Выравнивание заголовка по левому краю
flushleft upper flushleft upper Выравнивание верхней части по левому краю
flushright lower flushright lower Выравнивание нижней части по правому краю
flushright title flushright title Выравнивание заголовка по правому краю
flushright upper flushright upper Выравнивание верхней части по правому краю
fontlower fontlower={<font>} Шрифт нижней части
fonttitle fonttitle={<font>} Шрифт заголовка
fontupper fontupper={<font>} Шрифт верхней части
force nobeforeafter force nobeforeafter Принудительное отключение before/after
frame code frame code={<code>} Пользовательский код рамки
frame code app frame code app={<code>} Код рамки для приложений
frame code pre frame code pre={<code>} Предварительный код рамки
frame empty frame empty Пустая рамка
frame engine frame engine=<name> Движок отрисовки рамки
frame hidden frame hidden Скрытая рамка
frame style frame style={<style>} Стиль рамки
frame style image frame style image={<image>} Стиль рамки с изображением
frame style tile frame style tile={<options>} Стиль рамки с плиткой
freelance freelance={<options>} Freelance-стиль
freeze extension freeze extension={<ext>} Расширение для замороженных файлов
freeze file freeze file={<name>} Имя замороженного файла
freeze jpg freeze jpg Заморозка в JPG
freeze none freeze none Без заморозки
freeze pdf freeze pdf Заморозка в PDF
freeze png freeze png Заморозка в PNG
fuzzy halo fuzzy halo={<options>} Размытое гало
fuzzy shadow fuzzy shadow={<options>} Размытая тень
geometry nodes geometry nodes={<names>} Геометрические узлы
graphics directory graphics directory={<path>} Директория с графикой
graphics options graphics options={<options>} Опции графики
graphics orientation graphics orientation={<angle>} Ориентация графики
graphics pages graphics pages={<range>} Страницы графики
grow sidewards by grow sidewards by={<length>} Рост вбок
grow to left by grow to left by={<length>} Рост влево
grow to right by grow to right by={<length>} Рост вправо
halign halign=<alignment> Горизонтальное выравнивание
halign code halign code={<code>} Код горизонтального выравнивания
halign lower halign lower=<alignment> Выравнивание нижней части
halign lower code halign lower code={<code>} Код выравнивания нижней части
halign title halign title=<alignment> Выравнивание заголовка
halign title code halign title code={<code>} Код выравнивания заголовка
halign upper halign upper=<alignment> Выравнивание верхней части
halign upper code halign upper code={<code>} Код выравнивания верхней части
halo halo={<options>} Эффект гало
hbox hbox Горизонтальная коробка
hbox boxed title hbox boxed title Горизонтальная коробка заголовка
height height={<length>} Фиксированная высота
height fill height fill Заполнение высоты
height fixed for height fixed for={<name>} Фиксированная высота для группы
height from height from={<code>} Высота из кода
height plus height plus={<length>} Дополнительная высота
hide hide Скрытый бокс
highlight math highlight math Подсветка математики
highlight math style highlight math style={<style>} Стиль подсветки математики
hyperlink hyperlink={<name>} Гиперссылка
hyperlink interior hyperlink interior={<name>} Гиперссылка на внутреннюю часть
hyperlink node hyperlink node={<name>} Гиперссылка на узел
hyperlink title hyperlink title={<name>} Гиперссылка на заголовок
hyperref hyperref={<options>} Настройки hyperref
hyperref interior hyperref interior={<options>} Hyperref для внутренней части
hyperref node hyperref node={<options>} Hyperref для узла
hyperref title hyperref title={<options>} Hyperref для заголовка
hypertarget hypertarget={<name>} Цель гиперссылки
hyperurl hyperurl={<url>} Гиперссылка-URL
hyperurl interior hyperurl interior={<url>} URL для внутренней части
hyperurl node hyperurl node={<url>} URL для узла
hyperurl title hyperurl title={<url>} URL для заголовка
hyperurl* hyperurl*={<url>} Альтернативный гиперurl
hyperurl* interior hyperurl* interior={<url>} Альтернативный URL для внутренней части
hyperurl* node hyperurl* node={<url>} Альтернативный URL для узла
hyperurl* title hyperurl* title={<url>} Альтернативный URL для заголовка
hyphenationfix hyphenationfix Исправление переносов
if odd page if odd page={<code>} Условие для нечетной страницы
if odd page or oneside if odd page or oneside={<code>} Условие для нечетной/односторонней страницы
if odd page or oneside* if odd page or oneside*={<code>} Альтернативное условие
if odd page* if odd page*={<code>} Альтернативное условие нечетной страницы
IfBlankF IfBlankF={<arg>}{<code>} Условный код если аргумент пуст (ложь)
IfBlankT IfBlankT={<arg>}{<code>} Условный код если аргумент пуст (истина)
IfBlankTF IfBlankTF={<arg>}{<if>}{<else>} Полное условие для пустого аргумента
IfBooleanF IfBooleanF={<arg>}{<code>} Условие для булева значения (ложь)
IfBooleanT IfBooleanT={<arg>}{<code>} Условие для булева значения (истина)
IfBooleanTF IfBooleanTF={<arg>}{<if>}{<else>} Полное булево условие
IfEmptyF IfEmptyF={<arg>}{<code>} Условие для пустого значения (ложь)
IfEmptyT IfEmptyT={<arg>}{<code>} Условие для пустого значения (истина)
IfEmptyTF IfEmptyTF={<arg>}{<if>}{<else>} Полное условие для пустого значения
IfNoValueF IfNoValueF={<arg>}{<code>} Условие если нет значения (ложь)
IfNoValueT IfNoValueT={<arg>}{<code>} Условие если нет значения (истина)
IfNoValueTF IfNoValueTF={<arg>}{<if>}{<else>} Полное условие для отсутствия значения
IfValueF IfValueF={<arg>}{<code>} Условие если есть значение (ложь)
IfValueT IfValueT={<arg>}{<code>} Условие если есть значение (истина)
IfValueTF IfValueTF={<arg>}{<if>}{<else>} Полное условие для наличия значения
ignore nobreak ignore nobreak Игнорирование запрета разрыва
image comment image comment={<text>} Комментарий к изображению
index index={<entry>} Запись в индекс
index actual index actual={<options>} Фактические настройки индекса
index annotate index annotate={<options>} Аннотации индекса
index colorize index colorize={<options>} Раскрашивание индекса
index command index command={<cmd>} Команда индекса
index command name index command name={<name>} Имя команды индекса
index default settings index default settings Настройки индекса по умолчанию
index format index format={<format>} Формат индекса
index gather all index gather all Сбор всех элементов в индекс
index gather colors index gather colors Сбор цветов в индекс
index gather commands index gather commands Сбор команд в индекс
index gather counters index gather counters Сбор счетчиков в индекс
index gather environments index gather environments Сбор окружений в индекс
index gather keys index gather keys Сбор ключей в индекс
index gather lengths index gather lengths Сбор длин в индекс
index gather none index gather none Отключение сбора в индекс
index gather paths index gather paths Сбор путей в индекс
index gather values index gather values Сбор значений в индекс
index german settings index german settings Немецкие настройки индекса
index key formatter index key formatter={<formatter>} Форматирование ключей индекса
index keys formatter index keys formatter={<formatter>} Форматирование нескольких ключей
index level index level={<level>} Уровень индекса
index quote index quote={<text>} Цитата в индексе
index* index*={<entry>} Альтернативная запись в индекс
inherit height inherit height Наследование высоты
interior code interior code={<code>} Пользовательский код внутренней части
interior code app interior code app={<code>} Код внутренней части для приложений
interior code pre interior code pre={<code>} Предварительный код внутренней части
interior empty interior empty Пустая внутренняя часть
interior engine interior engine={<name>} Движок внутренней части
interior hidden interior hidden Скрытая внутренняя часть
interior style interior style={<style>} Стиль внутренней части
interior style image interior style image={<image>} Стиль внутренней части с изображением
interior style tile interior style tile={<options>} Стиль внутренней части с плиткой
interior titled code interior titled code={<code>} Код внутренней части с заголовком
interior titled code app interior titled code app={<code>} Код внутренней части с заголовком для приложений
interior titled code pre interior titled code pre={<code>} Предварительный код внутренней части с заголовком
interior titled empty interior titled empty Пустая внутренняя часть с заголовком
interior titled engine interior titled engine=<name> Движок для внутренней части с заголовком
invisible invisible Делает бокс полностью невидимым (но сохраняет содержимое)
keywords bold keywords bold Выделение ключевых слов жирным шрифтом в документации
label label=<text> Метка для перекрестных ссылок
label is label label is label Использовать стандартные метки LaTeX
label is zlabel label is zlabel Использовать zref-метки
label separator label separator=<text> Разделитель между меткой и текстом
label type label type=<type> Тип метки (например, ’tcb@label')
left left=<length> Отступ слева для основного содержимого
left skip left skip=<length> Горизонтальный отступ слева
left* left*=<length> Альтернативный отступ слева
lefthand ratio lefthand ratio=<value> Соотношение для левой части (в split боксах)
lefthand width lefthand width=<length> Ширина левой части (в split боксах)
leftlower leftlower=<length> Отступ слева для нижней части
leftright skip leftright skip=<length> Одновременный отступ слева и справа
leftrule leftrule=<length> Толщина левой границы
lefttitle lefttitle=<length> Отступ слева для заголовка
leftupper leftupper=<length> Отступ слева для верхней части
lifted shadow lifted shadow={<options>} Эффект “приподнятой” тени
lines before break lines before break=<number> Минимальное количество строк перед разрывом
list entry list entry=<text> Запись для списка (оглавления)
list text list text=<text> Текст для списка
listing above comment listing above comment={<text>} Листинг с комментарием сверху
listing above text listing above text={<text>} Листинг с текстом сверху
listing and comment listing and comment={<text>} Комбинация листинга и комментария
listing engine listing engine=<name> Движок для обработки листингов
listing file listing file={<filename>} Файл с кодом для листинга
listing inputencoding listing inputencoding=<encoding> Кодировка входного файла листинга
listing only listing only Только листинг (без дополнительного текста)
listing options listing options={<options>} Опции для листинга
listing remove caption listing remove caption Удаление подписи у листинга
listing side comment listing side comment={<text>} Листинг с боковым комментарием
listing side text listing side text={<text>} Листинг с боковым текстом
listing style listing style={<style>} Стиль оформления листинга
listing utf8 listing utf8 Использование UTF-8 для листинга
lower separated lower separated Разделение нижней части визуальной линией
lowerbox lowerbox Обработка нижней части как бокса
marker marker={<options>} Маркеры для оформления
math math Математический режим в основном содержимом
math lower math lower Математический режим в нижней части
math upper math upper Математический режим в верхней части
middle middle=<length> Вертикальное выравнивание по середине
minipage minipage Обработка содержимого как minipage
minipage boxed title minipage boxed title Заголовок как minipage
minted language minted language={<lang>} Язык для пакета minted
minted options minted options={<options>} Опции для minted
minted style minted style={<style>} Стиль для minted
move upwards move upwards=<length> Сдвиг содержимого вверх
nameref nameref Использование nameref для ссылок
natural height natural height Естественная высота содержимого
no borderline no borderline Удаление дополнительных границ
no boxed title style no boxed title style Отключение стиля для заголовка в рамке
no extras no extras Отключение дополнительных стилей
no finish no finish Отключение завершающих стилей
no label type no label type Отключение специального типа метки
no listing options no listing options Отключение опций листинга
no overlay no overlay Отключение наложений
no shadow no shadow Отключение теней
no underlay no underlay Отключение подложек
no watermark no watermark Отключение водяных знаков
nobeforeafter nobeforeafter Отключение отступов before/after
nofloat nofloat Запрет плавающего размещения
noparskip noparskip Отключение parskip
notitle notitle Отключение заголовка
octogon arc octogon arc Восьмиугольная форма углов
on line on line Размещение в строке текста
only only={<options>} Условное отображение содержимого
opacityback opacityback=<value> Прозрачность фона
opacitybacktitle opacitybacktitle=<value> Прозрачность фона заголовка
opacityframe opacityframe=<value> Прозрачность рамки
opacitytext opacitytext=<value> Прозрачность текста
outer arc outer arc Скругление внешних углов
overlay overlay={<code>} Наложение TikZ-кода
oversize oversize Разрешение содержимому выходить за границы
pad at break pad at break=<length> Заполнение при разрыве
page ref formatter page ref formatter={<code>} Форматирование ссылок на страницы
parbox parbox Обработка содержимого как parbox
parskip parskip Использование parskip между абзацами
phantom phantom Невидимый бокс, занимающий место
process code process code={<code>} Обработка кода перед вставкой
raster columns raster columns=<number> Количество колонок в сетке
raster equal height raster equal height Выравнивание высоты элементов сетки
raster rows raster rows=<number> Количество строк в сетке
record record Запись параметров бокса
right right=<length> Отступ справа для основного содержимого
right skip right skip=<length> Горизонтальный отступ справа
rightrule rightrule=<length> Толщина правой границы
rotate rotate=<angle> Вращение бокса
rounded corners rounded corners=<length> Скругление углов
run pdflatex run pdflatex Запуск pdflatex для обработки содержимого
savedelimiter savedelimiter={<text>} Сохранение разделителя
saveto saveto={<filename>} Сохранение содержимого в файл
scale scale=<factor> Масштабирование содержимого
segmentation at break segmentation at break Разделитель при разрыве
segmentation code segmentation code={<code>} Пользовательский код разделителя
segmentation style segmentation style={<style>} Стиль линии-разделителя между верхней и нижней частями
separator sign separator sign={<char>} Символ-разделитель в описаниях
separator sign colon separator sign colon Использование двоеточия как разделителя
separator sign dash separator sign dash Использование тире как разделителя
separator sign none separator sign none Отсутствие разделителя
set alt set alt={<text>} Установка альтернативного текста
set temporal set temporal={<text>} Временная установка значения
shadow shadow={<options>} Настройка тени вокруг бокса
sharp corners sharp corners Острые углы (без скругления)
sharpish corners sharpish corners Слегка скругленные углы
shield externalize shield externalize Защита от externalize
short title short title={<text>} Краткий вариант заголовка
show bounding box show bounding box Отображение ограничивающей рамки
shrink break goal shrink break goal={<length>} Целевое значение сжатия при разрыве
shrink tight shrink tight Плотное сжатие содержимого
sidebyside sidebyside Размещение содержимого бок о бок
sidebyside align sidebyside align={<option>} Выравнивание side-by-side содержимого
sidebyside gap sidebyside gap={<length>} Зазор между side-by-side элементами
sidebyside switch sidebyside switch Переключение порядка side-by-side
size size={<option>} Размер бокса (normal, small, etc.)
skin skin={<name>} Скин для оформления бокса
skin first skin first={<name>} Скин для первого бокса в группе
skin last skin last={<name>} Скин для последнего бокса в группе
skin middle skin middle={<name>} Скин для средних боксов в группе
smart shadow arc smart shadow arc Умное скругление теней
space space={<length>} Вертикальный промежуток
space to space to={<length>} Гибкий вертикальный промежуток
space to lower space to lower={<length>} Промежуток до нижней части
space to upper space to upper={<length>} Промежуток до верхней части
spartan spartan Минималистичный стиль оформления
split split={<options>} Разделение бокса на части
spread spread Равномерное распределение пространства
spread downwards spread downwards Распределение вниз
spread inwards spread inwards Распределение внутрь
spread outwards spread outwards Распределение наружу
spread upwards spread upwards Распределение вверх
square square Квадратная форма бокса
squeezed title squeezed title Сжатый заголовок
standard standard Стандартный стиль оформления
standard jigsaw standard jigsaw Стандартный стиль с “пазлами”
step step={<counter>} Шаг нумерации
step and label step and label Автоматическая нумерация и метка
store to box array store to box array={<name>} Сохранение в массив боксов
subtitle style subtitle style={<style>} Стиль подзаголовка
tabularx tabularx Использование tabularx внутри
tcbimage comment tcbimage comment={<text>} Комментарий к изображению
tcbox raise tcbox raise={<length>} Поднятие бокса
tempfile tempfile Использование временного файла
temporal temporal={<text>} Временное значение
terminator sign terminator sign={<char>} Конечный символ в описаниях
text above listing text above listing={<text>} Текст над листингом
text and listing text and listing Комбинация текста и листинга
text fill text fill Заполнение текстом
text height text height={<length>} Высота текстовой области
text width text width={<length>} Ширина текстовой области
theorem theorem Стиль для теорем
theorem label supplement theorem label supplement={<text>} Дополнение к метке теоремы
theorem style theorem style={<name>} Стиль оформления теоремы
tikz tikz={<options>} Опции TikZ
tikz lower tikz lower={<options>} TikZ для нижней части
tikz upper tikz upper={<options>} TikZ для верхней части
tikznode tikznode Обработка как TikZ-узел
tile tile Плиточное оформление фона
title title={<text>} Заголовок бокса
title after break title after break={<text>} Заголовок после разрыва
title style title style={<style>} Стиль заголовка
titlerule titlerule={<length>} Линия под заголовком
toggle enlargement toggle enlargement Переключение увеличения
toggle left and right toggle left and right Переключение левого/правого
top top={<length>} Отступ сверху
toprule toprule={<length>} Верхняя граница
unbreakable unbreakable Запрет разрыва бокса
underlay underlay={<code>} Подложка (TikZ-код под содержимым)
underlay boxed title underlay boxed title={<code>} Подложка для заголовка
underlay first underlay first={<code>} Подложка для первой части
underlay last underlay last={<code>} Подложка для последней части
underlay middle underlay middle={<code>} Подложка для средней части
underlay vignette underlay vignette={<options>} Виньетка в качестве подложки
upperbox upperbox Обработка верхней части как бокса
use alt use alt Использование альтернативного текста
use color stack use color stack Использование стека цветов
valign valign={<option>} Вертикальное выравнивание
varwidth upper varwidth upper Переменная ширина верхней части
verbatim verbatim Режим verbatim
visible visible Видимый бокс (антоним invisible)
watermark graphics watermark graphics={<file>} Водяной знак из изображения
watermark opacity watermark opacity={<value>} Прозрачность водяного знака
watermark text watermark text={<text>} Текстовый водяной знак
watermark tikz watermark tikz={<code>} Водяной знак TikZ
width width={<length>} Ширина бокса

Основные ключи оформления заголовка (/tcb/boxtitle/)

Ключ Синтаксис Назначение
xshift xshift=<length> Горизонтальное смещение заголовка
yshift yshift=<length> Вертикальное смещение заголовка
yshift* yshift*=<length> Альтернативное вертикальное смещение
yshifttext yshifttext=<length> Смещение текста заголовка

Ключи документации (/tcb/doclang/)

Ключ Синтаксис Назначение
color color={<name>} Цвет для документации
commands commands={<list>} Список команд
counter counter={<name>} Счетчик для документации
environment environment={<name>} Окружение для документации
index index={<options>} Настройки индекса
key key={<name>} Ключ документации
length length={<name>} Длина для документации
new new Пометка нового элемента
path path={<name>} Путь для документации
updated updated Пометка обновленного элемента
value value={<val>} Значение для документации

Ключи внешнего контента (/tcb/external/)

Ключ Синтаксис Назначение
- - Стандартный режим externalize
! ! Форсированный режим externalize
compiler compiler={<name>} Компилятор для внешних файлов
environment environment={<name>} Окружение для внешнего контента
externalize externalize Активация externalize
name name={<base>} Базовое имя для файлов
preamble preamble={<code>} Преамбула для внешних файлов
prefix prefix={<text>} Префикс для имен файлов
runner runner={<command>} Команда для запуска
safety safety={<options>} Настройки безопасности

Библиотеки (/tcb/library/)

Ключ Назначение
all Все библиотеки
breakable Поддержка разрывов
documentation Документационные стили
external Внешний контент
fitting Автоподгонка размеров
listings Поддержка листингов
minted Интеграция с Minted
raster Сеточная компоновка
skins Дополнительные скины
theorems Стили для теорем

Ключи постеров (/tcb/poster/)

Ключ Синтаксис Назначение
colspacing colspacing=<length> Расстояние между колонками
columns columns=<number> Количество колонок
height height=<length> Высота постера
rowspacing rowspacing=<length> Расстояние между строками
showframe showframe Показать рамки
width width=<length> Ширина постера

Ключи виньетирования (/tcb/vig/)

Ключ Синтаксис Назначение
base color base color={<color>} Базовый цвет виньетки
east size east size=<length> Размер восточной части
fade in fade in={<options>} Эффект плавного появления
lower left corner lower left corner={<coord>} Левый нижний угол
size size={<length>} Общий размер
upper right corner upper right corner={<coord>} Правый верхний угол

Интеграция с TikZ (/tikz/)

Ключ Синтаксис Назначение
tcb fill frame tcb fill frame={<color>} Заливка рамки
tcb fill interior tcb fill interior={<color>} Заливка внутренней части
tcb fill title tcb fill title={<color>} Заливка заголовка

Особенности:

  1. Группы ключей организованы по функциональности (заголовки, документация, внешний контент и т.д.)
  2. Виньетки (/tcb/vig/) предоставляют сложные эффекты затемнения/осветления углов
  3. Постеры (/tcb/poster/) позволяют создавать сложные сеточные компоновки
  4. Интеграция с TikZ дает полный контроль над графическими элементами

Каждая группа ключей решает специфические задачи, от базового позиционирования до сложных эффектов оформления.

1.2 - Команды для Title

Управляет параметрами заголовка в боксах
Команда Полный синтаксис Описание и назначение
title /tcb/title=⟨text⟩ Создает заголовок с указанным текстом.
notitle /tcb/notitle Удаляет строку заголовка, если установлено.
adjusted title /tcb/adjusted title=⟨text⟩ Создает заголовок с автоматической подгонкой высоты под текст (полезно для выравнивания высоты боксов в группе).
adjust text /tcb/adjust text=⟨text⟩ Устанавливает эталонный текст для подгонки высоты в adjusted title.
squeezed title /tcb/squeezed title=⟨text⟩ Создает заголовок, сжимая текст, если он не помещается в доступное пространство.
squeezed title* /tcb/squeezed title*=⟨text⟩ Комбинация adjusted title и squeezed title (подгонка высоты и сжатие текста).
titlebox /tcb/titlebox=⟨mode⟩ Управляет отображением заголовка (visible — стандартное отображение, invisible — скрывает текст, оставляя пустое место).
detach title /tcb/detach title Отделяет заголовок от стандартной позиции, сохраняя его в \tcbtitletext и \tcbtitle.
attach title /tcb/attach title Возвращает заголовок в стандартную позицию (отменяет detach title).
attach title to upper /tcb/attach title to upper=⟨text⟩ Прикрепляет заголовок к началу верхней части содержимого бокса (с дополнительным текстом между заголовком и содержимым).
\tcbset{colback=White,arc=0mm,width=(\linewidth-4pt)/4,
equal height group=AT,before=,after=\hfill,fonttitle=\bfseries}
The following titles are not adjusted:\\
\foreach \n in {xxx,ggg,AAA,\"Agypten}
{\begin{tcolorbox}[title=\n,colframe=red!75!black]

Some content.\end{tcolorbox}}
Now, we try again with adjusted titles:\\
\foreach \n in {xxx,ggg,AAA,\"Agypten}
{\begin{tcolorbox}[adjusted title=\n,colframe=blue!75!black]
Some content.\end{tcolorbox}}

1.3 - Команды для SubTitle

Управляет параметрами подзаголовка в боксах

Таблица команд для управления Subtitle в пакете tcolorbox

Команда Полный синтаксис Описание и назначение
\tcbsubtitle \tcbsubtitle[⟨options⟩]{⟨text⟩} Добавляет подзаголовок внутри tcolorbox. Наследует стили родительского бокса, но может быть дополнительно настроен через ⟨options⟩.
subtitle style /tcb/subtitle style=⟨options⟩ Задает стиль для всех подзаголовков (\tcbsubtitle) внутри бокса. Позволяет централизованно настроить оформление.

Примеры использования

1. Базовый подзаголовок

\begin{tcolorbox}[title=Основной заголовок, colback=blue!5!white, colframe=blue!75!black]
   Основное содержимое.
   \tcbsubtitle{Первый подзаголовок}
   Текст под первым подзаголовком.
   \tcbsubtitle{Второй подзаголовок}
   Текст под вторым подзаголовком.
\end{tcolorbox}

2. Настройка стиля подзаголовков

\begin{tcolorbox}[
   title=Пример с subtitle style,
   colback=green!5!white,
   colframe=green!75!black,
   subtitle style={
      colback=yellow!20!white,
      colframe=red!50!black,
      fontupper=\bfseries,
      boxrule=1pt
   }
]
   Основной текст.
   \tcbsubtitle{Настроенный подзаголовок}
   Текст с кастомным оформлением.
\end{tcolorbox}

3. Локальная переопределение через ⟨options⟩

\begin{tcolorbox}[title=Локальные настройки, colback=purple!5!white]
   \tcbsubtitle[colback=orange!30!white, before skip=10pt]{Особый подзаголовок}
   Текст с увеличенным отступом сверху и оранжевым фоном.
\end{tcolorbox}

1.4 - Команды для Part

Управляет параметрами разделенных частей в боксах

Таблица команд для управления частями (Upper/Lower Part) в пакете tcolorbox

Команда Полный синтаксис Описание и назначение
upperbox /tcb/upperbox=⟨mode⟩ Управляет отображением верхней части бокса. Допустимые значения: visible (стандартное отображение), invisible (скрывает содержимое).
lowerbox /tcb/lowerbox=⟨mode⟩ Управляет отображением нижней части (после \tcblower). Аналогично upperbox.
visible /tcb/visible Сокращение для upperbox=visible, lowerbox=visible, titlebox=visible.
invisible /tcb/invisible Сокращение для upperbox=invisible, lowerbox=invisible, titlebox=invisible.
saveto /tcb/saveto=⟨file name⟩ Сохраняет весь контент бокса (включая нижнюю часть, если есть) в указанный файл. Несовместимо с savelowerto/redirectlowerto.
savelowerto /tcb/savelowerto=⟨file name⟩ Сохраняет только нижнюю часть (после \tcblower) в файл.
redirectlowerto /tcb/redirectlowerto=⟨file name⟩ Перенаправляет нижнюю часть в файл (без отображения в документе).

Примеры использования

1. Управление видимостью частей

\begin{tcolorbox}[upperbox=invisible, colback=white]
  Этот текст не виден (верхняя часть скрыта).
\end{tcolorbox}

\begin{tcolorbox}[lowerbox=invisible, colback=white]
  Виден только верх.
  \tcblower
  Нижняя часть скрыта.
\end{tcolorbox}

Результат:

  • Первый бокс: пустое пространство (верх скрыт).
  • Второй бокс: отображается только текст до \tcblower.

2. Сокращенные команды visible/invisible

\begin{tcolorbox}[invisible, title=Скрытый бокс]
  Весь контент (включая заголовок) не виден.
  \tcblower
  Нижняя часть тоже скрыта.
\end{tcolorbox}

Результат: Пустое место (все части скрыты).


3. Сохранение контента в файл

\begin{tcolorbox}[saveto=mybox.tex, title=Сохраненный бокс]
  Верхняя часть.
  \tcblower
  Нижняя часть.
\end{tcolorbox}

Загружаем сохраненное: 
\input{mybox.tex}

Результат:

  • В документе отображается оригинальный бокс.
  • Содержимое сохранено в mybox.tex и может быть повторно загружено через \input.

4. Работа с нижней частью

\begin{tcolorbox}[savelowerto=lower.tex]
  Верхняя часть (отображается).
  \tcblower
  Нижняя часть (сохраняется в файл).
\end{tcolorbox}

Результат:

  • В документе видна только верхняя часть.
  • Нижняя часть сохранена в lower.tex.

Важные нюансы:

  1. Разделение частей:

    • Верхняя часть обязательна, нижняя — опциональна (активируется \tcblower).
    • Без \tcblower весь контент считается верхней частью.
  2. Совместимость:

    • saveto нельзя использовать с savelowerto или redirectlowerto.
  3. Применение:

    • invisible полезен для скрытия контента (например, при сохранении в файл без отображения).
    • savelowerto удобен для извлечения доп. материалов (решений задач, примечаний).

1.5 - Команды для Lower Part

Управляет параметрами нижней части lower part в боксах

Таблица команд для управления нижней частью (Lower Part) в пакете tcolorbox

Команда Полный синтаксис Описание и назначение
lowerbox /tcb/lowerbox=⟨mode⟩ Управляет отображением нижней части. Допустимые значения: visible (стандартное отображение), invisible (скрывает содержимое, оставляя пустое место), ignored (полностью игнорирует нижнюю часть).
savelowerto /tcb/savelowerto=⟨file name⟩ Сохраняет содержимое нижней части в указанный файл для последующего использования. Несовместимо с saveto.
redirectlowerto /tcb/redirectlowerto=⟨file name⟩ Комбинация savelowerto и lowerbox=ignored. Сохраняет нижнюю часть в файл, но не отображает её в документе. Полезно для работы с счётчиками.
lower separated `/tcb/lower separated=true false(по умолчаниюtrue`)
savedelimiter /tcb/savedelimiter=⟨name⟩ Используется при создании новых окружений на основе tcolorbox для корректной работы с savelowerto или redirectlowerto. ⟨name⟩ должно совпадать с именем нового окружения.

Примеры использования

1. Управление видимостью нижней части

\begin{tcolorbox}[lowerbox=invisible, colback=white]
  Верхняя часть (видна).
  \tcblower
  Нижняя часть (скрыта, но место остаётся).
\end{tcolorbox}

\begin{tcolorbox}[lowerbox=ignored, colback=white]
  Верхняя часть (видна).
  \tcblower
  Нижняя часть (полностью игнорируется).
\end{tcolorbox}

Результат:

  • Первый бокс: нижняя часть скрыта, но занимает место.
  • Второй бокс: нижняя часть отсутствует.

2. Сохранение нижней части в файл

\begin{tcolorbox}[savelowerto=lower_content.tex, lowerbox=invisible]
  Верхняя часть.
  \tcblower
  Нижняя часть (сохранена в файл).
\end{tcolorbox}

Загружаем сохранённое: 
\input{lower_content.tex}

Результат:

  • В документе отображается только верхняя часть.
  • Нижняя часть сохранена в lower_content.tex и может быть загружена через \input.

3. Перенаправление нижней части без отображения

\setcounter{enumi}{1}
Значение счётчика: \theenumi

\begin{tcolorbox}[redirectlowerto=counter_example.tex]
  Верхняя часть.
  \tcblower
  Нижняя часть. \stepcounter{enumi} Новое значение: \theenumi.
\end{tcolorbox}

Загружаем: 
\input{counter_example.tex}

Результат:

  • В документе: отображается только верхняя часть, счётчик не изменён.
  • В файле counter_example.tex: сохранён текст нижней части с обновлённым счётчиком.

4. Визуальное разделение частей

\begin{tcolorbox}[title=Разделённые части, lower separated=true]
  Верхняя часть.
  \tcblower
  Нижняя часть (визуально отделена).
\end{tcolorbox}

\begin{tcolorbox}[title=Неразделённые части, lower separated=false]
  Верхняя часть.
  \tcblower
  Нижняя часть (без разделения).
\end{tcolorbox}

Результат:

  • Первый бокс: части разделены линией (зависит от стиля).
  • Второй бокс: части сливаются.

5. Создание пользовательского окружения с сохранением

\newtcolorbox{mybox}[1]{%
  savelowerto=#1, lowerbox=ignored,
  colback=blue!5!white, colframe=blue!75!black,
  title=Мой бокс
}

\begin{mybox}{saved_part.tex}
  Верхняя часть.
  \tcblower
  Сохранённая нижняя часть.
\end{mybox}

Используем сохранённое: 
\input{saved_part.tex}

Результат:

  • В документе: только верхняя часть с заголовком “Мой бокс”.
  • В файле saved_part.tex: сохранена нижняя часть.

Ключевые особенности:

  1. Гибкость:

    • lowerbox=ignored полностью исключает нижнюю часть из обработки, что полезно для оптимизации.
    • redirectlowerto позволяет сохранять контент без побочных эффектов (например, изменения счётчиков).
  2. Совместимость:

    • savelowerto и redirectlowerto нельзя использовать вместе с saveto.
  3. Дизайн:

    • Разделение частей (lower separated) можно настроить для разных стилей (например, beamer или raster).

1.6 - Команды для Color и Font

Управляет параметрами цвета и шрифтов текста и заголовков в боксах

Таблица управления цветами и шрифтами в tcolorbox

Основные параметры цвета

Параметр Синтаксис Описание Пример
colframe /tcb/colframe=⟨color⟩ Цвет рамки бокса. По умолчанию: black!75!white. colframe=red
colback /tcb/colback=⟨color⟩ Цвет фона содержимого бокса. По умолчанию: black!5!white. colback=blue!10
colbacktitle /tcb/colbacktitle=⟨color⟩ Цвет фона заголовка. По умолчанию: black!50!white. colbacktitle=green!20
colupper /tcb/colupper=⟨color⟩ Цвет текста верхней части. По умолчанию: black. colupper=red!50
collower /tcb/collower=⟨color⟩ Цвет текста нижней части. По умолчанию: black. collower=blue!50
coltext /tcb/coltext=⟨color⟩ Устанавливает одинаковый цвет текста для верхней и нижней части. coltext=purple
coltitle /tcb/coltitle=⟨color⟩ Цвет текста заголовка. По умолчанию: white. coltitle=yellow

Управление отображением заголовка

Параметр Синтаксис Описание Пример
title filled `/tcb/title filled=true false` Включает/отключает заливку фона заголовка. По умолчанию: false.

Параметры шрифтов

Параметр Синтаксис Описание Пример
fontupper /tcb/fontupper=⟨text⟩ Устанавливает шрифт для верхней части. fontupper=\bfseries
fontlower /tcb/fontlower=⟨text⟩ Устанавливает шрифт для нижней части. fontlower=\itshape
fonttitle /tcb/fonttitle=⟨text⟩ Устанавливает шрифт для заголовка. fonttitle=\sffamily

Примеры использования

1. Настройка цветов

\begin{tcolorbox}[colframe=red, colback=yellow!10, colbacktitle=blue!20, coltitle=white, title=Цветной бокс]
  Это пример цветного tcolorbox.
  \tcblower
  Нижняя часть с другим цветом текста.
\end{tcolorbox}

2. Управление шрифтами

\begin{tcolorbox}[fonttitle=\sffamily\bfseries\large, fontupper=\itshape, fontlower=\bfseries, title=Шрифты]
  Верхняя часть курсивом.
  \tcblower
  Нижняя часть жирным.
\end{tcolorbox}

3. Комбинированный пример

\begin{tcolorbox}[
  colframe=green!50!black,
  colback=green!10,
  colbacktitle=green!40,
  coltitle=white,
  fonttitle=\bfseries,
  title filled=true,
  title=Комбинированный пример,
  fontupper=\small,
  collower=red
]
  Верхняя часть мелким шрифтом.
  \tcblower
  Нижняя часть красным цветом.
\end{tcolorbox}

Особенности:

  1. Все цветовые параметры поддерживают стандартные цветовые модели LaTeX (например, red!50!white).
  2. Для шрифтов можно использовать любые стандартные команды изменения шрифта (\bfseries, \itshape и т.д.).
  3. Параметр title filled автоматически активируется при установке colbacktitle или других связанных с заголовком параметров.
  4. coltext удобен для установки единого цвета текста во всем боксе, тогда как colupper и collower позволяют дифференцировать части.

1.7 - Команды для выравнивания текста

Управляет параметрами выравнивания текста в боксах

Таблица управления выравниванием текста в tcolorbox

Горизонтальное выравнивание

Параметр Синтаксис Допустимые значения Описание Пример
halign / halign upper /tcb/halign=⟨alignment⟩ justify, left, flush left, right, flush right, center, flush center Выравнивание верхней части (или всего содержимого, если нет нижней части) halign=flush center
halign lower /tcb/halign lower=⟨alignment⟩ те же, что для halign Выравнивание нижней части halign lower=right
halign title /tcb/halign title=⟨alignment⟩ те же, что для halign Выравнивание заголовка halign title=center
halign code / halign upper code /tcb/halign code={⟨code⟩} произвольный LaTeX-код Произвольное выравнивание верхней части halign code={\raggedright}
halign lower code /tcb/halign lower code={⟨code⟩} произвольный LaTeX-код Произвольное выравнивание нижней части halign lower code={\centering}
halign title code /tcb/halign title code={⟨code⟩} произвольный LaTeX-код Произвольное выравнивание заголовка halign title code={\raggedleft}

Вертикальное выравнивание

Параметр Синтаксис Допустимые значения Описание Пример
valign / valign upper /tcb/valign=⟨alignment⟩ top, center, bottom, scale, scale* Вертикальное выравнивание верхней части valign=center
valign lower /tcb/valign lower=⟨alignment⟩ те же, что для valign Вертикальное выравнивание нижней части valign lower=bottom
valign scale limit /tcb/valign scale limit=⟨real⟩ число (по умолчанию 1.1) Максимальный коэффициент масштабирования для scale* valign scale limit=1.5

Сокращённые команды

Команда Эквивалент Описание
flushleft upper halign=flush left Выравнивание верхней части по левому краю
center upper halign=flush center Выравнивание верхней части по центру
flushright upper halign=flush right Выравнивание верхней части по правому краю
flushleft lower halign lower=flush left Выравнивание нижней части по левому краю
center lower halign lower=flush center Выравнивание нижней части по центру
flushright lower halign lower=flush right Выравнивание нижней части по правому краю
flushleft title halign title=flush left Выравнивание заголовка по левому краю
center title halign title=flush center Выравнивание заголовка по центру
flushright title halign title=flush right Выравнивание заголовка по правому краю

Примеры использования

1. Горизонтальное выравнивание

\begin{tcolorbox}[halign=flush left, title=Пример выравнивания]
  Текст, выровненный по левому краю.
  \tcblower
  Нижняя часть с выравниванием по правому краю.
\end{tcolorbox}

2. Вертикальное выравнивание

\begin{tcolorbox}[valign=center, height=4cm]
  Текст, выровненный по центру по вертикали.
\end{tcolorbox}

3. Выравнивание заголовка

\begin{tcolorbox}[halign title=center, title=Центрированный заголовок]
  Содержимое бокса.
\end{tcolorbox}

Особенности:

  1. Разница между flush и не-flush версиями:

    • flush версии используют стандартные LaTeX-команды (\raggedright, \centering, \raggedleft)
    • Не-flush версии реализованы через TikZ и могут давать более сбалансированное расположение с переносами
  2. Вертикальное выравнивание имеет смысл только при явно заданной высоте бокса

  3. Параметры scale и scale* масштабируют текст по вертикали, что может быть полезно для точного заполнения пространства

1.8 - Команды для управления размерами и отступами в боксах

Управляет параметрами размеров боксов и рамок в боксах

Управление геометрией в tcolorbox

4.7.1 Ширина (Width)

Команда Синтаксис Описание Пример
width /tcb/width=⟨length⟩ Устанавливает общую ширину бокса width=\linewidth/2
text width /tcb/text width=⟨length⟩ Устанавливает ширину текста в верхней части text width=4cm
add to width /tcb/add to width=⟨length⟩ Добавляет значение к текущей ширине бокса add to width=1cm

4.7.2 Границы (Rules)

Команда Синтаксис Описание Пример
toprule /tcb/toprule=⟨length⟩ Толщина верхней границы toprule=3mm
bottomrule /tcb/bottomrule=⟨length⟩ Толщина нижней границы bottomrule=3mm
leftrule /tcb/leftrule=⟨length⟩ Толщина левой границы leftrule=3mm
rightrule /tcb/rightrule=⟨length⟩ Толщина правой границы rightrule=3mm
titlerule /tcb/titlerule=⟨length⟩ Толщина линии под заголовком titlerule=3mm
boxrule /tcb/boxrule=⟨length⟩ Устанавливает толщину всех границ boxrule=3mm

4.7.3 Скругления (Arcs)

Команда Синтаксис Описание Пример
arc /tcb/arc=⟨length⟩ Радиус скругления углов arc=3mm
circular arc /tcb/circular arc Делает бокс круглым (при равных ширине и высоте) circular arc
bean arc /tcb/bean arc Автоматический радиус скругления bean arc
octogon arc /tcb/octogon arc Создает восьмиугольник octogon arc
arc is angular /tcb/arc is angular Заменяет скругления на углы arc is angular
arc is curved /tcb/arc is curved Восстанавливает скругления (по умолчанию) arc is curved
outer arc /tcb/outer arc=⟨length⟩ Внешний радиус скругления outer arc=1mm
auto outer arc /tcb/auto outer arc Автоматический внешний радиус auto outer arc

4.7.4 Отступы (Spacing)

Команда Синтаксис Описание Пример
boxsep /tcb/boxsep=⟨length⟩ Общий внутренний отступ boxsep=5mm
left /tcb/left=⟨length⟩ Левый отступ для всех частей left=0mm
left* /tcb/left*=⟨length⟩ Левый отступ от границы left*=0mm
lefttitle /tcb/lefttitle=⟨length⟩ Левый отступ заголовка lefttitle=3cm
leftupper /tcb/leftupper=⟨length⟩ Левый отступ верхней части leftupper=3cm
leftlower /tcb/leftlower=⟨length⟩ Левый отступ нижней части leftlower=3cm
right /tcb/right=⟨length⟩ Правый отступ для всех частей right=2cm
right* /tcb/right*=⟨length⟩ Правый отступ от границы right*=0mm
righttitle /tcb/righttitle=⟨length⟩ Правый отступ заголовка righttitle=2cm
rightupper /tcb/rightupper=⟨length⟩ Правый отступ верхней части rightupper=2cm
rightlower /tcb/rightlower=⟨length⟩ Правый отступ нижней части rightlower=2cm
top /tcb/top=⟨length⟩ Верхний отступ top=0mm
toptitle /tcb/toptitle=⟨length⟩ Верхний отступ заголовка toptitle=3mm
bottom /tcb/bottom=⟨length⟩ Нижний отступ bottom=0mm
bottomtitle /tcb/bottomtitle=⟨length⟩ Нижний отступ заголовка bottomtitle=3mm
middle /tcb/middle=⟨length⟩ Отступ между частями middle=0mm

4.7.5 Размеры (Size Shortcuts)

Команда Синтаксис Описание Пример
size /tcb/size=⟨name⟩ Предустановленные размеры: normal, title, small, fbox, tight, minimal size=small
oversize /tcb/oversize=⟨length⟩ Расширяет ширину за пределы страницы oversize

4.7.6 Переключение сторон (Toggle Left and Right)

Команда Синтаксис Описание Пример
toggle left and right /tcb/toggle left and right=⟨toggle preset⟩ Переключает левую и правую стороны (none, forced, evenpage) toggle left and right=evenpage

Примеры использования

Настройка ширины

\begin{tcolorbox}[width=0.5\linewidth, text width=4cm]
  Бокс с ограниченной шириной текста
\end{tcolorbox}

Границы и скругления

\begin{tcolorbox}[
  boxrule=2mm,
  arc=5mm,
  arc is angular,
  toprule=3mm,
  bottomrule=1mm
]
  Бокс с нестандартными границами
\end{tcolorbox}

Отступы

\begin{tcolorbox}[
  boxsep=2mm,
  left=1cm,
  right*=0mm,
  toptitle=5mm
]
  Бокс с кастомными отступами
\end{tcolorbox}

Размеры

\begin{tcolorbox}[size=small, oversize]
  Компактный бокс, расширенный за поля
\end{tcolorbox}

Переключение сторон

\begin{tcolorbox}[
  toggle left and right=evenpage,
  leftrule=1cm,
  rightrule=1mm
]
  Бокс с переключением границ на четных страницах
\end{tcolorbox}

1.9 - Команды для управления параметрами углов в боксах

Управляет параметрами углов в боксах

Управление углами (Corners) в tcolorbox

Основные команды для работы с углами

Команда Синтаксис Допустимые значения Описание Пример
sharp corners /tcb/sharp corners=⟨position⟩ northwest, northeast, southwest, southeast, north, south, east, west, downhill, uphill, all Делает указанные углы острыми sharp corners=northwest
rounded corners /tcb/rounded corners=⟨position⟩ Те же, что для sharp corners Делает указанные углы скругленными (по умолчанию) rounded corners=all
sharpish corners /tcb/sharpish corners - Делает углы визуально острыми (технически остаются скругленными) sharpish corners

Особенности работы с углами:

  1. По умолчанию все углы скруглены (rounded corners=all)
  2. sharpish corners - это компромиссный вариант, когда углы выглядят острыми, но технически остаются скругленными (влияет на тени и границы)
  3. Можно комбинировать разные типы углов в одном боксе

Примеры использования

1. Острые углы

\begin{tcolorbox}[
  colback=white,
  colframe=blue,
  sharp corners=northwest,  % только северо-западный угол острый
  title=Бокс с острым углом
]
Содержимое бокса
\end{tcolorbox}

2. Полностью острый бокс

\begin{tcolorbox}[
  colback=white,
  colframe=red,
  sharp corners,  % все углы острые
  title=Полностью острый бокс
]
Содержимое бокса
\end{tcolorbox}

3. Комбинирование углов

\begin{tcolorbox}[
  colback=white,
  colframe=green,
  sharp corners=north,  % верхние углы острые
  rounded corners=south,  % нижние углы скругленные
  title=Комбинированный бокс
]
Содержимое бокса
\end{tcolorbox}

4. Sharpish corners

\begin{tcolorbox}[
  colback=white,
  colframe=purple,
  sharpish corners,  # углы выглядят острыми
  title=Бокс с sharpish corners
]
Содержимое бокса
\end{tcolorbox}

Визуальные различия:

  1. Обычные скругленные углы (rounded corners):

    • Плавные изгибы
    • Тени и границы полностью повторяют форму
  2. Sharpish corners:

    • Углы выглядят почти острыми
    • Тени и границы слегка скруглены
  3. Полностью острые углы (sharp corners):

    • Четкие прямые углы
    • Тени и границы имеют острые края

Советы по использованию:

  1. Для большинства случаев достаточно sharp corners или rounded corners
  2. Используйте sharpish corners, если нужен компромисс между внешним видом и поведением теней
  3. Можно точечно менять отдельные углы для создания уникальных дизайнов
  4. Настройки углов влияют на:
    • Основную рамку бокса
    • Границы (borderline)
    • Тени (shadow)

1.10 - Команды для управления прозрачностью в боксах

Управляет параметрами прозрачности в боксах

Таблица управления прозрачностью в tcolorbox

Основные параметры прозрачности

Параметр Синтаксис Описание Диапазон значений Пример
opacityframe /tcb/opacityframe=⟨fraction⟩ Прозрачность рамки 0.0 (полная прозрачность) - 1.0 (непрозрачный) opacityframe=0.5
opacityback /tcb/opacityback=⟨fraction⟩ Прозрачность фона содержимого 0.0-1.0 opacityback=0.3
opacitybacktitle /tcb/opacitybacktitle=⟨fraction⟩ Прозрачность фона заголовка 0.0-1.0 opacitybacktitle=0.7
opacityfill /tcb/opacityfill=⟨fraction⟩ Прозрачность заливки (рамка + фон + заголовок) 0.0-1.0 opacityfill=0.6
opacityupper /tcb/opacityupper=⟨fraction⟩ Прозрачность текста верхней части 0.0-1.0 opacityupper=0.4
opacitylower /tcb/opacitylower=⟨fraction⟩ Прозрачность текста нижней части 0.0-1.0 opacitylower=0.8
opacitytext /tcb/opacitytext=⟨fraction⟩ Прозрачность всего текста (верх + низ) 0.0-1.0 opacitytext=0.5
opacitytitle /tcb/opacitytitle=⟨fraction⟩ Прозрачность текста заголовка 0.0-1.0 opacitytitle=0.9

Примеры использования

1. Полупрозрачная рамка и фон

\begin{tcolorbox}[
  colframe=blue,
  colback=white,
  opacityframe=0.3,
  opacityback=0.7,
  title=Пример прозрачности
]
Этот бокс имеет полупрозрачную рамку и фон
\end{tcolorbox}

2. Прозрачный заголовок

\begin{tcolorbox}[
  colframe=red,
  colbacktitle=yellow,
  opacitybacktitle=0.5,
  opacitytitle=0.8,
  title=Прозрачный заголовок
]
Текст содержимого
\end{tcolorbox}

3. Разная прозрачность частей

\begin{tcolorbox}[
  opacityupper=0.9,
  opacitylower=0.5,
  opacityframe=0.6,
  opacityback=0.8
]
Верхний текст более непрозрачный
\tcblower
Нижний текст более прозрачный
\end{tcolorbox}

4. Комплексный пример с jigsaw-скином

\begin{tcolorbox}[
  enhanced jigsaw,
  colframe=green!75!black,
  colback=green!10!white,
  opacityframe=0.4,
  opacityback=0.6,
  opacitybacktitle=0.8,
  opacitytitle=1.0,
  title=Сложный пример
]
Бокс с различными настройками прозрачности
\end{tcolorbox}

Особенности работы с прозрачностью:

  1. Визуальные эффекты:

    • Значение 0.0 делает элемент полностью невидимым
    • Значение 1.0 - полностью непрозрачным
    • Промежуточные значения создают эффект просвечивания
  2. Рекомендации:

    • Для лучшего визуального восприятия используйте значения в диапазоне 0.3-0.8
    • Прозрачность особенно эффектна при наложении элементов или использовании фоновых изображений
    • В сочетании с jigsaw-скинами можно создавать интересные дизайнерские решения
  3. Технические ограничения:

    • Прозрачность может по-разному отображаться в различных PDF-ридерах
    • При печати эффекты прозрачности могут не сохраняться в зависимости от принтера
  4. Комбинации:

    • Можно комбинировать несколько параметров прозрачности для одного бокса
    • Эффекты прозрачности суммируются при наложении элементов

Эти параметры позволяют создавать сложные визуальные эффекты и гибко управлять внешним видом элементов tcolorbox.

1.11 - Команды для управления высотой боксов

Управляет параметрами высоты боксов

Управление высотой в tcolorbox

Основные параметры высоты

Параметр Синтаксис Описание Пример
natural height /tcb/natural height Естественная высота по содержимому natural height
height /tcb/height=⟨length⟩ Фиксированная высота бокса height=3cm
height plus /tcb/height plus=⟨length⟩ Максимальное увеличение высоты height plus=1cm
height from /tcb/height from=⟨min⟩ to ⟨max⟩ Диапазон высот height from=2cm to 5cm
text height /tcb/text height=⟨length⟩ Высота текстовой области text height=4cm
add to height /tcb/add to height=⟨length⟩ Добавление к текущей высоте add to height=0.5cm
add to natural height /tcb/add to natural height=⟨length⟩ Добавление к естественной высоте add to natural height=1cm
height fill /tcb/height fill=true|false|maximum Заполнение оставшегося пространства height fill=true
inherit height /tcb/inherit height=⟨fraction⟩ Наследование высоты от родителя inherit height=0.8
square /tcb/square Квадратный бокс (высота=ширине) square

Распределение пространства

Параметр Синтаксис Описание Пример
space /tcb/space=⟨fraction⟩ Распределение пространства (0-1) space=0.3
space to upper /tcb/space to upper Все пространство в верхнюю часть space to upper
space to lower /tcb/space to lower Все пространство в нижнюю часть space to lower
space to both /tcb/space to both Равное распределение space to both
space to /tcb/space to=⟨macro⟩ Сохранение пространства в макрос space to=\myspace
split /tcb/split=⟨fraction⟩ Позиция разделителя (0-1) split=0.7

Группы высот

Параметр Синтаксис Описание Пример
equal height group /tcb/equal height group=⟨id⟩ Группа с одинаковой высотой equal height group=A
minimum for equal height group /tcb/minimum for equal height group=⟨id⟩:⟨length⟩ Минимальная высота группы minimum for equal height group=A:3cm
minimum for current equal height group /tcb/minimum for current equal height group=⟨length⟩ Минимальная высота текущей группы minimum for current equal height group=2cm
use height from group /tcb/use height from group=⟨id⟩ Использование высоты группы use height from group=A
\tcbheightfromgroup \tcbheightfromgroup{⟨macro⟩}{⟨id⟩} Получение высоты группы \tcbheightfromgroup{\myheight}{A}

Примеры использования

1. Фиксированная высота

\begin{tcolorbox}[height=4cm, valign=center]
  Бокс с фиксированной высотой 4cm
\end{tcolorbox}

2. Автоматическое выравнивание высоты

\begin{tcolorbox}[equal height group=A]
  Первый бокс
\end{tcolorbox}
\begin{tcolorbox}[equal height group=A]
  Второй бокс с большим количеством текста, который делает высоту больше
\end{tcolorbox}

3. Заполнение пространства

\begin{tcolorbox}[height fill]
  Бокс заполнит все доступное вертикальное пространство
\end{tcolorbox}

4. Квадратный бокс

\begin{tcolorbox}[width=3cm, square]
  Квадратный бокс 3x3cm
\end{tcolorbox}

5. Наследование высоты

\begin{tcolorbox}[height=5cm]
  \begin{tcolorbox}[inherit height=0.5]
    Бокс с половиной высоты родителя
  \end{tcolorbox}
\end{tcolorbox}

Особенности работы с высотой:

  1. Для работы некоторых параметров (height fill) требуется библиотека breakable
  2. Параметры групп высот требуют двойной компиляции
  3. natural height - это высота по умолчанию, рассчитываемая автоматически
  4. При использовании equal height group все боксы в группе получают высоту самого высокого бокса
  5. height plus позволяет задать максимально возможное увеличение высоты при необходимости

1.12 - Команды для добавления различного контента в боксы

Управляет добавлением различного контента в боксы

Управление содержимым бокса в tcolorbox

Добавление контента в различные части бокса

Параметр Синтаксис Описание Пример
before title /tcb/before title=⟨code⟩ Код перед заголовком (с \ignorespaces) before title={\textbf{Важно:}~}
before title* /tcb/before title*=⟨code⟩ Код перед заголовком (без \ignorespaces) before title*={\textbf{Важно:}}
after title /tcb/after title=⟨code⟩ Код после заголовка (с \unskip) after title={\hfill\small[подпись]}
after title* /tcb/after title*=⟨code⟩ Код после заголовка (без \unskip) after title*={\quad[подпись]}
before upper /tcb/before upper=⟨code⟩ Код перед верхней частью (с \ignorespaces) before upper={\begin{quote}}
before upper* /tcb/before upper*=⟨code⟩ Код перед верхней частью (без \ignorespaces) before upper*=\begin{tabular}
after upper /tcb/after upper=⟨code⟩ Код после верхней части (с \unskip) after upper={\end{quote}}
after upper* /tcb/after upper*=⟨code⟩ Код после верхней части (без \unskip) after upper*=\end{tabular}
before lower /tcb/before lower=⟨code⟩ Код перед нижней частью (с \ignorespaces) before lower={\textbf{Примечание:}}
before lower* /tcb/before lower*=⟨code⟩ Код перед нижней частью (без \ignorespaces) before lower*=\begin{itemize}
after lower /tcb/after lower=⟨code⟩ Код после нижней части (с \unskip) after lower={\hfill\footnotesize*}
after lower* /tcb/after lower*=⟨code⟩ Код после нижней части (без \unskip) after lower*=\end{itemize}

Специальные окружения для контента

Параметр Синтаксис Описание Пример
text fill /tcb/text fill Включает minipage для вертикального выравнивания text fill
tabulars /tcb/tabulars=⟨preamble⟩ Окружает контент tabular* tabulars={lcr}
tabulars* /tcb/tabulars*={⟨code⟩}{⟨preamble⟩} Tabular* с дополнительным кодом tabulars*={\small}{lcr}
tabularx /tcb/tabularx=⟨preamble⟩ Окружает контент tabularx `tabularx={X
tabularx* /tcb/tabularx*={⟨code⟩}{⟨preamble⟩} Tabularx с дополнительным кодом `tabularx*={\footnotesize}{X
tikz upper /tcb/tikz upper=⟨options⟩ Окружает верхнюю часть tikzpicture tikz upper={scale=0.5}
tikz lower /tcb/tikz lower=⟨options⟩ Окружает нижнюю часть tikzpicture tikz lower={rotate=30}
tikznode upper /tcb/tikznode upper=⟨options⟩ Помещает контент в TikZ node tikznode upper={draw}
tikznode lower /tcb/tikznode lower=⟨options⟩ Помещает нижнюю часть в TikZ node tikznode lower={fill=yellow}
tikznode /tcb/tikznode=⟨options⟩ Применяет tikznode к обеим частям tikznode={shape=circle}
varwidth upper /tcb/varwidth upper=⟨length⟩ Окружает varwidth окружением varwidth upper=5cm
environment upper /tcb/environment upper=⟨name⟩ Окружает верхнюю часть указанным окружением environment upper=itemize
environment upper args /tcb/environment upper args={⟨name⟩}{⟨code⟩} Окружение с дополнительными параметрами environment upper args={tabular}{{cc}}
environment lower /tcb/environment lower=⟨name⟩ Окружает нижнюю часть указанным окружением environment lower=enumerate
environment lower args /tcb/environment lower args={⟨name⟩}{⟨code⟩} Окружение с дополнительными параметрами environment lower args={tabular}{{lr}}
environment title /tcb/environment title=⟨name⟩ Окружает заголовок указанным окружением environment title=center
environment title args /tcb/environment title args={⟨name⟩}{⟨code⟩} Окружение с дополнительными параметрами environment title args={flushright}{}

Примеры использования

1. Добавление текста вокруг содержимого

\begin{tcolorbox}[
  before title={\textbf{Внимание:}~},
  after title={\hfill\footnotesize[источник]},
  before upper={\textit{Начало текста:}\par},
  after upper={\par\hfill\textit{окончание}}
]
  Заголовок
  \tcblower
  Основное содержимое бокса
\end{tcolorbox}

2. Использование окружений

\begin{tcolorbox}[
  environment upper=itemize,
  environment lower args={tabular}{{ll}}
  \item Первый пункт
  \item Второй пункт
  \tcblower
  A & B \\
  C & D
\end{tcolorbox}

3. Таблицы в боксе

\begin{tcolorbox}[
  tabulars={|l|c|r|},
  title=Таблица в боксе
]
  Левый & Центр & Правый \\
  A & B & C
\end{tcolorbox}

4. TikZ рисунки

\begin{tcolorbox}[
  tikz upper={scale=0.8},
  title=TikZ рисунок
]
  \draw (0,0) circle (1cm);
  \fill (0,0) circle (2pt);
\end{tcolorbox}

Особенности работы:

  1. Параметры с * (например, before upper*) не добавляют автоматические пробелы (\ignorespaces/\unskip)
  2. Для работы tabulars/tabularx требуются соответствующие пакеты
  3. text fill полезен для вертикального выравнивания с \vfill
  4. TikZ-окружения позволяют легко встраивать графику
  5. Окружения environment не работают с другими tcolorbox-окружениями

1.13 - Команды для упрвления слоями в боксах

Управляет слоями в боксах, наложение друг на друга и т.д.

Управление наложениями (Overlays) в tcolorbox

Основные параметры наложений

Параметр Синтаксис Описание Пример
overlay /tcb/overlay=⟨graphical code⟩ Графическое наложение для всех состояний бокса overlay={\draw[red] (frame.south west) rectangle (frame.north east);}
no overlay /tcb/no overlay Отключает все наложения no overlay
overlay broken /tcb/overlay broken=⟨graphical code⟩ Наложение только для разорванных боксов overlay broken={\draw[dashed] (frame.south west) -- (frame.north east);}
overlay unbroken /tcb/overlay unbroken=⟨graphical code⟩ Наложение только для целых боксов overlay unbroken={\fill[yellow] (frame.center) circle (5mm);}
overlay first /tcb/overlay first=⟨graphical code⟩ Наложение для первой части разорванного бокса overlay first={\node at (frame.center) {First};}
overlay middle /tcb/overlay middle=⟨graphical code⟩ Наложение для средних частей разорванного бокса overlay middle={\node at (frame.center) {Middle};}
overlay last /tcb/overlay last=⟨graphical code⟩ Наложение для последней части разорванного бокса overlay last={\node at (frame.center) {Last};}

Комбинированные параметры

Параметр Синтаксис Описание Пример
overlay unbroken and first /tcb/overlay unbroken and first=⟨graphical code⟩ Комбинация unbroken и first overlay unbroken and first={\draw[blue] (frame.south west) -- (frame.north east);}
overlay middle and last /tcb/overlay middle and last=⟨graphical code⟩ Комбинация middle и last overlay middle and last={\draw[green] (frame.south west) -- (frame.north east);}
overlay unbroken and last /tcb/overlay unbroken and last=⟨graphical code⟩ Комбинация unbroken и last overlay unbroken and last={\draw[red] (frame.south west) -- (frame.north east);}
overlay first and middle /tcb/overlay first and middle=⟨graphical code⟩ Комбинация first и middle overlay first and middle={\draw[yellow] (frame.south west) -- (frame.north east);}

Примеры использования

1. Простое наложение

\begin{tcolorbox}[
  enhanced,
  overlay={\draw[red, line width=2pt] (frame.south west) rectangle (frame.north east);},
  title=Пример с наложением
]
Содержимое бокса с красной рамкой
\end{tcolorbox}

2. Наложение для разорванных боксов

\begin{tcolorbox}[
  breakable,
  overlay first={\node[rotate=45] at (frame.center) {Начало};},
  overlay middle={\node[rotate=45] at (frame.center) {Продолжение};},
  overlay last={\node[rotate=45] at (frame.center) {Конец};},
  title=Разорванный бокс
]
Много текста, который будет разорван на несколько частей...
\end{tcolorbox}

3. Комбинированное наложение

\begin{tcolorbox}[
  enhanced,
  overlay unbroken and first={\fill[yellow!50] (frame.north west) rectangle ([xshift=2cm]frame.north east);},
  title=Комбинированный пример
]
Содержимое бокса с желтой полосой вверху для unbroken/first состояний
\end{tcolorbox}

4. Водяной знак

\begin{tcolorbox}[
  enhanced,
  overlay={\node[rotate=45,scale=10,text=gray!20] at (frame.center) {ЧЕРНОВИК};},
  title=Документ с водяным знаком
]
Текст документа с полупрозрачным водяным знаком
\end{tcolorbox}

Особенности работы с наложениями:

  1. Для сложных наложений рекомендуется использовать enhanced режим из библиотеки skins
  2. Наложения применяются после рисования рамки и фона, но перед отображением текста
  3. Для позиционирования элементов можно использовать узлы геометрии (frame.north west, title.south и т.д.)
  4. При работе с разорванными боксами (breakable) можно задавать разные наложения для разных частей
  5. Наложения могут содержать любые допустимые TikZ-команды

Советы:

  1. Используйте overlay для элементов, которые должны отображаться всегда
  2. Для разорванных боксов применяйте overlay first/middle/last для разных частей
  3. Комбинированные параметры (unbroken and first и т.д.) помогают избежать дублирования кода
  4. Для сложных графических элементов создавайте стили с наложениями и переиспользуйте их

1.14 - Команды для управления плавающими объектами боксов

Управляет плавающими боксами на странице

Управление плавающими объектами (Floating Objects) в tcolorbox

Основные параметры плавающих объектов

Параметр Синтаксис Описание Пример
floatplacement /tcb/floatplacement=⟨values⟩ Устанавливает параметры размещения по умолчанию floatplacement=tbp
float /tcb/float=⟨values⟩ Превращает бокс в плавающий объект float=ht
float* /tcb/float*=⟨values⟩ Плавающий объект на всю ширину страницы float*=b, width=\textwidth
nofloat /tcb/nofloat Отключает плавающее поведение nofloat
every float /tcb/every float={⟨code⟩} Код, выполняемый перед каждым плавающим объектом every float=\centering
before float /tcb/before float={⟨code⟩} Код перед началом float-окружения before float=\small
after float /tcb/after float={⟨code⟩} Код после окончания float-окружения after float=\vspace{1cm}

Примеры использования

1. Базовый плавающий бокс

\begin{tcolorbox}[
  float=htb,
  title=Пример плавающего бокса,
  colback=blue!5!white,
  colframe=blue!75!black
]
Этот бокс будет автоматически размещен в подходящем месте документа
(обычно вверху страницы, если возможно).
\end{tcolorbox}

2. Плавающий бокс на всю ширину

\begin{tcolorbox}[
  float*=t,
  width=\textwidth,
  title=Широкий плавающий бокс,
  colback=green!5!white,
  colframe=green!75!black
]
Этот бокс занимает всю ширину страницы и будет размещен вверху.
\end{tcolorbox}

3. Центрирование плавающих объектов

\begin{tcolorbox}[
  float,
  every float=\centering,
  title=Центрированный плавающий бокс,
  colback=red!5!white,
  colframe=red!75!black
]
Этот плавающий бокс будет центрирован на странице.
\end{tcolorbox}

4. Плавающий бокс с дополнительным кодом

\begin{tcolorbox}[
  float,
  before float={\small Начало float-окружения},
  after float={\vspace{5mm} Конец float-окружения},
  title=Бокс с дополнительным кодом,
  colback=yellow!5!white,
  colframe=yellow!75!black
]
Этот плавающий бокс имеет дополнительный код до и после.
\end{tcolorbox}

Особенности работы с плавающими объектами:

  1. Параметры размещения (для float и float*):

    • h - здесь (если возможно)
    • t - вверху страницы
    • b - внизу страницы
    • p - на отдельной странице
    • ! - принудительное размещение
  2. Различия между float и float*:

    • float работает как стандартное плавающее окружение
    • float* предназначен для:
      • Двухколоночных документов
      • Использования с пакетами multicol/paracol
      • Широких боксов (требует width=\textwidth)
  3. Отключение плавающего поведения:

    • Используйте nofloat для возврата к обычному поведению
  4. Особые случаи:

    • Для разрываемых боксов (breakable) every float выполняется перед каждой частью
    • before float и after float позволяют вставить код до/после float-окружения

Советы по использованию:

  1. Для изображений и широких таблиц лучше использовать float*
  2. Комбинация every float=\centering полезна для центрирования содержимого
  3. При использовании в двухколоночном режиме не забывайте указывать width=\textwidth
  4. Для точного контроля размещения используйте комбинации параметров (например, float=!b для принудительного размещения внизу)

1.15 - Команды для встраивания объектов и боксов в боксы (embedding)

Управляет встраиванием объектов в боксы

Управление встраиванием (Embedding) в tcolorbox

Основные параметры встраивания

Параметр Синтаксис Описание Пример
before /tcb/before=⟨code⟩ Код, выполняемый перед боксом before={\par\medskip}
after /tcb/after=⟨code⟩ Код, выполняемый после бокса after={\par\medskip}
nobeforeafter /tcb/nobeforeafter Отключает пробелы до/после бокса nobeforeafter
force nobeforeafter /tcb/force nobeforeafter Принудительно отключает пробелы force nobeforeafter

Вертикальные отступы

Параметр Синтаксис Описание Пример
before skip balanced /tcb/before skip balanced=⟨glue⟩ Вертикальный отступ с учетом базовой линии before skip balanced=1cm
after skip balanced /tcb/after skip balanced=⟨glue⟩ Вертикальный отступ после с базовой линией after skip balanced=1cm
beforeafter skip balanced /tcb/beforeafter skip balanced=⟨glue⟩ Отступы до/после с базовой линией beforeafter skip balanced=0.5cm
before skip /tcb/before skip=⟨glue⟩ Простой вертикальный отступ перед before skip=10pt
after skip /tcb/after skip=⟨glue⟩ Простой вертикальный отступ после after skip=10pt
beforeafter skip /tcb/beforeafter skip=⟨glue⟩ Простые отступы до/после beforeafter skip=10pt

Горизонтальные отступы

Параметр Синтаксис Описание Пример
left skip /tcb/left skip=⟨length⟩ Горизонтальный отступ слева left skip=1cm
right skip /tcb/right skip=⟨length⟩ Горизонтальный отступ справа right skip=1cm
leftright skip /tcb/leftright skip=⟨length⟩ Отступы слева и справа leftright skip=1cm

Выравнивание и позиционирование

Параметр Синтаксис Описание Пример
baseline /tcb/baseline=⟨length⟩ Установка базовой линии baseline=3mm
box align /tcb/box align=⟨alignment⟩ Выравнивание бокса (bottom, top, center, base) box align=top

Особые параметры

Параметр Синтаксис Описание Пример
ignore nobreak `/tcb/ignore nobreak=true false` Игнорировать запрет разрыва после заголовка
before nobreak /tcb/before nobreak=⟨code⟩ Код перед боксом при запрете разрыва before nobreak={\noindent}
parfillskip restore `/tcb/parfillskip restore=true false` Восстанавливать значение \parfillskip

Примеры использования

1. Базовые вертикальные отступы

\begin{tcolorbox}[
  before skip balanced=1cm,
  after skip balanced=0.5cm,
  colframe=blue
]
Бокс с кастомными отступами
\end{tcolorbox}

2. Горизонтальное позиционирование

\begin{tcolorbox}[
  left skip=2cm,
  right skip=1cm,
  colframe=red
]
Бокс со смещением по горизонтали
\end{tcolorbox}

3. Выравнивание по базовой линии

Текст \begin{tcolorbox}[nobeforeafter, box align=base, colframe=green]
Выровнено по базовой линии
\end{tcolorbox} продолжение текста

4. Интеграция в поток текста

\begin{tcolorbox}[
  nobeforeafter,
  box align=base,
  colback=yellow,
  colframe=orange
]
Встроенный в текст бокс
\end{tcolorbox} продолжение текста.

Особенности работы:

  1. Параметры *balanced учитывают базовую линию текста для более точного выравнивания
  2. nobeforeafter полностью убирает бокс из отдельного абзаца
  3. Для точного контроля вертикального положения используйте комбинацию baseline и box align
  4. Параметры с skip изменяют bounding box, что может влиять на общий макет

Советы:

  1. Для встраивания в текст используйте nobeforeafter + box align=base
  2. Для сложных макетов предпочтительнее *balanced версии отступов
  3. При работе с разрываемыми боксами учитывайте поведение ignore nobreak
  4. Для восстановления стандартного поведения \parfillskip используйте parfillskip restore

1.16 - Управление ограничивающей рамкой (Bounding Box) в tcolorbox

Управление ограничивающей рамкой (Bounding Box) в tcolorbox в различных вариациях

Управление ограничивающей рамкой (Bounding Box) в tcolorbox

Смещение границ ограничивающей рамки

Параметр Синтаксис Описание Пример
enlarge top initially by /tcb/enlarge top initially by=⟨length⟩ Расширение верхней границы (только для первого бокса) enlarge top initially by=5mm
enlarge bottom finally by /tcb/enlarge bottom finally by=⟨length⟩ Расширение нижней границы (только для последнего бокса) enlarge bottom finally by=5mm
enlarge top at break by /tcb/enlarge top at break by=⟨length⟩ Расширение верхней границы для разорванных частей enlarge top at break by=3mm
enlarge bottom at break by /tcb/enlarge bottom at break by=⟨length⟩ Расширение нижней границы для разорванных частей enlarge bottom at break by=3mm
enlarge top by /tcb/enlarge top by=⟨length⟩ Расширение верхней границы для всех случаев enlarge top by=5mm
enlarge bottom by /tcb/enlarge bottom by=⟨length⟩ Расширение нижней границы для всех случаев enlarge bottom by=5mm
enlarge left by /tcb/enlarge left by=⟨length⟩ Расширение левой границы enlarge left by=2cm
enlarge right by /tcb/enlarge right by=⟨length⟩ Расширение правой границы enlarge right by=2cm
enlarge by /tcb/enlarge by=⟨length⟩ Расширение всех границ enlarge by=5mm

Выравнивание бокса

Параметр Синтаксис Описание Пример
grow to left by /tcb/grow to left by=⟨length⟩ Увеличение ширины влево grow to left by=2cm
grow to right by /tcb/grow to right by=⟨length⟩ Увеличение ширины вправо grow to right by=2cm
grow sidewards by /tcb/grow sidewards by=⟨length⟩ Увеличение ширины в обе стороны grow sidewards by=2cm
flush left /tcb/flush left Выравнивание влево flush left
flush right /tcb/flush right Выравнивание вправо flush right
center /tcb/center Центрирование center

Переключение расширений

Параметр Синтаксис Описание Пример
toggle enlargement /tcb/toggle enlargement=⟨toggle preset⟩ Переключение расширений (none, forced, evenpage) toggle enlargement=evenpage

Растягивание до границ страницы

Параметр Синтаксис Описание Пример
spread inwards /tcb/spread inwards=⟨length⟩ Растягивание к внутреннему краю страницы spread inwards=5mm
spread outwards /tcb/spread outwards=⟨length⟩ Растягивание к внешнему краю страницы spread outwards=5mm
move upwards /tcb/move upwards=⟨length⟩ Перемещение к верхнему краю (с новой страницы) move upwards=5mm
move upwards* /tcb/move upwards*=⟨length⟩ Перемещение к верхнему краю (без новой страницы) move upwards*=5mm
fill downwards /tcb/fill downwards=⟨length⟩ Заполнение до нижнего края fill downwards=5mm
spread upwards /tcb/spread upwards=⟨length⟩ Комбинация: вверх + внутрь + наружу spread upwards=5mm
spread upwards* /tcb/spread upwards*=⟨length⟩ То же без новой страницы spread upwards*=5mm
spread sidewards /tcb/spread sidewards=⟨length⟩ Растягивание в стороны spread sidewards=5mm
spread /tcb/spread=⟨length⟩ Заполнение всей страницы spread=5mm
spread downwards /tcb/spread downwards=⟨length⟩ Комбинация: вниз + внутрь + наружу spread downwards=5mm

Выступание бокса

Параметр Синтаксис Описание Пример
shrink tight /tcb/shrink tight Плотное облегание содержимого shrink tight
extrude left by /tcb/extrude left by=⟨length⟩ Выступание влево extrude left by=1cm
extrude right by /tcb/extrude right by=⟨length⟩ Выступание вправо extrude right by=1cm
extrude top by /tcb/extrude top by=⟨length⟩ Выступание вверх extrude top by=1cm
extrude bottom by /tcb/extrude bottom by=⟨length⟩ Выступание вниз extrude bottom by=1cm
extrude by /tcb/extrude by=⟨length⟩ Выступание во все стороны extrude by=5mm

Примеры использования

1. Расширение границ

\begin{tcolorbox}[
  enlarge left by=2cm,
  enlarge top by=5mm,
  enhanced,
  show bounding box
]
Бокс с расширенными границами
\end{tcolorbox}

2. Растягивание до краев страницы

\begin{tcolorbox}[
  spread sidewards,
  spread upwards,
  height=3cm,
  colframe=blue,
  sharp corners=north
]
Бокс, растянутый до краев страницы
\end{tcolorbox}

3. Выступающие элементы

Текст \tcbox[shrink tight, extrude right by=5mm]{с выступающим} элементом

Особенности работы:

  1. Параметры с * не создают новую страницу
  2. Для визуализации bounding box используйте show bounding box
  3. Комбинированные параметры (spread и др.) экономят время настройки
  4. Выступающие элементы (extrude) не изменяют bounding box

1.17 - Управление уровнями/слоями в пакете tcolorbox

Управление слоями в tcolorbox

1. Основные команды для управления слоями

Команда / Стиль Синтаксис Описание
every box \tcbset{every box/.style={...}} Стиль, применяемый ко всем tcolorbox (по умолчанию пуст).
every box on layer n \tcbset{every box on layer 1/.style={...}} Стиль для конкретного слоя (1-4 по умолчанию).
every box on higher layers \tcbset{every box on higher layers/.style={...}} Стиль для слоёв выше управляемых (по умолчанию reset,every box).
\tcbsetmanagedlayers \tcbsetmanagedlayers{<число>} Устанавливает максимальный номер управляемого слоя (только в преамбуле).

2. Примеры использования

Пример 1: Настройка стилей для всех слоёв

\usepackage{tcolorbox}
\tcbset{
    every box/.style={enhanced, colframe=blue}, % Базовый стиль
    every box on layer 2/.style={colback=yellow}, % Стиль для второго слоя
    every box on higher layers/.style={colframe=red} % Стиль для вложенных
}

\begin{tcolorbox}[title=Layer 1]
    Внешний блок.
    \begin{tcolorbox}[title=Layer 2]
        Вложенный блок (жёлтый фон).
        \begin{tcolorbox}[title=Layer 3]
            Ещё глубже (красная рамка).
        \end{tcolorbox}
    \end{tcolorbox}
\end{tcolorbox}

Пример 2: Сброс стилей (reset)

\tcbset{
    every box/.style={fonttitle=\bfseries},
    every box on layer 2/.style={reset, colback=green} % Сброс стилей перед применением
}

\begin{tcolorbox}[title=Layer 1]
    Заголовок жирный.
    \begin{tcolorbox}[title=Layer 2]
        Заголовок НЕ жирный (сброшен), фон зелёный.
    \end{tcolorbox}
\end{tcolorbox}

Пример 3: Увеличение числа управляемых слоёв

\usepackage{tcolorbox}
\tcbsetmanagedlayers{5} % В преамбуле
\tcbset{
    every box on layer 5/.style={colframe=purple}
}

\begin{tcolorbox}[title=Layer 1]
    \begin{tcolorbox}[title=Layer 2]
        \begin{tcolorbox}[title=Layer 3]
            \begin{tcolorbox}[title=Layer 4]
                \begin{tcolorbox}[title=Layer 5]
                    Фиолетовая рамка (5-й слой).
                \end{tcolorbox}
            \end{tcolorbox}
        \end{tcolorbox}
    \end{tcolorbox}
\end{tcolorbox}

3. Важные примечания

  • Команда \tcbsetmanagedlayers работает только в преамбуле.
  • По умолчанию для вложенных блоков применяется reset, что сбрасывает стили родительского блока.
  • Для глобального применения стиля используйте \tcbsetforeverylayer{...}.

1.18 - Управление Capture mode в пакете tcolorbox

Capture Mode определяет, как содержимое tcolorbox обрабатывается и отображается.

Capture Mode в tcolorbox

Capture Mode определяет, как содержимое tcolorbox обрабатывается и отображается.
Доступные режимы:

  • minipage (по умолчанию для tcolorbox)
  • hbox (по умолчанию для \tcbox)
  • fitbox (требует библиотеку fitting)

1. Основные команды и стили

Команда / Опция Синтаксис Описание
capture=<mode> \begin{tcolorbox}[capture=minipage] ... \end{tcolorbox} Устанавливает режим обработки содержимого (minipage, hbox, fitbox).
hbox (стиль) \begin{tcolorbox}[hbox] ... \end{tcolorbox} Короткая запись для capture=hbox.
minipage (стиль) \begin{tcolorbox}[minipage] ... \end{tcolorbox} Короткая запись для capture=minipage.
fitbox (стиль) \begin{tcolorbox}[fitbox] ... \end{tcolorbox} Короткая запись для capture=fitbox (требует \tcbuselibrary{fitting}).

2. Примеры использования

2.1. Режим minipage (по умолчанию)

\begin{tcolorbox}[
    capture=minipage, % можно опустить (стоит по умолчанию)
    colframe=blue,
    colback=white,
    title=Minipage Mode
]
Этот блок ведёт себя как `minipage`.  
Можно разбивать на части (`breakable`), добавлять верхнюю и нижнюю части.
\end{tcolorbox}

Особенности:

  • Поддерживает breakable (разрыв на страницах).
  • Можно использовать upper и lower части.

2.2. Режим hbox (как \tcbox)

\begin{tcolorbox}[
    hbox, % короткая запись для capture=hbox
    colframe=red,
    colback=white,
    title=HBox Mode
]
Этот блок ведёт себя как `\hbox` (аналогично `\tcbox`).
\end{tcolorbox}

Особенности:

  • Нельзя разбивать (breakable не работает).
  • Размер подстраивается под содержимое.

2.3. Режим fitbox (требует fitting)

\usepackage{tcolorbox}
\tcbuselibrary{fitting} % обязательно подключить

\begin{tcolorbox}[
    fitbox, % короткая запись для capture=fitbox
    height=2cm,
    width=6cm,
    colframe=green,
    colback=white,
    title=FitBox Mode
]
Содержимое масштабируется под размер блока.
\end{tcolorbox}

Особенности:

  • Размер содержимого подгоняется под заданные размеры блока.
  • Полезно для создания блоков фиксированного размера.

3. Сравнение режимов

Режим Разрыв (breakable) Размер Использование
minipage Да Под содержимое Основные блоки с текстом
hbox Нет Под содержимое Компактные блоки (\tcbox)
fitbox Нет Фиксированный Блоки с жёсткими размерами

4. Полный пример с разными режимами

\documentclass{article}
\usepackage{tcolorbox}
\tcbuselibrary{fitting} % для fitbox

\begin{document}

\begin{tcolorbox}[
    minipage, % или capture=minipage
    colframe=blue,
    title=Minipage Mode,
    breakable % можно разрывать
]
Этот блок ведёт себя как `minipage`.  
Можно разбивать на страницы и использовать `lower` и `upper` части.
\end{tcolorbox}

\begin{tcolorbox}[
    hbox,
    colframe=red,
    title=HBox Mode
]
Это компактный блок (`\hbox`).
\end{tcolorbox}

\begin{tcolorbox}[
    fitbox,
    width=5cm,
    height=3cm,
    colframe=green,
    title=FitBox Mode
]
Содержимое подгоняется под размер блока.
\end{tcolorbox}

\end{document}

Результат:

  • Первый блок (minipage) может быть разорван на страницы.
  • Второй блок (hbox) компактный, без разрывов.
  • Третий блок (fitbox) имеет фиксированный размер.

1.19 - Управление характеристиками текста в пакете tcolorbox

Настройки оформления текста внутри tcolorbox позволяют управлять поведением абзацев, переносом слов и другими текстовыми характеристиками.

Text Characteristics в tcolorbox

Настройки оформления текста внутри tcolorbox позволяют управлять поведением абзацев, переносом слов и другими текстовыми характеристиками.


1. Основные команды и стили

Опция Синтаксис Описание Значение по умолчанию
parbox parbox=true / parbox=false Определяет, будет ли текст обрабатываться как в minipage/parbox (влияет на форматирование абзацев). true
hyphenationfix hyphenationfix=true / hyphenationfix=false Включает исправление проблем с переносом длинных слов в узких блоках. false

2. Примеры использования

2.1. Опция parbox

Включает/отключает режим parbox (аналогично minipage).

Пример с parbox=true (по умолчанию)

\begin{tcolorbox}[
    parbox=true, % можно не указывать (стоит по умолчанию)
    width=0.45\linewidth,
    colframe=blue,
    title=parbox=true (стандартное поведение)
]
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
\end{tcolorbox}

Особенности:

  • Абзацы форматируются как в minipage.
  • Подходит для большинства случаев.

Пример с parbox=false

\begin{tcolorbox}[
    parbox=false,
    width=0.45\linewidth,
    colframe=red,
    title=parbox=false (обычный текст)
]
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
\end{tcolorbox}

Особенности:

  • Текст ведёт себя как в основном документе (не как в minipage).
  • Может вызывать неожиданные эффекты в сложных блоках.

2.2. Опция hyphenationfix

Исправляет проблемы с переносом длинных слов в узких блоках.

Пример без hyphenationfix (по умолчанию)

\begin{tcolorbox}[
    width=3cm,
    colframe=green,
    title=Без hyphenationfix
]
Rechnungsadjunktentochter.\par
Statthaltereikonzipist.
\end{tcolorbox}

Проблема:

  • Длинные слова не переносятся.

Пример с hyphenationfix=true

\begin{tcolorbox}[
    hyphenationfix=true,
    width=3cm,
    colframe=green,
    title=С hyphenationfix
]
Rechnungsadjunktentochter.\par
Statthaltereikonzipist.
\end{tcolorbox}

Результат:

  • Длинные слова корректно переносятся.

3. Важные замечания

  1. Не используйте parbox=false и hyphenationfix вместе — они предназначены для разных типов блоков и могут конфликтовать.
  2. parbox=false — экспериментальная опция, применяйте её только при необходимости.
  3. hyphenationfix полезен в узких блоках, где pdflatex не справляется с переносом.

4. Полный пример

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{tcolorbox}
\usepackage{lipsum} % для демонстрации текста

\begin{document}

\begin{tcolorbox}[
    parbox=true,
    width=0.45\linewidth,
    colframe=blue,
    title=parbox=true (стандартное поведение)
]
\lipsum[1][1-3] % Первые три предложения из lipsum
\end{tcolorbox}
\hfill
\begin{tcolorbox}[
    parbox=false,
    width=0.45\linewidth,
    colframe=red,
    title=parbox=false (обычный текст)
]
\lipsum[1][1-3]
\end{tcolorbox}

\vspace{1cm}

\begin{tcolorbox}[
    width=3cm,
    colframe=green,
    title=Без hyphenationfix
]
Rechnungsadjunktentochter.\par
Statthaltereikonzipist.
\end{tcolorbox}
\hfill
\begin{tcolorbox}[
    hyphenationfix=true,
    width=3cm,
    colframe=green,
    title=С hyphenationfix
]
Rechnungsadjunktentochter.\par
Statthaltereikonzipist.
\end{tcolorbox}

\end{document}

Результат:

  • Первые два блока показывают разницу между parbox=true и parbox=false.
  • Вторые два блока демонстрируют работу hyphenationfix.

Вывод

  • parbox=true — стандартное поведение (рекомендуется).
  • parbox=false — экспериментальная опция (используйте осторожно).
  • hyphenationfix=true — решает проблемы с переносом длинных слов.

Если нужно что-то уточнить или добавить, дайте знать!

1.20 - Files - Работа с временными файлами в tcolorbox

В этом разделе рассматривается управление временными файлами, которые используются при работе с tcbwritetemp и cbusetemp.

Files - Работа с временными файлами в tcolorbox

В этом разделе рассматривается управление временными файлами, которые используются при работе с tcbwritetemp и \tcbusetemp.


1. Основные команды и параметры

Опция / Команда Синтаксис Описание
tempfile tempfile=<имя_файла> Устанавливает имя временного файла (по умолчанию: \jobname.tcbtemp).
\tcbwritetemp \tcbwritetemp{<содержимое>} Записывает содержимое во временный файл.
\tcbusetemp \tcbusetemp Вставляет содержимое временного файла в документ.

2. Примеры использования

2.1. Изменение имени временного файла

\documentclass{article}
\usepackage{tcolorbox}

\begin{document}

\tcbset{tempfile=mytempfile.tmp} % меняем имя временного файла

\begin{tcolorbox}[title=Пример с временным файлом]
Содержимое блока будет записано в \texttt{mytempfile.tmp} вместо \texttt{\jobname.tcbtemp}.
\end{tcolorbox}

\end{document}

Результат:
Временный файл будет называться mytempfile.tmp вместо стандартного <имя_документа>.tcbtemp.


2.2. Запись и использование временного файла

\documentclass{article}
\usepackage{tcolorbox}

\begin{document}

% Записываем текст во временный файл
\tcbwritetemp{Этот текст будет сохранён во временный файл.}

% Вставляем содержимое временного файла в документ
\begin{tcolorbox}[title=Содержимое временного файла]
\tcbusetemp
\end{tcolorbox}

\end{document}

Результат:
В блоке tcolorbox отобразится текст, записанный через \tcbwritetemp.


3. Важные замечания

  1. Имя файла по умолчанию
    Если не указать tempfile, будет использоваться <имя_документа>.tcbtemp (например, document.tcbtemp).

  2. Автоматическое управление

    • \tcbwritetemp автоматически записывает содержимое в указанный временный файл.
    • \tcbusetemp автоматически вставляет его в документ.
  3. Очистка временных файлов
    LaTeX не удаляет временные файлы автоматически - их нужно удалять вручную или с помощью скриптов сборки.


4. Полный пример

\documentclass{article}
\usepackage{tcolorbox}

\begin{document}

% Устанавливаем кастомное имя файла
\tcbset{tempfile=my_custom_tempfile.tmp}

% Пишем текст во временный файл
\tcbwritetemp{
Этот текст был записан во временный файл \texttt{my\_custom\_tempfile.tmp}.
}

% Вставляем содержимое файла в бокс
\begin{tcolorbox}[
  colframe=blue,
  colback=white,
  title=Пример работы с временными файлами,
  fonttitle=\bfseries
]
Содержимое временного файла:\\
\tcbusetemp
\end{tcolorbox}

\end{document}

Результат:

  • Создаётся временный файл my_custom_tempfile.tmp
  • Его содержимое вставляется в цветную рамку

Вывод

Опция tempfile позволяет:

  • Контролировать имена временных файлов
  • Избегать конфликтов при использовании нескольких документов
  • Организовать сложные схемы работы с содержимым

Команды \tcbwritetemp и \tcbusetemp предоставляют удобный способ:

  • Сохранения промежуточного содержимого
  • Повторного использования текста в документе

Для сложных документов рекомендуется явно указывать tempfile, чтобы избежать неожиданных перезаписей.

1.21 - cbox Specials - Специальные настройки для cbox и cboxmath

В этом разделе рассматриваются специальные параметры, которые работают только с командами cbox и cboxmath.

\tcbox Specials - Специальные настройки для \tcbox и \tcboxmath

В этом разделе рассматриваются специальные параметры, которые работают только с командами \tcbox и \tcboxmath.


1. Основные команды и параметры

1.1. Вертикальное выравнивание

Опция / Стиль Синтаксис Описание
tcbox raise tcbox raise=<длина> Поднимает \tcbox на указанную высоту (например, 5mm).
tcbox raise base tcbox raise base Выравнивает \tcbox по базовой линии текста.
on line on line Комбинация tcbox raise base + nobeforeafter (аналог \fbox).

Пример:

\tcbset{colframe=blue!50!black, colback=white}
Test\tcbox[tcbox raise base]{Выровнено по базовой линии} и \tcbox[tcbox raise=2mm]{Приподнято на 2mm}.

1.2. Стиль verbatim

Опция / Стиль Синтаксис Описание
verbatim verbatim Уменьшает размеры \tcbox и включает nobeforeafter + tcbox raise base.

Пример:

\DeclareTotalTCBox{\myverb}{ v }{verbatim, colframe=red!75!black}{#1}
Команда \myverb{\textbf} выделяет текст.

1.3. Управление шириной (tcbox width)

Режим Описание
auto Ширина определяется содержимым (по умолчанию).
auto limited Ширина как у содержимого, но не больше заданной (width).
forced center Фиксированная ширина (width), текст по центру (может выходить за границы).
forced left Фиксированная ширина, текст по левому краю.
forced right Фиксированная ширина, текст по правому краю.
minimum center Минимальная ширина (width), может увеличиваться.
minimum left Минимальная ширина, текст по левому краю.
minimum right Минимальная ширина, текст по правому краю.

Пример:

\tcbset{width=3cm, colframe=blue!75!black}
\tcbox[tcbox width=auto]{auto} \\
\tcbox[tcbox width=forced center]{forced center} \\
\tcbox[tcbox width=minimum left]{minimum left}

2. Примеры использования

2.1. Выравнивание по базовой линии

Обычный текст \tcbox[tcbox raise base, colframe=green]{Выровнено} и \tcbox[colframe=red]{Не выровнено}.

Результат:
Первая рамка выровнена с текстом, вторая — смещена вниз.


2.2. Режимы ширины

\tcbset{width=4cm, colframe=blue!50!black}

\begin{itemize}
\item \tcbox[tcbox width=auto]{auto} — ширина по содержимому
\item \tcbox[tcbox width=forced center]{forced center} — фиксированная ширина
\item \tcbox[tcbox width=minimum right]{minimum right} — минимальная ширина
\end{itemize}

2.3. Verbatim-боксы

\DeclareTotalTCBox{\code}{ v }{verbatim, colframe=black}{#1}
Используйте \code{\textbackslash LaTeX} для красивого набора.

3. Полный пример

\documentclass{article}
\usepackage{tcolorbox}

\begin{document}

\section{Выравнивание}
Обычный текст \tcbox[on line, colframe=blue]{on line} и \tcbox[tcbox raise=3mm, colframe=red]{raise=3mm}.

\section{Управление шириной}
\tcbset{width=5cm, colframe=green!70!black}

\begin{tabular}{ll}
\textbf{Режим} & \textbf{Пример} \\
auto & \tcbox[tcbox width=auto]{Короткий текст} \\
forced center & \tcbox[tcbox width=forced center]{Очень длинный текст, который не помещается} \\
minimum left & \tcbox[tcbox width=minimum left]{Адаптивная ширина} \\
\end{tabular}

\section{Verbatim}
\DeclareTotalTCBox{\cmd}{ v }{verbatim, colframe=black}{#1}
Команда \cmd{\textbf} делает текст жирным.

\end{document}

4. Важные замечания

  1. tcbox raise работает только с \tcbox и \tcboxmath.
  2. verbatim стиль уменьшает отступы — используйте для коротких команд.
  3. forced режимы могут обрезать текст — применяйте осторожно.

Вывод

  • Для встроенных в текст рамок используйте on line или tcbox raise base.
  • Для управления шириной выбирайте подходящий tcbox width режим.
  • Для оформления команд удобен verbatim стиль.

Эти настройки дают полный контроль над встроенными цветными рамками в LaTeX!

1.22 - Counters, Labels, and References - Счётчики, метки и ссылки в tcolorbox

В этом разделе рассматриваются механизмы работы с нумерацией, перекрёстными ссылками и гиперссылками в рамках tcolorbox.

Counters, Labels, and References - Счётчики, метки и ссылки в tcolorbox

В этом разделе рассматриваются механизмы работы с нумерацией, перекрёстными ссылками и гиперссылками в рамках tcolorbox.


1. Основные команды и параметры

1.1. Основные опции для работы с метками

Опция Синтаксис Описание
phantom phantom={\refstepcounter{mycounter}} Выполняет код без видимого вывода (для счётчиков и меток)
nophantom nophantom Отключает ранее заданный phantom код
label label=mylabel Устанавливает метку для ссылок через \ref
phantomlabel phantomlabel=mylabel Аналог label для ненумерованных боксов
step step=mycounter Увеличивает счётчик (\refstepcounter)
step and label step and label={mycounter}{mylabel} Комбинация step + label

Пример базового использования:

\begin{tcolorbox}[
    label=mybox,
    title=Пример с меткой
]
Содержимое бокса. Ссылка: \ref{mybox}.
\end{tcolorbox}

1.2. Типы ссылок

Опция Синтаксис Описание
label is label label is label Использует стандартные \label/\ref (по умолчанию)
label is zlabel label is zlabel Использует \zlabel из пакета zref
label type label type=theorem Задаёт тип ссылки для cleveref/zref-clever
no label type no label type Сбрасывает тип ссылки

Пример с cleveref:

\usepackage{cleveref}
\begin{tcolorbox}[
    label=mytheorem,
    label type=theorem,
    title=Теорема
]
Содержимое. Ссылка: \cref{mytheorem}.
\end{tcolorbox}

1.3. Дополнительные возможности

Опция Синтаксис Описание
nameref nameref=Моё название Текст для \nameref
short title short title=Краткое название Устанавливает nameref и list entry
hypertarget hypertarget=mytarget Создаёт якорь для гиперссылок
bookmark bookmark=Название Добавляет закладку PDF
index index=Термин Добавляет запись в индекс

2. Примеры использования

2.1. Автоматическая нумерация

\newtcolorbox[auto counter]{mybox}[1][]{
    colback=white,
    title=Блок \thetcbcounter,
    #1
}

\begin{mybox}[label=box1]
Первый блок. Ссылка: \ref{box1}.
\end{mybox}

2.2. Работа с гиперссылками

\usepackage{hyperref}
\begin{tcolorbox}[
    hypertarget=target1,
    title=Кликабельный блок
]
\hyperlink{target2}{Перейти к другому блоку}.
\end{tcolorbox}

\begin{tcolorbox}[
    hypertarget=target2,
    title=Целевой блок
]
Этот блок будет целью ссылки.
\end{tcolorbox}

2.3. Индексирование и закладки

\usepackage{imakeidx,bookmark}
\makeindex

\begin{tcolorbox}[
    bookmark=Важная теорема,
    index=Теоремы,
    title=Теорема Пифагора
]
$a^2 + b^2 = c^2$
\end{tcolorbox}

3. Полный пример

\documentclass{article}
\usepackage{tcolorbox}
\usepackage{hyperref,cleveref,bookmark,imakeidx}
\makeindex

\newtcolorbox[auto counter]{theorem}[2][]{
    colback=green!5,
    title=Теорема \thetcbcounter: #2,
    label type=theorem,
    #1
}

\begin{document}

\section{Примеры}

\begin{theorem}[label=pyth]{Пифагора}
$a^2 + b^2 = c^2$
\end{theorem}

Ссылка на \cref{pyth}.

\begin{tcolorbox}[
    bookmark=Демонстрация,
    index=Примеры,
    hypertarget=demo,
    title=Демо-блок
]
Этот блок имеет:
\begin{itemize}
\item Закладку PDF
\item Запись в индексе
\item Якорь для ссылок
\end{itemize}
\end{tcolorbox}

\printindex
\end{document}

4. Важные замечания

  1. Для работы zlabel требуется пакет zref
  2. phantom код выполняется в группе - используйте \global для глобальных изменений
  3. Опции bookmark и index требуют соответствующих пакетов

Вывод

  • Используйте label и phantom для перекрёстных ссылок
  • label type улучшает работу с cleveref
  • hypertarget и bookmark добавляют интерактивности PDF
  • index интегрирует боксы в предметный указатель

1.23 - Even and Odd Pages - Разное оформление для чётных и нечётных страниц

В этом разделе рассматриваются механизмы для различного оформления tcolorbox на чётных и нечётных страницах документа.

Even and Odd Pages - Разное оформление для чётных и нечётных страниц

В этом разделе рассматриваются механизмы для различного оформления tcolorbox на чётных и нечётных страницах документа.


1. Основные команды и параметры

1.1. Основные опции

Опция/Команда Синтаксис Описание
check odd page check odd page=true/false Включает точную проверку чётности страницы (требует 2-х компиляций)
if odd page if odd page={нечётные}{чётные} Разные стили для чётных/нечётных страниц
if odd page or oneside if odd page or oneside={нечётные}{чётные} Для односторонней печати всегда применяет “нечётные” стили
if odd page* if odd page*={нечётные}{чётные} Аналог if odd page для breakable-боксов (требует библиотеку breakable)
\tcbifoddpage \tcbifoddpage{нечётный код}{чётный код} Условный оператор в коде
\thetcolorboxnumber \thetcolorboxnumber Уникальный номер бокса (внутри бокса)
\thetcolorboxpage \thetcolorboxpage Номер страницы бокса (требует check odd page=true)

2. Примеры использования

2.1. Разные цвета для чётных/нечётных страниц

\begin{tcolorbox}[
    if odd page={colback=yellow!30}{colback=blue!30},
    title=Блок на \tcbifoddpage{нечётной}{чётной} странице
]
Этот блок будет жёлтым на нечётных и синим на чётных страницах.
Текущая страница: \thetcolorboxpage.
\end{tcolorbox}

2.2. Для breakable-боксов (с разрывом)

\usepackage{tcolorbox}
\tcbuselibrary{breakable}

\begin{tcolorbox}[
    breakable,
    if odd page*={colback=red!20}{colback=green!20},
    title=Разрываемый блок
]
Длинный текст, который может занимать несколько страниц...
Каждая часть будет окрашена в зависимости от чётности страницы.
\end{tcolorbox}

2.3. Использование в водяных знаках

\begin{tcolorbox}[
    enhanced,
    check odd page,
    watermark text={\tcbifoddpage{НЕЧЁТНАЯ}{ЧЁТНАЯ}},
    title=Пример с водяным знаком
]
Содержимое блока. Водяной знак покажет чётность страницы.
\end{tcolorbox}

3. Важные особенности

  1. Точность проверки:

    • Для точного определения чётности страницы требуется:
      • Установить check odd page=true
      • Двойная компиляция документа
    • Без этой опции проверка может работать некорректно для первого блока на странице
  2. Разрываемые боксы:

    • Для breakable-боксов используйте if odd page* вместо if odd page
    • Либо упакуйте if odd page в extras:
\begin{tcolorbox}[
    breakable,
    check odd page,
    extras={if odd page={colback=yellow}{colback=blue}}
]
...
\end{tcolorbox}
  1. Односторонняя печать:
    • Для документов с oneside используйте if odd page or oneside
    • В этом случае всегда будут применяться “нечётные” стили

4. Полный пример

\documentclass[twoside]{article}
\usepackage{tcolorbox}
\tcbuselibrary{breakable}
\usepackage{lipsum}

\newtcolorbox{smartbox}[1][]{
    check odd page,
    if odd page*={colback=yellow!10}{colback=blue!10},
    colframe=black,
    title=Блок на странице \thetcolorboxpage,
    #1
}

\begin{document}

\section{Разное оформление для чётных/нечётных страниц}

\begin{smartbox}
Этот блок автоматически меняет цвет в зависимости от страницы.
\begin{itemize}
\item Номер бокса: \thetcolorboxnumber
\item Номер страницы: \thetcolorboxpage
\end{itemize}
\end{smartbox}

\begin{smartbox}[breakable]
\lipsum[1-4]
Длинное содержимое, которое может переноситься на несколько страниц.
Каждая часть будет окрашена соответствующим образом.
\end{smartbox}

\end{document}

5. Вывод

  1. Для разного оформления на чётных/нечётных страницах:

    • Используйте if odd page для обычных боксов
    • Используйте if odd page* для breakable-боксов
    • Для точности добавьте check odd page=true
  2. Специальные команды:

    • \tcbifoddpage - условный оператор в коде
    • \thetcolorboxnumber - уникальный номер бокса
    • \thetcolorboxpage - точный номер страницы
  3. Для односторонней печати используйте варианты с or oneside.

1.24 - Externalization - Интеграция с внешними файлами TikZ

В этом разделе рассматривается взаимодействие tcolorbox с системой внешних файлов (externalization) пакета TikZ.

Externalization - Интеграция с внешними файлами TikZ

В этом разделе рассматривается взаимодействие tcolorbox с системой внешних файлов (externalization) пакета TikZ.


1. Основные команды и параметры

Опция/Команда Синтаксис Описание
shield externalize shield externalize=true/false Защищает tcolorbox от внешнего экспорта (по умолчанию false)
external external=имя_файла Устанавливает имя файла для экспорта TikZ-рисунков внутри бокса
remake remake=true/false Форсирует пересоздание внешнего файла для TikZ-рисунка

2. Примеры использования

2.1. Базовое использование

\documentclass{article}
\usepackage{tcolorbox}
\usetikzlibrary{external}
\tikzexternalize % Включаем систему внешних файлов

\begin{document}

\begin{tcolorbox}[
    shield externalize, % Защищаем сам бокс от экспорта
    title=Защищённый бокс
]
Этот tcolorbox не будет экспортирован как внешний файл.

\begin{tikzpicture}
\draw (0,0) circle (1cm); % Этот рисунок БУДЕТ экспортирован
\end{tikzpicture}
\end{tcolorbox}

\end{document}

2.2. Управление экспортом отдельных рисунков

\begin{tcolorbox}[
    external=myplot, % Устанавливаем имя файла для экспорта
    remake=true,     % Форсируем пересоздание
    title=Бокс с управляемым экспортом
]
\begin{tikzpicture}
\draw[red] (0,0) rectangle (2,2); % Экспортируется в myplot.pdf
\end{tikzpicture}
\end{tcolorbox}

3. Важные особенности

  1. Автоматическое отключение в TikZ-окружении:

    • Внутри tikzpicture опция shield externalize автоматически отключается
    • Не используйте \tikzexternaldisable перед tcolorbox в этом случае
  2. Рекомендуемые паттерны использования:

    \tikzexternalenable
    % Рисунки для экспорта
    \tikzexternaldisable
    % Обычные tcolorbox
    
  3. Требования:

    • Для работы необходимо подключить библиотеку TikZ:
      \usetikzlibrary{external}
      \tikzexternalize
      
  4. Ограничения:

    • Рисунки, созданные через tikz upper и аналогичные опции, не экспортируются
    • Для сложных документов может потребоваться несколько компиляций

4. Полный пример

\documentclass{article}
\usepackage{tcolorbox}
\usetikzlibrary{external}
\tikzexternalize % Активируем систему внешних файлов
\tcbset{shield externalize} % Глобально защищаем все tcolorbox

\begin{document}

\section{Пример интеграции с внешними файлами}

\begin{tcolorbox}[title=Обычный защищённый бокс]
Этот блок не будет экспортирован как внешний файл.
\end{tcolorbox}

\begin{tcolorbox}[
    external=mycircle,
    title=Бокс с экспортируемым рисунком
]
\begin{tikzpicture}
\draw[blue, thick] (0,0) circle (1.5cm);
\node at (0,0) {Экспортируется};
\end{tikzpicture}
\end{tcolorbox}

\tikzexternaldisable % Временно отключаем экспорт
\begin{tcolorbox}[title=Временный незащищённый бокс]
Этот блок создан при отключённом экспорте.
\end{tcolorbox}
\tikzexternalenable % Возобновляем экспорт

\end{document}

5. Вывод

  1. Защита боксов:

    • Используйте shield externalize для предотвращения экспорта tcolorbox
    • Устанавливайте глобально через \tcbset, если не нужен экспорт
  2. Управление экспортом:

    • Для экспорта отдельных рисунков используйте external=имя_файла
    • Для принудительного обновления - remake=true
  3. Лучшие практики:

    • Чётко разделяйте код, требующий экспорта и не требующий
    • Используйте \tikzexternalenable/disable для группировки экспортируемых элементов

Эти механизмы позволяют эффективно комбинировать tcolorbox с системой внешних файлов TikZ, оптимизируя процесс сборки сложных документов.

1.25 - Miscellaneous - Разные дополнительные возможности

В этом разделе рассматриваются различные дополнительные функции tcolorbox, которые не вошли в предыдущие категории.

4.24 Miscellaneous - Разные дополнительные возможности

В этом разделе рассматриваются различные дополнительные функции tcolorbox, которые не вошли в предыдущие категории.


1. Основные команды и параметры

1.1. Сброс настроек

Опция Синтаксис Описание
reset reset Сбрасывает все настройки tcolorbox к значениям по умолчанию

Пример:

\begin{tcolorbox}[reset, title=Блок со сброшенными настройками]
Этот блок игнорирует все предыдущие \tcbset{}
\end{tcolorbox}

1.2. Условные операторы

Опция Синтаксис Описание
IfBlankTF IfBlankTF={текст}{опции если пусто}{опции если не пусто} Проверяет на пустоту (пробелы считаются пустотой)
IfEmptyTF IfEmptyTF={текст}{опции если пусто}{опции если не пусто} Проверяет на полную пустоту
IfNoValueTF IfNoValueTF={аргумент}{опции если нет значения}{опции если есть} Для обработки необязательных аргументов
IfValueTF IfValueTF={аргумент}{опции если есть значение}{опции если нет} Обратная версия IfNoValueTF
IfBooleanTF IfBooleanTF={аргумент}{опции если true}{опции если false} Для булевых значений

Пример с IfValueTF:

\DeclareTColorBox{mybox}{o}{%
  IfValueTF={#1}{title=#1}{title=Без названия},
  colframe=blue
}
\begin{mybox}
Блок без названия
\end{mybox}
\begin{mybox}[Мой заголовок]
Блок с названием
\end{mybox}

1.3. Специальные режимы

Опция Синтаксис Описание
void void Полностью удаляет бокс (как комментарий)
nirvana nirvana Обрабатывает содержимое, но не отображает бокс

Пример:

Текст до
\begin{tcolorbox}[void]
Этот блок полностью исчезнет
\end{tcolorbox}
Текст после

2. Примеры использования

2.1. Условное форматирование

\newtcolorbox{smartbox}[1][]{
  IfBlankTF={#1}{colback=red!10}{colback=green!10},
  title=Умный бокс
}

\begin{smartbox}[]
Будет красным (аргумент пуст)
\end{smartbox}

\begin{smartbox}[X]
Будет зелёным (аргумент не пуст)
\end{smartbox}

2.2. Обработка необязательных аргументов

\DeclareTColorBox{mybox}{o}{
  IfNoValueTF={#1}{title=Стандартный}{title=#1},
  colframe=black
}

\begin{mybox}
Стандартный заголовок
\end{mybox}

\begin{mybox}[Кастомный]
Специальный заголовок
\end{mybox}

2.3. Временное отключение боксов

Текст до
\begin{tcolorbox}[nirvana]
Этот блок обработается, но не будет виден
\begin{tcolorbox}
Вложенный блок (будет виден)
\end{tcolorbox}
\end{tcolorbox}
Текст после

3. Важные особенности

  1. reset:

    • Не сбрасывает capture, shield externalize и настройки raster
    • Автоматически применяется для вложенных боксов (начиная с v2.40)
  2. Условные операторы:

    • Основаны на функциях expl3 и xparse
    • Полезны для создания гибких шаблонов боксов
  3. void vs nirvana:

    • void полностью удаляет бокс (как если бы его закомментировали)
    • nirvana обрабатывает содержимое (счётчики и пр.), но не отображает
  4. Ограничения:

    • void нельзя использовать для вложенных боксов с одинаковыми именами
    • void не работает с \tcolorboxenvironment

4. Полный пример

\documentclass{article}
\usepackage{tcolorbox}
\usepackage{xcolor}

% Бокс с условным форматированием
\newtcolorbox{condbox}[1][]{
  IfBlankTF={#1}{colback=gray!20}{colback=#1!20},
  title=Условный бокс
}

\begin{document}

\section{Примеры разных возможностей}

\begin{condbox}[]
Стандартный серый фон (аргумент пуст)
\end{condbox}

\begin{condbox}[red]
Красный фон (аргумент указан)
\end{condbox}

% Пример с void
Текст до \begin{tcolorbox}[void]Невидимый блок\end{tcolorbox} текст после

% Пример с nirvana
Текст до \begin{tcolorbox}[nirvana]
Невидимый но обработанный блок
\begin{tcolorbox}[colback=yellow]
Вложенный видимый блок
\end{tcolorbox}
\end{tcolorbox} текст после

\end{document}

5. Вывод

  1. Для сброса настроек используйте reset
  2. Для условного форматирования применяйте:
    • IfBlankTF/IfEmptyTF - проверка на пустоту
    • IfNoValueTF/IfValueTF - работа с аргументами
    • IfBooleanTF - для булевых флагов
  3. Для скрытия блоков:
    • void - полное удаление
    • nirvana - скрытие с обработкой содержимого

2 - Справочник основных пакетов LaTeX

Справочник основных пакетов LaTeX, которые я использую, с кратким описанием их назначения и ключевых команд:

1. Кодировка и языки

fontenc

Назначение: Выбор кодировки шрифтов.

  • T1 – для западноевропейских языков.
  • T2A – для кириллицы (русский текст).
    Пример:
\usepackage[T1,T2A]{fontenc}

inputenc

Назначение: Указывает кодировку исходного файла.

  • utf8x – поддержка UTF-8.
    Пример:
\usepackage[utf8x]{inputenc}

babel

Назначение: Поддержка многоязычных документов (переносы, автоимена разделов).

  • russian – активирует русскую локализацию.
  • english – резервный язык.
    Пример:
\usepackage[english, russian]{babel}

2. Разметка страницы

geometry

Назначение: Настройка полей и размеров страницы.
Основные параметры:

  • tmargin, bmargin, lmargin, rmargin – отступы.
  • headsep, headheight – расстояние до верхнего колонтитула.
    Пример:
\usepackage{geometry}
\geometry{tmargin=25mm, bmargin=20mm, lmargin=20mm, rmargin=20mm}

fancyhdr

Назначение: Настройка колонтитулов.

  • \pagestyle{fancy} – активирует стиль.
  • \lhead, \chead, \rhead – левый/центральный/правый верхний колонтитул.
  • \lfoot, \cfoot, \rfoot – нижний колонтитул.
    Пример:
\usepackage{fancyhdr}
\pagestyle{fancy}
\lhead{Левый заголовок}
\rfoot{Страница \thepage}

3. Математика

amsmath, amsthm, amssymb

Назначение: Расширенная математическая вёрстка.

  • amsmath – улучшенные уравнения (align, gather).
  • amssymb – дополнительные символы (\mathbb, \mathcal).
  • amsthm – теоремы (\newtheorem).
    Пример:
\begin{align}
    a &= b + c \\
    E &= mc^2
\end{align}

wasysym

Назначение: Дополнительные символы (например, \diameter для диаметра).


4. Графика и таблицы

graphicx

Назначение: Вставка изображений.

  • \includegraphics[width=5cm]{image.png} – вставка с масштабированием.
    Пример:
\usepackage{graphicx}
\graphicspath{{images/}} % путь к изображениям

float

Назначение: Улучшенное управление позиционированием плавающих объектов (рисунков, таблиц).

subcaption

Назначение: Подписи к нескольким изображениям в одной фигуре.
Пример:

\begin{figure}
    \begin{subfigure}{0.5\textwidth}
        \includegraphics{img1.png}
        \caption{Первое изображение}
    \end{subfigure}
    \begin{subfigure}{0.5\textwidth}
        \includegraphics{img2.png}
        \caption{Второе изображение}
    \end{subfigure}
    \caption{Два изображения}
\end{figure}

multirow, colortbl, hhline

Назначение: Сложные таблицы.

  • \multirow – объединение строк.
  • \colortbl – цветные ячейки.
  • \hhline – двойные линии.
    Пример:
\begin{tabular}{|c|c|}
    \hline
    \multirow{2}{*}{Объединённые строки} & Текст \\ \cline{2-2}
    & Ещё текст \\ \hline
\end{tabular}

5. Гиперссылки и оглавление

hyperref

Назначение: Интерактивные ссылки в PDF.

  • \href{url}{текст} – гиперссылка.
  • \autoref{label} – автоматические подписи (“Рисунок 1”).
    Пример:
\usepackage{hyperref}
\hypersetup{colorlinks=true, linkcolor=blue}

varioref

Назначение: Умные ссылки (“на стр. 5”).

imakeidx

Назначение: Создание индекса.

  • \makeindex – активация.
  • \index{ключ} – добавление записи.
    Пример:
\usepackage{imakeidx}
\makeindex
...
\printindex

6. Текст и форматирование

ulem

Назначение: Дополнительное оформление текста.

  • \sout{текст} – зачёркивание.
  • \uline{текст} – подчёркивание.

indentfirst

Назначение: Автоматический отступ у первого абзаца.

multicol

Назначение: Многоколоночная вёрстка.
Пример:

\begin{multicols}{2}
    Текст в две колонки...
\end{multicols}

7. Разное

tikz

Назначение: Создание векторной графики прямо в LaTeX.
Пример:

\begin{tikzpicture}
    \draw (0,0) -- (1,1);
\end{tikzpicture}

xcolor

Назначение: Работа с цветами.

  • \textcolor{red}{текст} – цвет текста.

3 - Latex для авторов

LATEX для авторов актуальная версия

Введение

LaTeX 2ε был выпущен в 1994 году и добавил ряд новых концепций, которые на тот момент были актуальны. Эти концепции описаны в документе usrguide-historic, который в значительной степени остался неизменным. С тех пор команда LaTeX работала над рядом идей, в первую очередь над языком программирования для LaTeX (expl3), а затем над рядом инструментов для авторов документов, которые основываются на этом языке. Здесь мы описываем стабильные и широко используемые концепции, которые стали результатом этой работы. Эти «новые» идеи были перенесены из пакетов разработки в ядро LaTeX 2ε. Таким образом, они теперь доступны всем пользователям LaTeX и имеют такую же стабильность, как и любая другая часть ядра. Тот факт, что «за кулисами» они построены на основе expl3, полезен для команды разработчиков, но не имеет прямого значения для пользователей.

2 Создание команд и окружений документа

2.1 Обзор

Создание команд и окружений документа с использованием инструментария LaTeX3 основано на идее, что общий набор описаний может быть использован для охвата почти всех типов аргументов, используемых в реальных документах. Таким образом, парсинг сводится к простому описанию того, какие аргументы принимает команда: это описание обеспечивает «связь» между синтаксисом документа и реализацией команды.

Сначала мы опишем типы аргументов, затем перейдем к объяснению того, как их можно использовать для создания как команд документа, так и окружений. Затем будут описаны различные более специализированные функции, которые позволяют еще более богатое применение простого интерфейса.

Детали, приведенные здесь, предназначены для помощи пользователям в создании команд документа в общем. Более технические детали, подходящие для программистов TeX, включены в раздел interface3.

2.2 Описание типов аргументов

Для того чтобы каждый аргумент можно было определить независимо, парсеру необходимо знать не только количество аргументов для функции, но и природу каждого из них. Это достигается путем построения спецификации аргумента, которая определяет количество аргументов, тип каждого аргумента и любую дополнительную информацию, необходимую парсеру для чтения пользовательского ввода и правильной передачи его во внутренние функции.

Основная форма спецификатора аргумента — это список букв, где каждая буква определяет тип аргумента. Как будет описано ниже, некоторые типы требуют дополнительной информации, такой как значения по умолчанию. Типы аргументов можно разделить на две категории: те, которые определяют обязательные аргументы (возможно, вызывая ошибку, если они не найдены), и те, которые определяют необязательные аргументы.

Обязательные типы

  • m
    Стандартный обязательный аргумент, который может быть либо единственным токеном, либо несколькими токенами, заключенными в фигурные скобки {}. Независимо от ввода, аргумент будет передан во внутренний код без внешних скобок. Это спецификатор типа для обычного аргумента TeX.

  • r
    Указывается как r⟨token1⟩⟨token2⟩, это обозначает «обязательный» аргумент с разделителями, где разделителями являются ⟨token1⟩ и ⟨token2⟩. Если открывающий разделитель ⟨token1⟩ отсутствует, будет вставлен маркер по умолчанию -NoValue- после соответствующей ошибки.

  • R
    Указывается как R⟨token1⟩⟨token2⟩{⟨default⟩}, это «обязательный» аргумент с разделителями, как и r, но он имеет определяемое пользователем значение по умолчанию ⟨default⟩ вместо -NoValue-.

  • v
    Читает аргумент «дословно» между следующим символом и его следующим вхождением, аналогично аргументу команды LaTeX 2ε \verb. Таким образом, аргумент типа v читается между двумя одинаковыми символами, которые не могут быть %, , #, {, } или ␣. Дословный аргумент также может быть заключен в фигурные скобки { и }. Команда с дословным аргументом вызовет ошибку, если она появится внутри аргумента другой команды.

  • b
    Подходит только в спецификации аргумента окружения, обозначает тело окружения, между \begin{⟨environment⟩} и \end{⟨environment⟩}. См. раздел 2.11 для подробностей.

Типы, которые определяют необязательные аргументы, следующие:

  • o
    Стандартный необязательный аргумент LaTeX, заключенный в квадратные скобки, который будет предоставлять специальный маркер -NoValue-, если не указан (как будет описано позже).

  • d
    Указывается как d⟨token1⟩⟨token2⟩, необязательный аргумент, который ограничен ⟨token1⟩ и ⟨token2⟩. Как и в случае с o, если значение не указано, возвращается специальный маркер -NoValue-.

  • O
    Указывается как O{⟨default⟩}, аналогично o, но возвращает ⟨default⟩, если значение не указано.

  • D
    Указывается как D⟨token1⟩⟨token2⟩{⟨default⟩}, аналогично d, но возвращает ⟨default⟩, если значение не указано. Внутренне типы o, d и O являются сокращениями для соответствующим образом сконструированного аргумента типа D.

  • s
    Необязательная звезда(*), которая приведет к значению \BooleanTrue, если звезда присутствует, и \BooleanFalse в противном случае (как будет описано позже).

  • t
    Необязательный ⟨token⟩, который приведет к значению \BooleanTrue, если ⟨token⟩ присутствует, и \BooleanFalse в противном случае. Указывается как t⟨token⟩.

  • e
    Указывается как e{⟨tokens⟩}, набор необязательных украшений, каждое из которых требует значения. Если украшение отсутствует, возвращается -NoValue-. Каждое украшение дает один аргумент, упорядоченный в соответствии со списком ⟨tokens⟩ в спецификации аргумента. Все ⟨tokens⟩ должны быть различными.

  • E
    Аналогично e, но возвращает одно или несколько ⟨defaults⟩, если значения не указаны: E{⟨tokens⟩}{⟨defaults⟩}. См. раздел 2.7 для получения дополнительных деталей.

2.3 Модификация описаний аргументов

В дополнение к типам аргументов, обсужденным выше, описание аргументов также придает специальное значение трем другим символам.

Во-первых, + используется для того, чтобы сделать аргумент длинным (принимать параграфные токены). В отличие от \newcommand, это применяется на основе каждого отдельного аргумента. Таким образом, модификация примера на «s o o +m O{default}» означает, что обязательный аргумент теперь является \long, в то время как необязательные аргументы таковыми не являются.

Во-вторых, ! используется для управления тем, разрешены ли пробелы перед необязательными аргументами. Здесь есть некоторые тонкости, так как сам TeX имеет ограничения на то, где пробелы могут быть «обнаружены»: более подробная информация приведена в разделе 2.6.

В-третьих, = используется для объявления того, что следующий аргумент должен интерпретироваться как серия ключевых значений (keyvals). См. раздел 2.9 для получения дополнительных деталей.

Наконец, символ > используется для объявления так называемых «процессоров аргументов», которые могут быть использованы для модификации содержимого аргумента перед его передачей в определение макроса. Использование процессоров аргументов является несколько продвинутой темой (или, по крайней мере, менее часто используемой функцией) и рассматривается в разделе 2.10.

Вот перевод раздела 2.4 “Создание команд и окружений документа”:


2.4 Создание команд и окружений документа

\NewDocumentCommand {⟨cmd⟩} {⟨arg spec⟩} {⟨code⟩}
\RenewDocumentCommand {⟨cmd⟩} {⟨arg spec⟩} {⟨code⟩}
\ProvideDocumentCommand {⟨cmd⟩} {⟨arg spec⟩} {⟨code⟩}
\DeclareDocumentCommand {⟨cmd⟩} {⟨arg spec⟩} {⟨code⟩}

Эта группа команд используется для создания команды ⟨cmd⟩. Спецификация аргумента для функции задается с помощью ⟨arg spec⟩, а команда использует ⟨code⟩, где #1, #2 и т. д. заменяются на аргументы, найденные парсером.

Пример:

\NewDocumentCommand\chapter{s o m} {
  \IfBooleanTF{#1}
    {\typesetstarchapter{#3}}
    {\typesetnormalchapter{#2}{#3}}
}

Это способ определения команды \chapter, которая будет вести себя аналогично текущей команде LaTeX 2ε (за исключением того, что она будет принимать необязательный аргумент, даже когда был распарсен символ *). Команда \typesetnormalchapter может проверить свой первый аргумент на наличие значения -NoValue-, чтобы определить, присутствует ли необязательный аргумент. (См. раздел 2.8 для деталей о \IfBooleanTF и проверке на -NoValue-.)

Разница между версиями \New…, \Renew…, \Provide… и \Declare… заключается в поведении, если ⟨cmd⟩ уже определена.

  • \NewDocumentCommand выдаст ошибку, если ⟨cmd⟩ уже была определена.
  • \RenewDocumentCommand выдаст ошибку, если ⟨cmd⟩ ранее не была определена.
  • \ProvideDocumentCommand создаст новое определение для ⟨cmd⟩ только в том случае, если оно еще не было дано.
  • \DeclareDocumentCommand всегда создаст новое определение, независимо от существующей ⟨cmd⟩ с тем же именем. Это следует использовать с осторожностью.

Если ⟨cmd⟩ не может быть предоставлена как единый токен, но требует «конструирования», вы можете использовать \ExpandArgs, как объясняется в разделе 4, который также дает пример, в котором это необходимо.

\NewDocumentEnvironment {⟨env⟩} {⟨arg spec⟩} {⟨beg-code⟩} {⟨end-code⟩}
\RenewDocumentEnvironment {⟨env⟩} {⟨arg spec⟩} {⟨beg-code⟩} {⟨end-code⟩}
\ProvideDocumentEnvironment {⟨env⟩} {⟨arg spec⟩} {⟨beg-code⟩} {⟨end-code⟩}
\DeclareDocumentEnvironment {⟨env⟩} {⟨arg spec⟩} {⟨beg-code⟩} {⟨end-code⟩}

Эти команды работают так же, как \NewDocumentCommand и т. д., но создают окружения (\begin{⟨env⟩} … \end{⟨env⟩}). Как ⟨beg-code⟩, так и ⟨end-code⟩ могут получать доступ к аргументам, как определено в ⟨arg spec⟩. Аргументы будут переданы после \begin{⟨env⟩}. Все пробелы в начале и в конце {⟨env⟩} удаляются перед определением, таким образом:

\NewDocumentEnvironment{foo}

и

\NewDocumentEnvironment{ foo }

оба создают одно и то же окружение «foo».

2.5 Необязательные аргументы

В отличие от команд, созданных с помощью \newcommand в LaTeX 2ε, необязательные аргументы, созданные с помощью \NewDocumentCommand, могут безопасно вкладываться. Таким образом, например, после

\NewDocumentCommand\foo{om}{I grabbed ‘#1’ and ‘#2’}
\NewDocumentCommand\baz{o}{#1-#1}

использование команды как

\foo[\baz[stuff]]{more stuff}

выведет

I grabbed ‘stuff-stuff’ and ‘more stuff’

Это особенно полезно, когда команда с необязательным аргументом помещается внутри необязательного аргумента второй команды.

Когда необязательный аргумент следует за обязательным аргументом с тем же разделителем, парсер выдает предупреждение, поскольку необязательный аргумент не может быть опущен пользователем, тем самым фактически становясь обязательным. Это может касаться аргументов типов o, d, O, D, s, t, e и E, за которыми следуют обязательные аргументы типа r или R.

Значение по умолчанию для аргументов O, D и E может быть результатом захвата другого аргумента. Таким образом, например,

\NewDocumentCommand\foo{O{#2} m}

будет использовать обязательный аргумент в качестве значения по умолчанию для ведущего необязательного аргумента.

2.6 Пробелы и необязательные аргументы

TeX найдет первый аргумент после имени функции независимо от любых промежуточных пробелов. Это верно как для обязательных, так и для необязательных аргументов. Таким образом, \foo[arg] и \foo␣[arg] эквивалентны. Пробелы также игнорируются при сборе аргументов до последнего обязательного аргумента, который должен существовать. Поэтому после

\NewDocumentCommand\foo{m o m}{ ... }

ввод пользователя \foo{arg1}[arg2]{arg3} и \foo{arg1}␣[arg2]␣{arg3} будут парситься одинаково.

Поведение необязательных аргументов после любых обязательных аргументов можно настроить. Стандартные настройки позволят пробелы здесь, и таким образом, с

\NewDocumentCommand\foobar{m o}{ ... }

как \foobar{arg1}[arg2], так и \foobar{arg1}␣[arg2] найдут необязательный аргумент. Это можно изменить, добавив модификатор ! в спецификацию аргументов:

\NewDocumentCommand\foobar{m !o}{ ... }

где \foobar{arg1}␣[arg2] не найдет необязательный аргумент.

Существует одна тонкость, связанная с различием в обработке TeX «управляющих символов», когда имя команды состоит из одного символа, например, ‘\’. Пробелы здесь не игнорируются TeX, и, таким образом, возможно, чтобы необязательный аргумент следовал непосредственно за такой командой. Наиболее распространенный пример — использование \ в окружениях amsmath, которое в терминах здесь будет определено как

\NewDocumentCommand\\{!s !o}{ ... }

Также стоит отметить, что при использовании необязательных аргументов в последней позиции TeX обязательно будет заглядывать вперед для открытия токена аргумента. Это означает, что значение \inputlineno будет «сдвинуто на один», если такой завершающий необязательный аргумент отсутствует и команда заканчивает строку; оно будет на единицу больше, чем номер строки, содержащей последний обязательный аргумент.

2.7 «Украшения»

Аргумент типа E позволяет задавать одно значение по умолчанию для каждого тестового токена. Это достигается путем указания списка значений по умолчанию для каждой записи в списке, например:

E{^_}{{UP}{DOWN}}

Если список значений по умолчанию короче списка тестовых токенов, будет возвращен специальный маркер -NoValue- (как и для аргумента типа e). Таким образом, например:

E{^_}{{UP}}

имеет значение по умолчанию UP для тестового символа ^, но вернет маркер -NoValue- в качестве значения по умолчанию для _. Это позволяет смешивать явные значения по умолчанию с проверкой на отсутствие значений.

2.8 Проверка специальных значений

Необязательные аргументы используют специальные переменные для возврата информации о природе полученного аргумента.

\IfNoValueTF {⟨arg⟩} {⟨true code⟩} {⟨false code⟩}
\IfNoValueT {⟨arg⟩} {⟨true code⟩}
\IfNoValueF {⟨arg⟩} {⟨false code⟩}

Команды \IfNoValue(TF) используются для проверки, является ли ⟨argument⟩ (#1, #2 и т. д.) специальным маркером -NoValue-. Например:

\NewDocumentCommand\foo{o m} {
  \IfNoValueTF {#1}
    {\DoSomethingJustWithMandatoryArgument{#2}}
    {\DoSomethingWithBothArguments{#1}{#2}}
}

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

Обратите внимание, что доступны три теста, в зависимости от того, какие ветви результата требуются: \IfNoValueTF, \IfNoValueT и \IfNoValueF. Поскольку тесты \IfNoValue(TF) являются расширяемыми, возможно проверять эти значения позже, например, в момент верстки или в контексте расширения.

Важно отметить, что -NoValue- сконструирован таким образом, что он не будет соответствовать простому текстовому вводу -NoValue-, т.е.

\IfNoValueTF{-NoValue-}

будет логически ложным. Когда два необязательных аргумента следуют друг за другом (синтаксис, который мы обычно не рекомендуем), может иметь смысл позволить пользователям команды указывать только второй аргумент, предоставив пустой первый аргумент. Вместо того чтобы отдельно проверять на пустоту и на -NoValue-, лучше использовать тип аргумента O с пустым значением по умолчанию, а затем проверять на пустоту, используя условие \IfBlankTF (описанное ниже).

\IfValueTF {⟨arg⟩} {⟨true code⟩} {⟨false code⟩}
\IfValueT {⟨arg⟩} {⟨true code⟩}
\IfValueF {⟨arg⟩} {⟨false code⟩}

Обратная форма тестов \IfNoValue(TF) также доступна как \IfValue(TF). Контекст определит, какая логическая форма имеет наибольший смысл для данного сценария кода.

\IfBlankTF {⟨arg⟩} {⟨true code⟩} {⟨false code⟩}
\IfBlankT {⟨arg⟩} {⟨true code⟩}
\IfBlankF {⟨arg⟩} {⟨false code⟩}

Команда \IfNoValueTF выбирает ⟨true code⟩, если необязательный аргумент вообще не использовался (и возвращает специальный маркер -NoValue-), но не если ему было дано пустое значение. В отличие от этого, \IfBlankTF возвращает true, если его аргумент либо действительно пуст, либо содержит один или несколько обычных пробелов. Например:

\NewDocumentCommand\foo{m!o}{\par #1: 
	\IfNoValueTF{#2} 
		{No optional}% 
		{% 
	\IfBlankTF{#2} 
		{Blanks in or empty}% 
		{Real content in}% 
		}% 
	\space argument!}

\foo{1}[bar] \foo{2}[ ] \foo{3}[] \foo{4}[\space] \foo{5}[x]

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

1: Real content in argument!
2: Blanks in or empty argument!
3: Blanks in or empty argument!
4: Real content in argument!
5: No optional argument! [x]

Обратите внимание, что \space в (4) считается реальным содержимым — потому что это команда, а не символ «пробел» — даже если это приводит к созданию пробела. Вы также можете наблюдать в (5) эффект спецификатора !, предотвращающего последнюю \foo от интерпретации [x] как своего необязательного аргумента.

\BooleanFalse
\BooleanTrue

Флаги истинности и ложности, устанавливаемые при поиске необязательного символа (с использованием s или t⟨char⟩), имеют имена, которые доступны вне блоков кода.

\IfBooleanTF {⟨arg⟩} {⟨true code⟩} {⟨false code⟩}
\IfBooleanT {⟨arg⟩} {⟨true code⟩}
\IfBooleanF {⟨arg⟩} {⟨false code⟩}

Эти команды используются для проверки, является ли ⟨argument⟩ (#1, #2 и т. д.) равным \BooleanTrue или \BooleanFalse. Например:

\NewDocumentCommand\foo{sm} {
  \IfBooleanTF {#1}
    {\DoSomethingWithStar{#2}}
    {\DoSomethingWithoutStar{#2}}
}

Этот код проверяет наличие звезды в качестве первого аргумента, а затем выбирает действие на основе этой информации.

2.9 Автоматическое преобразование в формат ключ-значение

Некоторые команды документа имеют долгую историю принятия необязательного аргумента в виде «свободного текста», например, \caption и команды секционирования \section и т.д. Введение более сложных (keyval) опций для этих команд требует метода интерпретации необязательного аргумента как свободного текста или как серии ключевых значений. Это должно происходить во время захвата аргумента, так как необходимо аккуратно обрабатывать фигурные скобки для получения правильного результата.

Модификатор = доступен для того, чтобы позволить ltcmd правильно реализовать этот процесс. Модификатор гарантирует, что аргумент будет передан в дальнейший код как серия ключевых значений. Для этого = должен быть за ним, за которым следует аргумент, содержащий имя ключа по умолчанию. Это используется как ключ в паре ключ-значение, если «сырой» аргумент не имеет правильной формы для интерпретации как набора ключевых значений.

Пример с \caption

Рассмотрим \caption в качестве примера с демонстрационной реализацией:

\DeclareDocumentCommand \caption {s ={short-text} +O{#3} +m} {%
  \showtokens{Grabbed arguments:^^J(#2)^^Jand^^J(#3)}%
}

Имя ключа по умолчанию — short-text. Когда команда \caption используется, если необязательный аргумент является свободным текстом, например:

\caption[Некоторый короткий текст]{Длинный и более детализированный текст для демонстрационных целей}

то вывод будет:

Grabbed arguments: (short-text={Некоторый короткий текст}) and (Длинный и более детализированный текст для демонстрационных целей)

С другой стороны, если заголовок задан с аргументом в формате ключ-значение:

\caption[label = cap:demo]{Длинный и более детализированный текст для демонстрационных целей}

то это будет учтено:

Grabbed arguments: (label = cap:demo) and (Длинный и более детализированный текст для демонстрационных целей)

Интерпретация в формате ключ-значение

Интерпретация как ключ-значение определяется наличием символов = в аргументе. Символы в режиме встроенной математики (включенные в $...$ или \(...\)) игнорируются. Аргумент можно заставить быть прочитанным как ключ-значение, включив пустую запись в начале:

\caption[=,Это теперь ключ-значение]%
\caption[Это не $=$ ключ-значение]%

Эта пустая запись не передается в основной код, поэтому не приведет к проблемам с парсерами ключ-значение, которые не допускают пустое имя ключа. Любые знаки = в текстовом режиме необходимо обрамлять фигурными скобками, чтобы избежать неправильной интерпретации: это, вероятно, наиболее удобно обрабатывать, обрамляя весь аргумент:

\caption[{Не = ключ-значение!}]%

что будет правильно передано как:

Grabbed arguments: (short-text = {Не = ключ-значение!})

2.10 Процессоры аргументов

Процессоры аргументов применяются к аргументу после его захвата основной системой, но перед передачей в ⟨код⟩. Таким образом, процессор аргументов может использоваться для нормализации ввода на ранней стадии, позволяя внутренним функциям быть полностью независимыми от формы ввода. Процессоры применяются к пользовательскому вводу и к значениям по умолчанию для необязательных аргументов, но не к специальному маркеру -NoValue-.

Каждый процессор аргументов указывается синтаксисом >{⟨процессор⟩} в спецификации аргумента. Процессоры применяются справа налево, так что >{\ProcessorB} >{\ProcessorA} m применит \ProcessorA, а затем \ProcessorB к токенам, захваченным аргументом m.

\SplitArgument {⟨number⟩} {⟨token(s)⟩}

Этот процессор разделяет аргумент, заданный при каждом вхождении ⟨tokens⟩, до максимума ⟨number⟩ токенов (тем самым деля ввод на ⟨number⟩ + 1 частей). Ошибка будет выдана, если в вводе присутствует слишком много ⟨токенов⟩. Обработанный ввод помещается внутри ⟨number⟩ + 1 наборов фигурных скобок для дальнейшего использования. Если в аргументе меньше, чем ⟨number⟩, то в конце обработанного аргумента добавляются маркеры -NoValue-.

\NewDocumentCommand \foo {>{\SplitArgument{2}{;}} m} {\InternalFunctionOfThreeArguments#1}

Если для разделения используется только один символ ⟨токен⟩, любой символ с кодом категории 13 (активный) совпадающий с ⟨токеном⟩ будет заменен до того, как произойдет разделение. Пробелы обрезаются в начале и в конце каждого элемента, который разбирается.

Тип аргумента E несколько особенный, потому что с одним E в объявлении команды вы можете получить несколько аргументов в команде (по одному формальному аргументу на каждый токен украшения). Поэтому, когда процессор аргументов применяется к аргументу типа e/E, все аргументы проходят через этот процессор перед тем, как быть переданными в ⟨код⟩. Например, эта команда:

\NewDocumentCommand \foo { >{\TrimSpaces} e{_^} } { [#1](#2) }

применяет \TrimSpaces к обоим аргументам.

\SplitList {⟨токены⟩}

Этот процессор разделяет аргумент, заданный при каждом вхождении ⟨токенов⟩, где количество элементов не фиксировано. Каждый элемент затем оборачивается в фигурные скобки внутри #1. Результат заключается в том, что обработанный аргумент может быть дополнительно обработан с использованием функции отображения (см. ниже).

\NewDocumentCommand \foo {>{\SplitList{;}} m} {\MappingFunction#1}

Если для разделения используется только один символ ⟨токен⟩, он учтет возможность того, что ⟨токен⟩ был активирован (код категории 13) и будет разделять по таким токенам. Пробелы обрезаются в начале и в конце каждого элемента, который разбирается. Точно один набор фигурных скобок будет удален, если весь элемент окружен ими, т.е. следующие вводы и выводы приводят к результату (каждый отдельный элемент как группа фигурных скобок):

a ==> {a}
{a} ==> {a}
{a}b ==> {{a}b}
a,b ==> {a}{b}
{a},b ==> {a}{b}
a,{b} ==> {a}{b}
a,{b}c ==> {a}{{b}c}

\ProcessList {⟨список⟩} {⟨токены⟩}

Чтобы поддержать \SplitList, доступна функция \ProcessList, которая применяет ⟨токены⟩ ко всем элементам в ⟨списке⟩. ⟨Токены⟩ могут содержать произвольные данные, которые ожидают один аргумент после них: элемент списка. Например:

\NewDocumentCommand \foo {>{\SplitList{;}} m} 
	{\ProcessList{#1}{\SomeDocumentCommand}}

или

\NewDocumentCommand \foo {>{\SplitList{;}} m} 
	{\ProcessList{#1}{Abc \SomeDocumentCommand}}

\ReverseBoolean

Этот процессор изменяет логику \BooleanTrue и \BooleanFalse, так что пример из предыдущего раздела будет выглядеть следующим образом:

\NewDocumentCommand\foo{>{\ReverseBoolean} s m} {%
  \IfBooleanTF#1% 
    {\DoSomethingWithoutStar{#2}}% 
    {\DoSomethingWithStar{#2}}% 
}

\TrimSpaces

Удаляет любые ведущие и завершающие пробелы (токены с кодом символа 32 и кодом категории 10) на концах аргумента. Таким образом, например, объявление функции:

\NewDocumentCommand\foo {>{\TrimSpaces} m} 
	{\showtokens{#1}}

и использование ее в документе как:

\foo{␣hello␣world␣}

покажет «hello␣world» в терминале, при этом пробелы в начале и в конце будут удалены. \TrimSpaces удалит множественные пробелы с концов ввода в случаях, когда они были включены так, что стандартное преобразование TEX, которое сводит множественные пробелы к одному, не применяется.

2.11 Тело окружения

Хотя окружения \begin{⟨окружение⟩} ... \end{⟨окружение⟩} обычно используются в случаях, когда код, реализующий ⟨окружение⟩, не нуждается в доступе к содержимому окружения (его «телу»), иногда полезно иметь тело в качестве стандартного аргумента. Это достигается путем завершения спецификации аргумента с помощью b, который является специальным типом аргумента для этой ситуации. Например:

\NewDocumentEnvironment{twice} {O{\ttfamily} +b} {#2#1#2} {}
\begin{twice}[\itshape] 
Hello world! 
\end{twice}

выводит «Hello world!Hello world!».

Префикс + используется для разрешения нескольких абзацев в теле окружения. Процессоры аргументов также могут применяться к аргументам типа b. По умолчанию пробелы обрезаются в начале и в конце тела: в приведенном примере в противном случае будут пробелы, исходящие из концов строк после [\itshape] и world!. Добавление префикса ! перед b подавляет обрезку пробелов.

Когда b используется в спецификации аргумента, последний аргумент объявления окружения (например, \NewDocumentEnvironment), который состоит из ⟨кода завершения⟩ для вставки в \end{⟨окружение⟩}, является избыточным, так как можно просто поместить этот код в конец ⟨кода начала⟩. Тем не менее, этот (пустой) ⟨код завершения⟩ должен быть предоставлен.

Окружения, использующие эту функцию, могут быть вложенными.

2.12 Полностью расширяемые команды документа

Команды документа, созданные с помощью \NewDocumentCommand и т.д., обычно создаются так, чтобы они не расширялись неожиданно. Это достигается с использованием возможностей движка, поэтому это более мощно, чем механизм \protect в LATEX 2ε. Существуют очень редкие случаи, когда может быть полезно создать функции с использованием захватчика, который работает только на расширении. Это накладывает ряд ограничений на природу аргументов, принимаемых функцией, и на код, который она реализует. Эта возможность должна использоваться только в случае необходимости.

Команды для создания полностью расширяемых команд

\NewExpandableDocumentCommand {⟨cmd⟩} {⟨arg spec⟩} {⟨code⟩}
\RenewExpandableDocumentCommand {⟨cmd⟩} {⟨arg spec⟩} {⟨code⟩}
\ProvideExpandableDocumentCommand {⟨cmd⟩} {⟨arg spec⟩} {⟨code⟩}
\DeclareExpandableDocumentCommand {⟨cmd⟩} {⟨arg spec⟩} {⟨code⟩}

Эта группа команд используется для создания команды документа уровня ⟨cmd⟩, которая будет захватывать свои аргументы в полностью расширяемом режиме. Спецификация аргументов для функции задается с помощью ⟨arg spec⟩, а ⟨cmd⟩ будет выполнять ⟨code⟩. В общем, ⟨code⟩ также будет полностью расширяемым, хотя возможно, что это не так (например, функция для использования в таблице может расширяться так, что \omit будет первым нерасширяемым не-пробельным токеном).

Ограничения при парсинге аргументов

Парсинг аргументов с помощью чистого расширения накладывает ряд ограничений как на типы аргументов, которые могут быть прочитаны, так и на доступную проверку ошибок:

  • Последний аргумент (если таковой имеется) должен быть одним из обязательных типов m, r или R.
  • Аргумент типа «вербатим» v недоступен.
  • Процессоры аргументов (с использованием >) недоступны.
  • Невозможно различить, например, \foo[ и \foo{[}: в обоих случаях [ будет интерпретироваться как начало необязательного аргумента. В результате проверка на необязательные аргументы менее надежна, чем в стандартной версии.

2.13 Команды в начале ячеек таблицы

Создание команд, которые используются в начале ячеек таблицы, накладывает некоторые ограничения на основную реализацию. Стандартные окружения LATEX для таблиц (такие как tabular и т.д.) используют механизм, который требует, чтобы любая команда, оборачивающая \multicolumn или подобные команды, была «расширяемой». Это не относится к командам, созданным с помощью \NewDocumentCommand и т.д., которые, как описано в разделе 2.12, используют функцию движка, предотвращающую такое «расширение».

Поэтому, чтобы создать такие обертки для использования в начале ячеек таблицы, необходимо использовать \NewExpandableDocumentCommand. Например:

\NewExpandableDocumentCommand\MyMultiCol{m}{\multicolumn{3}{c}{#1}}
\begin{tabular}{lcr}
  a & b & c \\
  \MyMultiCol{stuff} \\
\end{tabular}

В этом примере команда \MyMultiCol позволяет использовать \multicolumn в ячейках таблицы, обеспечивая необходимую расширяемость.

2.14 Использование аргументов типа verbatim

Как описано выше, аргумент типа v можно рассматривать как аналог команды \verb. Прежде чем рассмотреть, что это именно означает, важно выделить некоторые ключевые различия. Прежде всего, захват аргумента, подобного verbatim, отделен от его наборки: последнее будет рассмотрено в следующем разделе.

При захвате аргумента типа v LATEX сначала использует команду ядра \dospecials, чтобы отключить «специальный» характер символов. Затем он делает как пробелы, так и табуляции «активными», чтобы им можно было задать пользовательское определение. Все остальные символы захватываются как есть: это означает, что если какие-либо символы были сделаны «специальными» и не перечислены в \dospecials, возникнет ошибка (см. ниже).

Символы, которые захватываются как аргумент, — это все те, что находятся между двумя одинаковыми символами: в отличие от \verb, символы \,, {, } и % не могут использоваться в качестве разделителей. Если любой из захваченных токенов имеет «специальное» значение, будет выдана ошибка.

Для аргумента типа +v, который позволяет переносить строки внутри аргумента, символы новой строки преобразуются в команды \obeyedline. Стандартное определение \obeyedline — это простая команда \par, что позволяет захваченным токенам использоваться непосредственно в наборе. Локальное переопределение \obeyedline может быть использовано для достижения других результатов. Например, чтобы сохранить пустые строки при наборе, можно использовать:

\renewcommand*\obeyedline{\mbox{}\par}

Дополнительная информация о использовании этих аргументов в наборе представлена в следующем подразделе.

Некоторые дополнительные детали, которые могут быть полезны для тех, кто имеет больше знаний о TEX: не беспокойтесь, если это не имеет смысла для вас! Пробелы и табуляции хранятся как активные символы. В 8-битных движках не-ASCII символы являются «активными», в то время как все символы ASCII, кроме букв a–zA–Z, являются «другими». В Юникодных движках не-ASCII кодовые точки будут либо буквами, либо «другими», в зависимости от стандартных настроек LATEX, основанных на данных Юникода. Для сравнений на основе токенов, вероятно, активные пробелы и табуляции должны быть заменены: это можно удобно сделать с помощью расширения.

2.15 Набор материала, подобного verbatim

В отличие от \verb, аргумент типа (+)v касается только захвата аргумента, а не его набора. Таким образом, функции, которые пользователи часто ассоциируют с «verbatim», не активируются автоматически, например, выбор моноширинного шрифта. Материал, захваченный аргументом типа v, не подавляет автоматически лигатуры: с современными движками TEX это в значительной степени можно сделать без манипуляций с токенами, которые использует \verb. (В \verb лигатуры подавляются путем активации символов и вставки нулевой ширины керна перед самим символом.)

Команда \verb также выбирает моноширинный шрифт: это не является внутренним для verbatim-материала, поэтому его нужно настраивать, например, с помощью \ttfamily. Аналогично, окружение verbatim настраивает значение \par, подходящее для переноса строк.

2.16 Окружения verbatim

В некоторых случаях, когда вы захватываете тело окружения, вы захотите, чтобы содержимое обрабатывалось как verbatim. Это доступно с использованием спецификации аргумента c. Как и спецификация b, это должно быть последним. Таким образом, например:

\NewDocumentEnvironment{MyVerbatim}{!O{\ttfamily} c} {\begin{center} #1 #2\end{center}} {}
\begin{MyVerbatim}[\ttfamily\itshape]
% Some code is shown here
$y = mx + c$
\end{MyVerbatim}

будет выводить содержимое verbatim, таким образом:

␣␣%␣Some␣code␣is␣shown␣here
␣␣$y␣=␣mx␣+␣c$

Поскольку захват всего содержимого verbatim приведет к отсутствию токенов \par, новые строки всегда разрешены: здесь нет необходимости в модификаторе +. Как и в спецификации v, новые строки хранятся как \obeyedline. Аналогично спецификации b, по умолчанию новые строки обрезаются в начале и в конце тела. Добавление префикса ! перед c подавляет эту обрезку.

Сбор тела происходит построчно: содержимое собирается до конца строки в исходном коде, затем проверяется перед хранением. Это означает, что строка, завершающая окружение (содержащая в приведенном выше примере \end{MyVerbatim}), не может содержать текст после конца окружения. Текст перед концом окружения обрабатывается нормально, но обратите внимание, что если здесь есть текст, то не добавляется завершающий \obeyedline. Кроме необязательных аргументов, текст не допускается на открывающей строке окружения.

Специальная обработка применяется к аргументам с спецификацией o, O, d или D, которые идут сразу перед спецификацией c. Это означает, что когда необязательный аргумент отсутствует, первый символ следующей строки будет прочитан с правильно примененным кодом категории verbatim. Проблемы могут возникнуть, если несколько необязательных аргументов используются перед спецификацией c: это будет работать надежно только в тех случаях, когда необязательные токены являются «другими» символами.

По техническим причинам мы рекомендуем не игнорировать пробелы при поиске необязательного аргумента перед спецификацией c: это можно сделать, добавив модификатор !, как показано в примере. Однако это оставлено на усмотрение пользователя.

2.17 Производительность

Для команд документа, где спецификация аргументов полностью состоит из записей m или +m (или полностью пуста), внутренняя структура, создаваемая с помощью \NewDocumentCommand, по сути, так же эффективна, как и предоставляемая \newcommand(*). Таким образом, команды документа могут заменять конструкции, возникающие из \newcommand и т.д., без необходимости беспокоиться о производительности. Следует отметить, что \newcommand(*) производит расширяемые результаты, поэтому прямой заменой является \NewExpandableDocumentCommand; однако в большинстве случаев лучше использовать \NewDocumentCommand, чтобы обеспечить более надежные структуры.

2.18 Подробности о разделителях аргументов

В обычных (нерасширяемых) командах делимитированные типы ищут начальный разделитель, заглядывая вперед (с использованием функций \peek_... из expl3), ища токен-разделитель. Токен должен иметь то же значение и «форму», что и токен, определенный как разделитель. Существует три возможных случая разделителей: символы, управляющие последовательности и активные символы. Для всех практических целей этого описания активные символы будут вести себя точно так же, как управляющие последовательности.

2.18.1 Символьные токены

Символьный токен характеризуется своим кодом символа, а его значение — кодом категории (\catcode). Когда команда определяется, значение символьного токена фиксируется в определении команды и не может изменяться. Команда правильно увидит разделитель аргумента, если открывающий разделитель имеет те же коды символа и категории, что и в момент определения. Например:

\NewDocumentCommand { \foobar } { D<>{default} } {(#1)}
\foobar <hello> \par
\char_set_catcode_letter:N <
\foobar <hello>

вывод будет:

(hello) 
(default)<hello>

так как открывающий разделитель < изменил свое значение между двумя вызовами \foobar, поэтому второй вызов не видит < как допустимый разделитель. Команды предполагают, что если был найден допустимый открывающий разделитель, то также будет соответствующий закрывающий разделитель. Если его нет (либо из-за пропуска, либо из-за изменения значения), возникает ошибка низкого уровня TEX, и вызов команды прерывается.

2.18.2 Токены управляющих последовательностей

Токен управляющей последовательности (или управляющего символа) характеризуется своим именем, а его значение — это его определение. Токен не может иметь два разных значения одновременно. Когда управляющая последовательность определяется как разделитель в команде, она будет обнаружена как разделитель всякий раз, когда имя управляющей последовательности встречается в документе, независимо от ее текущего определения. Например:

\cs_set:Npn \x { abc }
\NewDocumentCommand { \foobar } { D\x\y{default} } {(#1)}
\foobar \x hello\y \par
\cs_set:Npn \x { def }
\foobar \x hello\y

вывод будет:

(hello) 
(hello)

при этом оба вызова команды видят разделитель \x.

2.19 Создание новых процессоров аргументов

\ProcessedArgument

Процессоры аргументов позволяют манипулировать захваченным аргументом перед его передачей в основной код. Новые реализации процессоров могут быть созданы в виде функций, которые принимают один завершающий аргумент и оставляют свой результат в переменной \ProcessedArgument.

Например, \ReverseBoolean определяется следующим образом:

\ExplSyntaxOn
\cs_new_protected:Npn \ReverseBoolean #1 {
  \bool_if:NTF #1 {
    \tl_set:Nn \ProcessedArgument { \c_false_bool }
  } {
    \tl_set:Nn \ProcessedArgument { \c_true_bool }
  }
}
\ExplSyntaxOff

Примечание: Код написан на языке expl3, поэтому нам не нужно беспокоиться о том, что пробелы могут попасть в определение.

3 Копирование и отображение (робустных) команд и окружений

Если вы хотите (слегка) изменить существующую команду, вам может понадобиться сохранить текущее определение под новым именем, а затем использовать его в новом определении. Если существующая команда является робустной, то старый трюк с использованием низкоуровневой команды \let не сработает, потому что он копирует только верхнее определение, но не ту часть, которая фактически выполняет работу. Поскольку большинство команд LATEX в настоящее время являются робустными, LATEX предлагает некоторые высокоуровневые объявления для этого.

Однако, пожалуйста, обратите внимание, что обычно лучше использовать доступные хуки (например, хуки для общих команд или окружений), вместо того чтобы копировать текущее определение и тем самым замораживать его; смотрите документацию по управлению хуками lthooks-doc.pdf для получения подробной информации.

\NewCommandCopy {⟨cmd⟩} {⟨existing-cmd⟩} 
\RenewCommandCopy {⟨cmd⟩} {⟨existing-cmd⟩} 
\DeclareCommandCopy {⟨cmd⟩} {⟨existing-cmd⟩} 

Эти команды копируют определение ⟨existing-cmd⟩ в ⟨cmd⟩. После этого ⟨existing-cmd⟩ может быть переопределен, и ⟨cmd⟩ все еще будет работать! Это позволяет вам предоставить новое определение для ⟨existing-cmd⟩, которое использует ⟨cmd⟩ (т.е. его старое определение). Например, после

\NewCommandCopy\LaTeXorig\LaTeX
\RenewDocumentCommand\LaTeX{}{\textcolor{blue}{\LaTeXorig}}

все логотипы LATEX, сгенерированные с помощью \LaTeX, будут отображаться синим цветом (при условии, что у вас загружен пакет цвета).

Различия между \New... и \Renew... такие же, как и в других случаях: вы получите ошибку в зависимости от того, существует ли уже ⟨cmd⟩, или в случае \Declare... оно будет скопировано независимо от этого. Обратите внимание, что нет объявления \Provide..., потому что это было бы ограниченной ценностью.

Если ⟨cmd⟩ или ⟨existing-cmd⟩ не могут быть предоставлены как единый токен, а требуют “конструирования”, вы можете использовать \ExpandArgs, как объясняется в разделе 4.

\ShowCommand {⟨cmd⟩}

Эта команда отображает значение ⟨cmd⟩ в терминале и затем останавливается (так же, как и примитивная \show). Разница в том, что она правильно показывает значение более сложных команд, например, в случае робустных команд она отображает не только верхнее определение, но и фактический код нагрузки, а в случае команд, объявленных с помощью \NewDocumentCommand и т.д., она также предоставляет подробную информацию о сигнатуре аргументов.

\NewEnvironmentCopy {⟨env⟩} {⟨existing-env⟩} 
\RenewEnvironmentCopy {⟨env⟩} {⟨existing-env⟩} 
\DeclareEnvironmentCopy {⟨env⟩} {⟨existing-env⟩} 

Эти команды копируют определение окружения ⟨existing-env⟩ в ⟨env⟩ (как начальный, так и конечный код), т.е. это просто применение \NewCommandCopy дважды к внутренним командам, которые определяют окружение, т.е. \⟨env⟩ и \end⟨env⟩. Различия между \New..., \Renew... и \Declare... являются обычными.

\ShowEnvironment {⟨env⟩}

Эта команда отображает значение начального и конечного кода для окружения ⟨env⟩.

4 Предварительное построение имен команд (или иное расширение аргументов)

При объявлении новых команд с помощью \NewDocumentCommand, \NewCommandCopy или аналогичных команд иногда необходимо “построить” имя команды. В качестве общего механизма L3 программный уровень предлагает \exp_args:N... для этой цели, но нет механизма для этого, если \ExplSyntaxOn не активен (и смешивание команд программного и пользовательского уровней не является хорошим подходом). Поэтому мы предлагаем механизм для доступа к этой возможности с использованием именования в стиле CamelCase.

\UseName {⟨string⟩} 
\ExpandArgs {⟨spec⟩} {⟨cmd⟩} {⟨arg1⟩} . . .

\UseName преобразует ⟨string⟩ непосредственно в имя команды и затем выполняет его: это эквивалентно давно существующей внутренней команде LATEX 2ε \@nameuse или эквиваленту L3 программирования \use:c. \ExpandArgs принимает ⟨spec⟩, который описывает, как расширять ⟨arguments⟩, выполняет эти операции, а затем выполняет ⟨cmd⟩. ⟨spec⟩ использует описания, предлагаемые L3 программным уровнем, и соответствующая функция \exp_args:N... должна существовать. Общие случаи будут иметь ⟨spec⟩ в виде c, cc или Nc: см. ниже.

В качестве примера, следующее объявление предоставляет метод для генерации команд редактирования:

\NewDocumentCommand\newcopyedit{mO{red}} {
  \newcounter{todo#1}%
  \ExpandArgs{c}\NewDocumentCommand{#1}{s m} {
    \stepcounter{todo#1}%
    \IfBooleanTF {##1} {
      \todo[color=#2!10]{\UseName{thetodo#1}: ##2}%
    } {
      \todo[inline,color=#2!10]{\UseName{thetodo#1}: ##2}%
    }%
  }%
}

С учетом этого объявления вы можете написать \newcopyedit{note}[blue], что определит команду \note и соответствующий счетчик для вас.

Второй пример — это копирование команды по строковому имени с использованием \NewCommandCopy: здесь нам может понадобиться построить оба имени команд.

\NewDocumentCommand\savebyname{m} {
  \ExpandArgs{cc}\NewCommandCopy{saved#1}{#1}
}

В ⟨spec⟩ каждая c обозначает один аргумент, который преобразуется в команду. n представляет собой “нормальный” аргумент, который не изменяется, а N обозначает “нормальный” аргумент, который также остается неизменным, но состоит только из одного токена (и обычно не заключен в фигурные скобки). Таким образом, чтобы построить команду из строки только для второго аргумента \NewCommandCopy, вы бы написали:

\ExpandArgs{Nc}\NewCommandCopy\mysectionctr{c@section}

Существует несколько других одиночных букв, поддерживаемых в L3 программном уровне, которые могут быть использованы в ⟨spec⟩ для манипуляции аргументами другими способами. Если вас это интересует, ознакомьтесь с разделом “Расширение аргументов” в документации L3 программного уровня в файле interface3.pdf.

5 Расширяемые вычисления с плавающей точкой (и другие)

Программный уровень LATEX3, который является частью формата, предлагает богатый интерфейс для манипуляции переменными и значениями с плавающей точкой. Чтобы позволить (более простым) приложениям использовать это на уровне документа или в пакетах, которые иначе не используют L3 программный уровень, предоставляется несколько интерфейсных команд.

\fpeval {⟨floating point expression⟩}

Расширяемая команда \fpeval принимает в качестве аргумента выражение с плавающей точкой и производит результат, используя обычные правила математики. Поскольку эта команда является расширяемой, ее можно использовать там, где TEX требует числа, например, в низкоуровневой операции \edef, чтобы получить чисто числовой результат.

Кратко, выражения с плавающей точкой могут включать:

  • Основные арифметические операции: сложение x + y, вычитание x - y, умножение x * y, деление x / y, квадратный корень sqrt x и скобки.
  • Операторы сравнения: x < y, x <= y, x > y, x != y и т.д. Отношение x ? y истинно, если один или оба операнда являются NaN или являются кортежем, если только они не равны кортежам. Каждое ⟨отношение⟩ может быть любой (непустой) комбинацией <, =, >, и ?, плюс необязательный ведущий ! (который отрицает ⟨отношение⟩), с ограничением, что отрицательное ⟨отношение⟩ не может начинаться с ?.
  • Булева логика: знак sign x, отрицание ! x, конъюнкция x && y, дизъюнкция x || y, тернарный оператор x ? y : z.
  • Экспоненты: exp x, ln x, xˆy.
  • Целочисленный факториал: fact x.
  • Тригонометрия: sin x, cos x, tan x, cot x, sec x, csc x, ожидая, что их аргументы будут в радианах, и sind x, cosd x, tand x, cotd x, secd x, cscd x, ожидая, что их аргументы будут в градусах.
  • Обратные тригонометрические функции: asin x, acos x, atan x, acot x, asec x, acsc x, дающие результат в радианах, и asind x, acosd x, atand x, acotd x, asecd x, acscd x, дающие результат в градусах.
  • Экстремумы: max(x1, x2, ...), min(x1, x2, ...), abs(x).
  • Функции округления, управляемые двумя необязательными значениями, n (количество знаков, по умолчанию 0) и t (поведение при равенстве, по умолчанию NaN):
    • trunc(x, n) округляет к нулю,
    • floor(x, n) округляет к −∞,
    • ceil(x, n) округляет к +∞,
    • round(x, n, t) округляет к ближайшему значению, при равенстве округляя к четному значению по умолчанию, к нулю, если t = 0, к +∞, если t > 0, и к −∞, если t < 0.
  • Случайные числа: rand(), randint(m, n).
  • Константы: pi, deg (один градус в радианах).
  • Размерности, автоматически выраженные в пунктах, например, pc равен 12.
  • Автоматическое преобразование (нет необходимости в \number) целочисленных, размерных и пропускных переменных в числа с плавающей точкой, выражая размерности в пунктах и игнорируя компоненты растяжения и сжатия пропусков.
  • Кортежи: (x1, ..., xn), которые могут быть сложены, умножены или разделены на число с плавающей точкой, а также могут быть вложенными. Пример использования может быть следующим:
\LaTeX{} может теперь вычислить: $ \frac{\sin (3.5)}{2} + 2\cdot 10^{-3} = \fpeval{sin(3.5)/2 + 2e-3} $.

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

LATEX может теперь вычислить: sin(3.5) / 2 + 2 · 10−3 = −0.1733916138448099.

\inteval {⟨integer expression⟩}

Расширяемая команда \inteval принимает в качестве аргумента целочисленное выражение и производит результат, используя обычные правила математики с некоторыми ограничениями, см. ниже. Признаваемые операции: +, -, * и /, а также скобки. Поскольку эта команда является расширяемой, ее можно использовать там, где TEX требует числа, например, в низкоуровневой операции \edef, чтобы получить чисто числовой результат.

Это, по сути, тонкая оболочка для примитивной команды \numexpr, и поэтому имеет некоторые синтаксические ограничения. Эти ограничения следующие:

  • / обозначает деление, округленное до ближайшего целого числа, при этом при равенстве округление происходит от нуля;
  • возникает ошибка, и общее выражение оценивается в ноль, когда абсолютное значение любого промежуточного результата превышает (2^{31} - 1), за исключением случаев операций масштабирования (ab/c), для которых (ab) может быть произвольно большим;
  • скобки не могут появляться после унарных + или -, а именно, размещение +( или -( в начале выражения или после +, -, *, / или ( приводит к ошибке.

Пример использования может быть следующим:

\LaTeX{} может теперь вычислить: Сумма чисел равна $\inteval{1 + 2 + 3}$.

Это приводит к результату:

LATEX может теперь вычислить: Сумма чисел равна 6.
\dimeval {⟨dimen expression⟩} 
\skipeval {⟨skip expression⟩}

Эти команды аналогичны \inteval, но вычисляют длину (dimen) или значение резинки (skip). Обе команды являются тонкими оболочками вокруг соответствующих примитивов движка, что делает их быстрыми, но, следовательно, они имеют те же синтаксические особенности, как обсуждалось выше. Тем не менее, на практике они обычно достаточно эффективны. Например:

\NewDocumentCommand\calculateheight{m}{%
  \setlength\textheight{\dimeval{\topskip+\baselineskip*\inteval{#1-1}}}
}

Эта команда устанавливает \textheight на соответствующее значение, если страница должна содержать определенное количество строк текста. Таким образом, после вызова \calculateheight{40} значение будет установлено на 478.0pt, учитывая значения \topskip (10.0pt) и \baselineskip (12.0pt) в текущем документе.

6 Расширяемый эквивалент \input

\expandableinput {⟨filename⟩}

Определение \input в LATEX не может быть использовано в местах, где TEX выполняет расширение: классический пример — в начале ячейки таблицы. Существует несколько причин для этого: ключевыми являются то, что \input фиксирует, какие файлы были прочитаны, и предоставляет хуки до и после чтения файла.

Чтобы поддержать необходимость выполнения ввода файла в контекстах расширения, доступна команда \expandableinput: она пропускает запись имени файла и не применяет никакие хуки для файлов, но в остальном ведет себя как \input. В частности, она по-прежнему использует \input@path при выполнении поиска файла.

7 Изменение регистра

\MakeUppercase [⟨keyvals⟩] {⟨text⟩} 
\MakeLowercase [⟨keyvals⟩] {⟨text⟩} 
\MakeTitlecase [⟨keyvals⟩] {⟨text⟩} 

TEX предоставляет две примитивные команды \uppercase и \lowercase для изменения регистра текста. Однако у них есть ряд ограничений: они изменяют регистр только явных символов, не учитывают окружающий контекст, не поддерживают ввод UTF-8 с 8-битными движками и т.д. Чтобы преодолеть эту проблему, LATEX предоставляет команды \MakeUppercase, \MakeLowercase и \MakeTitlecase: они предлагают значительное улучшение по сравнению с примитивами TEX. Эти команды являются робустными (\protected) и могут использоваться в движущихся аргументах.

Изменение регистра в общем смысле хорошо понимается в разговорной речи. Заглавный регистр здесь следует определению, данному Консорциумом Unicode: первый символ входных данных будет преобразован в (широком смысле) заглавный регистр, а остальные символы — в строчный. Полный диапазон ввода Unicode UTF-8 может быть поддержан.

\MakeUppercase{hello WORLD ßüé}  % HELLO WORLD SSÜÉ
\MakeLowercase{hello WORLD ßüé}   % hello world ßüé
\MakeTitlecase{hello WORLD ßüé}    % Hello WORLD ßüé

Команды изменения регистра принимают необязательный аргумент, который можно использовать для настройки вывода. Этот необязательный аргумент принимает ключ locale, также доступный под псевдонимом lang, который можно использовать для указания идентификатора языка в формате BCP-47. Это затем применяется для выбора языковых особенностей при изменении регистра.

Для заглавного регистра также могут использоваться ключевые слова: это выбор между first или all. Стандартная настройка — first, что означает, что только самый первый “буквенный” символ будет (широком смысле) преобразован в заглавный регистр. Альтернатива, all, означает, что входные данные делятся по каждому пробелу, и для каждого полученного слова первый символ будет преобразован в заглавный регистр. Например:

\MakeTitlecase[words=first]{some words}  % Some words
\MakeTitlecase[words=all]{some words}    % Some Words

Входные данные, переданные этим командам, “расширяются” перед применением изменения регистра. Это означает, что любые команды внутри входных данных, которые преобразуются в чистый текст, будут изменены по регистру. Математическое содержимое автоматически исключается, как и аргументы команд \label, \ref, \cite, \begin и \end. Дополнительные исключения могут быть добавлены с помощью команды \AddToNoCaseChangeList. Входные данные могут быть исключены из изменения регистра с помощью команды \NoCaseChange.

\MakeUppercase{Some text $y = mx + c$}  % SOME TEXT y = mx + c
\MakeUppercase{\NoCaseChange{iPhone}}    % iPhone

Чтобы позволить использовать робустные команды внутри изменения регистра и получить ожидаемый вывод, доступны две дополнительные управляющие команды. \CaseSwitch позволяет пользователю указать результат для четырех возможных случаев:

  • Без изменения регистра
  • Преобразование в заглавный регистр
  • Преобразование в строчный регистр
  • Заглавный регистр (применяется только к началу входных данных)

Команда \DeclareCaseChangeEquivalent предоставляет способ заменить команду альтернативной версией, когда она встречается внутри ситуации изменения регистра. Существуют три команды для настройки изменения регистра кодовых точек:

\DeclareLowercaseMapping [⟨locale⟩] {⟨codepoint⟩} {⟨output⟩} 
\DeclareTitlecaseMapping [⟨locale⟩] {⟨codepoint⟩} {⟨output⟩} 
\DeclareUppercaseMapping [⟨locale⟩] {⟨codepoint⟩} {⟨output⟩} 

Все три принимают ⟨codepoint⟩ (в виде целочисленного выражения) и приводят к тому, что

8 Поддержка решения проблем

\listfiles [⟨options⟩]

Если эта команда помещена в преамбулу, то в конце выполнения документа на терминале (и в лог-файле) будет отображен список прочитанных файлов (в результате обработки документа). При возможности также будет предоставлено краткое описание. Эти описания, надеемся, будут включать описания, даты и номера версий для файлов пакетов и классов.

Иногда может случиться так, что в файл пакета или класса (или, скорее, в его копию) были внесены локальные изменения. Чтобы позволить идентифицировать такие случаи, \listfiles принимает необязательный аргумент, который позволяет настроить выводимую информацию с использованием подхода ключ-значение:

  • hashes — добавляет MD5-хеш для каждого файла в выводимую информацию.
  • sizes — добавляет размер файла для каждого файла в выводимую информацию.

Обратите внимание, что так как Windows и Unix используют разные окончания строк (LF против LF CR), хеши и размеры файлов из двух систем не будут одинаковыми. Поэтому следует сравнивать эти значения между операционными системами одного типа.

Предупреждение: эта команда будет перечислять только файлы, которые были прочитаны с использованием команд LATEX, таких как \input{⟨file⟩} или \include{⟨file⟩}. Если файл был прочитан с использованием примитивного синтаксиса TEX \input file (без фигурных скобок вокруг имени файла), то он не будет перечислен; несоблюдение формата LATEX с фигурными скобками может вызвать более серьезные проблемы, возможно, приведя к перезаписи важных файлов, поэтому всегда используйте фигурные скобки.

3.1 - Памятка по командам Latex 3

Краткий справочник по командам LAtex 3 для создания собственных команд и окружения

Краткая таблица с основными типами аргументов и их описанием:

| Ключ | Краткое описание                                                                 |
|------|----------------------------------------------------------------------------------|
| **m**  | Обычный обязательный аргумент (один токен или `{...}`).                          |
| **r**  | Обязательный аргумент с разделителями (формат: `r⟨t1⟩⟨t2⟩`).                     |
| **R**  | Как `r`, но с значением по умолчанию (формат: `R⟨t1⟩⟨t2⟩{⟨default⟩}`).          |
| **v**  | Дословный аргумент (аналог `\verb` в LaTeX).                                   |
| **b**  | Тело окружения (только для `\begin{...}...\end{...}`).                         |
| **o**  | Необязательный аргумент в `[...]`, возвращает `-NoValue-` если отсутствует.     |
| **d**  | Необязательный аргумент с разделителями (формат: `d⟨t1⟩⟨t2⟩`).                 |
| **O**  | Как `o`, но с значением по умолчанию (формат: `O{⟨default⟩}`).                 |
| **D**  | Как `d`, но с значением по умолчанию (формат: `D⟨t1⟩⟨t2⟩{⟨default⟩}`).         |
| **s**  | Необязательная звезда (`*`), возвращает `\BooleanTrue`/`\BooleanFalse`.        |
| **t**  | Необязательный токен (формат: `t⟨token⟩`), возвращает `\BooleanTrue`/`False`.  |
| **e**  | Необязательные "украшения" (формат: `e{⟨tokens⟩}`), возвращает `-NoValue-`.    |
| **E**  | Как `e`, но с значениями по умолчанию (формат: `E{⟨tokens⟩}{⟨defaults⟩}`).     |
| **+**  | Модификатор: делает аргумент "длинным" (параграфным).                           |
| **!**  | Модификатор: управляет пробелами перед необязательными аргументами.             |
| **=**  | Модификатор: аргумент интерпретируется как ключ-значение (keyvals).             |
| **>**  | Модификатор: применяет "процессор аргументов" для преобразования ввода.        |

Создание команд документа

\NewDocumentCommand {⟨cmd⟩} {⟨arg spec⟩} {⟨code⟩}
\RenewDocumentCommand {⟨cmd⟩} {⟨arg spec⟩} {⟨code⟩}
\ProvideDocumentCommand {⟨cmd⟩} {⟨arg spec⟩} {⟨code⟩}
\DeclareDocumentCommand {⟨cmd⟩} {⟨arg spec⟩} {⟨code⟩}

Эта группа команд используется для создания команды ⟨cmd⟩. Спецификация аргумента для функции задается с помощью ⟨arg spec⟩, а команда использует ⟨code⟩, где #1, #2 и т. д. заменяются на аргументы, найденные парсером.

Пример:

\NewDocumentCommand\chapter{s o m} {
  \IfBooleanTF{#1}
    {\typesetstarchapter{#3}}
    {\typesetnormalchapter{#2}{#3}}
}

Создание окружений документа

\NewDocumentEnvironment {⟨env⟩} {⟨arg spec⟩} {⟨beg-code⟩} {⟨end-code⟩}
\RenewDocumentEnvironment {⟨env⟩} {⟨arg spec⟩} {⟨beg-code⟩} {⟨end-code⟩}
\ProvideDocumentEnvironment {⟨env⟩} {⟨arg spec⟩} {⟨beg-code⟩} {⟨end-code⟩}
\DeclareDocumentEnvironment {⟨env⟩} {⟨arg spec⟩} {⟨beg-code⟩} {⟨end-code⟩}

Эти команды работают так же, как \NewDocumentCommand и т. д., но создают окружения (\begin{⟨env⟩} … \end{⟨env⟩}). Как ⟨beg-code⟩, так и ⟨end-code⟩ могут получать доступ к аргументам, как определено в ⟨arg spec⟩. Аргументы будут переданы после \begin{⟨env⟩}. Все пробелы в начале и в конце {⟨env⟩} удаляются перед определением, таким образом:

Проверка специальных значений

\IfNoValueTF {⟨arg⟩} {⟨true code⟩} {⟨false code⟩}
\IfNoValueT {⟨arg⟩} {⟨true code⟩}
\IfNoValueF {⟨arg⟩} {⟨false code⟩}

Команды \IfNoValue(TF) используются для проверки, является ли ⟨argument⟩ (#1, #2 и т. д.) специальным маркером -NoValue-. Например:

\NewDocumentCommand\foo{o m} {
  \IfNoValueTF {#1}
    {\DoSomethingJustWithMandatoryArgument{#2}}
    {\DoSomethingWithBothArguments{#1}{#2}}
}
\IfValueTF {⟨arg⟩} {⟨true code⟩} {⟨false code⟩}
\IfValueT {⟨arg⟩} {⟨true code⟩}
\IfValueF {⟨arg⟩} {⟨false code⟩}

Обратная форма тестов \IfNoValue(TF) также доступна как \IfValue(TF). Контекст определит, какая логическая форма имеет наибольший смысл для данного сценария кода.

\IfBlankTF {⟨arg⟩} {⟨true code⟩} {⟨false code⟩}
\IfBlankT {⟨arg⟩} {⟨true code⟩}
\IfBlankF {⟨arg⟩} {⟨false code⟩}

Таблица описывающая команды проверки специальных значений:

| Команда                     | Краткое описание                                                                 |
|-----------------------------|----------------------------------------------------------------------------------|
| `\BooleanFalse`             | Логическое значение "ложь" (используется с аргументами `s`/`t`).                |
| `\BooleanTrue`              | Логическое значение "истина" (используется с аргументами `s`/`t`).              |
| `\IfBooleanTF{arg}{true}{false}` | Проверяет, является ли `arg` булевым значением (`\BooleanTrue`/`\BooleanFalse`). |
| `\IfBooleanT{arg}{true}`    | Выполняет `true` код, если `arg` равно `\BooleanTrue`.                          |
| `\IfBooleanF{arg}{false}`   | Выполняет `false` код, если `arg` равно `\BooleanFalse`.                        |
| `\IfNoValueTF{arg}{true}{false}` | Проверяет, равен ли `arg` маркеру `-NoValue-`.                                 |
| `\IfNoValueT{arg}{true}`    | Выполняет `true` код, если `arg` равен `-NoValue-`.                             |
| `\IfNoValueF{arg}{false}`   | Выполняет `false` код, если `arg` **не** равен `-NoValue-`.                     |
| `\IfValueTF{arg}{true}{false}` | Обратная логика: `true` если `arg` **имеет** значение.                         |
| `\IfValueT{arg}{true}`      | Выполняет `true` код, если `arg` **имеет** значение.                            |
| `\IfValueF{arg}{false}`     | Выполняет `false` код, если `arg` **не имеет** значения.                        |
| `\IfBlankTF{arg}{true}{false}` | Проверяет, является ли `arg` пустым или содержит только пробелы.               |
| `\IfBlankT{arg}{true}`      | Выполняет `true` код, если `arg` пустой/пробельный.                            |
| `\IfBlankF{arg}{false}`     | Выполняет `false` код, если `arg` **не** пустой.                               |

Пример использования:

\NewDocumentCommand\foo{o m}{
  \IfNoValueTF{#1}
    {Команда без опции: #2}
    {Команда с опцией [#1] и аргументом #2}
}

Таблица с описанием процессоров аргументов и примерами их использования:

| Процессор                     | Описание                                                                 | Пример использования                                                                 |
|--------------------------------|--------------------------------------------------------------------------|--------------------------------------------------------------------------------------|
| **`\SplitArgument{n}{sep}`**   | Разделяет аргумент по `sep` на `n+1` частей, оборачивая в `{}`.          | `\NewDocumentCommand\foo{>{\SplitArgument{2}{;}}m}{#1}``\foo{a;b;c}``{a}{b}{c}` |
| **`\SplitList{sep}`**          | Разделяет аргумент по `sep` на неограниченное число частей.              | `\NewDocumentCommand\foo{>{\SplitList{,}}m}{\ProcessList{#1}{\textbf}}``\foo{a,b}`**a** **b** |
| **`\ProcessList{list}{cmd}`**  | Применяет `cmd` к каждому элементу `list` (используется с `\SplitList`). | `\ProcessList{{a}{b}}{\textbf}`**a****b**                                         |
| **`\ReverseBoolean`**          | Инвертирует булевы значения (`\BooleanTrue``\BooleanFalse`).          | `\NewDocumentCommand\foo{>{\ReverseBoolean}s}{Star: \IfBooleanT{#1}{YES}}``\foo*` выведет "Star: NO" |
| **`\TrimSpaces`**              | Удаляет пробелы в начале/конце аргумента.                                | `\NewDocumentCommand\foo{>{\TrimSpaces}m}{[#1]}``\foo{  text  }``[text]`       |
| **Комбинация процессоров**     | Процессоры применяются справа налево.                                    | `>{\TrimSpaces} >{\SplitList{,}} m` → сначала разделит запятыми, затем обрежет пробелы. |

Примеры использования

  1. Разделение аргументов с обработкой:

    \NewDocumentCommand\formatlist{>{\SplitList{,}}m}{
      \ProcessList{#1}{\textbf}
    }
    \formatlist{a, b, c} % → **a** **b** **c**
    
  2. Обработка ключевых значений:

    \NewDocumentCommand\setoptions{>{\TrimSpaces}m}{
      \keys_set:nn {my-module} {#1}
    }
    \setoptions{ key1 = value1 , key2 = value2 }
    
  3. Инверсия логики звездочки:

    \NewDocumentCommand\checkstar{>{\ReverseBoolean}s}{
      \IfBooleanT{#1}{Звезды НЕТ} \IfBooleanF{#1}{Звезда ЕСТЬ}
    }
    \checkstar* % Выведет "Звезда ЕСТЬ"
    
  4. Многоэтапная обработка:

    \NewDocumentCommand\process{>{\TrimSpaces} >{\SplitList{;}} m}{
      \ProcessList{#1}{\SomeCommand}
    }
    \process{ a; b; c } % → обработает как `{a}{b}{c}`
    

4 - Пакеты для работы с таблицами в LaTeX

Команды и примеры построения таблиц

Пакет longtable

Назначение

Пакет longtable позволяет создавать таблицы, которые могут разбиваться на несколько страниц. Это особенно полезно для длинных таблиц, которые не помещаются на одной странице.

Основные возможности

  • Автоматический разрыв таблицы на страницы
  • Повторение заголовков на каждой странице
  • Настройка оформления разрывов

Пример использования

\usepackage{longtable}

% Настройка отступов в таблицах
\renewcommand{\tabcolsep}{0.05cm} % Горизонтальный отступ между колонками
\renewcommand{\arraystretch}{1.7} % Вертикальное растяжение строк

\begin{center}
  % Настройка цветов таблицы
  \rowcolors{2}{gray!10}{white} % Чередование цветов строк (начиная со 2-й)
  \arrayrulecolor{gray!20} % Цвет линий таблицы
  
  % Начало длинной таблицы (может переноситься на несколько страниц)
  % Формат колонок: B{2} - жирная шириной 2cm, L{8} и L{5} - обычные шириной 8cm и 5cm
  \begin{longtable}{B{2}|L{8}|L{5}}

    %%% ЗАГОЛОВОК НА ПЕРВОЙ СТРАНИЦЕ %%%
    \caption[Технические характеристики]{Основные характеристики \label{tab:tech-character}}\\
    \rowcolor{black!90} % Цвет фона заголовка
    
    % Названия колонок (белый текст на темном фоне)
    \multicolumn{1}{c}{\color{white}{}} & 
    \multicolumn{1}{c}{\color{white}{Характеристика}} & 
    \multicolumn{1}{c}{\color{white}{Значение}} \\
    \endfirsthead % Конец заголовка для первой страницы

    %%% ЗАГОЛОВОК НА СЛЕДУЮЩИХ СТРАНИЦАХ %%%
    \caption[]{Продолжение таблицы}\\
    \rowcolor{black!90}
    \multicolumn{1}{c}{} & 
    \multicolumn{1}{c}{Характеристика} & 
    \multicolumn{1}{c}{Значение} \\
    \endhead % Конец заголовка для последующих страниц

    %%% ТЕЛО ТАБЛИЦЫ %%%
    1 & Вес: & 80кг \\
    2 & Габаритные размеры: & 730мм * 530мм * 850мм \\
    3 & Напряжение управляющего питания (низковольтное): & 9-30 Вольт \\
   
  \end{longtable}
\end{center}

Пояснение ключевых команд:

  1. Настройка внешнего вида таблицы:

    • \tabcolsep - расстояние между колонками
    • \arraystretch - коэффициент растяжения строк по вертикали
    • \rowcolors - чередование цветов строк
    • \arrayrulecolor - цвет линий таблицы
  2. Структура таблицы:

    • \begin{longtable}{формат_колонок} - начало длинной таблицы
    • Формат колонок: B{2}|L{8}|L{5} - три колонки с заданной шириной и выравниванием
  3. Заголовки:

    • \caption - название таблицы (в квадратных скобках - для списка таблиц)
    • \endfirsthead - заголовок только для первой страницы
    • \endhead - заголовок для последующих страниц
  4. Форматирование содержимого:

    • \rowcolor - цвет фона строки
    • \multicolumn - объединение ячеек по горизонтали
    • \color - цвет текста
  5. Специальные символы:

    • \diameter - символ диаметра (из пакета wasysym)

Этот пример создает профессионально оформленную таблицу с:

  • автоматическим переносом на несколько страниц
  • повторяющимися заголовками
  • чередованием цветов строк
  • настраиваемыми отступами и выравниванием

Пользовательские типы колонок

\newcolumntype{C}[1]{>{\columncolor{white}\ttfamily\centering\arraybackslash}p{#1cm}}
\newcolumntype{R}[1]{>{\columncolor{white}\ttfamily\raggedleft\arraybackslash}p{#1cm}}
\newcolumntype{L}[1]{>{\columncolor{white}\ttfamily\raggedright\arraybackslash}p{#1cm}}
\newcolumntype{B}[1]{>{\columncolor{white}\ttfamily\bfseries\raggedright\arraybackslash}p{#1cm}}

Эти определения создают новые типы колонок:

  • C - центрированное содержимое
  • R - выравнивание по правому краю
  • L - выравнивание по левому краю
  • B - полужирное содержимое с выравниванием по левому краю

Пакет tabbing

Назначение

Среда tabbing предоставляет простой способ создания таблиц с выравниванием по табуляции. Полезен для простых таблиц без рамок.

Пример использования

\begin{tabbing}
Первая колонка \= Вторая колонка \= Третья колонка \kill
Заголовок 1 \> Заголовок 2 \> Заголовок 3 \\
Данные 1 \> Данные 2 \> Данные 3 \\
Выровнено \> по \> табуляторам \\
\end{tabbing}

Основные команды

  • \= - установка табулятора
  • \> - переход к следующему табулятору
  • \kill - строка используется для установки табуляторов, но не печатается

Пакет array

Назначение

Пакет array расширяет возможности работы с таблицами, предоставляя дополнительные функции для форматирования колонок и строк.

Основные возможности

  • Дополнительные спецификаторы колонок
  • Улучшенное выравнивание
  • Возможность вставки команд перед/после элементов

Примеры использования

  1. Математическое выравнивание:
\begin{tabular}{>{$}l<{$} >{\centering\arraybackslash}m{2cm}}
\alpha & Буква альфа \\
\beta & Буква бета \\
\end{tabular}
  1. Условное форматирование:
\begin{tabular}{|>{\ifnum\value{rownum}=1 \bfseries\fi}l|l|}
\hline
Строка 1 & Данные 1 \\
Строка 2 & Данные 2 \\
\hline
\end{tabular}
  1. Использование пользовательских колонок:
\newcolumntype{M}[1]{>{\centering\arraybackslash}m{#1}}
\begin{tabular}{|M{2cm}|M{3cm}|}
Центрированная & колонка \\
ячейка & с заданной шириной \\
\end{tabular}

Полезные команды

  • \extrarowheight - добавление дополнительного пространства в строках
  • \newcolumntype - определение новых типов колонок
  • \multicolumn - объединение колонок (также доступно без array)

Эти пакеты предоставляют мощные инструменты для создания профессионально оформленных таблиц в LaTeX, от простых до самых сложных.

5 - Описание пакетов fancyhdr и fancybox

подробное описание пакетов fancyhdr и fancybox, включая ваши настройки и дополнительные примеры.

Пакеты fancyhdr и fancybox

Назначение: Оформление колонтитулов (fancyhdr) и декоративных рамок (fancybox).


1. fancyhdr

Основные возможности

  • Настройка верхних (head) и нижних (foot) колонтитулов.
  • Разные стили для чётных/нечётных страниц (twoside).
  • Автоматическая подстановка номеров страниц, названий разделов.

Команды и параметры

Инициализация

\usepackage[twoside,headings]{fancyhdr} % twoside — разные колонтитулы для чётных/нечётных страниц
\pagestyle{fancy} % Активирует стиль fancy
\fancyhf{} % Очистка текущих настроек

Настройка колонтитулов

  • \fancyhead[позиция]{содержимое} – верхний колонтитул.
  • \fancyfoot[позиция]{содержимое} – нижний колонтитул.

Позиции:

  • L – слева, C – центр, R – справа.
  • E – чётная страница, O – нечётная.
  • Комбинации: LE, RO, CE и т.д.

Пример:

\fancyhead[LE,RO]{\leftmark} % Название раздела (для чётных и нечётных)
\fancyfoot[C]{\thepage} % Номер страницы по центру

Ваш пример с tikz для фона

\AddEverypageHook{
\begin{tikzpicture}[remember picture,overlay]
\fill[black!90] (current page.north west) rectangle ($(current page.north east)+(0,-22mm)$);
\fill[black!90] (current page.south west) rectangle ($(current page.south east)+(0,15mm)$);
\end{tikzpicture}
}
\fancyhead[LE,RO]{\raisebox{1.2em}{\color{white}{\Large\leftmark}}}
\fancyfoot[LE,RO]{\color{white}{\textbf{\thepage}}}

Удаление разделительных линий

\renewcommand{\headrulewidth}{0pt} % Убирает линию под верхним колонтитулом
\renewcommand{\footrulewidth}{0pt} % Убирает линию над нижним колонтитулом

2. fancybox

Назначение: Создание декоративных рамок вокруг текста.

Основные команды

  • \shadowbox{текст} – рамка с тенью.
  • \doublebox{текст} – двойная рамка.
  • \ovalbox{текст} – овальная рамка.

Пример:

\usepackage{fancybox}
...
\shadowbox{\parbox{10cm}{Это текст в рамке с тенью.}}
\doublebox{\parbox{10cm}{Это текст в двойной рамке.}}

Кастомизация

\setlength{\shadowrule}{1pt} % Толщина тени
\setlength{\shadowsize}{4pt} % Размер тени

Примеры использования

1. Разные колонтитулы для глав и страниц

\fancyhead[LE]{\color{white}Глава \thechapter}
\fancyhead[RO]{\color{white}\nouppercase{\rightmark}}
\fancyfoot[CO,CE]{\color{white}\thepage}

2. Логотип и номер страницы

\fancyhead[L]{\includegraphics[width=2cm]{logo}}
\fancyfoot[R]{\thepage}

3. Рамки для выделения текста

\ovalbox{
  \begin{minipage}{0.9\linewidth}
    Важное замечание: этот текст выделен овальной рамкой.
  \end{minipage}
}

Заключение

  • fancyhdr идеален для сложных колонтитулов с графикой и динамическим содержимым.
  • fancybox полезен для визуального выделения блоков текста.

6 - TEX издательская система

Старая как мир компьютерная система для верстки и оформления документов.

Я от части пожалел, что сначала изучил Latex, а потом взялся за TeX.

Установка TeX

https://tug.org/texlive/doc/texlive-ru/texlive-ru.html

Установите Tex Live для полного удовлетворения своих запросов в издательской системе TeX и LaTeX.

На этой странице полная инструкция по установке https://tug.org/texlive/acquire-netinstall.html

или набрать в командной строке:

sudo pacman -S texlive
#manjaro
или 
pkg install texlive
#freebsd

6.1 - TEX команды

Самые полезные для меня команды TEX

Символы

Специальные символы

  • \# pound sign #
  • \$ dollar sign $
  • \% percent sign %
  • \& ampersand &
  • \_ underscore _
  • \lq left quote ‘
  • \rq right quote ’
  • \lbrack left bracket [
  • \rbrack right bracket ]
  • \dag dagger symbol †
  • \ddag double dagger symbol ‡
  • \copyright copyright symbol c©
  • \P paragraph symbol ¶
  • \S section symbol §

Произвольные символы

{\char65} {\char `A} {\char `\A}

Акценты

наименование Tex input Tex output Compose
grave \`o ò cmp+` o
acute \’o ó cmp+’ o
circumflex \^o ô cmp+^ o
umlaut/dieresis/tr ́emat \“o ö cmp+” o
tilde \~o õ cmp+~ o
macron \=o ő cmp+= o
dot \.o ȯ cmp+. o

Продолжение для символов требующих пробела

наименование Tex input Tex output Compose
cedilla \c o ǫ cmp+, o
underdot \d o cmp+! o
underbar \b o o᤻ o C-x 8 RET 193b
h ́acˇek \v o ǒ cmp+v o
breve \u o ŏ cmp+u o
tie \t oo o͡o o C-x 8 RET 0361 o
Hungarian umlaut \H o ő cmp+= o
ơ cmp++ o
° cmp+o o
§ cmp+s o
ø cmp+? o

или команда \accent94 или номер в таблице шрифта

Встроенные шрифты

имя описание
\fivebf use 5-point bold font
\fivei use 5-point math italic font
\fiverm use 5-point roman font
\fivesy use 5-point math symbol font
\sevenbf use 7-point bold font
\seveni use 7-point math italic font
\sevenrm use 7-point roman font
\sevensy use 7-point math symbol font
\tenbf use 10-point bold text font
\tenex use 10-point math extension font
\teni use 10-point math italic font
\tenrm use 10-point roman text font
\tensl use 10-point slanted roman font
\tensy use 10-point math symbol font
\tenit use 10-point italic font
\tentt use 10-point typewriter font

\nullfont — отменить шрифты (пусто)

В Tex по умолчанию доступны 16 шрифтов

Наименование команда
Roman \rm
Boldface \bf
Italic \it
Slanted \sl
Typewriter \tt
Math symbol5 \cal

Верхний и нижний регистр

  • \lccode 〈charcode〉 [ 〈number〉 table entry ]
  • \uccode 〈charcode〉 [ 〈number〉 table entry ]

\char\uccode`s \char\lccode`a \char\lccode`M — выдаст Sam

Строка в верхний или нижний регистр

\lowercase { 〈token list〉 } \uppercase { 〈token list〉 }

Пробелы

  • \ — вставит пробел после команды
  • ~ — неразрывный пробел
  • \/ — курсивный пробел
  • \obeyspaces — не сжимает пробелы, а сохраняет их как есть
  • \spacefactor [ 〈number〉 parameter ] — 1000 норма, <1000 больше сжимается между словами, >1000 больше растягивается.
  • \spaceskip [ 〈glue〉 parameter ] — применяет клей при SF < 2000
  • \xspaceskip [ 〈glue〉 parameter ] — применяет клей для SF > 2000
  • \sfcode 〈charcode〉 [ 〈number〉 table entry ] — устанавливает spacefactor для отдельного символа (для . он 3000)

Выравнивание строк

  • \centerline 〈argument〉
  • \leftline 〈argument〉
  • \rightline 〈argument〉
  • \line{} — выровняет по левому и правому краю
  • \llap{} — печатает влево от курсора
  • \rlap{} — печатает вправо от курсора
\noindent
\llap{off left }
\line{\vrule $\Leftarrow$ left margin of examples\hfil right margin of examples $\Rightarrow$\vrule}
\rlap{ off right}

Параграф

  • \par — новый абзац
  • \parskip=
  • \parindent=
  • \endgraf — синоним \par
  • \parfillskip [ 〈glue〉 parameter ] — \parfillskip = 0pt plus 1fil по умолчанию, определяет последнюю строку в абзаце.
  • \indent — Если TEX находится в вертикальном режиме, как это происходит после окончания абзаца, эта команда вставляет межабзацную связку \parskip, переводит TEX в горизонтальный режим, начинает абзац и делает отступ в этом абзаце на \parindent. Если TEX уже находится в горизонтальном режиме, эта команда просто создает пробел шириной \parindent. Два \indent подряд создают два отступа.
  • \noindent — запрещает отступ в начале абзаца
  • \textindent 〈argument〉 — используется для печатания сносок и пунктов списков
  • \everypar [ 〈token list〉 parameter ] — назначает команды для выполнения перед началом нового абзаца
\everypar = {$\Longrightarrow$\enspace} 
Now pay attention!\par I said, 
"Pay attention!".\par 
I'll say it again! Pay attention!

на выходе получим:
⇒ Now pay attention! 
⇒ I said, “Pay attention!”. 
⇒ I’ll say it again! Pay attention!
  • \hsize — ширина печатной области
\leftline{\raggedright\vtop{\hsize = 2.5in Here is some text that we put into a paragraph that is an inch and a half wide.}\qquad \vtop{\hsize = 1.5in Here is some more text that we put into another paragraph that is an inch and a half wide.}}

шикарный пример как печатать в 2 колонки без мути в Latex

  • \narrower — сужает абзац слева и справа на \parindent
  • \leftskip [ 〈glue〉 parameter ] — отступ слева
  • \rightskip [ 〈glue〉 parameter ] — отступ справа
  • \raggedright — убирает выравнивание справа
  • \ttraggedright — тоже для мониширинного текста
  • \hang — Эта команда устанавливает отступ во второй и последующих строках абзаца на \parindent, отступ абзаца
  • \hangafter [ 〈number〉 parameter ] — определяет, какие строки имеют отступ: Если n < 0, первые −n строк абзаца будут иметь отступ. Если n ≥ 0, все строки абзаца, кроме первых n, будут иметь отступ.
  • \hangindent [ 〈dimen〉 parameter ] — определяет величину отступа и то, находится ли он слева или справа: Если x ≥ 0, строки будут иметь отступ x слева. Если x < 0, строки будут иметь отступ -x справа.
  • \prevgraf [ 〈number〉 parameter ] — количество строк в абзаце
  • \vadjust { 〈vertical mode material〉 } — Эта команда вставляет указанный 〈материал вертикального режима〉 сразу после выходной строки, содержащей позицию, в которой встречается команда. Вы можете использовать его, например, чтобы вызвать выброс страницы или вставить дополнительное пространство после определенной строки.

Полезная штука для вставки указателей и линий:

Some of these words are \vadjust{\kern8pt\hrule} to be found above the line and others are to be found below it.

Выдаст линиюпод строкой:

Some of these words are to be found above the line and others are to be found


below it.

\parshape n i1l1 i2l2 . . . inln

Эта команда определяет форму первых n строк абзаца, следующего абзаца, если вы находитесь в вертикальном режиме, и текущего абзаца, если вы находитесь в горизонтальном режиме. «i» — это отступ слева и справа, а «l» — это длина строки, n — это количество строк, на которые будет выполнено воздействие.

Line breaks

  • \break — просто прервет строку
  • \nobreak
  • \allowbreak — для математики полезен
  • \penalty 〈number〉 — штраф 10000 или -10000 управляет разрывом строк
  • \obeylines — концу строки присваивает значение конец абзаца (полезно для стихов и программного кода)
  • \slash — поставит /, но $\backslash$ работает в математической моде
  • \pretolerance [ 〈number〉 parameter ] — (по умолчанию 100)
  • \tolerance [ 〈number〉 parameter ] — (200) это как штрафы \penalty определяют плохость для абзацев, чтобы их разрывать на странице.
  • \emergencystretch [ 〈dimen〉 parameter ] — Если TEX не может набрать абзац, не превысив \tolerance, он попытается еще раз, добавив \emergencystretch к растягиванию каждой строки.
  • \looseness [ 〈number〉 parameter ] — Этот параметр дает вам возможность изменить общее количество строк в абзаце по сравнению с оптимальным.
  • \linepenalty [ 〈number〉 parameter ] — Этот параметр определяет штраф, который TEX начисляет за каждый перенос строки при разбиении абзаца на строки.
  • \adjdemerits [ 〈number〉 parameter ] — Этот параметр определяет дополнительные недостатки, которые TEX прикрепляет к точке останова между двумя соседними строками, которые «визуально несовместимы».
  • \exhyphenpenalty [ 〈number〉 parameter ] — Увеличение этого параметра препятствует тому, чтобы TEX заканчивал строку явным дефисом. Обычный TEX устанавливает \exhyphenpenalty равным 50.
  • \hyphenpenalty [ 〈number〉 parameter ] — Увеличение этого параметра препятствует использованию в TEX переноса слов. Обычный TEX устанавливает \hyphenpenalty равным 50.
  • \doublehyphendemerits [ 〈number〉 parameter ] — Увеличение значения этого параметра препятствует TEXу расставлять переносы в двух строках подряд.
  • \finalhyphendemerits [ 〈number〉 parameter ] — Увеличение значения этого параметра препятствует тому, чтобы TEX заканчивал предпоследнюю строку дефисом.

Переносы слов Hyphenation

  • \- — расставить в тех местах слов, где допускается перенос.
  • \discretionary { 〈pre-break text〉 } { 〈post-break text〉 } { 〈no-break text〉 } — Эта команда определяет «дискреционный разрыв», а именно место, где TEX может разорвать строку. Он также сообщает TEXу, какой текст поместить по обе стороны от разрыва.
% Accounts for German usage: ‘flicken’, but ‘flik% ken’: German 
"fli\discretionary{k-}{k}{ck}en"
  • \hyphenation { 〈word〉 . . . 〈word〉 } — TEX хранит словарь исключений из своих правил расстановки переносов. В каждой словарной статье указано, как следует писать через дефис то или иное слово.
\hyphenation{Gry-phon my-co-phagy} 
\hyphenation{man-u-script man-u-scripts piz-za}
  • \uchyph [ 〈number〉 parameter ] — разрешает перенос в верхнем регистре
  • \language [ 〈number〉 parameter ] — устанавливает язык для переносов в абзаце
  • \setlanguage 〈number〉 — установит текущий язык
  • \lefthyphenmin [ 〈number〉 parameter ] \righthyphenmin [ 〈number〉 parameter ] — левое и правое количество слогов при переносе
  • \hyphenchar 〈font〉 [ 〈number〉 parameter ] — установит символ переноса
\hyphenchar\tenrm = ‘% Set hyphenation for tenrm font to ‘-’. 
\hyphenchar\tentt = -1 % Don’t hyphenate words in font tentt.% нет переноса

Секции и заголовки

- `\beginsection 〈argument〉 \par` --- заголовок секции
- `\item 〈argument〉  \itemitem 〈argument〉`  --- отступ для списков
- `\proclaim 〈argument〉. 〈general text〉 \par` --- теоремы
\proclaim Theorem 1. 
What I say is not to be believed.  
\proclaim Corollary 1. Theorem 1 is false.\par

Команды для создания страниц

Межстрочный клей

  • \baselineskip [ 〈glue〉 parameter ] — расстояние от базовой линии одного блока до другой

  • \lineskiplimit [ 〈dimen〉 parameter ] — минимальное значение межстрочного клея

  • \lineskip [ 〈glue〉 parameter ] — расстояние между низом верхнего блока и верхом нижнего блока

  • \prevdepth [ 〈dimen〉 parameter ] — глубина блока

  • \normalbaselineskip [ 〈glue〉 parameter ] — хранит значение baselineskip

  • \normallineskiplimit [ 〈dimen〉 parameter ] — хранит значение lineskiplimit

  • \normallineskip [ 〈glue〉 parameter ] — хранит значение lineskip

  • \normalbaselines — устанавливает значатения, хранящиеся в параметрах normal…

  • \offinterlineskip — отключает вставку межстрочного клея

  • \nointerlineskip — Эта команда сообщает TEXу не вставлять межстрочный клей перед следующей строкой. На последующие строки это не влияет.

  • \openup 〈dimen〉 — Эта команда увеличивает \baselineskip на 〈dimen〉.

Разрыв страниц

  • \break
  • \nobreak
  • \allowbreak
  • \penalty 〈number〉
  • \goodbreak — Эта команда завершает абзац, а также указывает TEXу, что это подходящее место для разрыва страницы.
  • \smallbreak \medbreak \bigbreak
  • \eject \supereject — Эти команды вызывают разрыв страницы в текущей позиции и завершают текущий абзац. Если нет vfill будет пытаться сам растянуть страницу.
  • \filbreak — Эта команда обеспечивает своего рода условный разрыв страницы. Он сообщает TEXу разбить страницу, но не в том случае, если текст до более позднего \filbreak также помещается на той же странице.
  • \raggedbottom \normalbottom — сообщает TEXу, что нужно разрешить некоторую вариативность нижних полей на разных страницах.

Параметры разрыва страницы

  • \interlinepenalty [ 〈number〉 parameter ] — Этот параметр определяет штраф за разрыв страницы между строками абзаца.
  • \clubpenalty [ 〈number〉 parameter ] — Этот параметр определяет штраф за разрыв страницы сразу после первой строки абзаца.
  • \widowpenalty [ 〈number〉 parameter ] — Этот параметр определяет штраф за разрыв страницы непосредственно перед последней строкой абзаца.
  • \displaywidowpenalty [ 〈number〉 parameter ] — Этот параметр определяет штраф за разрыв страницы непосредственно перед последней строкой частичного абзаца, который непосредственно предшествует математическому отображению.
  • \predisplaypenalty [ 〈number〉 parameter ] — Этот параметр определяет штраф за разрыв страницы непосредственно перед математическим отображением. Обычный TEX устанавливает \predisplaypenalty равным 10000.
  • \postdisplaypenalty [ 〈number〉 parameter ] — Этот параметр определяет штраф за разрыв страницы сразу после математического отображения.
  • \brokenpenalty [ 〈number〉 parameter ] — Этот параметр определяет штраф за разрыв страницы сразу после строки, которая заканчивается произвольным элементом (обычно дефисом).
  • \insertpenalties [ 〈number〉 parameter ] — Этот параметр содержит сумму определенных штрафов, которые накапливает TEX при размещении вставок на текущей странице.
  • \floatingpenalty [ 〈number〉 parameter ] — Этот параметр определяет штраф, который TEX добавляет к \insertpenalties, когда построитель страниц добавляет вставку на текущую страницу и обнаруживает, что предыдущая вставка того же типа на этой странице была разделена, оставив ее часть для последующих страниц.
  • \pagegoal [ 〈dimen〉 parameter ] — Этот параметр определяет желаемую высоту текущей страницы. TEX устанавливает \pagegoal в текущее значение \vsize, когда он впервые помещает блок или вставку на текущую страницу.
  • \pagetotal [ 〈dimen〉 parameter ] — Этот параметр определяет накопленную естественную высоту текущей страницы. TEX обновляет \pagetotal по мере добавления элементов в основной вертикальный список.
  • \pagedepth [ 〈dimen〉 parameter ] — Этот параметр определяет глубину текущей страницы.
  • \pageshrink [ 〈dimen〉 parameter ] — Этот параметр определяет степень сжатия накопленного клея на текущей странице.
  • \pagestretch [ 〈dimen〉 parameter ] \pagefilstretch [ 〈dimen〉 parameter ] \pagefillstretch [ 〈dimen〉 parameter ] \pagefilllstretch [ 〈dimen〉 parameter ] — Эти четыре параметра вместе определяют степень растяжения клея на текущей странице. n0 + n1fil + n2fill + n3filll

Макет страницы

  • \hsize [ 〈dimen〉 parameter ] — горизонтальный размер текста
  • \vsize [ 〈dimen〉 parameter ] — вертикальный размер текста
  • \hoffset [ 〈dimen〉 parameter ] \voffset [ 〈dimen〉 parameter ] — отступ слева и сверху
  • \topskip [ 〈glue〉 parameter ] — TEX вставляет клей вверху каждой страницы, чтобы гарантировать, что базовая линия первого блока на странице всегда находится на одинаковом расстоянии d от верха страницы.
  • \parskip [ 〈glue〉 parameter ] — Этот параметр определяет «пропуск абзаца», то есть вертикальную склейку, которую TEX вставляет в начало абзаца.
  • \maxdepth [ 〈dimen〉 parameter ] — Этот параметр определяет максимальную глубину нижнего поля на странице.

Номер страницы

  • \pageno [ 〈number〉 parameter ] — Этот параметр содержит номер текущей страницы в виде целого числа. Номер страницы обычно является отрицательным для страниц титульной страницы, которые нумеруются маленькими римскими цифрами, а не арабскими цифрами.
\pageno = 30 % Number the next page as 30. Don’t look for this explanation on page \number\pageno.
  • \advancepageno — Эта команда добавляет 1 к номеру страницы n в \pageno, если n ≥ 0, и вычитает из него 1, если n < 0.
  • \nopagenumbers — создает пустой нижний колонтитул
  • \folio — Эта команда создает номер текущей страницы, значением которого является число n, содержащееся в \pageno. Если n ≥ 0, TEX выдает n как десятичное число, а если n < 0, TEX выдает −n в виде строчных римских цифр.
  • \headline [ 〈token list〉 parameter ] — заголовок
  • \footline [ 〈token list〉 parameter ] — подвал

Метки Marks

  • \mark { 〈text〉 } — Эта команда заставляет TEX добавлять метку, содержащую 〈текст метки〉, к любому списку, который он в данный момент создает.
  • \firstmark \botmark \topmark — Эти команды расширяются до текста метки в элементе, созданном предыдущей командой \mark.
  • \splitfirstmark \splitbotmark — Эти команды расширяются до текста метки, сгенерированного более ранней командой \mark, которая создала элемент в списке элементов vbox V .

Сноски footnotes

  • \footnote 〈argument1 〉 〈argument2 〉
To quote the mathematician P\’olya is a ploy.\footnote *{This is an example of an anagram, but not a strict one.}
  • \vfootnote 〈argument1 〉 〈argument2 〉 — \footnote, и \vfootnote вставляют знак ссылки перед самой сноской, но \vfootnote не вставляет знак ссылки в текст.

Вставки

  • \topinsert 〈vertical mode material〉 \endinsert — пытается разместить материал вверху текущей страницы.
  • \midinsert 〈vertical mode material〉 \endinsert — пытается поместить материал в текущую позицию.
  • \pageinsert 〈vertical mode material〉 \endinsert — помещает материал отдельно на следующую страницу.
  • \insert 〈number〉 { 〈vertical mode material〉 } — Эта примитивная команда обеспечивает базовый механизм создания вставок, но она почти никогда не используется за пределами определения макроса. Необходимо три элемента для insert
  • \box n — это место, где TEX накапливает материал для вставок с кодом n. Когда TEX разбивает страницу, он помещает в \box n столько вставочного материала, сколько поместится на странице. Ваша процедура вывода должна затем переместить этот материал на реальную страницу. Вы можете использовать \ifvoid (стр. 238), чтобы проверить, есть ли какой-либо материал в \box n. Если не весь материал помещается, TEX сохраняет остатки для следующей страницы.
  • \count n — коэффициент увеличения f. Когда TEX вычисляет вертикальное пространство, занимаемое на странице вставкой n материала, он умножает вертикальную протяженность этого материала на f/1000. Таким образом, вы обычно устанавливаете f равным 500 для вставки двух столбцов и 0 для примечания на полях.
  • \dimen n определяет максимальное количество вставок n материала, которые TEX поместит на одну страницу.
  • \skip n указывает дополнительное пространство, которое TEX выделяет на странице, если страница содержит какой-либо материал вставки n. Это место дополнительное пространство, занимаемое самой вставкой.

Изменение процедуры вывода

  • \output [ 〈token list〉 parameter ] — Этот параметр содержит текущую процедуру вывода, т. е. список токенов, который TEX расширяет, когда находит разрыв страницы.
  • \plainoutput — Эта команда вызывает обычную процедуру вывода TEXа.
  • \shipout 〈box〉 — Эта команда инструктирует TEX отправить 〈box〉 в файл .dvi.
  • \deadcycles [ 〈number〉 parameter ] — Этот параметр содержит количество раз, когда TEX инициировал процедуру вывода с момента последнего выполнения команды \shipout.
  • \maxdeadcycles [ 〈number〉 parameter ] — Если значение \deadcycles превышает значение \maxdeadcycles, TEX предполагает, что процедура вывода зациклилась.
  • \outputpenalty [ 〈number〉 parameter ] — TEX устанавливает этот параметр, когда разрывает страницу.
  • \holdinginserts [ 〈number〉 parameter ] — Если этот параметр больше 0, когда TEX обрабатывает разрыв страницы, TEX воздержится от обработки вставок.

Разрыв вертикальных списков

  • \vsplit 〈number〉 to 〈dimen〉 — Эта команда заставляет TEX разделить блок с номером 〈number〉, который мы назовем B2, на две части.
  • \splitmaxdepth [ 〈dimen〉 parameter ] — Этот параметр определяет максимально допустимую глубину поля, полученного в результате \vsplit.
  • \splittopskip [ 〈glue〉 parameter ] — Этот параметр определяет клей, который TEX вставляет в верхнюю часть блока, полученного в результате \vsplit.

Горизонтальная и вертикальная мода

  • \thinspace — Эта команда создает положительный керн, ширина которого составляет одну шестую em, т.е. она заставляет TEX смещать свою позицию вправо на эту величину. Полезно при использовании одиночных и двойных ковычек.
  • \negthinspace — Эта команда создает отрицательный керн, ширина которого составляет одну шестую em, т. е. заставляет TEX смещать свою позицию влево на эту величину.
  • \enspace — Эта команда создает керн, ширина которого равна 1em.
  • \enskip \quad \qquad — Каждая из этих команд создает шарик горизонтального клея, который не может ни растягиваться, ни сжиматься. 1/2em, 1em, 2em.
  • \smallskip \medskip \bigskip — вертикальный отступ.
  • \smallskipamount [ 〈glue〉 parameter ] — Эти параметры определяют количество клея, производимого командами \smallskip, \medskip и \bigskip.
  • \medskipamount [ 〈glue〉 parameter ]
  • \bigskipamount [ 〈glue〉 parameter ]

Вертикальные и горизонтальные отступы (клей)

  • \hskip 〈dimen1 〉 plus 〈dimen2 〉 minus 〈dimen3 〉 — горизонтальная
  • \vskip 〈dimen1 〉 plus 〈dimen2 〉 minus 〈dimen3 〉 — вертикальная
\hbox to 2in{one\hskip 0pt plus .5in two}
  • \hglue 〈glue〉 — Команда \hglue создает горизонтальное склеивание, которое не исчезает при разрыве строки
  • \vglue 〈glue〉 — команда \vglue создает вертикальную склейку, которая не исчезает при разрыве страницы.
  • \topglue 〈glue〉 — Эта команда заставляет пространство от верха страницы до верха первого поля на странице быть склеенным.
  • \kern 〈dimen〉 — В горизонтальном режиме TEX перемещает свое положение вправо (при положительном керне) или влево (при отрицательном керне). В вертикальном режиме TEX перемещает свою позицию вниз по странице (при положительном керне) или вверх (при отрицательном керне).
\centerline{$\Downarrow$}\kern 3pt % a vertical kern 
\centerline{$\Longrightarrow$\kern 6pt % a horizontal kern 
{\bf Heed my warning!}\kern 6pt % another horizontal kern 
$\Longleftarrow$} 
\kern 3pt % another vertical kern 
\centerline{$\Uparrow$}
  • \hfil \hfill — Эти команды создают бесконечно растягиваемый горизонтальный и вертикальный клей, который подавляет любое конечное растяжение, которое может присутствовать.
  • \vfil \vfill
  • \hss \vss — Эти команды создают горизонтальный и вертикальный клей, который одновременно бесконечно растягивается и бесконечно сжимается.
  • \hfilneg \vfilneg — Эти команды отменяют эффект предыдущего \hfil или \vfil. В то время как \hfil и \vfil производят бесконечно растягиваемый позитивный клей, \hfilneg и \vfilneg производят бесконечно растягиваемый негативный клей.

Управление Box-ами

\hbox { 〈horizontal mode material〉 } 
\hbox to 〈dimen〉 { 〈horizontal mode material〉 } 
\hbox spread 〈dimen〉 { 〈horizontal mode material〉 }

Эта команда создает hbox (горизонтальный прямоугольник), содержащий 〈материал горизонтального режима〉.

\vtop 〈vertical mode material〉 
\vtop to 〈dimen〉 { 〈vertical mode material〉 } 
\vtop spread 〈dimen〉 { 〈vertical mode material〉 } 
\vbox { 〈vertical mode material〉 } 
\vbox to 〈dimen〉 { 〈vertical mode material〉 } 
\vbox spread 〈dimen〉 { 〈vertical mode material〉 }

Эти команды создают vbox (вертикальный блок), содержащий 〈материал вертикального режима〉.

  • \boxmaxdepth [ 〈dimen〉 parameter ] — Этот параметр содержит размер D. TEX не будет создавать блок, глубина которого превышает D.
  • \underbar 〈argument〉 — Эта команда помещает 〈аргумент〉 в hbox и подчеркивает его, не обращая внимания на все, что выступает за базовую линию блока.
  • \everyhbox [ 〈token list〉 parameter ] — Эти параметры содержат списки токенов, которые TEX расширяет в начале каждого создаваемого им hbox или vbox.
  • \everyvbox [ 〈token list〉 parameter ]

Создание box-ов для многократного использования

  • \setbox 〈register〉 = 〈box〉 — команда устанавливают содержимое регистра, номер которого равен 〈register〉.
  • \box 〈register〉 — команда выводит содержимое регистра
\setbox0 = \hbox{mushroom} 
\setbox1 = \vbox{\copy0\box0\box0} 
\box1 %выведет box1 и забудет его содержимое
  • \copy 〈register〉 — копирует содержимое box n не стирая его содержимого
  • \unhbox 〈register〉 — Эти команды создают список, содержащийся в регистре ящика 〈register〉, и делают этот регистр ящика недействительным.
  • \unvbox 〈register〉 — эти команды освобождают память и очищают box с выбранным номером
  • \unhcopy 〈register〉 \unvcopy 〈register〉 — Эти команды создают список, содержащийся в блочном регистре 〈register〉, и оставляют содержимое регистра нетронутым.

Смещение Box-ов

  • \moveleft 〈dimen〉 〈box〉 \moveright 〈dimen〉 〈box〉 — сдвинуть влево, сдвинуть вправо
  • \lower 〈dimen〉 〈box〉 \raise 〈dimen〉 〈box〉 — сдвинуть вниз, сдвинуть вниз.

Размеры Box-ов

  • \ht 〈register〉 [ 〈dimen〉 parameter ] — высота
  • \dp 〈register〉 [ 〈dimen〉 parameter ] — глубина
  • \wd 〈register〉 [ 〈dimen〉 parameter ] — ширина

Эти команды хранят размеры box-ов

\setbox0 = \vtop{\hbox{a}\hbox{beige}\hbox{bunny}}% 
The box has width \the\wd0, height \the\ht0, and depth \the\dp0.

Struts и фантомы

  • \strut — Эта команда создает блок, ширина которого равна нулю, а высота (8,5 пт) и глубина (3,5 пт) соответствуют более или менее типичной строке текста в cmr10, простом шрифте TEX по умолчанию.
  • \mathstrut — Эта команда создает фантомную формулу, ширина которой равна нулю, а высота и глубина такие же, как у левой круглой скобки.
  • \phantom 〈argument〉 — Эта команда создает пустое поле того же размера и размещения, что и 〈аргумент〉, если бы он был набран.
  • \hphantom 〈argument〉 —hphantom создает блок той же ширины, что и 〈аргумент〉, но с нулевой высотой и глубиной.
  • \vphantom 〈argument〉 — vphantom создает блок той же высоты и глубины, что и 〈аргумент〉, но нулевой ширины.
  • \smash 〈argument〉 — Эта команда вводит 〈аргумент〉, но заставляет высоту и глубину содержащего его поля равняться нулю.
  • \null — Эта команда создает пустой hbox. \setbox0 = \null

Неправильные поля (ошибки формирования документа)

  • \overfullrule [ 〈dimen〉 parameter ] — Этот параметр определяет ширину правила, которое TEX добавляет к переполненному hbox. Plain TEX устанавливает значение 5pt.
  • \hbadness [ 〈number〉 parameter ] \vbadness [ 〈number〉 parameter ] — Эти параметры определяют пороговые значения горизонтальной и вертикальной неисправности для сообщения о недостаточном или переполненном ящиках.
  • \badness — Эта команда возвращает числовое значение дефектности блока (горизонтального или вертикального), созданного TEX в последний раз.
  • \hfuzz [ 〈dimen〉 parameter ] \vfuzz [ 〈dimen〉 parameter ] — Эти параметры определяют величину, на которую ящик может превысить свой естественный размер, прежде чем TEX сочтет его переполненным.
\hfuzz = .5in \hbox to 2in{This box is longer than two inches.}

Получение последнего элемента из списка

  • \lastkern
  • \lastskip
  • \lastpenalty
  • \lastbox

Эти управляющие последовательности возвращают значение последнего элемента в текущем списке. Это не настоящие команды, поскольку они могут появляться только как часть аргумента.

Эти управляющие последовательности наиболее полезны после вызовов макросов, в которые могли быть вставлены объекты указанных типов.

  • \unkern
  • \unskip
  • \unpenalty

Если последний элемент в текущем списке имеет тип керн, клей или пенальти соответственно, эти команды удаляют его из этого списка. Если элемент не того типа, эти команды не имеют никакого эффекта.

Rules and leaders

\hrule 
\hrule height 〈dimen〉 width 〈dimen〉 depth 〈dimen〉 
\vrule 
\vrule width 〈dimen〉 height 〈dimen〉 depth 〈dimen〉

Команда \hrule создает горизонтальную линию; команда \vrule создает вертикальное линию.

По умолчанию \hrule будет расширено по горизонтали до границ самого внутреннего поля или выравнивания. Высота 0,4 пт; Глубина 0pt.

Leaders

\leaders 〈box or rule〉 〈skip command〉 
\cleaders 〈box or rule〉 〈skip command〉 
\xleaders 〈box or rule〉 〈skip command〉

заполняют горизонтальное или вертикальное пространство копиями узора

  • 〈box or rule〉 — указывает шаблон
  • 〈skip command — указывает команду для заполнения, т.е. пространство
\def\pattern{\hbox to 15pt{\hfil.\hfil}} 
\line{Down the Rabbit-Hole {\leaders\pattern\hfil} 1} 
\line{The Pool of Tears {\leaders\pattern\hfil} 9} 
\line{A Caucus-Race and a Long Tale {\cleaders\pattern \hfil} 19} 
\line{Pig and Pepper {\xleaders\pattern\hfil} 27}
  • \dotfill \hrulefill — Эти команды соответственно заполняют окружающее горизонтальное пространство рядом точек на базовой линии и горизонтальной линией на базовой линии.
\hbox to 3in{Start {\dotfill} Finish} 
\hbox to 3in{Swedish {\hrulefill} Finnish}
  • \leftarrowfill \rightarrowfill — Эти команды заполняют окружающее горизонтальное пространство стрелками, указывающими влево или вправо.
\hbox to 3in{\vrule \rightarrowfill \ 3 in \leftarrowfill\vrule}

Выравнивание

+ 〈text〉 & 〈text〉 & · · · \cr

  • \+ 〈text〉 & 〈text〉 & · · · \cr
  • \tabalign — Эти команды начинаются с одной строки с выравниванием по вкладкам.
\cleartabs % обнуляет установки предыдущих settabs
\+ {\bf if }$a[i] < a[i+1]$ &{\bf then}&\cr 
\+&&$a[i] := a[i+1]$;\cr 
\+&&{\it found }$:=$ {\bf true};\cr 
\+&{\bf else}\cr 
\+&&{\it found }$:=$ {\bf false};\cr 
\+&{\bf end if};\cr
  • \settabs 〈number〉 \columns — задает одинаковый размер колонкам
  • \settabs \+ 〈sample line〉 \cr — задает шаблон с образцом
  • \cleartabs — очищает предыдущие settabs

Общие выравнивания

\halign { 〈preamble〉 \cr 〈row〉 \cr . . . 〈row〉 \cr }
\halign to 〈dimen〉{ 〈preamble〉 \cr 〈row〉 \cr . . . 〈row〉 \cr }
\halign spread 〈dimen〉{ 〈preamble〉 \cr 〈row〉 \cr . . . 〈row〉 \cr }

Эта команда создает горизонтальное выравнивание, состоящее из последовательности строк, где каждая строка, в свою очередь, содержит последовательность записей столбцов. TEX регулирует ширину записей столбца, чтобы разместить самую широкую запись в каждом столбце.

 \valign { 〈preamble〉\cr 〈column〉\cr . . . 〈column〉\cr } 
\valign to 〈dimen〉{ 〈preamble〉\cr 〈column〉\cr . . . 〈column〉\cr } 
\valign spread 〈dimen〉{ 〈preamble〉\cr 〈column〉\cr . . . 〈column〉\cr }

делает вертикальную таблицу

  • \ialign — Эта команда ведет себя так же, как \halign, за исключением того, что она сначала устанавливает клей \tabskip равным нулю, а \everycr — пустым.
  • \cr — Эта команда завершает преамбулу горизонтального или вертикального выравнивания.
  • \endline — Эта команда является синонимом команды \cr.
  • \crcr — Эта команда ведет себя так же, как \cr, за исключением того, что TEX игнорирует ее, если она идет сразу после \cr или \noalign.
  • \omit — Эта команда сообщает TEX игнорировать шаблон при горизонтальном или вертикальном выравнивании
  • \span — Значение этой команды зависит от того, появляется ли она в преамбуле или в записи выравнивания. Помещение \span перед токеном в преамбуле приводит к немедленному расширению этого токена в соответствии с обычными правилами расширения макросов TEXа. Размещение \span вместо «&» между двумя записями столбца или строки приводит к объединению этих столбцов или строк.
  • \multispan 〈number〉 — Эта команда сообщает TEX, что следующие столбцы 〈number〉 в строке с горизонтальным выравниванием или строки 〈number〉 в столбце с вертикальным выравниванием должны быть объединены в один столбец или строку.
  • \noalign { 〈vertical mode material〉 } \noalign { 〈horizontal mode material〉 } — Чаще всего \noalign используется для добавления дополнительного пробела после строки или столбца.
  • \tabskip [ 〈glue〉 parameter ] — Этот параметр определяет количество горизонтального или вертикального клея, который TEX накладывает между столбцами горизонтального выравнивания или между строками вертикального выравнивания.
  • \hidewidth — Эта команда сообщает TEX игнорировать ширину следующей записи столбца при горизонтальном выравнивании.
  • \everycr [ 〈token list〉 parameter ] — TEX расширяет 〈список токенов〉 всякий раз, когда он выполняет \cr — в конце каждой преамбулы. Т.е. выполняет список команд после \cr.

Математическая мода

Скобки

\lbrace { \{  
} \rbrace } \}  
[ \lbrack 
] \rbrack 
\langle 
\rangle

Стрелки

\leftarrow 
\gets 
\Leftarrow 
\rightarrow 
\to 
\Rightarrow 
\leftrightarrow 
\Leftrightarrow 
←− \longleftarrow 
⇐= \Longleftarrow 
−→ \longrightarrow 
=⇒ \Longrightarrow 
←→ \longleftrightarrow 
⇐⇒ \Longleftrightarrow 
⇐⇒ \iff 
←↩ \hookleftarrow 
↪→ \hookrightarrow  
\leftharpoondown 
\rightharpoondown 
\leftharpoonup 
\rightharpoonup 
⇀↽ \rightleftharpoons 
7→ \mapsto 
7−→ \longmapsto 
\downarrow 
\Downarrow 
\uparrow 
\Uparrow 
l \updownarrow 
m \Updownarrow 
\nearrow 
\searrow 
\nwarrow 
\swarrow

Основные команды

Шрифты

\font 
\font 〈control sequence〉 = 〈fontname〉 
\font 〈control sequence〉 = 〈fontname〉 scaled 〈number〉 
\font 〈control sequence〉 = 〈fontname〉 at 〈dimen〉

Это заставляет TEX загружать файл метрик шрифта (файл .tfm) для 〈fontname〉.

Если ни масштабированный 〈number〉, ни 〈dimen〉 отсутствуют, шрифт используется в его дизайнерском размере — размере, в котором он обычно выглядит лучше всего. В противном случае загружается увеличенная версия шрифта.

Scaled — 〈number〉, шрифт увеличивается в 〈number〉/1000.

Если присутствует 〈dimen〉, шрифт масштабируется до 〈dimen〉

\font\tentt = cmtt10 
\font\bigttfont = cmtt10 scaled \magstep2 
\font\eleventtfont = cmtt10 at 11pt
  • \fontdimen 〈number〉 〈font〉 [ 〈dimen〉 parameter ] — изменяет различные параметры шрифта
номер значение
1 slant per point
2 interword space
3 interword stretch
4 interword shrink
5 x-height (size of 1ex)
6 quad width (size of 1em)
7 extra space
Here’s a line printed normally.\par 
\dimen0=\fontdimen2\font %сохранить значение пробела в dimen0
\fontdimen2\font=3\fontdimen2\font % увеличить пробел в 3 раза
\noindent Here’s a really spaced-out line. 
\fontdimen2\font=\dimen0 %восстановить первоначальные значения
  • \magnification = 〈number〉 — масштабирование
  • \mag [ 〈number〉 parameter ] — лучше использовать первое
  • \magstep 〈number〉 — Эта команда расширяется до коэффициента увеличения, необходимого для увеличения всего документа (кроме истинных размеров) на 1,2r, где r — значение 〈number〉. 〈число〉 должно быть от 0 до 5.
  • \magstephalf — маштабирование в полразмера

Конвертирование информации в токене

  • \number 〈number〉 — Эта команда создает представление числа в виде последовательности токенов символов.
\number 24 \quad \count13 = -10000 \number\count13

выдаст: 24 -10000

  • \romannumeral 〈number〉 — Эта команда создает представление числа римскими цифрами в виде последовательности токенов символов.
  • \time [ 〈number〉 parameter ] — TEX устанавливает этот параметр равным количеству минут, прошедших с полуночи (текущего дня).
  • \day [ 〈number〉 parameter ] — TEX устанавливает этот параметр на текущий день месяца. Это число от 1 до 31.
  • \month [ 〈number〉 parameter ] — TEX устанавливает для этого параметра текущий месяц. Это число от 1 до 12.
  • \year [ 〈number〉 parameter ] — TEX устанавливает для этого параметра текущий год
  • \fmtname \fmtversion — Эти команды создают имя и номер версии формата TEX, например, обычного TEX или LATEX, который вы используете.
  • \jobname — Эта команда создает базовое имя файла, с которым был вызван TEX.

Значение переменных

  • \meaning 〈token〉 — Эта команда определяет значение 〈токена〉.
[{\tt \meaning\eject}] [\meaning\tenrm] [\meaning Y]  
вернет:  
[macro:->\par \break ] [select font cmr10] [the letter Y]
  • \string 〈control sequence〉 — Эта команда создает символы, составляющие имя control sequence
  • \escapechar [ 〈number〉 parameter ] — Этот параметр определяет код ASCII символа, который TEX использует для представления escape-символа
  • \fontname 〈font〉 — Эта команда создает имя файла для 〈font〉. Имя файла — это 〈имя шрифта〉, которое использовалось для определения 〈font〉.
\font\myfive=cmr5 
[\fontname\myfive]

вернет [cmr5]

Grouping

  • \begingroup \endgroup — Эти две команды начинают и завершают группу.
  • \global — Эта команда делает следующее определение или назначение глобальным
  • \globaldefs [ 〈number〉 parameter ] — тоже, что \global\def
  • \aftergroup 〈token〉 — Когда TEX встречает эту команду во время ввода, он сохраняет 〈токен〉. После окончания текущей группы он вставляет 〈token〉 обратно во входные данные и расширяет их.
  • \afterassignment 〈token〉 — Когда TEX встречает эту команду, он сохраняет 〈token〉 в специальном месте. После следующего выполнения присваивания он вставляет 〈token〉 во входные данные и расширяет их.

Macros

  • \def 〈control sequence〉 〈parameter text〉 { 〈replacement text〉 } — Эта команда определяет 〈последовательность управления〉 как макрос с указанным 〈текстом параметра〉 и 〈текстом замены〉.
  • \edef 〈control sequence〉 〈parameter text〉 { 〈replacement text〉 } — Эта команда определяет макрос таким же общим способом, как и \def. Разница в том, что TEX немедленно расширяет 〈текст замены〉 \edef (но при этом ничего не выполняя).

Вы можете запретить расширение управляющей последовательности, которая в противном случае была бы расширена, используя \noexpand или можете отложить раскрытие управляющей последовательности, используя команду \expandafter.

Команды \write, \message, \errmessage, \wlog и \csname расширяют свои списки токенов, используя те же правила, которые \edef использует для расширения замещающего текста.

  • \gdef 〈control sequence〉 〈parameter text〉 { 〈replacement text〉 } — эквивалентно \global\def.
  • \xdef 〈control sequence〉 〈parameter text〉 { 〈replacement text〉 } — эквивалентно \global\edef
  • \long — Эта команда используется как префикс к определению макроса. Он сообщает TEX, что аргументы макроса могут включать токены \par
\long\def\aa#1{\par\hrule\smallskip#1\par\smallskip\hrule} 
\aa{This is the first line.\par 
This is the second line.} % without \long, TeX would complain
  • \outer — Эта команда используется как префикс к определению макроса. Он сообщает TEX, что макрос является внешним (стр. 83) и не может использоваться в определенных контекстах.
\outer\def\chapterhead#1{% 
\eject\topglue 2in \centerline{\bf #1}\bigskip} 
% Using \chapterhead in a forbidden context causes an 
% error message.
  • \chardef 〈control sequence〉=〈charcode〉 — Эта команда определяет 〈последовательность управления〉 как 〈символьный код〉. Хотя \chardef чаще всего используется для определения символов, его также можно использовать для присвоения имени числу в диапазоне 0–255, даже если вы не используете это число в качестве кода символа.
\chardef\percent = ‘\% 
21\percent, {\it 19\percent} 
% Get the percent character in roman and in italic 
выдаст:  21%, 19%
  • \mathchardef 〈control sequence〉=〈mathcode〉 — определит математический символ
  • \let 〈control sequence〉 = 〈token〉 — определит синоним команды
  • \futurelet 〈control sequence〉 〈token1 〉 〈token2 〉
  • \csname 〈token list〉 \endcsname — Эта команда создает управляющую последовательность из 〈списка токенов〉. Он обеспечивает способ синтеза управляющих последовательностей, в том числе тех, которые вы обычно не можете написать. 〈список токенов〉 сам может включать в себя управляющие последовательности; он расширяется так же, как заменяющий текст определения \edef
\def\capTe{Te} This book purports to be about \csname\capTe X\endcsname.
  • \expandafter 〈token1 〉 〈token2 〉 — Эта команда сообщает TEXу расширить 〈token1〉 в соответствии со своими правилами расширения макросов после расширения 〈token2〉 на один уровень.
\def\aa{xyz} 
\tt % Use this font so ‘\’ prints that way. 
[\string\aa] [\expandafter\string\aa] [\expandafter\string\csname TeX\endcsname]  
%выводит:  [\aa] [xyz] [\TeX]
  • \noexpand 〈token〉 — Эта команда сообщает TEX о подавлении расширения 〈token〉, если 〈token〉 является управляющей последовательностью, которую можно расширить.
  • \the 〈token〉 — Эта команда обычно расширяется до списка токенов символов, представляющих 〈токен〉. Это могут быть регистры, переменные и т.д. \parindent \deadcycles \count0 \catcode \fontdimen3\sevenbf \hyphenchar \skewchar \skewchar\teni \lastpenalty, \lastskip, \lastkern \chardef \mathchardef

Кроме того, \the может расширяться до несимвольных токенов в следующих двух случаях:

  • \the 〈font〉, который расширяется до последней определенной управляющей последовательности, которая выбирает тот же шрифт, что и управляющая последовательность 〈font〉
  • \the 〈переменная токена〉, которая расширяется до копии значения переменной, например, \the \everypar

Сравнения Conditional

  • \if 〈token1 〉 〈token2 〉 — Эта команда проверяет, имеют ли 〈token1 〉 и 〈token2 〉 одинаковый код символа, независимо от кодов их категорий.
  • \ifcat 〈token1 〉 〈token2 〉 — Эта команда проверяет, имеют ли 〈token1〉 и 〈token2〉 одинаковый код категории.
  • \ifx 〈token1 〉 〈token2 〉 — Эта команда проверяет, совпадают ли 〈token1〉 и 〈token2〉. В отличие от \if и \ifcat, \ifx не расширяет токены, следующие за \ifx, поэтому 〈token1 〉 и 〈token2 〉 — это два токена сразу после \ifx.
  • \ifnum 〈number1 〉 〈relation〉 〈number2 〉 — Эта команда проверяет, удовлетворяют ли 〈номер1〉 и 〈номер2〉 〈отношению〉, которое должно быть либо «<», «=» или «>».
  • \ifodd 〈number〉 — Эта команда проверяет, является ли 〈число〉 нечетным.
  • \ifdim 〈dimen1 〉 〈relation〉 〈dimen2 〉 — Эта команда проверяет, удовлетворяют ли 〈dimen1 〉 и 〈dimen2 〉 〈отношению〉, которое должно быть либо «<», «=» или «>».
  • \ifhmode \ifvmode \ifmmode \ifinner — определяет в какой моде находится Tex
  • \ifhbox 〈register〉 \ifvbox 〈register〉 \ifvoid 〈register〉 — Эти команды проверяют содержимое ящика-регистра с номером 〈register〉.
  • \ifeof 〈number〉 — Эта команда проверяет входной поток на конец файла.
  • \ifcase 〈number〉〈case0 text〉 \or 〈case1 text〉 \or . . . \or 〈casen text〉 \else 〈otherwise text〉 \fi — Эта команда представляет тест с пронумерованными несколькими случаями. Если 〈number〉 имеет значение k, TEX расширит 〈casek text〉, если он существует, и 〈иначе text〉, если его нет.
  • \iftrue \iffalse — Эти команды эквивалентны тестам, которые всегда верны или всегда ложны.
  • \else — Эта команда представляет «ложную» альтернативу условной проверки.
  • \fi — Эта команда завершает текст условной проверки.
  • \newif \if〈test name〉 — Эта команда называет три управляющих последовательности именами \alphatrue, \alphafalse и \ifalpha, где alpha — это 〈имя теста〉

Циклы и повторы

  • \loop α \ifΩ β \repeat — Эти команды предоставляют конструкцию цикла для TEXа. Здесь α и β — произвольные последовательности команд, а \ifΩ — любой из условных тестов. \repeat заменяет \fi, соответствующий тесту, поэтому вам не нужно явно писать \fi для завершения теста.
\count255 = 6 
\loop 
    \number\count255\ 
    \ifnum\count255 > 0 
   	\advance\count255 by -1 
\repeat

Пустота

  • \relax — Эта команда сообщает TEXу ничего не делать.
  • \empty — Эта команда вообще не требует токенов. Он отличается от \relax тем, что исчезает после раскрытия макроса.

Регистры

\count 〈register〉 = 〈number〉 
\dimen 〈register〉 = 〈dimen〉 
\skip 〈register〉 = 〈glue〉 
\muskip 〈register〉 = 〈muglue〉 
\toks 〈register〉 = 〈token variable〉 
\toks 〈register〉 = { 〈token list〉 }  
%Регистру \toks можно назначить либо переменную токена (регистр или параметр), 
%либо список токенов. Когда вы назначаете список токенов регистру токенов, 
%токены в списке токенов не расширяются.
\count 〈register〉 
\dimen 〈register〉 
\skip 〈register〉 
\muskip 〈register〉 
\toks 〈register>

Первые шесть команд, перечисленных здесь, присваивают что-то регистру. Остальные пять управляющих последовательностей не являются настоящими командами, поскольку могут появляться только как часть аргумента. Они возвращают содержимое указанного регистра. Хотя вы не можете использовать эти управляющие последовательности сами по себе в качестве текстовых команд, вы можете использовать \the для преобразования их в текст и набора их значений.

  • \newcount — Резервирование регистров
  • \maxdimen — Эта последовательность управления дает 〈размер〉, который является наибольшим размером, приемлемым для TEX

Операции над регистрами: \advance, \multiply, \divide, \setbox, \box.

Объявление регистров

\newcount %каждый резервирует регистр указанного типа.
\newdimen 
\newskip 
\newmuskip 
\newtoks 
\newbox  
\newread %зарезервируйте входной поток и выходной поток соответственно.
\newwrite 
\newfam %резервирует семейство математических шрифтов.
\newinsert %резервирует тип вставки.
\newlanguage %резервирует набор шаблонов расстановки переносов.
\countdef 〈control sequence〉 = 〈register〉 
\dimendef 〈control sequence〉 = 〈register〉 
\skipdef 〈control sequence〉 = 〈register〉 
\muskipdef 〈control sequence〉 = 〈register〉 
\toksdef 〈control sequence〉 = 〈register〉

Эти команды определяют 〈последовательность управления〉 для ссылки на регистр указанной категории, номер которого равен 〈register〉.

Операции над регистрами

\advance 〈count register〉 by 〈number〉 
\advance 〈dimen register〉 by 〈dimen〉 
\advance 〈skip register〉 by 〈glue〉 
\advance 〈muskip register〉 by 〈muglue〉

Эта команда добавляет совместимое количество в регистр.

\multiply 〈register〉 by 〈number〉 
\divide 〈register〉 by 〈number〉

Эти команды умножают и делят значение в 〈register〉 на 〈number〉 (которое может быть отрицательным).

Завершение работы

  • \bye — заканчивается документ
  • \end — Эта команда сообщает TEX создать последнюю страницу и завершить задание. Однако он не заполняет страницу, поэтому обычно лучше использовать \bye, а не \end.

Input и Output

Input

  • \input 〈filename〉 — Эта команда сообщает TEX прочитать входные данные из файла 〈имя файла〉. Когда этот файл исчерпан, TEX возвращается к чтению из предыдущего источника ввода.
  • \endinput — Эта команда сообщает TEXу прекратить чтение ввода из текущего файла, когда он в следующий раз достигнет конца строки.
  • \inputlineno — Эта команда возвращает число (не строку), задающее номер текущей строки, определенный как номер, который будет отображаться в сообщении об ошибке, если ошибка произойдет в этот момент.
  • \openin 〈number〉 = 〈filename〉 — Эта команда сообщает TEXу открыть файл с именем 〈имя файла〉 и сделать его доступным для чтения через входной поток, обозначенный 〈number〉 . Number от 0 до 15. Чтение из файла выполняется командой \read. Номера потоков определяются с помощью команды \newread.
  • \closein 〈number〉 — Эта команда сообщает TEXу закрыть входной поток с номером 〈number〉, т. е. прекратить связь между входным потоком и его файлом.
  • \read 〈number〉 to 〈control sequence〉 — Эта команда сообщает TEX прочитать строку из файла, связанного с входным потоком, обозначенным 〈номером〉, и назначить токены в этой строке 〈управляющей последовательности〉.

Output

  • \openout 〈number〉 = 〈filename〉 — Эта команда сообщает TEXу открыть файл с именем 〈имя файла〉 и сделать его доступным для записи через выходной поток, обозначенный 〈номер〉. 〈число〉 должно быть от 0 до 15.
  • \closeout 〈number〉 — Эта команда сообщает TEXу закрыть выходной поток с номером 〈number〉.
  • \write 〈number〉 { 〈token list〉 } — Эта команда сообщает TEX записать 〈список токенов〉 в файл, связанный с выходным потоком, обозначенным 〈номер〉.
  • \immediate — Эта команда должна предшествовать командам \openout, \closeout или \write. Он сообщает TEXу выполнить указанную операцию с файлом без задержки.
  • \special { 〈token list〉 } — Эта команда сообщает TEX записать 〈список токенов〉 непосредственно в файл .dvi при следующей отправке страницы.
  • \newlinechar [ 〈number〉 parameter ] — Этот параметр содержит символ, обозначающий новую строку на выходе. Когда TEX встречает этот символ при чтении аргумента команды \write, \message или \errmessage, он начинает новую строку.

Интерпретация входных символов

  • \catcode 〈charcode〉 [ 〈number〉 table entry ] — Эта запись таблицы содержит код категории символа, код ASCII которого равен 〈charcode〉.
  • \active — Эта команда содержит код категории для активного символа, а именно цифру 13.
  • \mathcode 〈charcode〉 [ 〈number〉 table entry ] — Эта запись таблицы содержит математический код символа, ASCII-код которого равен 〈charcode〉
  • \delcode 〈charcode〉 [ 〈number〉 table entry ] — Эта запись таблицы определяет код-разделитель для входного символа, код ASCII которого равен 〈charcode〉.
  • \endlinechar [ 〈number〉 parameter ] — Этот параметр содержит код символа, который TEX добавляет в конец каждой входной строки.
  • \ignorespaces — Эта команда сообщает TEXу читать и расширять токены, пока не найдет тот, который не является токеном пространства, игнорируя любые токены пространства, которые он находит на своем пути.

Отладка кода Tex’s

  • \show 〈token〉 \showthe 〈argument〉 \showbox 〈number〉 \showlists — Эти команды записывают информацию в журнал вашего запуска TEXа
  • \tracingonline [ 〈number〉 parameter ] — Если этот параметр больше нуля, TEX будет отображать результаты трассировки (включая \showbox и \showlists) на вашем терминале в дополнение к записи их в файл журнала.
  • \message { 〈token list〉 } \errmessage { 〈token list〉 } — Эти команды отображают сообщение, заданное 〈списком токенов〉, на вашем терминале, а также записывают его в журнал. Все макросы в сообщении раскрываются, но команды не выполняются.
  • \wlog { 〈token list〉 } — Эта команда записывает 〈список токенов〉 в файл журнала.
  • \errhelp [ 〈token list〉 parameter ] — Этот параметр содержит список токенов, который TEX отображает, когда вы запрашиваете помощь в ответ на команду \errmessage.
  • \newhelp 〈control sequence〉 { 〈help text〉 } — Эта команда назначает справочное сообщение, заданное 〈текстом помощи〉, 〈последовательности управления〉.

Инициализация TEX

  • \dump — Эта команда, которая не должна появляться внутри группы, сбрасывает содержимое памяти TEXа в файл формата (стр. 65). Используя virtex, специальную «чистую» форму TEXа, вы можете затем перезагрузить файл формата на высокой скорости и продолжить работу в том же состоянии, в котором находился TEX на момент создания дампа. \dump также завершает выполнение. Поскольку \dump можно использовать только в initex, а не в рабочих формах TEXа, он полезен только тем, кто устанавливает TEX.
  • \everyjob [ 〈token list〉 parameter ] — Этот параметр содержит список токенов, который TEX расширяет в начале каждого задания. Поскольку назначение \everyjob не может повлиять на текущий запуск (к тому времени, когда вы выполните назначение, будет уже слишком поздно), оно полезно только для людей, которые подготавливают файлы форматирования.

6.2 - TEX for the Impatient

Обзор документации TEX по книге TEX for the Impatient

Некоторые команды

\null

Ставится после большой буквы,чтобы Tex мог понять, что точку нужно воспринимать не как после большой буквы.

Двойные кавычки

Поставить две одинарные, а чтобы разделить одинарную от двойной между ними поставить команду ’text’\thinspace"

Объявление \def

\def\xmpheader#1/#2{% Now here’s the title. 
\leftline{\xmplbx Example #1:\quad\xmplbxti #2}%
\vglue .5\baselineskip % skip an extra half line
}

Какие особенности?

при объявлении между параметрами указывается разделитель,которым будут отделяться параметры, это может быть пробел или как у меня #1/#2. Сложные данные передаются просто в группе {}.

Но определению \def я еще посвящу отдельную главу.

Управляем отступами

  • \parindent = 0pt — отступ первой строки
  • \noindent — подавить отступ
  • \parskip = 6pt — отступ между абзацев
  • \par — новый абзац
  • \smallskip — маленький разрыв абзацев
  • \medskip
  • \bigskip
  • \narrower — отступ слева и справа на ширину \parindent
  • \vskip 1pc — вертикальный отступ
  • \leftskip .5in — отступ слева
  • \rightskip .5in — отступ справа
  • \baselineskip = 7pt — межстрочный интервал
  • \raggedright — отключить выравнивание по правому краю
  • \leftline{} — строку выравнивает по левому краю
  • \rightline{}
  • \centerline{}

Определение символов

\chardef \\ = `\\ — определили \\ как backslash

\char `\^ — выводит символ по его коду

Акценты и диакритические знаки

\`
\'
\"
\^
...

через backslash ставим знак и дальше нужную букву.

Дроби

Макрос дробилка. На вход две цифири через слеш.

\def\frac#1/#2{\leavevmode 
                           \kern.1em \raise .5ex \hbox{\the\scriptfont0 #1}% 
                           \kern-.1em $/$% 
                           \kern-.15em \lower .25ex \hbox{\the\scriptfont0 #2}% 
}%
`\kern` --- сдвигает символ вправо или влево
`\raise` --- сдвигает вверх
`\lower` --- сдвигает вниз
`\leavevmode` --- переключается из вертикальной моды

Определение измеряемых величин \newdimen

Нужно для правильной разметки пространства

\newdimen\descindent 
\descindent = 8pc

llap начинает печатать влево от текущей позиции курсора

rlap — делает тоже, но вправо. Позицию курсора при этом не меняет.

\llap{\hbox to \descindent{\bf Queen of Hearts\hfil}}%

замечательный прием:

  • создать hbox длиной \descindent и поместить текст, выровненный по левому краю с помощью \hfil

\hbox \vbox

У этих замечательных box-ов есть переменные:

  • to — которая задает размер
  • spread — которая задает отступ текста, это установка для \hfil и \vfil
\hbox spread 8pt{\hfil\vbox spread 8pt{\vfil 

\leaders заполняет окна символами

Для различных строк с подчеркиванием или точками, а также любые пространства для заполнения однообразным элементом

\line{\hfil\hbox to 3in{\leaders\hbox{ * }\hfil}\hfil}

Заполнит 3in звездочками и выровняет их по центру

У него есть 2 брата: \cleaders и \xleaders — которые заполняют не выравнивая элементы заполнения относительно разных строк.

\proclaim теорема

Печатает первое предложение выделенным жирным, а остальной абзац курсивом.

\footline \headline

footer и header

Таблицы

{\xmpheader 8/{A ruled table}% see p. 21 
\bigskip \offinterlineskip % So the vertical rules are connected. 
% \tablerule constructs a thin rule across the table. 
\def\tablerule{\noalign{\hrule}} 
% \tableskip creates 9pt of space between entries. 
\def\tableskip{\omit&height 9pt&&&\omit\cr} 
% & separates templates for each column. TeX substitutes 
% the text of the entries for #. We must have a strut 
% present in every row of the table; otherwise, the boxes 
% won’t butt together properly, and the rules won’t join.
\halign{\tabskip = .7em plus 1em % glue between columns 
% Use \vtop for whole paragraphs in the first column. 
% Typeset the lines ragged right, without hyphenation. 
  \vtop{\hsize=6pc\pretolerance = 10000\hbadness = 10000        
       \normalbaselines\noindent\it#\strut}% 
  &\vrule #&#\hfil &\vrule #% the rules and middle column 
% Use \vtop for whole paragraphs in the last column. 
  &\vtop{\hsize=11pc \parindent=0pt \normalbaselineskip=12pt 
       \normalbaselines \rightskip=3pt plus2em #}\cr
  • \offinterlineskip — не дает масштабироваться вертикальным отступам в таблице
  • \def\tablerule{\noalign{\hrule}} — для правильного отображения горизонтальных линий
  • \def\tableskip{\omit&height 9pt&&&\omit\cr} — расстояние между строками в таблице
  • \halign — определяет параметры колонок таблицы
  • \vtop — выравнивает вертикальный бокс по верху
  • \pretolerance = 10000\hbadness = 10000 — не показывает ошибки
  • \vrule — рисует вертикальные линии
  • \omit — отменяет действие шаблона в ячейке или строке и заменяет его обычным #
  • \vtop{\hsize=11pc \parindent=0pt \normalbaselineskip=12pt \normalbaselines \rightskip=3pt plus2em #}\cr — чтобы задать в ячейке многострочный текст, а ячейку размером 11pc

Формулы математика

Очень большой раздел и пока им не интересуюсь

  • eqno — выведет номер формулы справа
  • leqno — выведет номер формулы слева

Концепция TEX

Активный символ \active

Это символ, которому будет назначено действие в TEX

  1. Символ нужно определить в \catcode назначить ему категорию 13 (\active)
  2. Определить действия через \def \let \chardef

Если символ не будет \active до определения, назначить ему команду не удастся

Например: \catcode ‘~ = \active \def~{\penalty10000\ }

alignment — выравнивание

Выравнивание TAB

  • \settabs
  • \+
  • &
  • \cr
{\hsize = 1.7 in \settabs 2 \columns 
\+cattle&herd\cr 
\+fish&school\cr 
\+lions&pride\cr}

Выравнивание \haling

выравнивание с учетом настроек преамбулы

\halign{\hfil#\hfil &\hfil#\hfil &\hfil#\hfil \cr

  • \tabskip =2pc — клей между колонками
  • \noalign — вертикально выровнять строки
  • \strut — увеличивает отступ между строк
  • \valign — вертикальное выравнивание (это таблица на боку)
{\hsize=0.6in \parindent=0pt 
\valign{#\strut&#\strut&#\strut\cr 
one&two&three\cr 
four&five&six\cr 
seven&eight&nine\cr 
ten&eleven\cr}}

Анатомия TEX

Текс расширяет макросы слева направо, но команда \expandafter может изменить порядокраскрытия макросов

Блоки в TEX

boxes

  • reference point
  • height
  • width
  • depth
  • baseline

Коды категорий символов

Code Назначение
0 \
1 {
2 }
3 $
4 &
5 ^^M=
6 #
7 ^ и ^^K
8 _ и ^^A
9 ^^@ (ignored)
10 пробел ^^I
11 a..z A..Z
12 другие символы
13 ~ и ^^L активный
14 %
15 ^^? ошибка

Символы

Категория 11 и 12

команда (напечатать символ) \char `h тоже самое, что \char104 напечатает h

Классы символов

Используется в математической моде и влияет на выделение места для каждого символа

Команды TEX

Все, что должен выполнить TEX:

  • активный символ
  • последовательность управляющих символов
  • сам символ

Сравнение

\ifα〈true text〉\else〈false text〉\fi или \ifα〈true text〉\fi

проверка выполняется до расширения макросов

Управляющая последовательность

Обычно начинаетяс с \ и имя последовательности, определенное в \def

Заканчивается, когда TEX видит небукву. Или когда заканчивается управляющий символ.

Управляющий символ

состоит из \ и символа

Разделители — delimeters

обычно скобки в математической моде

dimention

код значение
pt point (72.27 points = 1 inch)
pc pica (1 pica = 12 points)
bp big point (72 big points = 1 inch)
in inch
cm centimeter (2.54 centimeters = 1 inch)
mm millimeter (10 millimeters = 1 centimeter)
dd didˆot point (1157 didˆot points = 1238 points)
cc cicero (1 cicero = 12 didoˆt points)
sp scaled point (65536 scaled points = 1 point)
em ширина M
ex высота x

бесконечность: fil, fill, filll

Множитель перед размерами f/1000

\kern 8 true pt — сделает неизменным размер при масштабировании

Шрифты

\font\имя=шрифт в системе

\font\twelvebf=cmbx12

Глобальное определение \globaldefs

распространяется на весь документ

или сокращенный вариант: \gdef или \xdef вместо \global\def и \global\edef

Клей \hskip

есть вертикальный и горизонтальный

\hskip 6pt plus 2pt minus 3pt — клей может растягиваться и сжиматься

у клея есть свойства stretch — plus и shrink — minus

Межстрочный клей

определяет расстояние между строк и определяется параметрами: \baselineskip, \lineskip, \lineskiplimit

item

текст с отступом

выравнивание

\leftskip, \rightskip, \raggedright — установит размеры горизонтального бокса

kern

смещает символы горизонтально

leaders

заполнит пространство символами (нужно для оглавления)

Метка MARK

\topmark, \firstmark, \botmark размещаются на странице и используются командой \mark

\def\section#1{\medskip{\bf#1}\smallskip\mark{#1}} % #1 is the name of the section

Определение section устанавливает метку с именем секции

Числа

  • 52 — десятичное число
  • ‘14 — восьмеричное число
  • “FF — шестнадцатиричное число
  • `с или `\с — ASCII последовательность, но лучше второй вариант, хотя они идентичны. Со вторым вариантом можно использовать `\\, `\%, `\^^M

Но нежелательно при использовании команды \edef и \write

78 +078 "4E '116 `N `\N — это один и тот же код

число печатается командой \number78 или \romannumeral78 — получим 78lxxviii

box255

в этот box помещается готовая страница

готовый box255 отправляется командой \shipout в файл .dvi

Разрыв страницы

В Tex разрывом страницы управляет штраф:

\penalty 10000 = \nobreak

\penalty -10000 = \break

Размер страницы

  • \voffset — отступ сверху
  • \hoffset — отступ слева
  • hsize — ширина текста
  • vsize — высота текста

Регистры

тип контент
box a box
count a number
dimen a dimension
muskip muglue
skip glue
toks a token list

Все регистры имеют нумерацию от 0 до 255

Вызов регистра \box0 или \box100, \skip0 или \skip20

setbox3 = \hbox{text} — присвоит значение регистру box3

count255 = -1 — присвоит -1

для резервирования регистров используются команды:

  • \newbox,
  • \newcount,
  • \newdimen,
  • \newmuskip,
  • \newskip,
  • \newtoks

Просмотреть содержимое регистра можно с помощью команды \showthe\dimen0

\whatsit

действия для TeX когда, что-то пошло не так

  • команды \openout, \closeout, \write — откладывает запись в выходной файл до следующей команды
  • \special — вставить текс в выходной файл
  • при смене языка поместит информацию

6.3 - TEX

Документация TEX, в объеме,которуюя использую для своих задач

Введение

% A small font and close interline spacing make this work
\smallskip\font\sixrm=cmr6 \sixrm \baselineskip=7pt
\dimen0=\fontdimen3\font \dimen2=\fontdimen4\font
\fontdimen3\font=1.8pt \fontdimen4\font=.9pt
\noindent \hfuzz=.1pt
\parshape 30 0pt 120pt 1pt 118pt 2pt 116pt 4pt 112pt 6pt
108pt 9pt 102pt 12pt 96pt 15pt 90pt 19pt 84pt 23pt 77pt
27pt 68pt 30.5pt 60pt 35pt 52pt 39pt 45pt 43pt 36pt 48pt
27pt 51.5pt 21pt 53pt 16.75pt 53pt 16.75pt 53pt 16.75pt 53pt
16.75pt 53pt 16.75pt 53pt 16.75pt 53pt 16.75pt 53pt 16.75pt
53pt 14.6pt 48pt 24pt 45pt 30.67pt 36.5pt 51pt 23pt 76.3pt
The wines of France and California may be the best known,
but they are not the only fine wines. Spanish wines are
often underestimated, and quite old ones may be available at
reasonable prices. For Spanish wines the vintage is not so
critical, but the climate of the Bordeaux region varies
greatly from year to year. Some vintages are not as good as
others, so these years ought to be s\kern -.1pt p\kern -.1pt
e\kern -.1pt c\hfil ially n\kern .1pt o\kern .1pt
t\kern .1pt e\kern .1pt d\hfil: 1962, 1964, 1966. 1958,
1959, 1960, 1961, 1964, 1966 are also good California
vintages. Good luck finding them!
\fontdimen3\font=\dimen0 \fontdimen4\font=\dimen2

wine

Первый шаг Создать файл.

Я это делаю в своем любимом Emacs

Here is my first \TeX\ sentence. 
\bye

и сохранил с именем test.tex

Второй шаг выполнить tex

tex test.tex

Получилось два файла на выходе: test.dvi и test.log

В test.log

This is TeX, Version 3.141592653 (TeX Live 2024) (preloaded format=tex 2024.10.2)  5 JAN 2025 20:03
**test.tex
(./test.tex [1] )
Output written on test.dvi (1 page, 292 bytes).

А файл dvi вполне себе просматривается emacs, в том виде, как и должно быть.

Специальные символы в Tex

символ назначение как вывести в tex
\ спец символ и инструкции $\backslash$
{ открывает группу ${$
} закрывает группу $}$
% комментарии %
& разграничение колонок в таблице &
~ неразрываемый пробел ~{}
$ начало и окончание математической моды $
^ надстрочник ^{}
_ подстрочник _{}
# определение заменяемого символа #

Набор текста с акцентом

Акцент — это надстрочники и подстрочники над и под буквами

Акцент за которым следует буква

наименование Tex input Tex output Compose
grave \`o ò cmp+` o
acute \’o ó cmp+’ o
circumflex \^o ô cmp+^ o
umlaut/dieresis/tr ́emat \“o ö cmp+” o
tilde \~o õ cmp+~ o
macron \=o ő cmp+= o
dot \.o ȯ cmp+. o

Продолжение для символов требующих пробела

наименование Tex input Tex output Compose
cedilla \c o ǫ cmp+, o
underdot \d o cmp+! o
underbar \b o o᤻ o C-x 8 RET 193b
h ́acˇek \v o ǒ cmp+v o
breve \u o ŏ cmp+u o
tie \t oo o͡o o C-x 8 RET 0361 o
Hungarian umlaut \H o ő cmp+= o
ơ cmp++ o
° cmp+o o
§ cmp+s o
ø cmp+? o

По этой ссылке весь unicode а в Emacs C-x 8 RET в помощь. ⤖ https://www.compart.com/en/unicode/

Но и это еще не всё!

Это нужно при оформлении HTML документации просто пишем имя через &Rarrtl и получаем результат.

Можно создать собственную комбинацию клавиш

Создайте пустой ~/.XCompose и включите в него содержимое стандартного файла, используя директиву include “%L”, например:

# ~/.XCompose
include "%L"

<Multi_key> <g> <a> : "α"
<Multi_key> <g> <b> : "β"
<Multi_key> <g> <g> : "γ"

Определение шрифта

В Tex по умолчанию доступны 16 шрифтов

Наименование команда
Roman \rm
Boldface \bf
Italic \it
Slanted \sl
Typewriter \tt
Math symbol5 \cal

Масштабирование шрифта

используем команду \magstep 0...5 или \magstephalf

\font\bigrm = cmr10 scaled \magstep 5 %объявим свой шрифт crm10 и смасштабируем 5 magstep
\font\bigbigrm = cmr14 scaled \magstep 3

Имена стандартных шрифтов TEX

CMBSY10 CMBXSL10 CMBXTI10 CMBX10 CMBX12 CMBX5
CMBX6 CMBX7 CMBX8 CMBX9 CMB10 CMCSC10
CMDUNH10 CMEX10 CMFF10 CMFIB8 CMFI10 CMITT10
CMMIB10 CMMI10 CMMI12 CMMI5 CMMI6 CMMI7
CMMI8 CMMI9 CMR10 CMR12 CMR17 CMR5
CMR6 CMR7 CMR8 CMR9 CMSLTT10 CMSL10
CMSL12 CMSL8 CMSL9 CMSSBX10 CMSSDC10 CMSSI10
CMSSI12 CMSSI17 CMSSI8 CMSSI9 CMSSQI8 CMSSQ8
CMSS10 CMSS12 CMSS17 CMSS8 CMSS9 CMSY10
CMSY5 CMSY6 CMSY7 CMSY8 CMSY9 CMTCSC10
CMTEX10 CMTEX8 CMTEX9 CMTI10 CMTI12 CMTI7
CMTI8 CMTI9 CMTT10 CMTT12 CMTT8 CMTT9
CMU10 CMVTT10
  • CM — Computer Modern
  • B — Bold
  • R — roman
  • I — italic
  • CSC — small caps
  • SL — наклонный
  • SS — sans serif
  • SY — symbols
  • TT — моноширинный

Форма выводимого текста

Tex понимает различные единицы измерения:

  • in
  • cm
  • pt
  • pc

и другие

  • ex — высота маленькой x
  • em — ширина большой M

Форма страницы

Три части:

  • header
  • body
  • footer
наименование команда значение
ширина \hsize 6.5in
высота \vsize 8.9in
горизонтальный отступ \hoffset 0
вертикальный отступ \voffset 0

\vfill \eject — оборвет страницу и начнет новую

\hsize = 4in — определяет горизонтальный размер текста в текущем абзаце

0.75\hsize установит размер \hsize 0.75 от последнего значения

\vsize — задает вертикальный размер страницы

\hoffset \voffset — задают смещение текста относительно левого верхнего угла страницы. По умолчанию они равны 1in.

Для \hoffset и \voffset нет пределов страницы. Спокойно выведет текст за его пределами

\magnification = \magstep 3

Ставится в самом начале документа до начала первого символа и увеличивает весь документ, вместе с \hsize и \vsize

чтобы сохранить неизменными \hsize и \vsize используем true

\hsize = 5 true in

Форма параграфа

На размер абзаца влияет \hsize

Tex всегда читает весь абзац целиком и применяет последние настройки.

функция команда значение
ширина \hsize 6.5in
отступ первой линии \parindent 20pt
расстояние между линиями \baselineskip 12pt
расстояние между абзацами \parskip 0pt

команда \noindent убирает первый отступ линии, тоже,что и \parindent= 0pt

\rightskip \leftskip

это команды margin отступов слева и справа от обзаца

\narrower — изменяет оба значения сразу значением равным \parindent

\hangindent=2.5 in \hangafter=2

первую строку заполняет полностью на всю ширину, а следующую с отступом. Если положительное, то слева, если отрицательное, то справа.

\hangafter указывает после какой строки начинать отступ.

По умолчанию равно 1. Если поставлю 0, то отступ начнется с первой строки. Если отрицательное, то первые строки будут с отступом, а следующие на полную ширину.

еще есть команда \hang — которая сделает отступ абзаца на длину \parindent

\parshape

Создает абзацы любой формы

\item

Начинает абзац с отступом \parindent и вначале указывает значение, которое в {}

Команда \itemitem сделает двойной отступ

\parskip = 0pt \parindent = 30 pt \noindent 
Answer all the following questions: 
\item{(1)} What is question 1? 
\item{(2)} What is question 2? 
\item{(3)} What is question 3? 
\itemitem{(3a)} What is question 3a? 
\itemitem{(3b)} What is question 3b?

\parskip

расстояние между параграфами

и его друг \vskip 1 in — задают интервал между абзацами (у него нет знака равно)

\vglue 1 in — вставляет 1 in куда угодно, даже в начале страницы.

\topinsert \vskip -2 in \centerline{Figure 1} \endinsert

Эта команда поставит на текущей странице все, что находится между командами \topinsert и \endinsert

Я умышленно поставил \vskip -2 in и весь текстстраницы улетел вверх.

\smallskip, \medskip, \bigskip

Для смещений между абзацами. Действует только на текущий абзац.

Форма строки

\hfill \break — разорвет строку

\hfill — заполнит пространство

\line{} — выведет строку

\liftline{} \rightline{} \centerline{} выравнивает строку

\hfil — заполняет пространство для выравнивания

\raggedrigth — обрыв правого выравнивания

\hskip 1 in — горизонтальный отступ

Сноски

\footnote{}{}

в первой части {} могут быть знаки \dag, \ddag, \S, \P или номер ссылки в формате Tex {${}^{21}$} но сейчас работает {$^{21}$}

в Latex немного измененный формат \footnote{}

определяется командами

\headline{} — header

\footline{} — footer

аналогично как при заполнении \line{}

\headline={\hfil \tenrm Page \the\pageno}

\tenrm — это шрифт roman 10pt

\the\pageno — номер страницы

\folio — тоже номер страницы, но выводит римские буквы когда \pageno отрицательный

\pageno=-1 может быть любого значения

Четные и нечетные заголовки

\headline={\ifodd \pageno {...}\else {...}\fi}

Переполнение или недобор в боксах

При переполнении или недоборе в строках появляется slug — слизень █ который показывает проблему в этой строке.

vbox hbox

Так Tex делит на блоки всю страницу и заполняет ее

vbox — вертикальные блоки абзацев

hbox — горизонтальные блоки строк

\hbadness

Это параметр плохости строки — по умолчанию 1000

Накапливается от количества пробелов, вставленных в строку для ее выравнивания.

Увеличения параметра до 10000 подавляет все сообщения о плохости блока.

\tolerance

Это параметр устанавливает на сколько строка может превышать допустимый размер

По умолчанию = 200. 10000 также стирает все предупреждения.

\hfuzz

Параметр, который определяет, на сколько может выступать переполнение строки \hfuzz = 0.1 pt

\overfullrule

это толщина слизняка slug, появляющегося на полях.

Если установить его 0pt то маркеры будут незаметны

\hyphenation{data-base}

установка переносов для лучшего форматирования боксов

\vbadness

параметры для вертикального наполнения текста на странице

Группы

При наборе текст можно упаковать в группы {}

При выходе из группы, все настройки возвращаются к тем, которые были до входа в группу.

{  \hsize = 4 in \parindent = 0 pt \leftskip = 1 in will produce a paragraph that is four  ...  (this is an easy mistake to make). \par }

Математичесский режим

Третий режим Tex математический. Задается $…$ в строке и $$…$$ для многострочного блока.

Теоремы — это тоже почти математика.

\proclaim — макрос,который выделит первое предложение до точки. А оставшуюся часть абзаца выдаст как описание теоремы.

\proclaim Theorem 1 (H.~G.~Wells). In the country of the blind, the one-eyed man is king.

Матрицы

Это мне всегда больше нравилось.

$$\pmatrix{ 
a & b & c & d \cr 
b & a & c+d & c-d \cr 
0 & 0 & a+b & a-b \cr 
0 & 0 & ab & cd \cr 
}.$$

создаст матрицу с круглыми скобками

\hfill — выравнивают значения в матрице

\matrix

удаляет разделители круглые скобки и их можно задать явно с помощью команд: \left и \right

$$ \left | 
\matrix{ 
a & b & c & d \cr 
b & a & c+d & c-d \cr 
0 & 0 & a+b & a-b \cr 
0 & 0 & ab & cd \cr 
}  
\right | $$

типы скобок: (){}[]||

еще можно значения замещать многоточием: \cdots, \vdots, \ddots

Выравнивание по знаку =

$$\eqalign{ 
a+b &= c+d \cr 
x &= w + y + z \cr 
m + n + o + p &= q \cr 
}$$

Можно нумеровать уравнения тоже через знак &

$$\eqalignno{ 
a+b &= c+d & (1) \cr 
x &= w + y + z \cr 
m + n + o + p &= q & * \cr 
}$$

Таблицы и tabbing

\settabs — команда создать tabbing

\settabs 4 \columns %установить 4 равных столбца
\+ British Columbia & Alberta & Saskatchewan & Manitoba \cr 
\+ Ontario & Quebec & New Brunswick & Nova Scotia \cr 
\+ & Prince Edward Island & Newfoundland \cr

+ — начало строки

\cr — завершение строки

\hfil, \hfill выравнивают текст в ячейках

\settabs \+ \hskip 1 in & \hskip 2 in & \hskip 1.5 in & \cr — это более жизненный пример таблицы с установленными значениями ширины столбцов

или так: \settabs \+ ---------- & ------------------ & ----------------------- & \cr

черточки не выводятся, так же как и любой текст

\hrule — начертит линию под строкой

+\strut — сделает отступ вокруг строки

$$\vbox{
\settabs \+ ----------------&-----&----\cr
\+Plums&\hfill \$1&.22\hfill \cr 
\+Coffee&\hfill 1&.78\hfill \cr 
\+Granola&\hfill 1&.98\hfill \cr 
\+Mushrooms&\hfill &.63\hfill \cr 
\+Kiwi fruit&\hfill&  .39\hfill \cr 
\+Orange juice&\hfill 1&.09\hfill \cr 
\+Tuna&\hfill 1&.29\hfill \cr 
\+Zucchini&\hfill 0&.64\hfill \cr 
\+Grapes&\hfill 1&.69\hfill \cr 
\+Smoked beef&\hfill &.75\hfill \cr 
\+Broccoli&\hfill\underbar{\ \ 1}&\underbar{.09}\hfill \cr
\+Total&\hfill \$12&.55\hfill \cr
}$$

Горизонтальное выравнивание и шаблон \halign

\halign{шаблон} \cr

\halign{\hskip 2 in $#$& \hfil \quad # \hfil & \qquad $#$ & \hfil \quad # \hfil \cr

вместо # будет подставлено значение из строки

\halign{\hskip 2 in $#$& \hfil \quad # \hfil & \qquad $#$ & \hfil \quad # \hfil \cr \alpha & alpha & \beta & beta \cr 
\gamma & gamma & \delta & delta \cr 
\epsilon & epsilon & \zeta & zeta \cr 
}

\hrule — горизонтальная линия

\vrule — вертикальная линия

\offinterlineskip — позволяет зафиксировать раздвижение строк в таблице

\moveright 2 in 
\vbox{\offinterlineskip 
\halign{\strut \vrule \quad $#$\quad &\vrule \hfil \quad #\quad \hfil &\vrule \quad $#$\quad &\vrule \hfil \quad #\quad \hfil \vrule \cr 
\noalign{\hrule}
\alpha & alpha & \beta & beta \cr 
\noalign{\hrule} \gamma & gamma & \delta & delta \cr 
\noalign{\hrule} \epsilon & epsilon & \zeta & zeta \cr 
\noalign{\hrule} 
}}

финальный вариант. \moveright сдвинет box на два In вправо

но для этого также исправно работают \centrline, а также \rightline и \leftline

Создание своих макросов

\def\name{}

name — только буквы или одна не буква

Задать переменные #1

\def\name#1#2{#1...#2}

Задать синоним команде \let

\let \newname = \oldname

работать будут оба имени

Протокол ошибок Tex

обязательно в конце ввода поставить \bye

! Undefined control sequence. %название ошибки
l.1 \line{ The left side \hfli %успешно прочитанная строка
	the right side} % продолжение строки после ошибки
? %что делать?

варианты ответа:

Ответ буква результат
help h причина указана на терминале
insert i показать следующую строку
exit x завершить tex
scroll s прокрутить ошибки
run r продолжить работу
quiet q подавляет вывод в терминал
carry on продолжить лучше как можно

Большие файлы

\input filename

добавит маленькие файлы в большой

Линии rule

\hrule \vrule — имеют параметры width height depth

\vrule height 0 pt depth 0.4 pt width 3 in

Boxes

\vbox и \hbox — основные кирпичи в tex.

Вкладывая их друг в друга можно получить любой результат.

Задать размер \hbox to 5cm{}

у \vbox есть брат \vtop — будет выравнивать по верхнему краю boxes

\vbox{ \hrule 
\hbox{\vrule{} The text to be boxed \vrule} 
\hrule }

А это будет текст в рамочке, а с ключевым слово \strut — оно будет с отступами

Перемещение box по странице

\moveright \moveleft — переместит вертикальный бокс

\raise \lower — переместит горизонтальный бокс

Линии в боксе

\hbox to 5 in{Getting Started\hrulefill 1} и еще есть \dotfill — полезно для оглавления

6.4 -

7 - Графический пакет TIKZ для Latex

Дружелюбный функционал для полной графики в Latex. Картинки, иконки, графики и пр.

Дружелюбный функционал для полной графики в Latex. Картинки, иконки, графики и пр. Очень мощный пакет в котором можно нарисовать все.

Установка пакета

\usepackage{tikz}

Использование пакета

Окружение {tikzpicture} или команды \tikzpicture и \endtikzpicture

Использование дополнительных библиотек

\documentclass{article} % say

\usepackage{tikz}
\usetikzlibrary{arrows.meta,decorations.pathmorphing,backgrounds,positioning,fit,petri}

\begin{document}
\begin{tikzpicture}
  \draw (0,0) -- (1,1);
\end{tikzpicture}
\end{document}

7.1 - Дисплей для руководства пользователя

Практическая задача в LATEX по созданию настраиваемого дисплея при описании руководства пользователя

Примеры использования поисковых запросов POSIX

Постановка задачи

Для описания инструкции по эксплуатации прибора необходимо описывать интерфейс внутренней программы с меню и другими изображениями на 7-ми строчном дисплее.

Дисплей имеет 22 знака в ширину и 7 строк.

disp1

Необходимо создать однострочную команду в Latex для удобного заполнения параметров дисплея и вывода графического изображения в любое место на странице документации.

Команда должна обеспечивать сохранение размеров и цветовой гаммы дисплея на всех страницах документации однообразными.

  1. Дисплей должен отражать текстовые строки заглавными и строчными буквами латинского алфавита.
  2. На дисплее должны отображаться арабские цифры
  3. Графические элементы применяемые на дисплее:
    • аккумулятор
    • антенна
    • уровень сигнала
    • замок
    • линия под статусной строкой
    • линия середины экрана
  4. Типы строк дисплея:
    • строка с текстом выровненным по левому краю до 22 символов
    • строка подсвеченная прямоугольником с инвертированным цветом символов
    • строка с текстом выровненным по середине экрана
    • строка с текстом в две колонки
    • строка без текста
  5. Типы строк статусной строки
    • режим 1 с аккумулятором и антенной
    • режим 2 с аккумулятором
    • режим 3 текст
  6. Отдельный режим отображения средней линии на дисплее
  7. Режим вывода картинки в правой части дисплея
  8. Обозначение подсвеченных информационных кнопок в нижней части дисплея
  9. Информационный режим дисплея

Решение задачи

  1. Использование издательской системы Latex
  2. Загрузка специального графического пакета TIKZ
  3. Настройка графических примитивов с помощью библиотеки TIKZ для использования в строках
  4. Программирование Tex для создания простых команд для указания в строках дисплея выводимой информации
  5. Создание библиотеки с возможностью многократного использования дисплея в различных документах

Описание решения

\definecolor{disp}{HTML}{000041} % цвет дисплея
\definecolor{textdisp}{HTML}{f0ffff} %цвет текста дисплея

\tikzset{%настройки стиля шрифта для вывода символов на терминал дисплея
terminal/.style = {text=textdisp,inner sep=0pt, anchor=west,font=\fontfamily{cmtt}\fontsize{10}{10}\selectfont}}

Создание графических элементов

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%Аккумулятор
%%%%%%%%%%%%%
\tikzset{
accum/.pic={[font=\ttfamily]
\path (.5,.35) coordinate(acbl) ++(1,0) coordinate(acbr)
    ++(0,.6) coordinate(actr) ++(-1,0) coordinate(actl);
\draw[pic actions,thick] (acbl) -- (acbr) -- ($(acbr)!.2!(actr)$)-- ++(1pt,0) |- ($(acbr)!.8!(actr)$) -- (actr) -- (actl) -- cycle; 
\fill[pic actions] (acbl) rectangle ($(actl)!#1!(actr)$);
}
}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%Антенна
%%%%%%%%%%%%%
\tikzset{
antena/.pic={
 \path
    (0,.35) coordinate(anbot) ++(0,.6) coordinate(antop)
    +(-.3,0) coordinate(antl) +(.3,0) coordinate(antr);
\draw[pic actions,thick] (anbot) -- (antop) 
                 ($(anbot)!.5!(antop)$)--(antl)
                 ($(anbot)!.5!(antop)$)--(antr);
\path[pic actions] (anbot) ++(.4,.3) node[terminal]{100\%};
}
}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%Уровень сигнала
%%%%%%%%%%%%%
\tikzset{
lsignal/.pic={
\coordinate (a) at (.35,.35);
\draw[pic actions,thick] (a) foreach \x in {1,...,#1} {+(.\x,0) -- +(.\x,.\x)};
}
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%замок LOCK
%%%%%%%%%%%
\tikzset{
lockc/.pic={
\path (0,.15) coordinate (bl) +(.4,0) coordinate (br) +(.4,.3) coordinate (tr) +(0,.3) coordinate (tl);
\draw[pic actions,thick,fill] (bl) rectangle (tr);
\draw[thick,out=90,in=90,distance=.3em] (tl) to (tr);
}
}

Настройка типов строк

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%активная строка
%%%%%%%%%%%%%
\tikzset{
araw/.pic={%отображает строку подсвеченной как активную без текста
 \path
    (.4,.2) coordinate(arbl) ++(11.6,0) coordinate(arbr)
    ++(0,.9) coordinate(artr) ++(-11.6,0) coordinate(artl);
\fill[white!95,opacity=.7] (arbl) rectangle (artr); 
},
arawp/.pic={%выводит текст без подсветки
 \path
    (0.4,.2) coordinate(arbl) ++(11.6,0) coordinate(arbr)
    ++(0,.9) coordinate(artr) ++(-11.6,0) coordinate(artl);
\node[terminal,text width=5.6em] at ($(arbl)!.5!(artl)$) {#1};%обычная строка
},
arawa/.pic={%выводит текст в активной строке
 \path
    (0.4,.2) coordinate(arbl) ++(11.6,0) coordinate(arbr)
    ++(0,.9) coordinate(artr) ++(-11.6,0) coordinate(artl);
\node[terminal,text width=5.6em,text=disp] at ($(arbl)!.5!(artl)$) {#1} [fill=white!95,opacity=.7] (arbl) rectangle (artr);%обычная строка
},
lbut/.pic={%выводит текст в левой функциональной кнопке в нижнем ряду
 \path
    (.4,.2) coordinate(arbl) ++(5.7,0) coordinate(arbr)
    ++(0,.9) coordinate(artr) ++(-5.7,0) coordinate(artl);
\node[terminal,text=disp,anchor=center] at ($(arbl)!.5!(artr)$) {#1} [fill=white!95,opacity=.7] (arbl) rectangle (artr) ;
},
rbut/.pic={%выводит текст в правой функциональной кнопке в нижнем ряду
 \path
    (6.3,.2) coordinate(arbl) ++(5.7,0) coordinate(arbr)
    ++(0,.9) coordinate(artr) ++(-5.7,0) coordinate(artl);
\node[terminal,text=disp,anchor=center] at ($(arbl)!.5!(artr)$) {#1} [fill=white!95,opacity=.7] (arbl) rectangle (artr) ;
},
rawc/.pic={%строка через весь дисплей с выделенной активностью и текстом по центру
 \path
    (.4,.2) coordinate(arbl) ++(11.6,0) coordinate(arbr)
    ++(0,.9) coordinate(artr) ++(-11.6,0) coordinate(artl);
\node[terminal,text=disp,anchor=center] at ($(arbl)!.5!(artr)$) {#1} [fill=white!95,opacity=.7] (arbl) rectangle (artr);
}
}

Оформление контура дисплея

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%Дисплей маленького экрана
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\tikzset{
display/.pic={%рамка для дисплея
\path[terminal] (0,.2) coordinate (dtl) ++(12.4,0) coordinate (dtr)  ++(0,-7.2) coordinate (dbr)  ++(-12.4,0) coordinate (dbl);
\draw[thick,gray!20,fill=disp,rounded corners] (dbl) rectangle (dtr);
}
}

Создание стилей строки статуса для различных режимов

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%Строка состояния пульта
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\tikzset{
pultmain/.pic={% режим 1 с произвольным текстом, часами и аккумулятором заголовок дисплея пульт на вход отправим text 
\path
    (0.4,.2) coordinate(arbl) ++(11.6,0) coordinate(arbr)
    ++(0,.9) coordinate(artr) ++(-11.6,0) coordinate(artl);
\path ($(arbl)!.5!(artl)$) node[terminal] {#1} +(4,0) node[terminal] {08:20:46};
\pic[textdisp] at (10.4,0) {accum=.4};
\draw[textdisp,thick] (arbl.south west)--(arbr.south east);
},
pultfree/.pic={%заголовок дисплея пульт на вход отправим свободную строку
\path
    (0.4,.2) coordinate(arbl) ++(11.6,0) coordinate(arbr)
    ++(0,.9) coordinate(artr) ++(-11.6,0) coordinate(artl);
\node[terminal,text width=10.5em] at ($(arbl)!.5!(artl)$) {#1};%обычная строка
\pic[textdisp] at (10.4,0) {accum=.4};%\fill[red](arbl.south west)circle (1pt);
\draw[textdisp,thick] (arbl.south west)--(arbr.south east);
},
priemfree/.pic={%заголовок дисплея приемника на вход отправим свободную строку
\path
    (0.4,.2) coordinate(arbl) ++(11.6,0) coordinate(arbr)
    ++(0,.9) coordinate(artr) ++(-11.6,0) coordinate(artl);
\pic[textdisp]{accum=.5};\pic[textdisp] at (9.4,0) {antena};
\draw[textdisp,thick] (arbl.south west)--(arbr.south east);
},
rawg/.pic={\node[terminal,text width=5.6em] {#1};%обычная строка
},
rawa/.pic={\pic{arow} node[terminal,text width=5.6em,text=disp] {#1};%активная строка
}
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%шаблон дисплея создаем команду \dispm с 8-ю входными параметрами
\def\dispm#1#2#3#4#5#6#7#8{
\begin{tikzpicture}[x=10pt,y=10pt,node distance=10pt]%установить масштаб отображения
\pic{display};%вывести фон дисплея
\pic at (0,-1) {#1};%строка состояния 
\pic at (0,-2) {#2};%вторая строка
\pic at (0,-3) {#3};%третья строка
\pic at (0,-4) {#4};%четвертая строка
\pic at (0,-5) {#5};%пятая строка
\pic at (0,-6) {#6};%шестая строка
\path (0,-7) pic{lbut=#7} pic{rbut=#8};%седьмая строка с кнопками состояния
\draw[textdisp,thick] (6.2,-.9) -- (6.2,-5.9);%линия по центру экрана вертикальная
\end{tikzpicture}
}

% \dispm
% {}%1-я строка значения входного параметра (pultmain=text priemfree, pultfree=TEXT)
% {}%2-я строка (arawa=TEXT - активная строка, )
% {}%3-я строка (arawp=TEXT - пассивная строка,)
% {}%4-я строка (rawc=TEXT - активная строка с текстом по центру)
% {}%5-я строка
% {}%6-я строка
% {}{}%нижние кнопки в 7-й строке
% 

Пример

\dispm
{pultmain=ARM}%1-я строка (pultmain=ARM, pultmain=DISARM, priemfree, pultfree=TEXT)
{arawa=TEXT}%2-я строка (arawa=TEXT - активная строка, )
{arawp=TEXT}%3-я строка (arawp=TEXT - пассивная строка,)
{}%4-я строка (rawc=TEXT - активная строка с текстом по центру)
{}%5-я строка
{rawc=TEXT}%6-я строка
{MENU}{SERVICE}%нижние кнопки в 7-й строке

disp

7.2 - Foreach for Tex

Пакет pgffor для использования функции FOREACH в TEX

Установка

\usepackage{pgffor} % LATEX 
\input pgffor.tex % plain TEX 
\usemodule[pgffor] % ConTEXt

Отдельный пакет для самостоятельного использования в документах Tex и Latex

По умолчанию сам загружает пакет \tikz

Он определяет две новые команды: \foreach и \breakforeach.

Синтаксис

\foreach 〈variables〉 [〈options〉] in 〈list〉 〈commands〉

Простой пример

\def\mylist{1,2,3,0}  
\foreach \x in \mylist {[\x]}

Выдаст: [1][2][3][0]

Вложенные циклы

\begin{tikzpicture} 
\foreach \x in {0,1,2,3} 
	\foreach \y in {0,1,2,3} 
		{  
			\draw (\x,\y) circle (0.2cm); 
			\fill (\x,\y) circle (0.1cm); 
		}  
\end{tikzpicture}

Списки через многоточие

\foreach \x in {a,b,9,8,...,1,2,2.125,...,2.5} {\x, } 

выдаст:
a, b, 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, 2.125, 2.25, 2.375, 2.5,

\foreach \x in {2^1,2^...,2^7} {$\x$, } yields 21, 22, 23, 24, 25, 26, 27,
\foreach \x in {0\pi,0.5\pi,...\pi,3\pi} {$\x$, } yields 0π, 0.5π, 1π, 1.5π, 2π, 2.5π, 3π,  
\foreach \x in {A_1,..._1,H_1} {$\x$, } yields A1, B1, C1, D1, E1, F1, G1, H1,

Координаты для TIKZ

\tikz \foreach \position in {(0,0), (1,1), (2,0), (3,1)} 
\draw \position rectangle +(.25,.5);

Несколько переменных в цикле

\begin{tikzpicture}  
	\foreach \x/\xtext in {0,...,3,2.72 / e} 
	\draw (\x,0) node{$\xtext$}; 
\end{tikzpicture}

задан паттерн для получения переменных \x второе значение через /\xtext Отсутствие значений для второго параметра замещается первым значением.

\begin{tikzpicture}  % Let's draw circles at interesting points:  
\foreach \x / \y / \r in {0 / 0 / 2mm, 1 / 1 / 3mm, 2 / 0 / 1mm} 
\draw (\x,\y) circle (\r);  

% Same effect  
\foreach \center/\r in {{(0,0)/2mm}, {(1,1)/3mm}, {(2,0)/1mm}} \draw[yshift=2.5cm] \center circle (\r); 
\end{tikzpicture}

Угловые координаты

\begin{tikzpicture}[line cap=round,line width=3pt] 
\filldraw [fill=yellow!80!black] (0,0) circle (2cm);  

\foreach \angle / \label in 
{0/3, 30/2, 60/1, 90/12, 120/11, 150/10, 180/9, 210/8, 240/7, 270/6, 300/5, 330/4} 
	{  
		\draw[line width=1pt] (\angle:1.8cm) -- (\angle:2cm); 
		\draw (\angle:1.4cm) node{\textsf{\label}}; 
	}  
\foreach \angle in {0,90,180,270} 
	\draw[line width=2pt] (\angle:1.6cm) -- (\angle:2cm);  
	
	\draw (0,0) -- (120:0.8cm); % hour 
	\draw (0,0) -- (90:1cm); % minute 
\end{tikzpicture}%

clock

Параметры настройки оператора foreach

Описанные ниже ключи можно использовать в аргументе 〈options〉 команды \foreach. Все они имеют путь /pgf/foreach/, однако путь устанавливается автоматически при анализе 〈options〉, поэтому его не нужно указывать явно.

  • /pgf/foreach/var=〈variable〉 — Этот ключ обеспечивает альтернативный способ указания переменных: \foreach [var=\x,var=\y] аналогичен \foreach \x/\y.
  • /pgf/foreach/evaluate=〈variable〉 as 〈macro〉 using 〈formula〉 — Этот ключ позволяет оценивать переменную с помощью математического механизма. \foreach \x [evaluate=\x] in {2^0,2^...,2^8}{$\x$, } вернет 1.0, 2.0, 4.0, 8.0, 16.0, 32.0, 64.0, 128.0, 256.0,

as

или \foreach \x [evaluate=\x as \xeval] in {2^0,2^...,2^8}{$\x=\xeval$, } значение будет помещено в \xeval

using

указывает формулу для вычисления

\tikz\foreach \x [evaluate=\x as \shade using \x*10] in {0,1,...,10} \node [fill=red!\shade!yellow, minimum size=0.65cm] at (\x,0) {\x};

  • /pgf/foreach/remember=〈variable〉 as 〈macro〉 (initially 〈value〉) — Этот ключ позволяет запомнить значение элемента, хранящееся в 〈variable〉, во время следующей итерации, сохраненное в 〈macro〉.
\foreach \x [remember=\x as \lastx (initially A)] in {B,...,H}{$\overrightarrow{\lastx\x}$, }
  • /pgf/foreach/count=〈macro〉 from 〈value〉 — считает номер итерации
\tikz[x=0.75cm,y=0.75cm]  
\foreach \x [count=\xi] in {a,...,e} 
\foreach \y [count=\yi] in {\x,...,e} 
	\node [draw, top color=white, bottom color=blue!50, minimum size=0.666cm] 
		at (\xi,-\yi) {$\mathstrut\x\y$};
  • /pgf/foreach/parse={〈boolean〉} — Если для этого ключа установлено значение true, верхняя граница цикла будет передана в \pgfmathparse.
  • /pgf/foreach/expand list={〈boolean〉} — Если для этого ключа установлено значение true, содержимое списка полностью раскрывается с помощью \edef перед дальнейшей обработкой.

\breakforeach

Если эта команда задана внутри команды \foreach, дальнейшее выполнение 〈команд〉 происходить не будет. Однако текущее выполнение 〈команд〉 продолжается в обычном режиме, поэтому, вероятно, лучше использовать эту команду только в конце команды \foreach.

7.3 - Key Management

Key Management из пакета pgfkeys, может использоваться самостоятельно или в составе пакета TIKZ, управляет ключами пользователя

Введение

В основном этот раздел описываю, так как его активно используют библиотеки TIKZ.

А в общем этот вопрос вполне удовлетворяет знание TEX и его внутренней кухни по созданию макросов и переменных.

Подключение пакета

\usepackage{pgfkeys}

Отличия pgfkeys от xkeyval

  • pgfkeys организует дерево ключей
  • pgfkeys не влияет на состояние стека
  • pgfkeys медленнее keyval
  • pgfkeys поддерживает стили (полезно для TIKZ)
  • pgfkeys поддерживает множественные аргументы
  • pgfkeys поддерживает обработчики обратного вызова и ошибок

Краткое описание механизма Key Management

Организован по принципу файловой системы Unix, корень и как дерево ветвление всех элементов

Можно указать полный путь к ключу или сокращенное наименование и путь будет подставлен автоматически.

Основная команда \pgfkeys берет пару ключ и значение.

Для каждого будет выполнен код с параметром, переданным в

\pgfkeys{/my key=hallo,/your keys/main key=something\strange,
        key name without path=something else}

Сначала установим код для ключа: стр.1 и затем выполним его с переданным параметром стр.2

\pgfkeys{/my key/.code=The value is '#1'.}
\pgfkeys{/my key=hi!}

В качестве параметров может быть несколько значений (ключевое слово /.code 2 args=)

\pgfkeys{/my key/.code 2 args=The values are '#1' and '#2'.}
\pgfkeys{/my key={a1}{a2}}

Может быть значение по умолчанию: \pgfkeys{/my key/.default=hello}

Можно указать обязательное значение /.value required или запрещенное значение /.value forbidden, т.е. не нужно вводить значение.

Ключ /.cd - изменит путь. Т.е. после этого ключа, все остальные будут выполнять команды с новым путем.

\pgfkeys{/tikz/.cd,line width=1cm,line cap=round}

т.е. все остальные команды будут начинаться с /tikz/

Ключи могут вызывать выполнение других ключей.

\pgfkeys{/a/.code=(a:#1)}
\pgfkeys{/b/.code=(b:#1)}
\pgfkeys{/my style/.style={/a=foo,/b=bar,/a=#1}}
\pgfkeys{/my style=wow}

получим (a:foo)(b:bar)(a:wow)

Еще пример с созданием стиля tikz

\pgfkeys{/tikz/.style=/tikz/.cd}
\pgfkeys{tikz,line width=1cm,draw=red}

Описание синтаксиса pgfkeys

Если ключ начинается с / — это ключ с полным путем, если без слеша, то это не полный путь.

\pgfkeyssetvalue{⟨full key⟩}{⟨token text⟩}

Эта команда сохраняет token text в full key

Это не может быть частичным ключом.

\pgfkeyssetvalue{/my family/my key}{Hello, world!}%установить ключ
\pgfkeysvalueof{/my family/my key}%вывести ключ

\pgfkeyssetevalue{⟨full key⟩}{⟨token text⟩} — это тоже, но \edef версия

\pgfkeyslet{⟨full key⟩}{⟨macro⟩}

\def\helloworld{Hello, world!}
\pgfkeyslet{/my family/my key}{\helloworld}
\pgfkeysvalueof{/my family/my key}

позволяет устанавливать для ключа значение макроса, в нашем случае будет подставлено значение \helloworld

Недопустимо,чтобы ключ совпадал с \relax — relax это пустышка

\pgfkeysgetvalue{⟨full key⟩}{⟨macro⟩}

Извлекает токены из ключа

Если ключ не установлен то токен будет равен \relax

\pgfkeysvalueof{⟨full key⟩}

Возвращает значение ключа и вставляет его в текст

\pgfkeysifdefined{⟨full key⟩}{⟨if⟩}{⟨else⟩}

\pgfkeyssetvalue{/my family/my key}{Hello, world!}
\pgfkeysifdefined{/my family/my key}{yes}{no}

проверяет, если ключ был определен, то выведет значение if, если не определен, то else

\pgfkeys

Ключи могут выполнять следующие действия:

  • выполняет команду,хранящуюся в key с аргументом value
  • сохраняет значение value в ключе key
  • если имя ключа известный обработчик,тогда обработчик все сделает
  • если ключ неизвестный, то вызовется обработчик неизвестных ключей

Синтаксис команд

\pgfkeys{key=value,key,key={val1}{val2}}

Возможно указать:

  • key=value,
  • key,
  • key={val1}{val2}

или просто значение в {} если оно содержит запятые или спецсимволы

\pgfqkeys{⟨default path⟩}{⟨key list⟩}

Эта команда имеет тот же эффект,что и \pgfkeys{⟨default path⟩/.cd,⟨key list⟩}

\pgfkeysalso{⟨key list⟩}

в этой команде путь не изменяется

\pgfqkeysalso{⟨default path⟩}{⟨key list⟩}

вызывает с изменением пути

Команда привязанная к 1 символу

Наверно это удобно.

Так работают во всех nodes кавычки " которые заменяются текстом \label={}

Для этого нужно:

  • Установить /handlers/first char syntax=〈true or false〉 в true
  • Привязать к волшебному слову the character <символ> макрос, который будет выполняться
  • Объявить привязанный макрос
\pgfkeys{ 
/handlers/first char syntax=true, 
/handlers/first char syntax/the character "/.initial=\myquotemacro, 
/handlers/first char syntax/the character </.initial=\mypointedmacro, 
}  

\def\myquotemacro#1{Quoted: #1. } 
\def\mypointedmacro#1{Pointed: #1. }  

\ttfamily \pgfkeys{"foo", <bar>}

Дальше все параметры в "" будут переданы в макрос myquotemacro, а в <> в макрос mypointedmacro

Значение по умолчанию 〈key〉/.@def

  • если не нужно вводить значения, то можно указать key=\pgfkeysnovalue
  • проверяется наличие ключа: 〈key〉/.@def
  • если ключ есть, то он замещается в токене

Для установки по умолчанию значения используем команду: \pgfkeys{/my key/.default=hello}

Команды выполняемые в ключах 〈key〉/.@cmd

Во всем макросах в \pgf параметры должны заканчиваться значением \pgfeov т.е. что сделает на самом деле пакет \pgf

\usepackage {shortvrb} \MakeShortVerb {\|}  
\def\mystore#1+#2\pgfeov{\def\a{#1}\def\b{#2}} 
\pgfkeyslet{/my key/.@cmd}{\mystore} 
\pgfkeys{/my key=hello+world}  

получим:
|\a| is `\a', |\b| is `\b'.
т.е. 
\a is ‘hello’, \b is ‘world’.

Что предлагает пакет взамен

  • \pgfkeysdef{〈key〉}{〈code〉} — Эта команда временно определяет TEX-макрос со списком аргументов #1\pgfeov, а затем позволяет 〈key〉/.@cmd быть равным этому макросу.
  • \pgfkeysedef{〈key〉}{〈code〉} — аналогично, но работает, как edef
  • \pgfkeysdefnargs{〈key〉}{〈argument count〉}{〈code〉} — Эта команда работает аналогично \pgfkeysdef, но позволяет вам указать произвольное «счетчик аргументов» от 0 до 9 (включительно).
\usepackage {shortvrb} \MakeShortVerb {\|}  
\pgfkeysdefnargs{/my key}{2}{\def\a{#1}\def\b{#2}} 
\pgfkeys{/my key= {hello} {world}} 

|\a| is `\a', |\b| is `\b'
  • \pgfkeysedefnargs{〈key〉}{〈argument count〉}{〈code〉} — аналогично, но edef
  • \pgfkeysdefargs{〈key〉}{〈argument pattern〉}{〈code〉} — Эта команда работает аналогично \pgfkeysdefnargs, но позволяет вам предоставить произвольный «шаблон аргумента», а не просто несколько аргументов. \pgfkeysdefargs{/my key}{#1+#2}{\def\a{#1}\def\b{#2}}
  • \pgfkeysedefargs{〈key〉}{〈argument pattern〉}{〈code〉} — это его edef версия

Хранение значений в ключах

Если у ключа не определен key/.@cmd, то он будет просто хранить значение которое может быть задано командой \pgfkeyssetvalue

Обработчики ключей

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

\pgfkeysdef{/handlers/.my code}{\pgfkeysdef{\pgfkeyscurrentpath}{#1}}
  • Путь ключа, хранится в макросе \pgfkeyscurrentpath

  • Имя ключа, хранится в макросе \pgfkeyscurrentname

  • обработчик должен начинаться с .

  • /handler config=all|only existing|full or existing — Изменяет исходную конфигурацию использования обработчиков ключей.

  • /handler config/only existing/add exception={〈key handler name〉} — Позволяет добавлять исключения к существующей функции /handler config=only.

Обработка ключей, которые неизвестны

Для некоторых ключей не определен ни сам ключ, ни его подраздел .@cmd, ни обработчик. В этом случае проверяется, существует ли ключ 〈текущий путь〉/.unknown/.@cmd.

Т.к. он существует, то будет выполнена какая-то странная вещь, как он ее поймет.

Пути поиска и обрабатываемые ключи

Обработчики ключей

Теперь мы опишем, какие обработчики клавиш определены по умолчанию.

Обработчик пути

  • Key handler 〈key〉/.cd — Этот обработчик устанавливает путь по умолчанию 〈key〉. Обратите внимание, что путь по умолчанию сбрасывается в начале каждого вызова \pgfkeys и становится равным /.
\pgfkeys{/tikz/.cd,...}
  • Key handler 〈key〉/.is family — Этот обработчик настраивает такие вещи, что при выполнении 〈key〉 текущий путь устанавливается на 〈key〉.
\pgfkeys{/tikz/.is family} 
\pgfkeys{tikz,line width=1cm}

Установка по умолчанию

  • Key handler 〈key〉/.default=〈value〉 — Устанавливает значение по умолчанию 〈key〉 в 〈value〉. Это означает, что всякий раз, когда при вызове \pgfkeys не указывается значение, вместо него будет использоваться это 〈значение〉. \pgfkeys{/width/.default=1cm}
  • Key handler 〈key〉/.value required — Этот обработчик вызывает выдачу ключа /errors/value сообщения об ошибке всякий раз, когда 〈key〉 используется без значения. \pgfkeys{/width/.value required} Т.е. требует обязательно указать значение.
  • Key handler 〈key〉/.value forbidden — не будет выдавать сообщение об ошибке, если указано будет значение ключа

Определение кода ключа

  • Key handler 〈key〉/.code=〈code〉 — Этот обработчик выполняет \pgfkeysdef с параметрами 〈key〉 и 〈code〉.
  • Key handler 〈key〉/.ecode=〈code〉 — выполнит команду \pgfkeysedef
  • Key handler 〈key〉/.code 2 args=〈code〉 — с двумя аргументами
  • Key handler 〈key〉/.ecode 2 args=〈code〉 — с двумя аргументами edef
  • Key handler 〈key〉/.code n args={〈argument count〉}{〈code〉} — с n аргументами
  • Key handler 〈key〉/.ecode n args={〈argument count〉}{〈code〉} — с n аргументами edef
  • Key handler 〈key〉/.code args={〈argument pattern〉}{〈code〉} — с произвольным паттерном аргументов
  • Key handler 〈key〉/.ecode args={〈argument pattern〉}{〈code〉} — с произвольным паттерном аргументов edef
  • Key handler 〈key〉/.add code={〈prefix code〉}{〈append code〉} — Этот обработчик добавляет код к существующему ключу. 〈код префикса〉 добавляется к коду, хранящемуся в 〈key〉/.@cmd, в начале, 〈код добавления〉 добавляется к этому коду в конце.
\pgfkeys{/par indent/.code={\parindent=#1}} 
\newdimen\myparindent 
\pgfkeys{/par indent/.add code={}{\myparindent=#1}} 
...  
\pgfkeys{/par indent=1cm} % This will set both \p
  • Key handler 〈key〉/.prefix code=〈prefix code〉 — Этот обработчик является ярлыком для 〈key〉/.add code={〈prefix code〉}{}. То есть этот обработчик добавляет 〈префиксный код〉 в начало кода, хранящегося в 〈key〉/.@cmd.
  • Key handler 〈key〉/.append code=〈append code〉 — Этот обработчик является ярлыком для 〈key〉/.add code={}{〈append code〉}.

Определение стиля

  • Key handler 〈key〉/.style=〈key list〉 — Этот обработчик настраивает ситуацию таким образом, что всякий раз, когда 〈ключ〉=〈значение〉 встречается в списке ключей, вместо этого обрабатывается 〈список ключей〉, в котором каждое вхождение #1 заменено на 〈значение〉. Как всегда, если 〈значение〉 не указано, используется значение по умолчанию, если оно определено, или специальное значение \pgfkeysnovalue.
\pgfkeys{/par indent/.code={\parindent=#1}} 
\pgfkeys{/no indent/.style={/par indent=0pt}} 
\pgfkeys{/normal indent/.style={/par indent=2em}} 
\pgfkeys{/no indent} 
... 
\pgfkeys{/normal indent}
  • Key handler 〈key〉/.estyle=〈key list〉 — определяет стиль через edef
  • Key handler 〈key〉/.style 2 args=〈key list〉 — с двумя аргументами
  • Key handler 〈key〉/.estyle 2 args=〈key list〉 — с двумя аргументами edef
  • Key handler 〈key〉/.style n args={〈argument count〉}〈key list〉 — n аргументов
  • Key handler 〈key〉/.add style={〈prefix key list〉}{〈append key list〉} — добавить значение к стилю
  • Key handler 〈key〉/.style args={〈argument pattern〉}{〈key list〉} — стиль с произвольным паттерном
  • Key handler 〈key〉/.estyle args={〈argument pattern〉}{〈code〉} — стиль с произвольным паттерном edef
  • Key handler 〈key〉/.prefix style=〈prefix key list〉 — prefix style добавить
  • Key handler 〈key〉/.append style=〈append key list〉 — добавить стиль в конец

Определение ключей значений, макросов, if и выбора

Для некоторых клавиш код, который должен по ним выполняться, достаточно «специализирован».

  • Key handler 〈key〉/.initial=〈value〉 — Этот обработчик устанавливает значение 〈key〉 в 〈value〉. Обратите внимание, что никакие подразделы не задействованы. После использования этого обработчика, согласно правилам, регулирующим ключи, вы можете впоследствии изменить значение 〈key〉, просто написав 〈key〉=〈value〉. Таким образом, этот обработчик используется для установки начального значения ключа.
  • Key handler 〈key〉/.get=〈macro〉 — выведет содержимое ключа и поместит в \macro
  • Key handler 〈key〉/.add={〈prefix value〉}{〈append value〉} — добавит к ключу
  • Key handler 〈key〉/.prefix={〈prefix value〉} — добавит префикс
  • Key handler 〈key〉/.append={〈append value〉} — добавит суффикс
  • Key handler 〈key〉/.link=〈another key〉 — сделает ссылку на другой ключ
  • Key handler 〈key〉/.store in=〈macro〉 — это прямой аналог \def\macro{#1}
\pgfkeys{/text/.store in=\mytext}  
\def\a{world} \pgfkeys{/text=Hello \a!} 
\def\a{Gruffalo}
\mytext

выведет:
Hello Gruffalo!
  • Key handler 〈key〉/.estore in=〈macro〉 — тоже, только edef
  • Key handler 〈key〉/.is if=〈TEX-if name〉 — имитация if Tex
\newif\iftheworldisflat  
\pgfkeys{/flat world/.is if=theworldisflat} 
\pgfkeys{/flat world=false} 
\iftheworldisflat 
Flat \else Round? 
\fi
  • Key handler 〈key〉/.is choice — Этот обработчик настраивает ситуацию так, что запись 〈key〉=〈value〉 приведет к выполнению подраздела 〈key〉/〈value〉. Таким образом, каждый из возможных вариантов должен быть задан подразделом 〈key〉.
\pgfkeys{/line cap/.is choice} 
\pgfkeys{/line cap/round/.code={\pgfsetroundcap}} 
\pgfkeys{/line cap/butt/.code={\pgfsetbuttcap}} 
\pgfkeys{/line cap/rect/.code={\pgfsetrectcap}} 
\pgfkeys{/line cap/rectangle/.style={/line cap=rect}} 
... 
\draw [/line cap=butt] ...

Расширенные и множественные значения

  • Key handler 〈key〉/.expand once=〈value〉 — Этот обработчик расширяет 〈value〉 один раз (точнее, он выполняет команду \expandafter для первого токена 〈value〉), а затем обрабатывает полученный 〈result〉, как если бы вы написали 〈key〉=〈result〉.
  • Key handler 〈key〉/.expand twice=〈value〉 — дважды расширяет значение
  • Key handler 〈key〉/.expanded=〈value〉 — Этот обработчик полностью расширит 〈value〉 (с помощью \edef) перед обработкой 〈key〉=〈result〉.
  • Key handler 〈key〉/.evaluated=〈value〉 — Этот обработчик оценит 〈value〉 как математическое выражение с помощью \pgfmathparse и присвоит 〈key〉=\pgfmathresult.
  • Key handler 〈key〉/.list=〈comma-separated list of values〉 — Этот обработчик вызывает многократное использование ключа, а именно один раз для каждого элемента списка значений. Что-то вроде foreach

Обработчик с пересылкой значений

  • Key handler 〈key〉/.forward to=〈another key〉 — Этот обработчик заставляет 〈key〉 «пересылать» свой аргумент 〈другому ключу〉. При использовании 〈key〉 сначала будет выполнен ее обычный код. Затем значение (дополнительно) передается «другому ключу».
\pgfkeys{  
/a/.code=(a:#1), 
/b/.code=(b:#1), 
/b/.forward to=/a, 
/c/.forward to=/a 
}  
\pgfkeys{/b=1} \pgfkeys{/c=2}

выведет 
(b:1)(a:1) (a:2)
  • Key handler 〈key〉/.search also={〈path list〉} — Стиль, который устанавливает обработчик /.unknown в 〈key〉. Этот обработчик /.unknown затем будет искать неизвестные ключи по каждому пути, указанному в {〈списке путей〉}.

Обработчики для тестирования ключей

  • Key handler 〈key〉/.try=〈value〉 — Этот обработчик вызывает то же самое, как если бы вместо этого было написано 〈key〉=〈value〉. Однако если ни 〈key〉/.@cmd, ни сам ключ не определены, обработчики вызываться не будут. Вместо этого выполнение ключа просто останавливается. Таким образом, этот обработчик «пытается» использовать ключ, но никаких дальнейших действий не предпринимается, если ключ не определен.
  • Key handler 〈key〉/.retry=〈value〉 — Этот обработчик работает так же, как /.try, только он ничего не будет делать, если \ifpgfkeyssuccess имеет значение false. Таким образом, этот обработчик попытается установить ключ только в том случае, если «последняя попытка не удалась».
  • Key handler 〈key〉/.lastretry=〈value〉 — Этот обработчик работает как /.retry, только он будет вызывать обычные обработчики для неизвестных ключей, если \ifpgfkeyssuccess имеет значение false.

Обработчики для проверки ключей

  • Key handler 〈key〉/.show value — Этот обработчик выполняет команду \show для значения, хранящегося в 〈key〉. Это полезно в основном для отладки.
  • Key handler 〈key〉/.show code — Этот обработчик выполняет команду \show для кода, хранящегося в 〈key〉/.@cmd. Это полезно в основном для отладки.

Обработка ошибок

В определенных ситуациях могут возникнуть ошибки, например, при использовании неопределенного ключа. В таких ситуациях выполняются ключи ошибок. Они должны хранить макрос, который получает два аргумента: первый — это ключ-нарушитель (возможно, только после раскрытия макроса), второй — значение, которое было передано в качестве параметра (также возможно, только после раскрытия макроса).

Ключевая фильтрация

Обычно вызов \pgfkeys устанавливает все ключи, указанные в списке аргументов. Обычно именно этого ожидают пользователи. Однако реализации различных пакетов или pgf-библиотек могут нуждаться в большем контроле над процедурой установки ключей: библиотека A может захотеть установить свои параметры напрямую и передать все оставшиеся в библиотеку B.

Установить библиотеку фильтрации

\usepgfkeyslibrary{filtered} % LATEX and plain TEX 
\usepgfkeyslibrary[filtered] % ConTEXt

7.4 - Примеры PIC в библиотеке TIKZ

Живой пример использования мощи TIKZ на примерах с маленькими картинками PIC

Примеры использования поисковых запросов POSIX

Постановка задачи

Немного запутанно, но суть в том, что у устройства есть адреса на каждом выходе, и эти адреса изменяются, а картинок несколько.

Было принято решение не рисовать в редакторе картинки, а запрограммировать в LATEX и на вход просто подавать массив с адресами и номерами выходов.

  1. рисуем матрицу с адресами
  2. адрес состоит из двух частей, разделенных :
  3. первая часть 4 разряда
  4. вторая часть 5 разрядов
  5. матрица может располагаться горизонтально и вертикально
  6. в вертикальном положении над каждым адресом необходимо указать номер порта в черном кружке и схематичное изображение в виде скобки с кружком
  7. в горизонтальном положении слева от адреса расположить номер порта в черном кружке

Решение

  1. Создать стили для вертикальных и горизонтальных адресов
  2. Создать шаблон для номера выходного порта (цифра в черном кружке)
  3. Создать шаблон для имитации скрепки с красной точкой
  4. Создать шаблон для формирования горизонтального адреса
  5. Создать шаблон для формирования вертикального адреса
  6. Создать матрицу из 5-ти горизонтальных адресов в одной строке с номерами выходных портов в черных кружках
  7. Создать матрицу из 5-ти вертикальных адресов в одной колонке с номерами выходных портов в черных кружках и скрепкой с красной точкой

h

Код с описанием

\tikzset{vad/.style={node distance=0pt,inner sep=2pt,rotate=90,draw}}%настройка стиля для вертикальных адресов
\tikzset{had/.style={node distance=0pt,inner sep=2pt,rotate=0,draw}}%настройка стиля для горизонтальных адресов
\tikzset{
  orr/.pic={%рисуем маленький красный кружок на белом фоне
    \fill[white] (0,-0.3mm) ellipse (.6mm and 1mm);
    \fill[red] (0,0) ellipse (.4mm and .6mm);},
  piro/.pic={%рисуем скобку и внизу скобки помещаем красный кружок orr
    \draw[thick,orange,rounded corners] (-.7ex,1cm) -- (-.7ex,.3cm) -- (0,0) pic{orr} -- (.7ex,.3cm) -- (.7ex,1cm);},
 pics/ntt/.style={%рисуем черный кружок с переменной номер внутри кружка
   code={\node [circle,fill=black,minimum size=1em,inner sep=0pt,text=white] {#1};}},
 sp/.pic={\path (0,0)--(.2,0);}%это хитрый pic пробел. Чтобы не разъезжались строки.
}

\def\haddr#1#2{%строим горизонтальный адрес в формате 4:5
\coordinate(a0)at(0,.12);
\foreach \z [count=\x,evaluate=\x as \y using \x-1] in {#1}{ 
\node(a\x)[had,right=of a\y] {\z};
};
\node(s0)[had,draw=none,right=of a4] {:};
\foreach \z [count=\x,evaluate=\x as \y using \x-1] in {#2}{ 
\node(s\x)[had,right=of s\y] {\z};
};
}

\def\vaddr#1#2{%строим вертикальный адрес в формате 4:5
\coordinate(a0)at(0,0);
\foreach \z [count=\x,evaluate=\x as \y using \x-1] in {#1}{ 
\node(a\x)[vad,right=of a\y] {\z};
};
\node(s0)[vad,draw=none,right=of a4] {:};
\foreach \z [count=\x,evaluate=\x as \y using \x-1] in {#2}{ 
\node(s\x)[vad,right=of s\y] {\z};
};
}

%рисуем горизонтальную матрицу из пяти адресов
%в первой колонке черный кружок с номером \pic{ntt=1}
%во второй колонке пробел \pic{sp}, чтобы отделить
%в третьей колонке горизонтальный адрес \haddr...
\begin{tikzpicture}
\matrix[matrix of nodes,row sep={0ex}]{
 \pic{ntt=1};&\pic{sp};&\haddr{0,0,0,1}{0,0,0,1,2}\\
 \pic{ntt=2};& &\haddr{0,0,0,1}{0,0,0,1,3}\\
 \pic{ntt=3};& &\haddr{0,0,0,1}{0,0,0,1,4}\\
 \pic{ntt=4};& &\haddr{0,0,0,1}{0,0,0,1,5}\\
 \pic{ntt=5};& &\haddr{0,0,0,1}{0,0,0,1,6}\\};
\end{tikzpicture}

%рисуем вертикальную матрицу из пяти адресов
%в первой строке черные кружки с номерами \pic{ntt=1}
%во второй строке скобки, \pic{piro}
%в третьей строке вертикальный адрес \vaddr...
\begin{tikzpicture}
\matrix[matrix of nodes,column sep={0ex}]{
\pic{ntt=1};&\pic{ntt=2};&\pic{ntt=3};&\pic{ntt=4};&\pic{ntt=5};\\
\pic{piro};&\pic{piro};&\pic{piro};&\pic{piro};&\pic{piro};\\
  \vaddr{0,0,0,1}{0,0,0,1,2}&
  \vaddr{0,0,0,1}{0,0,0,1,2}&
  \vaddr{0,0,0,1}{0,0,0,1,2}&
  \vaddr{0,0,0,1}{0,0,0,1,2}&
  \vaddr{0,0,0,1}{0,0,0,1,2}\\};
\end{tikzpicture}

v

7.5 - Matrix в модуле TIKZ

Матрицы в графическом мобуле TIKZ

Введение в MATRIX

при объявлении node просто указать, что это будет matrix

\node [matrix,fill=red!20,draw=blue,very thick]

а дальше как в обычной таблице или array

\draw (0,0)   circle (4mm); & \node[rotate=10] {Hello};        \\
    \draw (0.2,0) circle (2mm); & \fill[red]   (0,0) circle (3mm); \\
  };

вот и всё.

every matrix

определяет стиль matrix

every outer matrix

это настраивает внешний node в котором объявлен matrix

\matrix

специальная команда без node

аналог \path node[matrix]

Выравнивание matrix

column sep=⟨spacing list⟩

расстояние между колонками

matr1

column sep={1cm,between origins} — расстояние будет мерить не по краям, а по центрам

row sep=⟨spacing list⟩

расстояние между строк

Задавать можно целиком на matrix, так и на отдельную ячейку

\draw (0,0) circle (2mm); \\[1cm,between origins] — можно так

\node {8}; &[2mm] \node{1}; &[-1mm] \node {6}; \\ — а можно и так

&[between borders] \node (c) {6}; — а можно и так

параметры ячейки (размеры)

every cell={⟨row⟩}{⟨column⟩} задает параметры каждой ячейки

cells=⟨options⟩

это стиль ячейки cell/.append style=⟨options⟩

nodes=⟨options⟩

это тоже стиль для ячеек matrix node/.append style=⟨options⟩

\begin{tikzpicture}
  \matrix [nodes={fill=blue!20,minimum size=5mm}]
  {
    \node {8}; & \node{1}; & \node {6}; \\
    \node {3}; & \node{5}; & \node {7}; \\
    \node {4}; & \node{9}; & \node {2}; \\
  };
\end{tikzpicture}

стили колонок и строк

  • /tikz/column ⟨number⟩ — column 2/.style={green!50!black}
  • /tikz/every odd column — стиль для нечетной колонки
  • /tikz/every even column — стиль для четной колонки
  • /tikz/row ⟨number⟩ — row 3/.style={green!50!black}
  • /tikz/every odd row — стиль для нечетной строки
  • /tikz/every even row — стиль для четной строки
  • /tikz/row ⟨row number⟩ column ⟨column number⟩ — стиль для строки и колонки
\begin{tikzpicture}
  [row 1/.style={red},
   column 2/.style={green!50!black},
   row 3 column 3/.style={blue}]

  \matrix
  {
    \node {8}; & \node{1}; & \node {6}; \\
    \node {3}; & \node{5}; & \node {7}; \\
    \node {4}; & \node{9}; & \node {2}; \\
  };
\end{tikzpicture}

Выравнивание в ячейках и колонках

\begin{tikzpicture}
  [column 1/.style={anchor=base west},%выравнивает слева
   column 2/.style={anchor=base east},%выравнивает справа
   column 3/.style={anchor=base}]% выравнивает по центру
  \matrix
  {
    \node {123}; & \node{456}; & \node {789}; \\
    \node {12}; & \node{45}; & \node {78}; \\
    \node {1}; & \node{4}; & \node {7}; \\
  };
\end{tikzpicture}

Большая таблица

\usetikzlibrary {matrix,fit}
\begin{tikzpicture}[
  font=\sffamily,
  head color/.style args={#1/#2}{
    row 1 column #1/.append style={nodes={fill=#2}}},
  % swap order of row and column styles
  matrix/inner style order={
    every cell,
    row, even odd row,
    column, even odd column,
    cell

  }
]

\matrix [
   matrix of nodes, nodes in empty cells,
   nodes={text width=2cm, align=center,
          minimum height=1.5em, anchor=center},
   % add striped row style
   every even row/.style={nodes={fill=olive!50}},
   % modify the feature column and header row
   column 1/.style= {nodes={fill=olive, inner ysep=0}},
   row 1/.style= {nodes={text depth=0.2ex, text=white}},
   row 1 column 1/.style={nodes={fill=none, draw=none}},
   head color/.list={2/orange,3/teal,4/cyan,5/magenta} % specify header colors
  ] (m)
  {
            & Basic     & Standard   & Professional & Enterprise \\
  Feature A & $\bullet$ & $\bullet$  & $\bullet$    & $\bullet$  \\
  Feature B & $\bullet$ & $\bullet$  & $\bullet$    & $\bullet$  \\
  Feature C &           &            &              & $\bullet$  \\
  Feature D &           & $\bullet$  & $\bullet$    & $\bullet$  \\
  Feature E &           &            & $\bullet$    & $\bullet$  \\
  };
% Add emphasis on selection by the use of "fit" library
\node[fit={(m-1-4.north west) (m-6-4.south east)},
      ultra thick, inner sep=0pt, rounded corners=1mm,
      draw=cyan, label={[cyan,align=center]270:Popular\\Choice!}]{};
\end{tikzpicture}

tabl

внутренние стили назначаются в определенной очередности.

Очередность задается параметром:

inner style order

\tikzset{
  matrix/inner style order={
    every cell,
    column,
    even odd column,
    row,
    even odd row,
    cell,
  },
}
  • inner style/every cell
  • inner style/column
  • inner style/even odd column
  • inner style/row
  • inner style/even odd row
  • inner style/cell
  • inner style order

Настройки по умолчанию

Для многих матриц нужно делать однообразные настройки

node{ какой-то текст и };

поэтому определим три макроса:

  • /tikz/execute at begin cell=⟨code⟩ — перед текстом
  • /tikz/execute at end cell=⟨code⟩ — послетекста
  • /tikz/execute at empty cell=⟨code⟩ — если пусто
\begin{tikzpicture}
 [matrix of nodes/.style={
    execute at begin cell=\node\bgroup,
    execute at end cell=\egroup;%
  }]
 \matrix [matrix of nodes]
 {
   8 & 1 & 6 \\
   3 & 5 & 7 \\
   4 & 9 & 2 \\
 };
\end{tikzpicture}

или так

\begin{tikzpicture}
  [matrix of nodes/.style={
     execute at begin cell=\node\bgroup,
     execute at end cell=\egroup;,%
     execute at empty cell=\node{--};%
   }]
  \matrix [matrix of nodes]
  {
    8 & 1 &   \\
    3 &   & 7 \\
      &   & 2 \\
  };
\end{tikzpicture}

https://tikz.dev/library-matrix

Якоря Matrix

matrix anchor=⟨anchor⟩

этот параметр применяется только к самой матрице, но не применяется к ячейкам

т.е. все north, south, east, west

\matrix [matrix anchor=west] at (0,0) поместит левую сторону матрицы в координату (0,0)

отличается от параметра [anchor=west] — который выравнивает в ячейках по левому краю

anchor=⟨anchor or node.anchor⟩

относится только к ячейке

если ячейке дали имя, то можно обращаться к ее якорям node.anchor

\begin{tikzpicture}
  \draw[help lines] (0,0) grid (3,2);
  \matrix[matrix anchor=inner node.south,anchor=base,row sep=3mm] at (1,1)
  {
    \node {a}; & \node             {b}; & \node {c}; & \node {d}; \\
    \node {a}; & \node(inner node) {b}; & \node {c}; & \node {d}; \\
    \node {a}; & \node             {b}; & \node {c}; & \node {d}; \\
  };
  \draw (inner node.south) circle (1pt);
\end{tikzpicture}

ancor

кратко по примеру выше:

  1. во второй строчке node дали имя inner node
  2. в опциях matrix дали команду [matrix anchor=inner node.south, ... at (1,1), т.е. сказали, что точку юга этой ноды поместить в координату (1,1)
  3. anchor=base — колонки выравнивать по центру

Замена & как разделителя колонок

ampersand replacement=⟨macro name or empty⟩

для некоторых процедур это нужно,чтобы не было конфликта с другими библиотеками. Если матрицу закручивать по контуру, то придется поменять разделитель на другое.

\matrix [ampersand replacement=\&]

Matrix Library

без нее эта тема не закончена

\usetikzlibrary{matrix}

matrix of nodes

это матрица в которой каждая ячейка это node

\usetikzlibrary {matrix}
\begin{tikzpicture}
  \matrix (magic) [matrix of nodes]
  {
    8 & 1 & 6 \\
    3 & 5 & 7 \\
    4 & 9 & 2 \\
  };

  \draw[thick,red,->] (magic-1-1) |- (magic-2-3);
\end{tikzpicture}

мы такую уже делали сами, но она объявлена в библиотеке, нужно просто сослаться в заголовке

добавить свои опции вариант 1

указать колонку и строку в заголовке и назначить свой стиль

\begin{tikzpicture}[row 2 column 3/.style=red]
\matrix [matrix of nodes]

добавить опции непосредственно ячейке вариант 2

\usetikzlibrary {matrix}
\begin{tikzpicture}
  \matrix [matrix of nodes]
  {
    8 & 1 &         6 \\
    3 & 5 & |[red]| 7 \\
    4 & 9 &         2 \\
  };
\end{tikzpicture}

для этого нужно поместить между вертикальных линий все данные |[red] (seven)|, как здесь передаем цвет и имя ноды

у & есть необязательный аргумент [3mm] — это расстояние между колонками

8 &[1cm] 1 &[3mm] |[red]| 6 \\

вариант 3 — указать полный список параметров

3 & 5 & \node[red]{7}; \draw(0,0) circle(10pt);\\

matrix of math nodes

все ячейки становятся заключены в $

nodes in empty cells=⟨true or false⟩

обязывает отображать пустые ячейки

\usetikzlibrary {matrix}
\begin{tikzpicture}
  \matrix [matrix of math nodes,nodes={circle,draw},nodes in empty cells]
  {
    a_8 &     & a_6 \\
    a_3 &     & a_7 \\
    a_4 & a_9 &     \\
  };
\end{tikzpicture}

empty

Символы конца строк и переноса строк в узлах

обычно это \\

чтобы в ячейке переносить по строкам, нужно поместить текст в {}

\usetikzlibrary {matrix}
\begin{tikzpicture}
  \matrix [matrix of nodes,nodes={text width=16mm,draw}]
  {
    row 1 & {upper line \\ lower line} \\
    row 2 & hmm \\
  };
\end{tikzpicture}

Разделители в матрицах

  • left delimiter=⟨delimiter⟩
  • right delimiter=⟨delimiter⟩
  • every delimiter
  • every left delimiter
  • every right delimiter
  • above delimiter
  • every above delimiter
  • below delimiter=⟨delimiter⟩
  • every below delimiter
\usetikzlibrary {matrix}
\begin{tikzpicture}
 \matrix [matrix of math nodes,%
          left delimiter=\|,right delimiter=\rmoustache,%
          above delimiter=(,below delimiter=\}]
 {
   a_8 & a_1 & a_6 \\
   a_3 & a_5 & a_7 \\
   a_4 & a_9 & a_2 \\
 };
\end{tikzpicture}

matr

7.6 - PIC маленький рисунок

PIC это маленькие рисунки в TIKZ которые можно встраивать в большие и делать свои библиотеки

Синтаксис PIC

\path … pic ⟨foreach statements⟩ [⟨options⟩] (⟨prefix⟩) at(⟨coordinate⟩) :⟨animation attribute⟩={⟨options⟩} {⟨pic type⟩} …;

  1. PIC можно объявить в \tikzset в преамбуле
  2. можно написать прямо в path в опции code
\tikzset{
  seagull/.pic={
    % Code for a "seagull". Do you see it?...
    \draw (-3mm,0) to [bend left] (0,0) to [bend left] (3mm,0);
  }
}

Вообще PIC это упрощенная запись вставки кода в path.

во втором случае напишем через pic type =:

\tikz {
  \path (0,0) pic [pic type = seagull]
        (1,0) pic                      {seagull};
}
  1. Или в третьем случае через pics/code={}:
\tikz \pic [pics/code={\draw (-3mm,0) to[bend left] (0,0)
                                      to[bend left] (3mm,0);}]
      {}; % no pic type specified

но в последнем варианте, pic не будет, а будет чистый code, который и делает сам pic

pic action

позволяет в опцияхк команде pic передать дополнительные параметры.

\tikzset{
  my pic/.pic = {
    \path [pic actions] (0,0) circle[radius=3mm];
    \draw (-3mm,-3mm) rectangle (3mm,3mm);
  }
}

\tikz \pic                      {my pic}; \space
\tikz \pic [red]                {my pic}; \space
\tikz \pic [draw]               {my pic}; \space
\tikz \pic [draw=red]           {my pic}; \space
\tikz \pic [draw, shading=ball] {my pic}; \space
\tikz \pic [fill=red!50]        {my pic};

behind path и in front of path

также как и node позволяет рисовать за основным рисунком или перед ним

foreground code=⟨code⟩ и background code=⟨code⟩

можно указать индекс слоя

foreach

принимает параметры от foreach

\tikz \pic foreach \x in {1,2,3} at (\x,0) {seagull};

every pic

настраиваем стили для pic

\begin{tikzpicture}[every pic/.style={scale=2,transform shape}]
  \pic foreach \x in {1,2,3} at (\x,0) {seagull};
\end{tikzpicture}

prefix name

я не уверен,что буду этим пользоваться, но можно добавлять префиксы к именам точек pic

pic text

будет работать как label в nodes

или его аналог в библиотеке quotes

pic [draw, "$\alpha$"] {angle};

every pic quotes — для настройки кавычек

глобальный стиль для pic

\tikzset{
  pics/my circle/.style = {
    background code = { \fill circle [radius=#1]; }
  }
}
\tikz [fill=blue!30]
  \draw (0,0) pic {my circle=2mm} -- (1,1) pic {my circle=5mm};

7.7 - Node TIKZ

Nodes и Edges, киты TIKZ в которых можно все писать и компоновать

Синтаксис NODE

\path … node ⟨foreach statements⟩ [⟨options⟩] (⟨name⟩) at(⟨coordinate⟩) :⟨animation attribute⟩={⟨options⟩} {⟨node contents⟩} …;

node contents

это тоже, что и в фигурных скобках.

\tikz {
  \path (0,0) node [red]                    {A}
        (1,0) node [blue]                   {B}
        (2,0) node [green, node contents=C]
        (3,0) node [node contents=D]           ;
}

at

Node размещается в последней координате path, а at указывает конкретно куда поместить node.

\node at (0,0) {сюда}

behind path

нарисует сзади текущего рисунка. \tikz \fill [fill=blue!50, draw=blue, very thick] (0,0) node [behind path, fill=red!50] {first node}

in front of path

тоже, что и выше, только нарисует спереди текущего рисунка

name

задает имя node, полезно для якорей и координат

можно задать alias и есть еще режим also, позволяет под этим же именем node разместить другой текст

coordinate

\path … coordinate[⟨options⟩](⟨name⟩)at(⟨coordinate⟩) …;

специальный синтаксис для легковесных node

это будет просто точка и все якоря будут иметь одно и тоже значение.

\coordinate — простая запись

 \path[shape=coordinate]
    (0,0) coordinate(b1) 
	(1,0) coordinate(b2)
    (1,1) coordinate(b3) 
	(0,1) coordinate(b4);

OPTIONS

Опции для node отличаются от назначений path, поэтому для node нужно давать свои назначения в опциях.

Для рисования вокруг node используем библиотеку \usetikzlibrary {shapes.geometric} https://tikz.dev/library-shapes в ней много разных shapes, которые можно указывать в options

По умолчанию без библиотек в node можно применять 3 вида shapes:

  • rectangle
  • circle
  • coordinate

foreach

в node можно вставлять несколько foreach

\tikz \node foreach \x in {1,...,4} foreach \y in {1,2,3}
            [draw] at (\x,\y) {\x,\y};

foreach

every node

устанавливает стиль для каждой ноды \begin{tikzpicture}[every node/.style={draw}]

или

\begin{tikzpicture}
  [every rectangle node/.style={draw},
   every circle node/.style={draw,double}]
  \draw (0,0) node[rectangle] {A} -- (1,1) node[circle] {B};
\end{tikzpicture}

для каждой прямоугольной node или для каждой круглой node

execute at begin node (end node)

\begin{tikzpicture}
  [execute at begin node={A},
   execute at end node={D}]
  \node[execute at begin node={B}] {C};
\end{tikzpicture}

На выходе даст ABCD

name prefix=⟨text⟩

Используется в scope и добавляет префикс к имени node

\tikz {
  \begin{scope}[name prefix = top-]
    \node (A) at (0,1) {A};
    \node (B) at (1,1) {B};
    \draw (A) -- (B);
  \end{scope}
  \begin{scope}[name prefix = bottom-]
    \node (A) at (0,0) {A};
    \node (B) at (1,0) {B};
    \draw (A) -- (B);
  \end{scope}

  \draw [red] (top-A) -- (bottom-B);
}

ее брат name suffix=⟨text⟩ добавит суффикс в конце имени

inner sep=⟨dimension⟩

внутренний отступ от текста к рамке

inner xsep=⟨dimension⟩

margin по x

inner ysep=⟨dimension⟩

margin по y

outer sep=⟨dimension or “auto”⟩

эффект этой опции позволит сместить все якоря вовне outer sep=auto

outer xsep=⟨dimension⟩

outer ysep=⟨dimension⟩

minimum height=⟨dimension⟩

минимальная высота node

если текст не вместится,то node расширится

minimum width=⟨dimension⟩

минимальная ширина node

minimum size=⟨dimension⟩

для квадратных и круглых форм

shape aspect=⟨aspect ratio⟩

пропорции сжатия

shape border uses incircle=⟨boolean⟩

проверяет,чтобы внутрь фигуры вписывалась окружность

shape border rotate=⟨angle⟩

поворачивает контур фигуры, но не поворачивает текст

\nodepart[⟨options⟩]{⟨part name⟩}

это node состоящая из нескольких частей

\usetikzlibrary {shapes.multipart}
\begin{tikzpicture}
  \node [circle split,draw,double,fill=red!20]
  {
    % No \nodepart has been used, yet. So, the following is put in the
    % ``text'' node part by default.
    $q_1$
    \nodepart{lower} % Ok, end ``text'' part, start ``output'' part
    $00$
  }; % output part ended.
\end{tikzpicture}

partnode

для ее использования нужно применить circle split и в \nodeparts указать аргументы {text,lower}.

для нее же можно настроить стиль: every ⟨part name⟩ node part

\usetikzlibrary {shapes.multipart}
\tikz [every lower node part/.style={red}]
  \node [circle split,draw] {$q_1$ \nodepart{lower} $00$};

NODE TEXT

text=color

задает цвет текста

node font=⟨font commands⟩

\draw[node font=\itshape] — задает шрифт в node

или font=⟨font commands⟩ если задать внутри node

\begin{tikzpicture}
  \node [font=\itshape] {italic};
\end{tikzpicture}

align

  • center
  • left
  • right
  • align=flush left
  • align=flush right — выравнивает без переноса слов
  • align=fkush center
  • align=justify
  • align=none \tikz[align=center] \node[draw] {This is a\\demonstration.};

text width=⟨dimension⟩

задает ширину текстового поля в node

text height=⟨dimension⟩

высоту текстового блока

text depth=⟨dimension⟩

глубина текста

badness warnings for centered text=⟨true or false⟩

система координат NODE

coordinate

south тоже есть

anchor=⟨anchor name⟩

anchor= — по умолчанию это центр node, но можно задать любую координату и относительно ее будет идти привязка

относительные надписи

  • above=⟨offset⟩
  • below=⟨offset⟩
  • left=⟨offset⟩
  • right=⟨offset⟩
  • above left
  • above right
  • below left
  • below right
  • centered

\tikz \fill (0,0) circle (2pt) node[above=2pt] {above};

библиотека positioning

\usetikzlibrary{positioning}

дает все тоже самое,но можно еще вычислять расстояния

\node at (1,1) [above=2pt+3pt,draw]

плюс у нее есть команда of

\usetikzlibrary {positioning}
\begin{tikzpicture}[every node/.style=draw]
 \draw[help lines] (0,0) grid (2,2);
 \node (somenode) at (1,1) {some node};

 \node [above=5mm of somenode.north east] {\tiny 5mm of somenode.north east};
 \node [above=1cm of somenode.north]      {\tiny 1cm of somenode.north};
\end{tikzpicture}

of укажет относительно чего смещение

on grig

смещает node по сетке, а не относительно бордюра node

\usetikzlibrary {positioning}
\begin{tikzpicture}[every node/.style=draw]
  \draw[help lines] (0,0) grid (2,3);

  % Not gridded
  \node (a1) at (0,0) {not gridded};
  \node (b1) [above=1cm of a1] {fooy};
  \node (c1) [above=1cm of b1] {a};

  % gridded
  \node (a2) at (2,0) {gridded};
  \node (b2) [on grid,above=1cm of a2] {fooy};
  \node (c2) [on grid,above=1cm of b2] {a};
\end{tikzpicture}

grid

смещает без on grid относительно бордюра node

с on grid смещает четко по сетке grid

node distance=⟨shifting part⟩

\begin{tikzpicture}[every node/.style=draw,node distance=5mm]

теперь все смещения будут на 5мм

Очень показательно как работает этот ключ

\usetikzlibrary {positioning}
\begin{tikzpicture}[every node/.style={draw,node distance=0mm}]
  \draw[help lines] (0,0) grid (2,3);

  % Not gridded
  \node (a1) at (0,0) {not gridded};
  \node (b1) [above=of a1] {fooy};
  \node (c1) [above=of b1] {a};

  % gridded
  \node (a2) at (2,0) {gridded};
  \node (b2) [on grid,above=of a2] {fooy};
  \node (c2) [on grid,above=of b2] {a};
\end{tikzpicture}

shift

node distance=0mm — показало смещение для on grid по центрам, а без grid от бордюра.

еще есть вариант [node distance=1 and 1]

К вышеперечисленной серии команд в библиотеке еще есть

  • base left=⟨specification⟩
  • base right
  • mid left
  • mid right

библиотека matrix и graphdrawing

о них отдельно

лучше позиционируют большие массивы node

fitting node

т.е. подгонка координат

\usetikzlibrary {fit,shapes.geometric}
\begin{tikzpicture}[level distance=8mm]
  \node (root) {root}
    child { node (a) {a} }
    child { node (b) {b}
      child { node (d) {d} }
      child { node (e) {e} } }
    child { node (c) {c} };

  \node[draw=red,inner sep=0pt,thick,ellipse,fit=(root) (b) (d) (e)] {};
  \node[draw=blue,inner sep=0pt,thick,ellipse,fit=(b) (c) (e)] {};
\end{tikzpicture}

библиотека fit и опция fit позволяет охватить место,чтобы в него могли войти нужные данные

fitting

Transformations

transform shape

\tikz[scale=3] \node[transform shape] {X}; т.е. я сначала сказал, что нужно сделать scale=3, а потом команда transform shape выполнит это действие и я получу гигантскую X.

причем сказать можно в path или draw, а команда выполнится в node

\usepgfmodule {nonlineartransformations}\usetikzlibrary {curvilinear}

модули и библиотеки для трансформаций

transform shape nonlinear=⟨true or false⟩

будет рисовать по криволинейным траекториям подробнее https://tikz.dev/tikz-shapes

pos

указывает явно координату, где разместить node в path

\tikz \draw (0,0) -- (3,1)
    node[pos=0]{0} node[pos=0.5]{1/2} node[pos=0.9]{9/10};

text

pos получает значение от 0 до 1 по длине пути

auto=⟨direction⟩

направление может быть left или right в зависимости от этого будет выбираться якорь в node для соединения

swap

если установлена опция auto то будет делать наоборот, для left будет искать right якорь

' — апостроф отработает как swap

sloped

будет писать текст вдоль кривой

можно добавить [allow upside down] или [rotate=180]

node[midway,sloped,below] {$y$};

allow upside down=⟨boolean⟩

перевернет надпись вверх ногами

midway имена точек в пути

  • midway — напишет посередине линии
  • near start — pos=0.25.
  • near end — pos=0.75.
  • very near start — pos=0.125.
  • very near end — pos=0.875.
  • at start — pos=0.
  • at end — pos=1

label

это такая надпись в надписи

\usetikzlibrary {positioning}
\tikz [circle] {
  \node [draw] (s) [label=below:$s$]  {ф};
  \node [draw] (a) [right=of s] {} edge (s);
  \node [draw] (b) [right=of a] {} edge (a);
  \node [draw] (t) [right=of b, label=$t$] {} edge (b);
}

label

направление метки словами left, right, below, above или градусы и двоеточие:

label=[⟨options⟩]⟨angle⟩:⟨text⟩ или \node [draw] (s) [label=100:$s$] {ф};

\tikz
  \node [circle, draw,
         label=default,
         label=60:$60^\circ$,
         label=below:$-90^\circ$,
         label=3:$3^\circ$,
         label=2:$2^\circ$,
         label={[below]180:$180^\circ$},
         label={[centered]135:$135^\circ$}] {my circle};

label distance=⟨distance⟩

установит дистанцию для label от меток

every label

настроит стиль для label

PIN

булавка — похожа на label, но с булавкой)

pin distance=⟨distance⟩

расстояние до текста в булавке

every pin

стиль булавки

pin position=⟨angle⟩

аналогично label position

every pin edge

настроит вид edge для pin

pin={[pin edge={blue,thick}]right:X},

Кавычки

Нужна библиотека \usetikzlibrary{quotes}

\usetikzlibrary {quotes}
\begin{tikzpicture}
  \matrix [row sep=5mm] {
    \node [draw, "label"]                  {A}; \\
    \node [draw, "label" left]             {B}; \\
    \node [draw, "label" centered]         {C}; \\
    \node [draw, "label" color=red]        {D}; \\
    \node [draw, "label" {red,draw,thick}] {E}; \\
  };
\end{tikzpicture}

текст в кавычках становится обычным label

quotes mean label

\usetikzlibrary {quotes}
\tikz
  \node ["90:$90^\circ$", "left:$180^\circ$", circle, draw] {circle};

every label quotes

задать стиль

quotes mean pin

Connecting Nodes

Соединение Nodes

\begin{tikzpicture}
  \path (0,0) node             (x) {Hello World!}
        (3,1) node[circle,draw](y) {$\int_1^2 x \mathrm d x$};

  \draw[->,blue]   (x) -- (y);
  \draw[->,red]    (x) -| node[near start,below] {label} (y);
  \draw[->,orange] (x) .. controls +(up:1cm) and +(left:1cm) .. node[above,sloped] {label} (y);
\end{tikzpicture}

При соединении nodes стрелки будут проходить от границы node

EDGES

это ребро, которое будет добавлено после того, как будет нарисован основной путь.

\path … edge[⟨options⟩] ⟨nodes⟩ (⟨coordinate⟩) …;

\begin{tikzpicture}
  \node foreach \name/\angle in {a/0,b/90,c/180,d/270}
        (\name) at (\angle:1) {$\name$};

  \path[->] (b) edge (a)
                edge (c)
                edge [-,dotted] (d)
            (c) edge (a)
                edge (d)
            (d) edge (a);
\end{tikzpicture}

edge

edge — это просто ребра между координатами.

Внутри edge можно вставлять node

every edge

назначить стиль для всех edge

quotes

для edge в библиотеке quotes также работает текст в кавычках, как label

\usetikzlibrary {quotes}
\tikz \draw (0,0) edge ["left", ->] (2,0);

every edge quotes

Стиль quotes

swap

к тексту с кавычками добавить '

расстояние между label и edge

определяется параметром inner sep=

\usetikzlibrary {quotes}
\tikz [tight/.style={inner sep=1pt}, loose/.style={inner sep=.7em}]
  \draw (0,0) edge ["left" tight,
                    "right"' loose,
                    "start" near start] (4,0);

Ссылка на узлы за пределами текущего изображения

Это означает,что можно ссылаться из одной картинки в другую картинку на странице.

remember picture=⟨boolean⟩

этот параметр нужно назначить картинкам, которые будут друг на друга ссылаться

\tikzset{every picture/.append style={remember picture}}

этот стиль для всех картинок сразу.

overlay

эту опцию необходимо указать в свойствах path, которые будут ссылаться на другие изображения.

Да, я это видел и я это сделал. Все соединились стрелочками.

\tikz[remember picture] \node[circle,fill=red!50] (n1) {}; — это кружок в любом месте текста.

\tikz[remember picture] \node[fill=blue!50] (n2) {}; — это квадратик, в другом месте.

\begin{tikzpicture}[remember picture,overlay]
  \draw[->,very thick] (n1) -- (n2);
\end{tikzpicture}

а это линия,которая соединит кружок с квадратиком

overlay

все так и произошло.

\begin{tikzpicture}[remember picture]
  \node (c) [circle,draw] {Big circle};

  \draw [overlay,->,very thick,red,opacity=.5]
    (c) to[bend left] (n1) (n1) -| (n2);
\end{tikzpicture}

Это красная линия с еще более сложным маршрутом.

Абсолютные координаты страницы

на каждой странице присутствует node — current page и у нее есть полный набор ancher: west,east,north,south,center…

для размещения в любом месте страницы нужно в свойствах указать:

\begin{tikzpicture}[remember picture,overlay]

Поздний код

\path … node also[⟨late options⟩](⟨name⟩) …; — добавляет опции к узлу позже.

Обязательно нужно указать имя node и не должно быть указано текста. Только опции.

\begin{tikzpicture}
  \node      [draw,circle]       (a) {Hello};
  \node also [label=above:world] (a);
\end{tikzpicture}

\tikzlastnode

этот макрос подобен командам append after command и prefix after command

late options=⟨options⟩

это еще один аналог node also

\begin{tikzpicture}
  \node      [draw,circle]       (a) {Hello};
  \path [late options={name=a, label=above:world}];
\end{tikzpicture}

7.8 - Path и его особенности

Разбираю документацию TIKZ и некоторые свои добавления по PATH

Вступление с моими открытиями

\begin{tikzpicture}
\begin{scope}%делаю специальнуюзону видимости для CLIP
\fill[black!20](-6,0) circle (1.6);%немного фона вокруг кружка
\clip (-6,0) circle (1.5cm);%клипаю будущий рисунок
\node (p) at (-6,0) {\includegraphics[width=3.5cm]{lamp}%вставляю рисунок
\rule{15pt}{0pt}};%так я придумал делать отступ от рисунка невидимой rule
\end{scope}

\gridnum %это просто разметка координат в моем нехитром исполнении, покажу позже

\node[text width=12cm,anchor=north west] at (p.north east) {Для проведения теста, подайте рабочее напряжение на вход ...};%это собственно текстовый блок, который выровнялся по правому верхнему углу рисунка и левому верхнему углу текста 
%anchor=north west] at (p.north east) - это магия 
\end{tikzpicture} 

clip

Grid

Grid сделал, чтобы удобно было рисовать и не разу не пожалел.

Кидаешь рисунок в координату и дальше расставляешь свои фичи.

%%%%%%%%%%%%%%%%%%%%%%%%% GRID 
\def\gridnum {
\draw[help lines] (-8,-8) grid +(16,16);
\node foreach \x in {-8,-7,...,8} at (\x,8.5) {\x};
\node foreach \y in {-8,-7,...,8} at (8.5,\y) {\y};
\node foreach \x in {-8,-7,...,8} at (\x,-8.5) {\x};
\node foreach \y in {-8,-7,...,8} at (-8.5,\y) {\y};
\draw[red] (0,-8.5) -- (0,8.5);
\draw[red] (-8.5,0) -- (8.5,0);
}

Кружки со стрелками

\tikzset{
num/.style={draw,shape=circle,fill=black,text=white,minimum size=2em,font=\bf,general shadow={fill=gray,shadow scale=1.1}},%определяет стиль кружка для отметки на рисунках
numtext/.style={draw,shape=circle,fill=black!85,text=white,minimum size=1em,font=\bf,general shadow={fill=gray,shadow scale=1.1}},%определяет стиль кружка для отметки в тексте
arrow num/.style={line width=.1em, gray,arrows = {-Stealth[line width=0.3pt, fill=gray, length=10pt,open,fill=gray,white,quick]}},%определяет стиль стрелки для отметки на рисунках
}

А это сами кружки

\def\numar#1#2#3{
\node [num] (l#1) at (#2) {#1};
\coordinate (t#1) at (#3);
\draw[line width=.15em, white] (l#1) -- ($(l#1)!.95!(t#1)$);
\draw[arrow num] (l#1) -- (t#1);
%рисует черный кружок с цифрой #1 кружок в координате #2, а стрелочку в координату #3
}

А это результат все вместе:

\begin{tikzpicture}
\begin{scope}%это клипнутый рисунок
\fill[black!20](-6,0) circle (1.6);
\clip (-6,0) circle (1.5cm);
\node (p) at (-6,0) {\includegraphics[width=3.5cm]{lamp}\rule{15pt}{0pt}};     
\end{scope}

\gridnum % это мой грид
 \numar{2}{0,-4}{-2.2,-1.8};%это кружок с 2 и со стрелкой
 \numar{2}{0,-4}{2.2,-1.8};%из двойки вторая стрелка
\node at (-4,0){\num{1}};%это кружок без стрелки
\node at ( 4,0){\num{1}};


\end{tikzpicture} 

grid

Path

Мощная примудрость, позволит на многое открыть глаза в TIKZ

\begin{tikzpicture}
\gridnum

\begin{scope}[scale=2] %сделал, чтобы видно лучше было
\draw[thick,red] 
(0,0) coordinate (a) %назначаем координате имя (a)
-- coordinate (ab) %а это пока рисуем от (a) к (b) запоминаем середину и называем ее (ab)
(1,.5) coordinate (b) %назначаем координате имя (b)
  .. coordinate (bc) controls +(up:1.5cm) and +(left:0cm) .. %а это пока рисуем от (b) к (c) запоминаем середину и называем ее (bc)
%но считает серидину сложно с учетом контрольных точек
(3,1) coordinate (c) %назначаем координате имя (c)
(0,1) -- (2,1) -- %просто рисуем замкнутый треугольник и 
coordinate (x) (1,2) -- cycle;%x - будет точно серединой между двух вершин

\draw (a) node[below] {start part 1} %ничего интересного, просто подписать точки
(ab) node[below right] {straight segment} 
(b) node[right] {end first segment} 
(c) node[right] {end part 1} 
(x) node[above right] {part 2 (closed)};

\fill[red](a) circle (1pt); %а это просто эти точки разукрасить
\fill[blue](b) circle (1pt);
\fill[green](ab) circle (1pt);
\fill[yellow](bc) circle (1pt);
\fill[magenta](c) circle (1pt);
\fill[orange](x) circle (1pt);
\end{scope}
\end{tikzpicture} 

coordinate

[rounded corners] [sharp corners]

круглые и угловатые соединения линий rounded corners=4pt — по умолчанию, или можно поменять

\tikz \draw (0,0) -- (1,1) [rounded corners] -- (2,0) -- (3,1) [sharp corners] -- (3,0) -- (2,1);

это группировка scope для назначения стиля

\tikz \draw (0,0) -- (1,1) {[rounded corners] -- (2,0) -- (3,1)} -- (3,0) -- (2,1);

name=

задает имя пути, полезно при пересечениях

every path

задает стиль всем значениям path

\begin{tikzpicture}

[fill=yellow!80!black, % only sets the color 
every path/.style={draw}] % all paths are drawn 
\fill (0,0) rectangle +(1,1); %все будут с конуром
\shade (2,0) rectangle +(1,1);%и градиент тоже
\end{tikzpicture} 

path2

insert path

по пути основного пути вставит любой другой путь))))

\tikz [c/.style={insert path={circle[radius=2pt]}}] \draw (0,0) -- (1,1) [c] -- (3,2) [c];

append after command=

и его брат prefix after command=〈path〉

\tikz \draw node [append after command={(foo)--(1,1) (foo)--(2,1) (foo)--(3,1)},draw] (foo){foo};

Т.е. пока рисую draw, включаю node и обвожу ее [draw], а в параметрах command задаю лучики, сколько угодно.

luch

cycle & current subpath start

cycle — замыкает контур

current subpath start — возвращается в исходную координату, но контур не замыкает

\useasboundingbox (0,2.5); % увеличивает отступ в картинке

– |- -| .. controls ..

тип линии которую нужно провести

-- — прямая

|- — вертикально, потом горизонтально или cycle

.. controls .. — контрольная точка 1 или 2

circle

begin{tikzpicture} 
\draw (1,0) circle [radius=1.5]; 
\fill (1,0) circle [x radius=1cm, y radius=5mm, rotate=30]; 
\end{tikzpicture}

ellipse

\begin{tikzpicture} 
\draw [help lines] (0,0) grid (3,2); 
\draw (1,1) ellipse [x radius=1cm,y radius=.5cm]; 
\end{tikzpicture}

arc

/tikz/start angle=〈degrees〉 
/tikz/end angle=〈degrees〉 
/tikz/delta angle=〈degrees〉

grid

\tikz[rotate=30] \draw[step=1mm] (0,0) grid (2,2);

/tikz/step=〈number or dimension or coordinate〉

/tikz/xstep=〈dimension or number〉

/tikz/ystep=〈dimension or number〉

/tikz/help lines

parabola

\path ... parabola[〈options〉]bend〈bend coordinate〉〈coordinate or cycle〉 ...;

/tikz/bend=〈coordinate〉
/tikz/bend pos=〈fraction〉
/tikz/parabola height=〈dimension〉
/tikz/bend at start
/tikz/bend at end

sin & cos

\path ... sin〈coordinate or cycle〉 ...;

svg

\path ... svg[〈options〉]{〈path data〉} ...;

\usetikzlibrary {svg.path}  
\begin{tikzpicture} 
\filldraw [fill=red!20] (0,1) svg[scale=2] {h 10 v 10 h -10} node [above left] {upper left} -- cycle;  
\draw svg {M 0 0 L 20 20 h 10 a 10 10 0 0 0 -20 0}; 
\end{tikzpicture}

И кульминация!!!

\usetikzlibrary {svg.path}  
\begin{tikzpicture} 
\draw[fill=red] svg[rotate=180,scale=1pt] {m 0,0 c -7.1455,-3.0005 -14.1485,-6.184 -6.261,-17.3275 l 0.7006,-8.7994 -2.2838,-2.151 c 6.7935,-23.5259 19.2799,-46.8506 29.895,-65.918 11.1032,-15.0145 24.2647,-28.7189 28.7623,-47.9367 l 11.9841,-34.99407 c -0.1546,-13.35578 -2.0371,-27.40362 3.835,-38.34918 l 6.2318,-9.82699 c 1.5939,-28.91141 13.1608,-53.72504 12.7031,-82.211751 11.2272,-29.04903 17.5024,-22.60743 25.1668,-26.1256 4.524,-1.40654 8.693,-3.38055 10.0668,-9.827 l 4.554,2.1571 c -3.5888,-15.13669 -2.1459,-27.75767 1.9176,-39.06851 1.3477,-6.40097 7.8536,-8.21675 14.8602,-9.58722 8.592,-2.16346 14.2134,1.61359 20.3733,4.31421 3.564,5.54462 6.8227,11.17624 5.9921,17.97645 -0.088,2.44508 -1.4805,0.80239 -1.7797,2.90917 -0.6305,4.43879 2.7321,11.60579 -0.8615,12.55824 -4.4315,1.17434 -0.8057,12.46002 -5.2394,13.07901 -11.4427,1.59752 -8.2461,7.35191 -11.8607,9.9434 -2.2929,3.4139 -3.7804,7.09455 0.088,11.12472 7.8121,8.29041 7.5135,18.05557 8.6284,27.563671 5.5774,16.1437 10.1453,32.62388 26.8446,45.06055 8.8021,6.70563 14.713,14.56771 20.3734,22.53013 l 11.0253,11.26537 c 9.1625,0.81664 11.8325,3.66246 10.7858,7.6699 5.2654,7.69444 0.9194,8.78118 -3.835,9.58721 l -19.4145,0.23948 c -6.3528,-2.57118 -8.2777,-6.80263 -9.5872,-11.26507 -4.7804,-8.04729 -11.2793,-15.52136 -19.8938,-22.29065 -18.0192,-7.5638 -23.762,-19.73159 -32.1176,-30.91936 l -1.6779,37.15119 c 1.1413,7.46498 1.8943,15.70567 2.3969,24.44775 6.3573,7.86785 13.5455,15.45832 14.381,25.16679 l 14.6207,50.57336 c 5.1154,14.4625 1.2032,22.1542 -0.9588,31.1588 l -16.0588,44.3416 c -4.5409,19.7879 5.1463,25.3556 -1.6827,26.5005 1.2122,4.1548 5.7941,11.5294 10.791,15.6839 l 16.538,5.5128 c 5.8814,5.4882 4.5425,8.71988 0.2395,11.02528 -10.2823,0.03 -20.4991,0.7699 -31.3983,-5.99208 -24.5966,2.299 -20.5907,-1.8606 -27.3242,-3.5952 -6.3237,-9.1034 0.046,-19.8628 2.075,-24.194 l -6.8033,2.9522 c 2.2535,-29.9275 11.2296,-63.866 17.911,-84.9381 l 4.0747,-4.3145 c -2.5708,-2.0158 -5.4922,-2.5127 -6.2318,-12.4634 -4.9405,-15.5883 -14.1539,-28.3278 -22.7699,-41.4653 -16.0976,16.02 -27.5888,36.6464 -36.6716,59.6813 -3.0305,7.3616 -8.3362,10.1725 -13.1827,13.9017 -11.4324,16.4468 -20.5631,46.1767 -29.4813,66.3954 l -3.5952,-1.2016 c -2.918,8.9664 1.9352,10.8095 6.4716,12.9432 l 8.6284,4.7935 c 5.8839,5.6301 4.5728,8.9879 -1.6778,10.7858 -9.743,4.25658 -18.0911,2.2347 -26.6049,0.9588 -3.7097,-3.4521 -7.4534,-6.8618 -13.6619,-7.1907 z}; 
\end{tikzpicture}

man

plot

  1. –plot[〈local options〉]coordinates{〈coordinate 1〉〈coordinate 2〉…〈coordinate n〉}
  2. –plot[〈local options〉]file{〈filename〉} 342
  3. –plot[〈local options〉]〈coordinate expression〉
  4. –plot[〈local options〉]function{〈gnuplot formula〉}

строит график по координатам

\tikz \draw plot coordinates {(0,0) (1,1) (2,0) (3,1) (2,1) (10:2cm)};

to path

(a) to (b) примерно тоже, что (a) – (b), но есть нюансы.

После to я могу передать дополнительные настройки для этого участка пути:

(a) to [out=135,in=45] (b) выйдет из точки (a) под углом 135, а войдет под 45.

или еще 3 замечательных макроса: \tikztostart, \tikztotarget, и \tikztonodes — запоминают координаты без зацикливания пути: т.е. в режиме current subpath start

\begin{tikzpicture}[to path={
    .. controls +(1,0) and +(1,0) .. (\tikztotarget) \tikztonodes}]

  \node (a) at (0,0) {a};
  \node (b) at (2,1) {b};
  \node (c) at (1,2) {c};

  \draw (a) to node {x} (b)
        (a) to          (c);
\end{tikzpicture}

Этот вариант я припас для вертикального написания шрифта


\begin{tikzpicture}
  \draw (0,0) to node [sloped,above] {x} (3,2);

  \draw (0,0) to[out=90,in=180] node [sloped,above] {x} (3,2);
\draw (0,0) to node[sloped,above] {0001000:000200} (0,5);
\end{tikzpicture}

vert

edge

EDGE умеет делать:

  • edge node={node [sloped,above] {x}} ноды
  • edge label=x ставит метки
  • edge label=x, edge label'=y ставит зеркальные метки

every to

Назначаем стили для всех to

\tikz[every to/.style={bend left}] \draw (0,0) to (3,2); назначает стиль для to

execute at begin to=⟨code⟩ (no default)

и ее брат execute at end to=⟨code⟩ выполняют код до и после начала рисования

FOREACH

Для него посвящу отдельную статью но в кратце:

\tikz \draw (0,0) foreach \x in {1,...,3} { -- (\x,1) -- (\x,0) }; Это цикл по списку.

LET IN

Сначала не хотел разбираться, но потом стало так интересно, а выяснилось, что еще и полезно.

\path … let⟨assignment⟩ ,⟨assignment⟩,⟨assignment⟩… in …;

В let … in можем использовать переменные

  • \n1 или \n5 — суть номер регистра, где можно вычислить что нибудь и потом в разделе IN подставить
  • \p1,\x1,\y1 — работает с координатами и тоже запоминает в своих регистрах
  • \p{name} — тоже, что и \p1,\p3 … только под любым именем.
\usetikzlibrary {calc}
\begin{tikzpicture}
 \draw [help lines] (0,0) grid (3,2);

 \draw let \p{foo} = (1,1), \p2 = (2,0) in
         (0,0) -- (\p2) -- (\p{foo});
\end{tikzpicture}

xshift yshift

оказалась полезная штука для смещения SCOPE и рисовать все в координатах с (0,0)

\pgfextra{⟨code⟩}

сначала хотел выбросить, но появилось время, почитал и тоже понравилось

\newdimen\mydim %назначаем переменную для измерения
\begin{tikzpicture}
  \mydim=1cm% присваиваем первое значение
  \draw (0pt,\mydim) \pgfextra{\mydim=2cm} -- (0pt,\mydim); изменяем значение и получаем новый результат
\end{tikzpicture}

я думаю использовать при настройке типовых рисунков для передачи им параметров

SOFT USE PATH

это такие ячейки памяти с сохранеными PATH, которые потом можно применять безограничений

\usetikzlibrary {intersections}
\begin{tikzpicture}
  \path[save path=\pathA,name path=A] (0,1) to [bend left] (1,0);%запоминаю путь pathA
  \path[save path=\pathB,name path=B]%запоминаю путь pathB
    (0,0) .. controls (.33,.1) and (.66,.9) .. (1,1);

  \fill[name intersections={of=A and B}] (intersection-1) circle (1pt);%нахожу пересечения пути (причем пути даже не наприсовал)

  \draw[blue][use path=\pathA];%а теперь достаю путь и рисую
  \draw[red] [use path=\pathB];
\end{tikzpicture}

действия с path

Это наверно аксиомы с которыми работает path

\draw — аналогично \path[draw]. рисует

\fill — аналогично \path[fill]. заполняет цветом

\filldraw — \path[fill,draw]. рисует и заполняет

\pattern — \path[pattern]. заполняет маленькими path из библиотеки pattern

\shade — \path[shade]. градиент

\shadedraw — \path[shade,draw]. рисует и заполняет градиентом

\clip — \path[clip]. клипит

\useasboundingbox — \path[use as bounding box] связывает до и после

опции

  • color= — покрасит в цветом
  • line width= — толщина линии
  • line cap= — round, rect, butt — завершение линии
  • line join= — тип соединения линии round, bevel, miter
  • miter limit= — определяет остроту угла соединения
  • dash pattern — чередуются on 2pt off 3pt on 4pt off 4pt и получаем свой пунктир
  • dash phase= — первоначальный сдвиг паттерна
  • dash= — совмещает pattern и phase \draw [dash=on 20pt off 10pt phase 10pt]
  • dash expand off растягивает на сколько может dash, т.е. линия будет нужной длины и без разрывов
\usetikzlibrary {decorations}
\begin{tikzpicture}[|-|, dash pattern=on 4pt off 2pt]
  \draw [dash expand off] (0pt,30pt) -- (26pt,30pt);
  \draw [dash expand off] (0pt,20pt) -- (24pt,20pt);
  \draw [dash expand off] (0pt,10pt) -- (22pt,10pt);
  \draw [dash expand off] (0pt, 0pt) -- (20pt, 0pt);
\begin{scope}[xshift=2cm]
  \draw  (0pt,30pt) -- (26pt,30pt);
  \draw  (0pt,20pt) -- (24pt,20pt);
  \draw  (0pt,10pt) -- (22pt,10pt);
  \draw  (0pt, 0pt) -- (20pt, 0pt);
\end{scope}
\end{tikzpicture}

dash

  • solid — сплошная прямая
  • dotted
  • densely dotted
  • loosely dotted
  • dashed
  • densely dashed
  • loosely dashed
  • dash dot
  • densely dash dot
  • loosely dash dot
  • dash dot dot
  • densely dash dot dot
  • loosely dash dot dot

draw opacity

работает для всего и draw и fill и svg

double

  • double=<color> — нарисует двойную линию и закрасит цветом
  • double distance=⟨dimension⟩ — расстояние между линиями
  • double distance between line centers=⟨dimension⟩ — расстояние между центрами линий
  • double equal sign distance — удвоит расстояние знака
\Huge $==>\implies$\tikz[baseline,double equal sign distance]
                   \draw[double,thick,-{Implies[]}](0,0.55ex) --++(3ex,0);

double

рисуем стрелу

\usetikzlibrary {arrows.meta,bending} — это нам пригодится

\usetikzlibrary {arrows.meta,bending}
\tikz \draw[tips, -{Latex[open,length=10pt,bend]}] (0,0) to[bend left] (1,0);

arrow

pattern

\usetikzlibrary {patterns}
\begin{tikzpicture}
  \draw[pattern=dots] (0,0) circle (1cm);
  \draw[pattern=fivepointed stars] (0,0) rectangle (3,1);
\end{tikzpicture}

star

в библиотеке их много и лучше смотреть библиотеку https://tikz.dev/library-patterns#section-library-patterns

  • pattern color — покрасит в нужный цвет

nonzero rule

исключит из пересечения фигур

\begin{tikzpicture}
  \filldraw[fill=yellow!80!black]
  % Clockwise rectangle
  (0,0) -- (0,1) -- (1,1) -- (1,0) -- cycle
  % Counter-clockwise rectangle
  (0.25,0.25) -- (0.75,0.25) -- (0.75,0.75) -- (0.25,0.75) -- cycle;

  \draw[->] (0,1) -- (.4,1);
  \draw[->] (0.75,0.75) -- (0.3,.75);

  \draw[->] (0.5,0.5) -- +(0,1) node[above] {crossings: $-1+1 = 0$};

  \begin{scope}[yshift=-3cm]
    \filldraw[fill=yellow!80!black]
    % Clockwise rectangle
    (0,0) -- (0,1) -- (1,1) -- (1,0) -- cycle
    % Clockwise rectangle
    (0.25,0.25) -- (0.25,0.75) -- (0.75,0.75) -- (0.75,0.25) -- cycle;

    \draw[->] (0,1) -- (.4,1);
    \draw[->] (0.25,0.75) -- (0.4,.75);

    \draw[->] (0.5,0.5) -- +(0,1) node[above] {crossings: $1+1 = 2$};
  \end{scope}
\end{tikzpicture}

cross

сразу не понял, но если внутри рисунок против шерсти,то вырезает пустоту. Смотрим на стрелочки внутреннего квадрата.

even odd rule

просто вырежет внутренний паттерн

pattern picture

Идея данной функции, добавить внутрь объекта другой объект, ограниченный первым.

причем родительский объект будет иметь имя box с метками по сторонам света.

\begin{tikzpicture}
  \draw [help lines] (0,0) grid (3,2);
  \filldraw [fill=blue!10,draw=blue,thick] (1.5,1) circle (1)% нарисую круг
    [path picture={
      \node at (path picture bounding box.center) {%вставлю в круг надпись в центр круга
        This is a long text.
      };}
    ];
\end{tikzpicture}

также path picture может быть \draw, \fill, \node, \pattern

Shade

Градиент

у него есть настройки

\tikz \shadedraw [shading=axis] (0,0) rectangle (1,1);
\tikz \shadedraw [shading=radial] (0,0) rectangle (1,1);
\tikz \shadedraw [shading=ball,ball color=red] (0,0) circle (.5cm);
\tikz \shadedraw [shading=ball,ball color=blue] (0,0) circle (.5cm);
\tikz \shadedraw [shading=ball,ball color=green] (0,0) circle (.5cm);

ball

bilinear interpolation

это красивые градиентные заливки объектов по 4-м углам

\usepgflibrary {shadings}
\tikz
  \shade[upper left=red,upper right=green,
         lower left=blue,lower right=yellow]
    (0,0) rectangle (3,2);
\tikz \shade[shading=color wheel] (0,0) circle (1.5);

\tikz \shade[shading=color wheel] [even odd rule]
  (0,0) circle (1.5)
  (0,0) circle (1);
  • color wheel
  • color wheel black center
  • color wheel white center
  • inner color= % радиальная заливка
  • outer color= %радиальная заливка

color

use as bounding box

графически привязывает блоки слева и справа Наверно будет удобно для создания различных перекрестных указателей или еще чего-нибудь, где важно, чтобы блоки склеились в единое целое

У них есть подпараметры:

  • trim left=⟨dimension or coordinate or default⟩
  • trim right=⟨dimension or coordinate or default⟩
  • trim lowlevel=true|false

right

clip

вырезает все на скорую руку

лучше использовать внутри рисунков с применением группировки scope

\begin{tikzpicture}
  \draw (0,0) -- ( 0:1cm);
  \draw (0,0) -- (10:1cm);
  \draw (0,0) -- (20:1cm);
  \draw (0,0) -- (30:1cm);
  \begin{scope}[fill=red]
    \fill[clip] (0.2,0.2) rectangle (0.5,0.5);

    \draw (0,0) -- (40:1cm);
    \draw (0,0) -- (50:1cm);
    \draw (0,0) -- (60:1cm);
  \end{scope}
  \draw (0,0) -- (70:1cm);
  \draw (0,0) -- (80:1cm);
  \draw (0,0) -- (90:1cm);
\end{tikzpicture}

clip

preaction

Я раньше использовал подобное для рисование стрелок с подложкой белого фона.

Оказалось, что все уже придумано до нас))

\begin{tikzpicture}
  \draw[help lines] (0,0) grid (3,2);

  \draw
    [preaction={draw,line width=4mm,blue}]%нарисует по координатам draw прямоугольник с толщиной линии 4mm
    [line width=2mm,red] (0,0) rectangle (2,2);%нарисует сверху по этим же координатам линию 2mm
\end{tikzpicture}

preaction

удобно для выделения контраста и рисования теней

\begin{tikzpicture}
  \draw[help lines] (0,0) grid (3,2);
  \draw
    [preaction={fill=black,opacity=.5,
                transform canvas={xshift=1mm,yshift=-1mm}}]
    [fill=red] (0,0) rectangle (1,2)
               (1,2) circle (5mm);
\end{tikzpicture}

preaction

preaction — может быть несколько штук в одном объекте

postaction=⟨options⟩

Это друг preaction, только делает после того как нарисовал основной рисунок

decorations

\usetikzlibrary {decorations.pathmorphing,shadows}
\begin{tikzpicture}
  \node [circular drop shadow={shadow scale=1.05},minimum size=3.13cm,
         decorate, decoration=zigzag,
         fill=blue!20,draw,thick,circle] {Hello!};
\end{tikzpicture}

Целая библиотека различных декораций и линий для рисования объектов.

decorate

7.9 - Вводные понятия в TIKZ

Базовые понятия TIKZ и описание системы координат. Без этого урока разбираться в TIKZ бессмысленно

Подключение TIKZ в документ.

Для подключения TIKZ нужно в преамбуле добавить:

\usepackage{tikz} %подключить пакет
\usetikzlibrary {angles,calc,quotes} %подключить нужные библиотеки

Библиотеки по ходу буду тоже описывать, те, которые мне точно понравились и нужны. Но их очень много.

Чтобы вставить в текст объект TIKZ нужно использовать окружение

\begin{tikzpicture}
...
\end{tikzpicture}

или 

\tikz ...

Координаты в TIKZ

Обычные координаты

(X, Y) — разделитель запятая.

Измеряем либо в стандартных единицах TeX (cm, pt). По умолчанию PGF использует сантиметр: X -> вправо, Y -> вверх.

(30:1cm) — полярные координаты. Т.е. от текущей точки на 1см 30 градусов.

Для трехмерных объектов (1,1,1)

Якорные координаты

У каждого объекта есть свои якорные координаты,связанные со сторонами света: например: first node.north

  • north
  • south
  • east
  • west

И их возможные комбинации: node.north west

Относительные координаты

Нужно перед указанием координат поставить ++ и указать относительное смещение ++(1cm,0pt) — вправо на 1см.

Но для этого нужно знать, где сейчас находится курсор.

Как выяснил, команда \node не изменяет текущую координату.

Если использовать один + перед координатами, то перемещение произойдет, но текущая координата не сменится.

(1,0) +(1,0) +(0,1) даст три точки (1,0), (2,0), (1,1).

Специальный синтаксис для PATH

PATH — водит пером по бумаге, но не оставляет следов, если его не попросить специально.

-- — прямая линия

-| — горизонтально + вертикально

|- — вертикально + горизонтально

cycle — вернуться в точку старта

PATH может:

  • draw — рисовать линию
  • fill — заполнять пространство
  • shade — градиент
  • clip — вырезать

Так же доступны комбинации с ними.

\path (0,0) rectangle (2ex,1ex); % ничего визуального не произойдет
\path[draw] (0,0) rectangle (2ex,1ex); % появится рамка
\path[fill=black] (0,0) rectangle (2ex,1ex); % появится черный прямоугольник

Для этих случаев есть сокращенные команды:

  • \path[draw]=\draw
  • \path[fill]=\fill
  • \path[fill,draw]=\filldraw
  • \path[shade]=\shade
  • \path[shade,draw]=\shadedraw
  • \path[clip]=\clip
  • \path[clip,draw]=\draw[clip]

Вставка текста

Текст добавляем с помощью команды \node прямо в синтаксис \path

\tikz \draw (1,1) node {text} -- (2,2);

У node могут быть:

(name) или [name=имя] [другие опции] {текст}

опции node:

  • rectangle
  • fill
  • circle
  • draw
  • ellipse

и т.д. это то, что будет нарисовано вокруг текста.

Рисуем деревья

Это такая умная \node с поднодиками.

\begin{tikzpicture}
  \node {root}
    child {node {left}}
    child {node {right}
      child {node {child}}
      child {node {child}}
    };
\end{tikzpicture}

Подключаем библиотеку со стрелочками и оформим стили.

FORK — это вилка, которой будем соединять вниз (down),также можно написать up, left, right и от этой стороны будет выходить стрелка.

\usetikzlibrary {arrows.meta,trees}
\begin{tikzpicture}
  [edge from parent fork down, sibling distance=15mm, level distance=15mm,
   every node/.style={fill=red!30,rounded corners},
   edge from parent/.style={red,-{Circle[open]},thick,draw}]
  \node {root}
      child {node {left}}
      child {node {right}
        child {node {child}}
        child {node {child}}
      };
\end{tikzpicture}

Tree

И еще с шариками, а grow — покажет куда расти дереву (up,down,left,right или north,south,east,west). Anchor — это куда прицепляться parent и child.

sibling — ширина плечика на одном уровне, level — это расстояние между уровнями.

every node/.style — назначает стиль глобально для всех node без указания класса.

edge — это собственно само ребро или соединение

ball — это еще одна разновидность фигуры, шарик называется.

\begin{tikzpicture}
  [parent anchor=east,child anchor=west,grow=east,
   sibling distance=15mm, level distance=15mm,
   every node/.style={ball color=red,circle,text=white},
   edge from parent/.style={draw,dashed,thick,red}]
  \node {root}
      child {node {left}}
      child {node {right}
        child {node {child}}
        child {node {child}}
      };
\end{tikzpicture}

boll

Графы

Нужна своя библиотека graphs

\usetikzlibrary {graphs}
\tikz \graph [grow down, branch left] {
  root -> { 
left,
2,3 ->{
  5,6,7,8 ->{
      11,12,13},
    9}, 
right -> {
  child, 
  child} }
};

graph

Тема с графом тоже интересна.

grow — куда растем, указать сторону

branch — в какую сторону ветви раскидать

\usetikzlibrary {graphs.standard}
\tikz \graph [clockwise] { subgraph K_n [n=9] };

Уж очень он мне понравился. Библиотеку обязательно отдельно всю опишу.

graph

SCOPE

Это внутреннее окружение для группировки настроек.

Это фактически зона видимости.

\begin{tikzpicture}
  \begin{scope}[color=red]
    \draw (0mm,10mm) -- (10mm,10mm);
    \draw (0mm, 8mm) -- (10mm, 8mm);
    \draw (0mm, 6mm) -- (10mm, 6mm);
  \end{scope}
  \begin{scope}[color=green]
    \draw             (0mm, 4mm) -- (10mm, 4mm);
    \draw             (0mm, 2mm) -- (10mm, 2mm);
    \draw[color=blue] (0mm, 0mm) -- (10mm, 0mm);
  \end{scope}
\end{tikzpicture}

line

Еще SCOPE умеет

/tikz/name=⟨scope name⟩ /tikz/every scope /tikz/execute at begin scope=⟨code⟩ /tikz/execute at end scope=⟨code⟩

И у нее есть даже библиотека \usetikzlibrary{scopes}

Когда библиотека загружена, то можно просто указать фигурные скобки, без begin/end

А еще становится доступной команда \scoped ⟨animations spec⟩[⟨options⟩]⟨path command⟩

\usetikzlibrary {scopes}
\begin{tikzpicture}
  { [ultra thick]
    { [red]
      \draw (0mm,10mm) -- (10mm,10mm);
      \draw (0mm,8mm)  -- (10mm,8mm);
    }
    \draw (0mm,6mm) -- (10mm,6mm);
  }
  { [green]
    \draw (0mm,4mm) -- (10mm,4mm);
    \draw (0mm,2mm) -- (10mm,2mm);
    \draw[blue] (0mm,0mm) -- (10mm,0mm);
  }
\end{tikzpicture}
\usetikzlibrary {backgrounds}
\begin{tikzpicture}
  \node [fill=white] at (1,1) {Hello world};
  \scoped [on background layer]
    \draw (0,0) grid (3,2);
\end{tikzpicture}

Опции

\tikzset

— установит в переменную любую команду для применения в окружении \begin{tikzpicture}

baseline

— еще можно задать с помощью координаты, тоже поймет.

\tikz[baseline=0pt]\draw(0,0)circle(.5ex); — установит смещение от базовой линии. По умолчанию строго по центру.

cir

А вот так перечеркнем слово

\usetikzlibrary {shapes.misc}
Hello
\tikz[baseline=(X.base)]
  \node [cross out,draw] (X) {world.};

cross

Назначение своего стиля

my style/.style={draw=red,fill=red!20}

Использование стилей

\begin{tikzpicture}[help lines/.style={blue!50,very thin}]
  \draw             (0,0) grid +(2,2);
  \draw[help lines] (2,0) grid +(2,2);
\end{tikzpicture}

Чтобы добавить настройки к существующему стилю /.append style вместо style

Стили с переменными

\begin{tikzpicture}[outline/.style={draw=#1,thick,fill=#1!50}]
  \node [outline=red]  at (0,1) {red};
  \node [outline=blue] at (0,0) {blue};
\end{tikzpicture}

или задать значение по умолчанию

\begin{tikzpicture}[outline/.style={draw=#1,thick,fill=#1!50},
                    outline/.default=black]
  \node [outline]      at (0,1) {default};
  \node [outline=blue] at (0,0) {blue};
\end{tikzpicture}

/tikz/execute at begin picture=⟨code⟩

Выполнит код до того как начал рисовать картину

/tikz/execute at end picture=⟨code⟩

Выполнит код после того как нарисовал картину

\usetikzlibrary {backgrounds}
\begin{tikzpicture}[execute at end picture=%
{
    \begin{pgfonlayer}{background}
      \path[fill=yellow,rounded corners]
        (current bounding box.south west) rectangle
        (current bounding box.north east);
    \end{pgfonlayer}
  }]
  \node at (0,0) {X};
  \node at (2,1) {Y};
\end{tikzpicture}

yellow

Нарисовал X и Y, а потом подрисовал фон желтого цвета.

Установка глобального стиля /tikz/every picture

В преамбуле напишем \tikzset{every picture/.style=semithick}

или если несколько значений, то \tikzset{every picture/.style={line width=1pt}}

Библиотека \usetikzlibrary{babel}

Для работы со шрифтами,рекомендуется всегда загружать эту библиотеку.

Specifying Coordinates

Или поговорим о координатах.

([⟨options⟩]⟨coordinate specification⟩)

Три вида координат:

  • декартовы
  • полярные
  • сферические

Явное указание координат и неявное указание.

Декартова система координат CANVAS

/tikz/cs/x=⟨dimension⟩

/tikz/cs/y=⟨dimension⟩

Система координат XYZ

Все тоже, только xyz

\begin{tikzpicture}[->]
  \draw (0,0) -- (xyz cs:x=1);
  \draw (0,0) -- (xyz cs:y=1);
  \draw (0,0) -- (xyz cs:z=1);
\end{tikzpicture}

xyz

Система координат canvas polar

/tikz/cs/angle=⟨градусы⟩ — Угол координаты. Угол всегда должен быть указан в градусах.

/tikz/cs/radius=⟨размер) — Расстояние от текущей точки

/tikz/cs/x radius=⟨размер⟩ /tikz/cs/y radius=⟨размер⟩

\tikz \draw    (0cm,0cm) -- (30:1cm) -- (60:1cm) -- (90:1cm)
            -- (120:1cm) -- (150:1cm) -- (180:1cm);

radius

Специальные слова для указания угла

up, down, left, right, north, south, west, east, north east, north west, south east, south west

Система координат XYZ POLAR

\begin{tikzpicture}[x=1.5cm,y=1cm]%масштаб системы координат 
  \draw[help lines] (0cm,0cm) grid (3cm,2cm);

  \draw (0,0) -- (xyz polar cs:angle=0,radius=1);
  \draw (0,0) -- (xyz polar cs:angle=30,radius=1);
  \draw (0,0) -- (xyz polar cs:angle=60,radius=1);
  \draw (0,0) -- (xyz polar cs:angle=90,radius=1);

  \draw (xyz polar cs:angle=0,radius=2)
     -- (xyz polar cs:angle=30,radius=2)
     -- (xyz polar cs:angle=60,radius=2)
     -- (xyz polar cs:angle=90,radius=2);
 \end{tikzpicture}
\begin{tikzpicture}[x={(-1cm,0cm)},y={(0cm,-1cm)}] %переворачиваю систему координат
  \draw[help lines] (0cm,0cm) grid (3cm,2cm);%рисую сетку

  \fill (canvas cs:x=1cm,y=0cm) node[right] {X}   circle (2pt);%точка в абсолютных координатах без изменений (черная)
  \fill (canvas cs:x=0cm,y=1cm)  node[left] {Y}  circle (2pt);%точка в абсолютных координатах без изменений (черная)

  \fill [color=red] (1,0)  node[left]{X'}  circle  (2pt);%точка в относительных координатах перевернутая (красная)
  \fill [color=red] (0,1)  node[right]{Y'}  circle (2pt);%точка в относительных координатах перевернутая (красная)
  \draw [color=red] (0,0) -- (30:1) -- (60:1) -- (90:1)
             -- (120:1) -- (150:1) -- (180:1);%рисунок в относительных координатах красный
\end{tikzpicture}

rotate

Барицентрические системы координат

barycentric — это координаты по сторонам света north, south, east, west и их комбинации

\begin{tikzpicture}
  \coordinate (content)   at (90:3cm);
  \coordinate (structure) at (210:3cm);
  \coordinate (form)      at (-30:3cm);

  \node [above]       at (content)   {content oriented};
  \node [below left]  at (structure) {structure oriented};
  \node [below right] at (form)      {form oriented};

  \draw [thick,gray] (content.south) -- (structure.north east) -- (form.north west) -- cycle;

  \small
  \node at (barycentric cs:content=0.5,structure=0.1 ,form=1)    {PostScript};
  \node at (barycentric cs:content=1 ,structure=0 ,form=0.4)  {DVI};
  \node at (barycentric cs:content=0.5,structure=0.5 ,form=1)    {PDF};
  \node at (barycentric cs:content=0 ,structure=0.25,form=1)    {CSS};
  \node at (barycentric cs:content=0.5,structure=1 ,form=0)    {XML};
  \node at (barycentric cs:content=0.5,structure=1 ,form=0.4)  {HTML};
  \node at (barycentric cs:content=1 ,structure=0.2 ,form=0.8)  {\TeX};
  \node at (barycentric cs:content=1 ,structure=0.6 ,form=0.8)  {\LaTeX};
  \node at (barycentric cs:content=0.8,structure=0.8 ,form=1)    {Word};
  \node at (barycentric cs:content=1 ,structure=0.05,form=0.05) {ASCII};
\end{tikzpicture}

barycentric

Для понимания процесса barycentric, каждая координата тянет к себе с определенной силой. Если я поставлю с одинаковой силой, то будет ровно посередине, относительно всех точек.

\node at (barycentric cs:content=1,structure=1 ,form=1) {PostScript}; как на рисунке ниже barycentric

Node координатная система

/tikz/cs/name=⟨node name⟩

/tikz/anchor=⟨anchor⟩

\usetikzlibrary {arrows.meta}
\begin{tikzpicture}[node font=\ttfamily]
  \node (shape)   at (0,2)  [draw] {class Shape};
  \node (rect)    at (-2,0) [draw] {class Rectangle};
  \node (circle)  at (2,0)  [draw] {class Circle};
  \node (ellipse) at (6,0)  [draw] {class Ellipse};

  \draw [color=red](node cs:name=circle,anchor=north) |- (0,1);
  \draw [blue] (node cs:name=ellipse,anchor=north) |- (0,1);
  \draw [arrows = -{Triangle[open, angle=60:3mm]}]
           (node cs:name=rect,anchor=north)
        |- (0,1) -| (node cs:name=shape,anchor=south);
\end{tikzpicture}

\usetikzlibrary {arrows.meta} — библиотека для красивых стрелочек

\begin{tikzpicture}[node font=\ttfamily] — назначаем шрифт

Присвоим имена каждой ноде

\node (shape)   at (0,2)  [draw] {class Shape};
\node (rect)    at (-2,0) [draw] {class Rectangle};
\node (circle)  at (2,0)  [draw] {class Circle};
\node (ellipse) at (6,0)  [draw] {class Ellipse};

Нарисуем первую линию красного цвета

\draw [color=red](node cs:name=circle,anchor=north) |- (0,1);

red

Нарисуем вторую линию синего цвета

\draw [blue] (node cs:name=ellipse,anchor=north) |- (0,1);

red

Нарисуем стрелку черногго цвета

\draw [arrows = -{Triangle[open, angle=60:3mm]}]
       (node cs:name=rect,anchor=north)
    |- (0,1) -| (node cs:name=shape,anchor=south);

red

А эта штука соединяет между собой две ноды по бордюру самым коротким путем: (node cs:name=a) -- (node cs:name=b), т.е. все, что в круглых скобках — это координаты.

\usetikzlibrary {shapes.geometric}
\begin{tikzpicture}
  \path (0,0)  node(a) [ellipse,rotate=10,draw] {An ellipse}
        (3,-1) node(b) [circle,draw]            {A circle};
  \draw[thick] (node cs:name=a) -- (node cs:name=b);
\end{tikzpicture}

А это легкая замена rectangle, чтобы не пересекалось

\tikz \draw (0,0) node(x) [draw] {Text}
%            rectangle (1,1)
            (node cs:name=x) -- +(0,1) -- +(1,1) -- +(1,0) -- (node cs:name=x)
            (node cs:name=x) -- +(1,1)
            (node cs:name=x) -- +(1,.5)
            (node cs:name=x) -- +(.5,1)
            ;

rext

Для те, кто в танке, чтобы не забыть: +(координаты) — не изменяет точку отсчета и указывает относительную координату; ++(координаты) — изменяет точку отсчета и указывает относительные координаты; (координаты) — изменяет точку отсчета и указывает абсолютные координаты.

\begin{tikzpicture}
  \draw[blue!20]             (0,0) grid +(2,2);
  \draw (0,0) node(x) [draw] {Text}
  (node cs:name=x) -- ++(0,1) -- ++(1,1) -- +(1,0) -- (node cs:name=x);
\end{tikzpicture}

rext

\usetikzlibrary {shapes.geometric}
\begin{tikzpicture}[fill=blue!20]
  \draw[help lines] (-1,-2) grid (6,3);
  \path (0,0)  node(a) [ellipse,rotate=10,draw,fill]    {An ellipse}
        (3,-1) node(b) [circle,draw,fill]               {A circle}
        (2,2)  node(c) [rectangle,rotate=20,draw,fill]  {A rectangle}
        (5,2)  node(d) [rectangle,rotate=-30,draw,fill] {Another rectangle};
  \draw[thick] (a.south) -- (b) -- (c) -- (d);
  \draw[thick,red,->] (a) |- +(1,3) -| (c) |- (b);
  \draw[thick,blue,<->] (b) .. controls +(right:2cm) and +(down:1cm) .. (d);
\end{tikzpicture}

rext

Что здесь примечательного?

  1. Все ноды рисуются в один присест, просто перечисляем через слово node и вначале подставляем координаты.
  2. Линии рисуем отдельными командами через \draw

Координатная система TANGENT

Работает только с загруженной библиотекой CALC

Нарисует по касательной от точки (a):

  • tangent — система координат
  • cs: — сами координаты
    • node=c — фигура
    • point={(a)} — точка, от которой пойдет касательная
    • solution=1 — номер решения, если их несколько
\usetikzlibrary {calc}
\begin{tikzpicture}
  \draw[help lines] (0,0) grid (3,2);

  \coordinate (a) at (3,2);

  \node [circle,draw] (c) at (1,1) [minimum size=40pt] {$c$};

  \draw[red] (a)  -- (tangent cs:node=c,point={(a)},solution=1) --
       (c.center) -- (tangent cs:node=c,point={(a)},solution=2) -- cycle;
\end{tikzpicture}

rext

Создание собственной системы координат

Требует отдельного изучения, если вдруг понадобится

Или создать alias существующей системекоординат

\tikzaliascoordinatesystem{⟨new name⟩}{⟨old name⟩}

https://tikz.dev/tikz-coordinates#sec-13.2.5

Координаты точек пересечения

Библиотека \usetikzlibrary{intersections}

/tikz/name path=⟨name⟩ — задать имя path для поиска пересечения

/tikz/name path global=⟨name⟩ — задает имя path глобально,будет доступно за пределами окружения SCOPE в рисунке

/tikz/name intersections={⟨options⟩} — поиск точек пересечения путей path

Если несколько точек пересечения им будут заданы координаты intersections-1 и intersections-2 и т.д. сколько получится.

\usetikzlibrary {intersections}
\begin{tikzpicture}[every node/.style={opacity=1, black, above left}]%стиль node подписи в лево вверх
  \draw [help lines] grid (3,2);%нарисуем grid
  \draw [name path=ellipse] (2,0.5) ellipse (0.75cm and 1cm);%нарисуем элипс и имя path=ellipse
  \draw [name path=rectangle, rotate=10] (0.5,0.5) rectangle +(2,1);%нарисуем прямоугольник и имя path=rectangle
  \fill [red, opacity=0.5, name intersections={of=ellipse and rectangle}]% найдем точки пересечения двух path
  %name intersections --- это команда для поиска пересечений
  %of= --- задает path для поиска пересечений
    (intersection-1) circle (2pt) node {1}%нарисовать точку в пересечении 1
    (intersection-2) circle (2pt) node {2};%нарисовать точку в пересечении 2
\end{tikzpicture}

intersec

Ключи intersections

of=

name intersections={of=ellipse and rectangle} — задает имена path для поиска пересечений

name=

выдаст имена точек пересечения, какие заданы в name

  \fill [red, opacity=0.5, name intersections={of=ellipse and rectangle,name=insec}]
    (insec-1) circle (2pt) node {1}
    (insec-2) circle (2pt) node {2};

total=⟨macro⟩

Создает список всех точек пересечения и сохраняет его в макросе tex по номерам 1,2,3 и т.д.

[name intersections={of=curve 1 and curve 2, name=i, total=\t}] — сохранит в макросе \t

by={a,b}

присвоит каждой точке свое имя a и b

  \fill [name intersections={of=curve 1 and curve 2, by={a,b}}]
        (a) circle (2pt)
        (b) circle (2pt);

Еще можно использовать нотацию ... подставит имена автоматически

[name intersections={
          of=curve 1 and curve 2,
			  by={[label=center:a],[label=center:...],[label=center:i]}}]

Относительные и инкрементальные координаты

Это мои любимые + и ++

Дают одинаковый вариант:

++ изменяет текущую координату и премещается относительно

+ не изменяет текущую координату и перемещается относительно

\begin{tikzpicture}
  \draw (0,0)     -- ++(1,0) -- ++(0,1) -- ++(-1,0) -- cycle;
  \draw (2,0)     -- ++(1,0) -- ++(0,1) -- ++(-1,0) -- cycle;
  \draw (1.5,1.5) -- ++(1,0) -- ++(0,1) -- ++(-1,0) -- cycle;
\end{tikzpicture}

\begin{tikzpicture}
  \draw (0,0)     -- +(1,0) -- +(1,1) -- +(0,1) -- cycle;
  \draw (2,0)     -- +(1,0) -- +(1,1) -- +(0,1) -- cycle;
  \draw (1.5,1.5) -- +(1,0) -- +(1,1) -- +(0,1) -- cycle;
\end{tikzpicture}

rect

Ключевое слово TURN

\tikz \draw (0,0) -- (1,1) -- ([turn]-45:1cm) -- ([turn]-30:1cm);

Поворачивает ось координат по касательной к последней точке.

\begin{tikzpicture} [delta angle=-180, radius=1cm]
\draw [help lines] (0,0) grid (10,5);
\draw (0,3) arc [start angle=-180]  -- ([turn]60:1cm)
              arc [start angle=-180] -- ([turn]60:1cm)
              arc [start angle=180] -- ([turn]60:1cm);
\end{tikzpicture}

arc

До меня дошло, когда нарисовал сетку координат

[delta angle=-180, radius=1cm] — параметры дуги: ее угол и радиус, минус говорит, что рисуем по часовой стрелке

[start angle=-180] — собственно стартовый угол дуги, относительно системы координат — здесь -180 и +180 роли не играет, но -90 и +90 развернут дугу в разные стороны.

– ([turn]60:1cm) — эта штука нарисует отрезок из последней точки но в системе координат именно последней точки. Т.е. 60 градусов она развернет относительно мысленного продолжения arc по касательной.

[current point is local]

Укажет, что внутри фигурных скобок была относительная координата и после выхода из скобок, система координат будет как была до нее.

\begin{tikzpicture}
  \draw      (0,0) -- ++(1,0)   -- ++(0,1)   -- ++(-1,0);
  \draw[red] (2,0) -- ++(1,0)
     { [current point is local] -- ++(0,1) } -- ++(-1,0);
\end{tikzpicture}

Вычисляемые координаты

Вся мощь библиотеки CALC в расчете координат

($(a) + 1/3*(1cm,0)$) — вот так берем и изменяем координаты. Не забываем поставить эту конструкцию в $.

([⟨options⟩]$⟨coordinate computation⟩$)

— синтаксис

\usetikzlibrary {calc}
\begin{tikzpicture}
  \draw [help lines] (0,0) grid (3,2);

  \fill [red] ($2*(1,1)$) circle (2pt);
  \fill [green] (${1+1}*(1,.5)$) circle (2pt);
  \fill [blue] ($cos(0)*sin(90)*(1,1)$) circle (2pt);
  \fill [black] (${3*(4-3)}*(1,0.5)$) circle (2pt);
\end{tikzpicture}

Это возможные операции над координатами. Координаты всегда имеют структуру (x,y) и умножение будет происходить над x и y по отдельности.

⟨coordinate⟩!⟨number⟩!⟨angle⟩:⟨second coordinate⟩

(1,2)!.75!(3,4) — это значит, что координата будет на .75 между точками (1,2) и (3,4)

\usetikzlibrary {calc}
\begin{tikzpicture}
  \draw [help lines] (0,0) grid (3,2);

  \draw (1,0) -- (3,2);

  \foreach \i in {0,0.2,0.5,0.9,1}
    \node at ($(1,0)!\i!(3,2)$) {\i};
\end{tikzpicture}

flow

\usetikzlibrary {calc}
\begin{tikzpicture}
  \draw [help lines] (0,0) grid (3,3);

  \coordinate (a) at (1,0);
  \coordinate (b) at (3,2);

  \draw[->] (a) -- (b);

  \coordinate (c) at ($ (a)!1! 10:(b) $); % от точки (a) длина !1! --- такая же как (ab) и повернуть на 10 градусов.

  \draw[->,red] (a) -- (c);

  \fill ($ (a)!.5! 10:(b) $) circle (2pt); % а здесь точку нарисуем
\end{tikzpicture}

Змея для примера

\usetikzlibrary {calc}
\begin{tikzpicture}
  \draw [help lines] (0,0) grid (4,4);

  \foreach \i in {0,0.125,...,2}
    \fill ($(2,2) !\i! \i*180:(3,2)$) circle (2pt);
\end{tikzpicture}

zmey

Модифаеры могут быть по нескольку штук дляг за другом

\usetikzlibrary {calc}
\begin{tikzpicture}
  \draw [help lines] (0,0) grid (3,2);

  \draw (0,0) -- (3,2);
  \draw[red] ($(0,0)!.3!(3,2)$) -- (3,0);
  \fill[red] ($(0,0)!.3!(3,2)!.7!(3,0)$) circle (2pt); %как здесь. Нашли точку на одной прямой и о нее ищем на другой.
\end{tikzpicture}

⟨coordinate⟩!⟨dimension⟩!⟨angle⟩:⟨second coordinate⟩

т.е. эта штука вычислит все в миллиметрах и расставит метки по прямой

\usetikzlibrary {calc}
\begin{tikzpicture}
  \draw [help lines] (0,0) grid (3,2);

  \draw (1,0) -- (3,2);

  \foreach \i in {0cm,1cm,15mm}
    \node at ($(1,0)!\i!(3,2)$) {\i};
\end{tikzpicture}

А эта будет ставить измерения

\usetikzlibrary {calc}
\begin{tikzpicture}
  \draw [help lines] (0,0) grid (3,2);

  \coordinate (a) at (1,0);
  \coordinate (b) at (3,1);

  \draw (a) -- (b);%нарисуем прямую ab

  \coordinate (c) at ($ (a)!.25!(b) $);%найдем точку c
  \coordinate (d) at ($ (c)!1cm!90:(b) $);%найдем точку d 90град от cb

  \draw [<->] (c) -- (d) node [sloped,midway,above] {1cm};% начертим стрелочки и напишем 1 cm
\end{tikzpicture}

dim

⟨coordinate⟩!⟨projection coordinate⟩!⟨angle⟩:⟨second coordinate⟩

модификаторы проекции

Нарисуем треугольник и опустим перпендикуляры от вершин на противоположные стороны

между !()! укажем вершину в скобках

\usetikzlibrary {calc}
\begin{tikzpicture}
  \draw [help lines] (0,0) grid (3,2);

  \coordinate (a) at (0,1);
  \coordinate (b) at (3,2);
  \coordinate (c) at (2.5,0);

  \draw (a) -- (b) -- (c) -- cycle;

  \draw[red]    (a) -- ($(b)!(a)!(c)$);%от a на сторону bc
  \draw[orange] (b) -- ($(a)!(b)!(c)$);%от b на сторону ac
  \draw[blue]   (c) -- ($(a)!(c)!(b)$);%от c на сторону ab
\end{tikzpicture}

pr

Перпендикуляры

Основные команды это:

  • /tikz/cs/horizontal line through={(⟨coordinate⟩)}
  • /tikz/cs/vertical line through={(⟨coordinate⟩)}

задают вертикальную и горизонтальные линии, но в основном используется синтаксис:

(⟨p⟩ |- ⟨q⟩) или (⟨q⟩ -| ⟨p⟩).

Для примера: (2,1 |- 3,4) и (3,4 -| 2,1) дадут точку (2,4)

\begin{tikzpicture}
  \path (30:1cm) node(p1) {$p_1$}   (75:1cm) node(p2) {$p_2$};

  \draw (-0.2,0) -- (1.2,0) node(xline)[right] {$q_1$};
  \draw (2,-0.2) -- (2,1.2) node(yline)[above] {$q_2$};

  \draw[->] (p1) -- (p1 |- xline);
  \draw[->] (p2) -- (p2 |- xline);
  \draw[->] (p1) -- (p1 -| yline);
  \draw[->] (p2) -- (p2 -| yline);
\end{tikzpicture}

perprn

или такой

\usetikzlibrary {calc}
\begin{tikzpicture}
  \node (A) at (0,1)    {A};
  \node (B) at (1,1.5)  {B};
  \node (C) at (2,0)    {C};
  \node (D) at (2.5,-2) {D};

  \draw (A) -- (B) node [midway] {x};
  \draw (C) -- (D) node [midway] {x};

  \node at ({$(A)!.5!(B)$} -| {$(C)!.5!(D)$}) {X};
\end{tikzpicture}

от одной средней точки возьмем координату X от другой Y и напишем метку X.

perprn

7.10 - Диаграммы в Latex библиотека TIKZ

Возможности библиотеки TIKZ для рисования графиков в Latex

Возможности библиотеки TIKZ для рисования графиков в Latex. Обзор учебника из документации.

Библиотеки для работы с диаграммами

\usetikzlibrary {
positioning,% нативные позиции node
shapes.misc, % настройка внешнего вида фигур, углы и т.д.
graphs, % работает с диаграммами и графами
calc, % считает координаты
arrows.meta % рисует наконечники стрел
}

Стилизация узлов диаграммы

Простой прямоугольник (Не-Терминал)

\usetikzlibrary {positioning}
\begin{tikzpicture}[
    nonterminal/.style={
      % The shape:
      rectangle,
      % The size:
      minimum size=6mm,
      % The border:
      very thick,
      draw=red!50!black!50,         % 50% red and 50% black,
                                    % and that mixed with 50% white
      % The filling:
      top color=white,              % a shading that is white at the top...
      bottom color=red!50!black!20, % and something else at the bottom
      % Font
      font=\itshape
    }]
  \node [nonterminal] {unsigned integer};
\end{tikzpicture}

В стиле определил:

  • rectangle
  • minimum size
  • border — красночерного цвета толстый бордюр
  • filling — градиент top и bottom
  • font

Для рисования просто пишу NODE и все готово st1

Стиль терминалов с круглыми углами

\usetikzlibrary {positioning}
\begin{tikzpicture}[node distance=5mm,
                    terminal/.style={
                      % The shape:
                      rectangle,minimum size=6mm,rounded corners=3mm,
                      % The rest
                      very thick,draw=black!50,
                      top color=white,bottom color=black!20,
                      font=\ttfamily}]
  \node (dot)   [terminal]                {.};
  \node (digit) [terminal,right=of dot]   {digit};
  \node (E)     [terminal,right=of digit] {E};
\end{tikzpicture}

Как приятно писать что-то, когда ты понимаешь, что ты это понимаешь)))

В стиле определено:

  • node distance — это значит,что расстояние между node будет, то, которое задано.
  • terminal — название стиля
  • rectangle — форма
  • minimum size
  • rounded corners — радиус закругления углов (закругляет у любой фигуры \node, \fill, \path)
  • very thick — толщина обводки
  • top, bottom — градиент заливки
  • font

Односимвольный терминал станет кругом, а многосимвольный — прямоугольником с закругленными углами.

st2

Использование библиотеки shapes.misc

Только немного изменится настройка в описании стиля

[node distance=5mm,
                    terminal/.style={
                      % The shape:
                      rounded rectangle,
                      minimum size=6mm,
                      % The rest
                      very thick,draw=black!50,
                      top color=white,bottom color=black!20,
                      font=\ttfamily}]

убрали rounded corners а поставили rounded rectangle — собственно и все. Но разметка слегка отъехала. На рисунке можно увидеть небольшую разницу.

Выравнивание текста в терминалах

Просто добавляем в стиль высоту и глубину строки [text height=1.5ex,text depth=.25ex]

Полезная библиотека позиционирования

\usetikzlibrary {positioning,shapes.misc}
\begin{tikzpicture}[node distance=5mm and 5mm]
  \node (ui1)   [nonterminal]                     {unsigned integer};
  \node (dot)   [terminal,right=of ui1]           {.};
  \node (digit) [terminal,right=of dot]           {digit};
  \node (E)     [terminal,right=of digit]         {E};
  \node (plus)  [terminal,above right=of E]       {+};
  \node (minus) [terminal,below right=of E]       {-};
  \node (ui2)   [nonterminal,below right=of plus] {unsigned integer};
\end{tikzpicture}

основные команды:

  • right=of
  • left=of
  • above=of
  • below=of
  • above right=of
  • и т.д.

Перенесем настройки стилей в преамбулу документа

\tikzset {terminal/.style={
                      % The shape:
                      rectangle,minimum size=6mm,rounded corners=3mm,
                      % The rest
                      very thick,draw=black!50,
                      top color=white,bottom color=black!20,
                      font=\ttfamily}}
\tikzset {nonterminal/.style={
      % The shape:
      rectangle,
      % The size:
      minimum size=6mm,
      % The border:
      very thick,
      draw=red!50!black!50,         % 50% red and 50% black,
                                    % and that mixed with 50% white
      % The filling:
      top color=white,              % a shading that is white at the top...
      bottom color=red!50!black!20, % and something else at the bottom
      % Font
      font=\itshape
    }}

Теперь будет действовать глобально на всех.

Рисуем стрелки

\usetikzlibrary {calc,positioning,shapes.misc}
\begin{tikzpicture}[node distance=5mm and 5mm,
    skip loop/.style={to path={-- ++(0,#1) -| (\tikztotarget)}}]
  \node (dot)   [terminal]                        {.};
  \node (digit) [terminal,right=of dot]           {digit};
  \node (E)     [terminal,right=of digit]         {E};

  \path (dot)   edge[->]                (digit)  % simple edges
        (digit) edge[->]                (E)
        ($ (digit.east)!.5!(E.west) $)
                edge[->,skip loop=-5mm] ($ (digit.west)!.5!(dot.east) $);
\end{tikzpicture}

Разберем кривую стрелку

($ (digit.east)!.5!(E.west) $)
                edge[->,skip loop=-5mm] ($ (digit.west)!.5!(dot.east) $);

т.е. от середины между метками (digit.east)!.5!(E.west) до середины между метками (digit.west)!.5!(dot.east) рисуем кривулину типа skip loop

st4

Пока все довольны.

Но разобрать по частям стиль skip loop очень хочется: skip loop/.style={to path={-- ++(0,#1) -| (\tikztotarget)}}

  • первая часть понятна: от текущей точке рисуем линию вертикально на заданный параметр #1, а потом
  • -| — рисует горизонтально, а потом вертикально к цели, это один из родственников -- — рисует прямую; |-— рисует вертикально и горизонтально и .. — рисует кривую
  • возвращаемся к поставленной цели (\tikztotarget) вообще таких макросов три (\tikztostart, \tikztotarget, and \tikztonodes;)

Матрицы

\usetikzlibrary {shapes.misc}
\begin{tikzpicture}
  \matrix[row sep=1mm,column sep=5mm] {
    % First row:
      & & & & \node [terminal] {+}; & \\
    % Second row:
    \node [nonterminal] {unsigned integer}; &
    \node [terminal]    {.};                &
    \node [terminal]    {digit};            &
    \node [terminal]    {E};                &
                                            &
    \node [nonterminal] {unsigned integer}; \\
    % Third row:
      & & & & \node [terminal] {-}; & \\
  };
\end{tikzpicture}

Пока \matrix представляет собой что-то вроде таблицы, со своими дополнениями.

  • row sep — расстояние между строками
  • column sep — расстояние между столбцами

Дальше обычная tabular.

st5

Промежуточная задача с узлами привязки

\usetikzlibrary {shapes.misc}
\begin{tikzpicture}[point/.style={circle,inner sep=0pt,minimum size=2pt,fill=red},
                   skip loop/.style={to path={-- ++(0,#1) -| (\tikztotarget)}}]
  \matrix[row sep=1mm,column sep=2mm] {
    % First row:
    & & & & & & &  & & & & \node (plus) [terminal] {+};\\
    % Second row:
    \node (p1) [point]  {}; &    \node (ui1)   [nonterminal] {unsigned integer}; &
    \node (p2) [point]  {}; &    \node (dot)   [terminal]    {.};                &
    \node (p3) [point]  {}; &    \node (digit) [terminal]    {digit};            &
    \node (p4) [point]  {}; &    \node (p5)    [point]  {};                      &
    \node (p6) [point]  {}; &    \node (e)     [terminal]    {E};                &
    \node (p7) [point]  {}; &                                                    &
    \node (p8) [point]  {}; &    \node (ui2)   [nonterminal] {unsigned integer}; &
    \node (p9) [point]  {}; &    \node (p10)   [point]       {};\\
    % Third row:
    & & & & & & &  & & & & \node (minus)[terminal] {-};\\
  };

  \path (p4) edge [->,skip loop=-5mm] (p3)
        (p2) edge [->,skip loop=5mm]  (p6);
\end{tikzpicture}
  1. Описываем стиль [point/.style={circle,inner sep=0pt,minimum size=2pt,fill=red}]
  2. Расставляем точки в матрице и даем им имена: \node (p1) [point] {};
  3. Соединяем точки edge (p4) edge [->,skip loop=-5mm] (p3)

Частично задача решена. Вторым этапом убираем видимость точек и результат готов.

Команда GRAPH (библиотека graphs)

Это еще одна мощная команда, которая должна со всем этим хозяйством управиться.

\begin{tikzpicture}[skip loop/.style={to path={-- ++(0,#1) -| (\tikztotarget)}},
                    point/.style={circle,inner sep=0pt,minimum size=2pt,fill=red},
                    hv path/.style={to path={-| (\tikztotarget)}},
                    vh path/.style={to path={|- (\tikztotarget)}}]
  \matrix[row sep=1mm,column sep=2mm] {
    % First row:
    & & & & & & &  & & & & \node (plus) [terminal] {+};\\
    % Second row:
    \node (p1) [point]  {}; &    \node (ui1)   [nonterminal] {unsigned integer}; &
    \node (p2) [point]  {}; &    \node (dot)   [terminal]    {.};                &
    \node (p3) [point]  {}; &    \node (digit) [terminal]    {digit};            &
    \node (p4) [point]  {}; &    \node (p5)    [point]  {};                      &
    \node (p6) [point]  {}; &    \node (e)     [terminal]    {E};                &
    \node (p7) [point]  {}; &                                                    &
    \node (p8) [point]  {}; &    \node (ui2)   [nonterminal] {unsigned integer}; &
    \node (p9) [point]  {}; &    \node (p10)   [point]       {};\\
    % Third row:
    & & & & & & &  & & & & \node (minus)[terminal] {-};\\
};

  \graph {
    (p1) -> (ui1) -- (p2) -> (dot) -- (p3) -> (digit) -- (p4)
         -- (p5)  -- (p6) -> (e) -- (p7) -- (p8) -> (ui2) -- (p9) -> (p10);
    (p4) ->[skip loop=-5mm]  (p3);
    (p2) ->[skip loop=5mm]   (p5);
    (p6) ->[skip loop=-11mm] (p9);
    (p7) ->[vh path]         (plus)  -> [hv path] (p8);
    (p7) ->[vh path]         (minus) -> [hv path] (p8);
  };
\end{tikzpicture}

st6

Завершаем оформление и добавляем стрелочки

Библиотека arrows.meta: и вариант работы p7 ->[vh path] { plus, minus } -> [hv path] p8; библиотеки graphs по раздвоению стрелок. Просто перечисляем узлы в фигурных скобках.

Итоговый вариант:

\begin{tikzpicture}[skip loop/.style={to path={-- ++(0,#1) -| (\tikztotarget)}},
                    point/.style={circle,inner sep=0pt,minimum size=2pt,fill=red},
                    >={Stealth[round]},thick,black!50,text=black,
                    every new ->/.style={shorten >=1pt},
                    graphs/every graph/.style={edges=rounded corners},
                    hv path/.style={to path={-| (\tikztotarget)}},
                    vh path/.style={to path={|- (\tikztotarget)}}]
  \matrix[column sep=4mm] {
    % First row:
    & & & & & & &  & & & & \node (plus) [terminal] {+};\\
    % Second row:
    \node (p1) [point]  {}; &    \node (ui1)   [nonterminal] {unsigned integer}; &
    \node (p2) [point]  {}; &    \node (dot)   [terminal]    {.};                &
    \node (p3) [point]  {}; &    \node (digit) [terminal]    {digit};            &
    \node (p4) [point]  {}; &    \node (p5)    [point]  {};                      &
    \node (p6) [point]  {}; &    \node (e)     [terminal]    {E};                &
    \node (p7) [point]  {}; &                                                    &
    \node (p8) [point]  {}; &    \node (ui2)   [nonterminal] {unsigned integer}; &
    \node (p9) [point]  {}; &    \node (p10)   [point]       {};\\
    % Third row:
    & & & & & & &  & & & & \node (minus)[terminal] {-};\\
};

  \graph [use existing nodes] {
    p1 -> ui1 -- p2 -> dot -- p3 -> digit -- p4 -- p5  -- p6 -> e -- p7 -- p8 -> ui2 -- p9 -> p10;
    p4 ->[skip loop=-5mm]  p3;
    p2 ->[skip loop=5mm]   p5;
    p6 ->[skip loop=-11mm] p9;
    p7 ->[vh path] { plus, minus } -> [hv path] p8;

};
\end{tikzpicture}

st8

Более серьезное погужение в GRAPHs

\tikz \graph [grow right=2cm] { unsigned integer -> d -> digit -> E };

выдаст сразу: st9

Добавим стилей:

\tikz \graph [grow right sep] {
  unsigned integer[nonterminal] -> "."[terminal] -> digit[terminal] -> E[terminal]
};

st10

Добавим + и -:

\usetikzlibrary {graphs,shapes.misc}
\tikz \graph [grow right sep] {
  unsigned integer  [nonterminal] ->
  "."               [terminal] ->
  digit             [terminal] ->
  E                 [terminal] ->
  {
    "+"             [terminal],
    ""              [coordinate],
    "-"             [terminal]
  } ->
  ui2/unsigned integer [nonterminal]
};

st11

Окончательный вариант через Graphs

\usetikzlibrary {arrows.meta,graphs,shapes.misc}
\tikz [>={Stealth[round]}, black!50, text=black, thick,
       every new ->/.style = {shorten >=1pt},
       graphs/every graph/.style = {edges=rounded corners},
       skip loop/.style = {to path={-- ++(0,#1) -| (\tikztotarget)}},
       hv path/.style = {to path={-| (\tikztotarget)}},
       vh path/.style = {to path={|- (\tikztotarget)}},
       nonterminal/.style = {
         rectangle, minimum size=6mm, very thick, draw=red!50!black!50, top color=white,
         bottom color=red!50!black!20, font=\itshape, text height=1.5ex,text depth=.25ex},
       terminal/.style = {
         rounded rectangle,  minimum size=6mm, very thick, draw=black!50, top color=white,
         bottom color=black!20, font=\ttfamily, text height=1.5ex, text depth=.25ex},
       shape = coordinate
       ]
  \graph [grow right sep, branch down=7mm, simple] {
    / -> unsigned integer[nonterminal] -- p1 -> "." [terminal] -- p2 -> digit[terminal] --
    p3 -- p4 -- p5 -> E[terminal] -- q1 ->[vh path]
    {[nodes={yshift=7mm}]
      "+"[terminal], q2, "-"[terminal]
    } -> [hv path]
    q3 -- /unsigned integer [nonterminal] -- p6 -> /;

    p1 ->[skip loop=5mm]   p4;
    p3 ->[skip loop=-5mm]  p2;
    p5 ->[skip loop=-11mm] p6;

    q1 -- q2 -- q3;  % make these edges plain
  };
  

st12

Особенности кода:

  • использовании групп, при делении веток, группы заключаем в {}
  • анонимные координаты обозначаются /
  • simpe — свойство graph — которое определяем, что между 2-мя узлами может быть только 1 edge.
  • graphs/every graph/.style = {edges=rounded corners} — закругленные уголки у стрелок
  • >={Stealth[round]}, black!50, text=black, thick, — стиль стрелок

7.11 - Примеры по Эвклиду

Продолжаем осваивать библиотеку TIKZ и изучаем новые команды

Установка необходимых библиотек для работы

\documentclass{article} % say

% For LaTeX:
\usepackage{tikz}
\usetikzlibrary{calc,intersections,through,backgrounds}

\begin{tikzpicture}
  \coordinate [label=left:\textcolor{blue}{$A$}]  (A) at (0,0);
  \coordinate [label=right:\textcolor{blue}{$B$}] (B) at (1.25,0.25);

  \draw[blue] (A) -- (B);
\end{tikzpicture}

Мощь библиотеки calc

\begin{tikzpicture}
  \coordinate [label=left:\textcolor{blue}{$A$}] (A) at ($ (0,0) + .1*(rand,rand) $);
  \coordinate [label=right:\textcolor{red}{$B$}] (B) at ($ (1.25,0.25) + .1*(rand,rand) $);
 
  \draw[blue] (A) -- (B);
\end{tikzpicture}

Все вычисления происходят между двух символов $.

Особенность оператора rand, что он каждый раз будет вычисляться одинаково. Т.е. не такой он уж и случайное число.

Оператор let и команда veclen

\usetikzlibrary {calc}
\begin{tikzpicture}
  \coordinate [label=left:$A$]  (A) at (0,0);
  \coordinate [label=right:$B$] (B) at (1.25,0.25);
  \draw (A) -- (B);

  \draw (A) let
              \p1 = ($ (B) - (A) $)
            in
              circle ({veclen(\x1,\y1)});
\end{tikzpicture}

st1

  • \p1 = ($ (B) - (A) $) вычислит длину вектора и запишет в переменную 1
  • p — это команда записать точку (коорд.x, коорд.y)
  • veclen(\x1,\y1) — соответственно передать коордитаты x и y из переменной 1 и вычислить их длину для радиуса.
  • n — похожа на p, но записывает число.

т.е. let определил p1 и передал in в circle

\usetikzlibrary {calc}
\begin{tikzpicture}
 \coordinate [label=left:$A$]  (A) at (0,0);
 \coordinate [label=right:$B$] (B) at (1.25,0.25);
 \draw (A) -- (B);

 \draw let \p1 = ($ (B) - (A) $),
           \n2 = {veclen(\x1,\y1)}
       in
         (A) circle (\n2)
         (B) circle (\n2);
\end{tikzpicture}

в этом примере, как раз вычисленный радиус, записали в переменную 2. Вместо цифры в этих переменных можно использовать длинные имена в скобках n{ragius} и также их использовать circle (\n{radius})

Библиотека THROUGH

Создадим окружность через точку B относительно A, находящейся в центре координат. Т.е. точку A он всегда будет считать центром.

\usetikzlibrary {through}
\begin{tikzpicture}
  \coordinate [label=left:$A$]  (A) at (0,0);
  \coordinate [label=right:$B$] (B) at (1.25,0.25);
  \draw (A) -- (B);

  \node [draw,circle through=(B),label=left:$D$] at (A) {};
\end{tikzpicture}

st2

Библиотека INTERSECTION

\usetikzlibrary {intersections,through}
\begin{tikzpicture}
  \coordinate [label=left:$A$]  (A) at (0,0);
  \coordinate [label=right:$B$] (B) at (1.25,0.25);
  \draw (A) -- (B);

  \node (D) [name path=D,draw,circle through=(B),label=left:$D$]  at (A) {}; %нода D и путь D это разные объекты, можно называть по разному
  \node (E) [name path=E,draw,circle through=(A),label=right:$E$] at (B) {};

  % Name the coordinates, but do not draw anything:
  \path [name intersections={of=D and E}];

  \coordinate [label=above:$C$] (C) at (intersection-1);

  \draw [red] (A) -- (C);
  \draw [red] (B) -- (C);
\end{tikzpicture}

st3

  • \node (D) [name path=D,draw,circle through=(B),label=left:$D$] задаем имя \path где проходит окружность.
  • \path [name intersections={of=D and E}]; — определяем пересечение двух путей D и E и у них образуются точки пересечения как (intersection-1) и (intersection-2).
  • \coordinate [label=above:$C$] (C) at (intersection-1); — определим точку C с координатами пересечения.

но есть еще у name intersections команда by, которая все это решит автоматически: \path [name intersections={of=D and E, by={[label=above:$C$]C, [label=below:$C'$]C'}}]; т.е. поставит точки и метки в них.

Потом просто проведем линию и дадим ей тоже имя \path \draw [name path=C--C',red] (C) -- (C'); имя будет C--C'.

Новый intersection получит точку F

\path [name intersections={of=A--B and C--C',by=F}];

\begin{tikzpicture}
 \coordinate [label=left:$A$]  (A) at (0,0);
 \coordinate [label=right:$B$] (B) at (1.25,0.25);
 \draw [name path=A--B] (A) -- (B);

 \node (D) [name path=D,draw,circle through=(B),label=left:$D$]  at (A) {};
 \node (E) [name path=E,draw,circle through=(A),label=right:$E$] at (B) {};

 \path [name intersections={of=D and E, by={[label=above:$C$]C, [label=below:$C'$]C'}}];

 \draw [name path=C--C',red] (C) -- (C');

 \path [name intersections={of=A--B and C--C',by=F}];
 \node [fill=red,inner sep=2pt,label=-45:$F$] at (F) {};
\end{tikzpicture}

это полная картина, где из нового inner sep=2pt — это толщина точки пересечения, а на самом деле просто размер node в виде точки

st5

если бы я написал \node [fill=red,circle, inner sep=2pt,label=-45:$F$] at (F) {}; то получилось бы:

st6

Разукрашки и определение макросов

\begin{tikzpicture}[
  thick,% толстые линии
  help lines/.style={thin,draw=black!50}]%вспомогательные линии
  \def\A{\textcolor{input}{$A$}} % макросы ABCDE со стилями меток
  \def\B{\textcolor{input}{$B$}} 
  \def\C{\textcolor{output}{$C$}}    
  \def\D{$D$}
  \def\E{$E$}

  \colorlet{input}{blue!80!black} % input и output цвета, которые подставятся в макросы
  \colorlet{output}{red!70!black}
  \colorlet{triangle}{orange}

Наарисуем треугольник

\draw [output] (A) -- (C) -- (B);

Поставим в вершинах точки

\foreach \point in {A,B,C}
    \fill [black,opacity=.5] (\point) circle (2pt);

Закрасим треугольник

  \begin{pgfonlayer}{background}
    \fill[triangle!80] (A) -- (C) -- (B) -- cycle;
  \end{pgfonlayer}

Итоговый код

\usetikzlibrary {backgrounds,calc,intersections,through}
\begin{tikzpicture}[thick,help lines/.style={thin,draw=black!50}]
  \def\A{\textcolor{input}{$A$}}     \def\B{\textcolor{input}{$B$}}
  \def\C{\textcolor{output}{$C$}}    \def\D{$D$}
  \def\E{$E$}

  \colorlet{input}{blue!80!black}    \colorlet{output}{red!70!black}
  \colorlet{triangle}{orange}

  \coordinate [label=left:\A]  (A) at ($ (0,0) + .1*(rand,rand) $);
  \coordinate [label=right:\B] (B) at ($ (1.25,0.25) + .1*(rand,rand) $);

  \draw [input] (A) -- (B);

  \node [name path=D,help lines,draw,label=left:\D]   (D) at (A) [circle through=(B)] {};
  \node [name path=E,help lines,draw,label=right:\E]  (E) at (B) [circle through=(A)] {};

  \path [name intersections={of=D and E,by={[label=above:\C]C}}];

  \draw [output] (A) -- (C) -- (B);

  \foreach \point in {A,B,C}
    \fill [black,opacity=.5] (\point) circle (2pt);

  \begin{pgfonlayer}{background}
    \fill[triangle!80] (A) -- (C) -- (B) -- cycle;
  \end{pgfonlayer}

  \node [below right, text width=10cm,align=justify] at (4,3) {
    \small\textbf{Proposition I}\par
    \emph{To construct an \textcolor{triangle}{equilateral triangle}
      on a given \textcolor{input}{finite straight line}.}
    \par\vskip1em
    Let \A\B\ be the given \textcolor{input}{finite straight line}.  \dots
  };
\end{tikzpicture}

st6

Мой первый прямоугольник с почти умными координатами

\begin{tikzpicture}
  \coordinate (NW) at (0,5); \coordinate (nw) at ($ (NW) + (1,-1) $);
  \coordinate (NE) at (7,5); \coordinate (ne) at ($ (NE) + (-1,-1) $);
  \coordinate (SE) at (7,0); \coordinate (se) at ($ (SE) + (-1,1) $);
  \coordinate (SW) at (0,0); \coordinate (sw) at ($ (SW) + (1,1) $);
\draw[black!10] (NW) -- (NE) -- (SE) -- (SW) -- cycle;
\draw[black!30, thick, fill=black!25] ($ (NW) + (1,-1) $) -- (ne) -- (se) -- (sw) -- cycle;
\fill[black!25] (nw) -- (ne) -- (se) -- (sw) -- cycle;
\end{tikzpicture}

st7

Немного неказист, но многообещающь.

Дальше он будет понемногу обрастать,пока не превратится в то,что я задумал.

Продолжение сериала по Эвклиду.

Найдем точку между координатами

Это будет ровно посередине между A и B.

\usetikzlibrary {calc}
\begin{tikzpicture}
  \coordinate [label=left:$A$]  (A) at (0,0);
  \coordinate [label=right:$B$] (B) at (1.25,0.25);
  \draw (A) -- (B);
  \node [fill=red,inner sep=1pt,label=below:$X$] (X) at ($ (A)!.5!(B) $) {};
\end{tikzpicture}

Это для убедительности: st8

Или за пределами точек и даже сложные вычисления: \coordinate [label=above:$D$] (D) at ($ (A) ! .5 ! (B) ! {sin(60)*2} ! 90:(B) $) {};

И еще пример, чисто как памятка, потому-что очень сложные вычисления, мне точно не нужны.

\draw (D) -- ($ (D) ! 2.5 ! (A) $) coordinate [label=below:$E$] (E); — начертит прямую и установит новую точку E

7.12 - Сети PETRI

Сети петри для ознакомления с возможностями NODE и настройки своих стилей.

Установка необходимых библиотек для работы

\documentclass{article} % say

\usepackage{tikz}
\usetikzlibrary{arrows.meta,decorations.pathmorphing,backgrounds,positioning,fit,petri}

\begin{document}
\begin{tikzpicture}
  \draw (0,0) -- (1,1);
\end{tikzpicture}
\end{document}

Просто нарисуем в системе координат 5 node

\begin{tikzpicture}
  \path ( 0,2) node [shape=circle,draw] {}
        ( 0,1) node [shape=circle,draw] {}
        ( 0,0) node [shape=circle,draw] {}
        ( 1,1) node [shape=rectangle,draw] {}
        (-1,1) node [shape=rectangle,draw] {};
\end{tikzpicture}

Но, выяснилось, что вариант выше не очень умен по своей сути. \path задает координату откуда начинается какое-то действие, в нашем случае размещаем node, а можно draw, но node с параметром draw обернет текст рамкой.

Синтаксис at т.е. поместить в…

step1

\begin{tikzpicture}
  \path node at ( 0,2) [shape=circle,draw] {}
        node at ( 0,1) [shape=circle,draw] {}
        node at ( 0,0) [shape=circle,draw] {}
        node at ( 1,1) [shape=rectangle,draw] {}
        node at (-1,1) [shape=rectangle,draw] {};
\end{tikzpicture}

Получаем тотже эффект, но говорят умнее.

Дальше больше:

\begin{tikzpicture}
  \path node at ( 0,2) [circle,draw] {}
        node at ( 0,1) [circle,draw] {}
        node at ( 0,0) [circle,draw] {}
        node at ( 1,1) [rectangle,draw] {}
        node at (-1,1) [rectangle,draw] {};
\end{tikzpicture}

Прикручиваем стили

\begin{tikzpicture}[thick]
  \path  node at ( 0,2) [circle,draw=blue,fill=red] {}
         node at ( 0,1) [circle,draw=blue,fill=yellow] {}
         node at ( 0,0) [circle,draw=blue,fill=green] {}
         node at ( 1,1) [rectangle,draw=black!50,fill=black!20] {}
         node at (-1,1) [rectangle,draw=black!50,fill=black!20] {};
\end{tikzpicture}

step2 Причем [draw=blue] — рисует такого цвета обводку, а fill — заполняет пространство

А теперь сделаем стиль универсальным на блок

\begin{tikzpicture}
  [place/.style={circle,draw=blue!50,fill=blue!20,thick},
   transition/.style={rectangle,draw=black!50,fill=black!20,thick}]
  \node at ( 0,2) [place] {};
  \node at ( 0,1) [place] {};
  \node at ( 0,0) [place] {};
  \node at ( 1,1) [transition] {};
  \node at (-1,1) [transition] {};
\end{tikzpicture}

просто один будет называться place а второй transition и теперь название этихстилей ставим в описании node.

Размеры SHAPE

Можно задать переменную inner sep=2mm в блоке — и это сделает отступ вокруг текста 2mm. Или:

[place/.style={circle,draw=blue!50,fill=blue!20,thick,
                 inner sep=0pt,minimum size=6mm},

т.е прямо в стиль и это даст эффект, что размер будет не меньше 4мм, пока в него влезает текст.

step3

Имена SHAPEs

Очень пригодятся имена SHAPEs для того,чтобы иметь привязки и потом на них ссылаться.

\begin{tikzpicture}
  \node (waiting 1)      at ( 0,2) [place] {};
  \node (critical 1)     at ( 0,1) [place] {};
  \node (semaphore)      at ( 0,0) [place] {};
  \node (leave critical) at ( 1,1) [transition] {};
  \node (enter critical) at (-1,1) [transition] {};
\end{tikzpicture}

имена будут в круглых скобочках, причем порядок написания не имеет значения. Это все определения одного \path

Нативное размещение SHAPEs

Вместо указания координат, можно указывать влево, вправо, ниже, выше. Такого ума можно набраться в библиотеке: \usetikzlibrary {positioning}

\usetikzlibrary {positioning}
\begin{tikzpicture}
  \node[place]      (waiting)                            {};
  \node[place]      (critical)       [below=of waiting]  {}; % ниже waitinig
  \node[place]      (semaphore)      [below=of critical] {}; % ниже critical
  \node[transition] (leave critical) [right=of critical] {}; % справа от critical
  \node[transition] (enter critical) [left=of critical]  {}; % слева от critical
\end{tikzpicture}

Объекты размещаются по координатной сетке.

Метки объектов по сторонам света

Все объекты TIKZ получают метки по сторонам света:

  • north
  • south
  • west
  • east
  • north east
  • north west
  • south east
  • south west
 \node [red,above] at (semaphore.north) {$s\le 3$};
\end{tikzpicture}

напишет node красного цвета red над above северной меткой объекта semaphore.

но в библиотеке есть вариант с label, который сделает тоже самое.

  \node[place] (semaphore) [below=of critical, 
                             label=above:$s\le3$] {};

Памятка, как label работает:

\tikz
  \node [circle,draw,label=60:$60^\circ$,label=below:$-90^\circ$] {my circle};

step4

И немного подольем красочки: label={[red]below:$-90^\circ$} и будет метка красная, но чтобы небыло конфлика поставим все это дело в {}.

Коннекторы это просто

  \draw [->] (enter critical.east) -- (critical.west);
  \draw [->] (waiting.west) .. controls +(left:5mm) and +(up:5mm)
                            .. (enter critical.north);

т.е. \draw [в какую сторону стрелу] (координата откуда) -- (координата куда);

Краткий комментарий к .. CONTROLS ..

Это вставка вместо оператора рисования - -, которая позволяет поставить несколько контрольных точек относительно некоторого центра вращения и сказать куда они сдвигаются и насколько:

\draw[->](waiting.west) ..controls +(left:15mm) and +(up:15mm) .. (enter critical.north);

step5

Умность библиотеки tirz

Можно не указывать стороны света в метках, от сделает это автоматически

  \draw [->] (enter critical) -- (critical);
  \draw [->] (waiting) .. controls +(left:5mm) and +(up:5mm)
                            .. (enter critical);

будет тоже самое.

Совершенствуем стрелочки до предела (to [in out])

Замечательный оператор to, который укажет под каким углом выйти и под каким углом войти стрелке.

Схема такая же, только вместо наших - - и .. controls .. появляется еще один оператор to [out=,in=]

in=220 — выглядит еще причудлевее.

\draw[->](waiting) to [out=0, in=180] (leave critical)

step6

Команда bend right left

изгиб кривой.

\draw[->](leave critical) to [bend left=150] (semaphore)

step7

но лучше загибать bend left=45, правда лучше.

Теперь еще один элемент EDGE

край - ребро, как угодно, но эта штука действует как внутри \path так и самостоятельно. Т.е. можно задавать свои особые наконечники и цвета для edge.

 \node[transition] (enter critical) [left=of critical]  {}
    edge [->]               (critical)
    edge [<-,bend left=45]  (waiting)
    edge [->,bend right=45] (semaphore);

буквально: там где нарисовал node от неё начинаю рисовать edges.

  • не завершая node точкой с запятой пишем edge
  • [здесь команды куда стрела, как гнуть]
  • (куда соединяем)
  • теперь текущая точка опять в пункте node
  • продолжаем рисовать дальше от той же точки

Вот такой казус может получиться:

\begin{tikzpicture}
  \node (c) at (0,0) {};
  \node (n) at (0,1) {}
  edge [bend right=45] (w);
  \node (s) at (0,-1) {}
  edge [bend right=45] (e);
  \node (w) at (-1,0) {}
  edge [bend right=45] (s);
  \node (e) at (1,0) {}
   edge [->,bend right=45] (n);
\end{tikzpicture}

step8

Но если рисовать по задумке:

\begin{tikzpicture}
  \node (c) at (0,0) {};
  \node (n) at (0,1) {};
  \node (w) at (-1,0) {}
  edge [bend left=45] (n);
  \node (s) at (0,-1) {}
  edge [bend left=45] (w);
  \node (e) at (1,0) {}
   edge [bend left=45] (s)
   edge [bend right=45] (n);
\end{tikzpicture}

то получим -> step9

И все это упакуем в стили

  [bend angle=45,
   pre/.style={<-,shorten <=1pt,>={Stealth[round]},semithick},
   post/.style={->,shorten >=1pt,>={Stealth[round]},semithick}]

вот такая штука позволит дальше в коде писать просто:

edge [pre] (critical) и edge [post,bend right] (waiting) и TIKZ все поймет.

Метки на линиях

\begin{tikzpicture}[auto,bend right]
  \node (a) at (0:1) {$0^\circ$};
  \node (b) at (120:1) {$120^\circ$};
  \node (c) at (240:1) {$240^\circ$};

  \draw (a) to node {1} node [swap] {1'} (b)
        (b) to node {2} node [swap] {2'} (c)
        (c) to node {3} node [swap] {3'} (a);
\end{tikzpicture}

step10

  • NODE — нарисовали метки в узлах через оператор at, т.е. поместить в … конкретную точку
  • DRAW — рисует через оператор to, т.е. от одной точки к другой, а на пути его рисования мы размещаем другие NODE и говорим с какой стороны их рисовать относительно линии.
  • SWAP — это нарисовать зеркально
  • на пути DRAW, NODEs может быть сколько угодно, главное их всех разместить правильно, а то все в одну точку вляпаются.

Декоративные линии (\usetikzlibrary {decorations.pathmorphing})

Собственно любую линию можно нарисовать, просто отдельно нужно изучить особенности этой библиотеки.

\usetikzlibrary {decorations.pathmorphing}
\begin{tikzpicture}
  \draw [->,decorate,
     decoration={snake,amplitude=.4mm,segment length=2mm,post length=1mm}]
    (0,0) -- (3,0);
\end{tikzpicture}

получится вот такая кривулина: step11

И продолжая тему кривулины или любой другой линии, если мне нужно разместить текст, то делаю в разрыве DRAW вставку NODE:

node [above,text width=3cm,align=center,midway]
    {
      replacement of the \textcolor{red}{capacity} by
      \textcolor{red}{two places}
    }
  • above — выше над линией
  • text width=3cm — ширина текста 3см
  • align-center — текст выравнять по центру
  • midway — в центре линии (у него еще есть братья:
    • near start — pos=0.25.
    • near end — pos=0.75.
    • very near start — pos=0.125.
    • very near end — pos=0.875.
    • at start — pos=0.
    • at end — pos=1

BACKGROUND или слои и фон под картинкой

Нам поможет библиотека fit и background

fit — дает координаты всех узлов background — размещает на разных слоях рисунки

Еще нам понадобятся знания об окружении SCOPE — это просто окружение чего-то, такие своеобразные скобки, в которых будут действовать правила, которые мы установим, а за пределами SCOPE все возвращается в исходные установки.

\begin{tikzpicture}[ultra thick]
  \begin{scope}[red]
    \draw (0mm,10mm) -- (10mm,10mm);
    \draw (0mm,8mm) -- (10mm,8mm);
  \end{scope}
  \draw (0mm,6mm) -- (10mm,6mm);
  \begin{scope}[green]
    \draw (0mm,4mm) -- (10mm,4mm);
    \draw (0mm,2mm) -- (10mm,2mm);
    \draw[blue] (0mm,0mm) -- (10mm,0mm);
  \end{scope}
\end{tikzpicture}

этот пример на линиях все показал step12

а про background мы просто добавим в конце такой код:

 \begin{scope}[on background layer]
    \node [fill=black!30,fit=(waiting) (critical) (semaphore)
             (leave critical) (enter critical)] {};
  \end{scope}
  • on background layer — на каком слое разместить, т.е. под рисунком
  • \node — рисуем node
  • fill — заполняем ее цветом
  • fit — перечисляем все внутренние node по которым определяем координаты

Настройки стандартных библиотек для рисования сетей PETRI

\begin{tikzpicture}
  [node distance=1.3cm,on grid,>={Stealth[round]},bend angle=45,auto,
   every place/.style= {minimum size=6mm,thick,draw=blue!75,fill=blue!20},
   every transition/.style={thick,draw=black!75,fill=black!20},
   red place/.style= {place,draw=red!75,fill=red!20},
   every label/.style= {red}]

т.е. там уже все определено, поэтому нарисуем все, что уже пытались с использованием библиотеки:

\usetikzlibrary {arrows.meta,petri,positioning}
   \node [place,tokens=1] (w1)                                    {};
   \node [place]          (c1) [below=of w1]                      {};
   \node [place]          (s)  [below=of c1,label=above:$s\le 3$] {};
   \node [place]          (c2) [below=of s]                       {};
   \node [place,tokens=1] (w2) [below=of c2]                      {};

   \node [transition] (e1) [left=of c1] {}
     edge [pre,bend left]                  (w1)
     edge [post,bend right]                (s)
     edge [post]                           (c1);
   \node [transition] (e2) [left=of c2] {}
     edge [pre,bend right]                 (w2)
     edge [post,bend left]                 (s)
     edge [post]                           (c2);
   \node [transition] (l1) [right=of c1] {}
     edge [pre]                            (c1)
     edge [pre,bend left]                  (s)
     edge [post,bend right] node[swap] {2} (w1);
   \node [transition] (l2) [right=of c2] {}
     edge [pre]                            (c2)
     edge [pre,bend right]                 (s)
     edge [post,bend left]  node {2}       (w2);

а это ее более кудрявый друг:

\usetikzlibrary {arrows.meta,petri,positioning}
 \begin{scope}[xshift=6cm]
   \node [place,tokens=1]     (w1')                            {};
   \node [place]              (c1') [below=of w1']             {};
   \node [red place]          (s1') [below=of c1',xshift=-5mm]
           [label=left:$s$]                                    {};
   \node [red place,tokens=3] (s2') [below=of c1',xshift=5mm]
           [label=right:$\bar s$]                              {};
   \node [place]              (c2') [below=of s1',xshift=5mm]  {};
   \node [place,tokens=1]     (w2') [below=of c2']             {};

   \node [transition] (e1') [left=of c1'] {}
     edge [pre,bend left]                  (w1')
     edge [post]                           (s1')
     edge [pre]                            (s2')
     edge [post]                           (c1');
   \node [transition] (e2') [left=of c2'] {}
     edge [pre,bend right]                 (w2')
     edge [post]                           (s1')
     edge [pre]                            (s2')
     edge [post]                           (c2');
   \node [transition] (l1') [right=of c1'] {}
     edge [pre]                            (c1')
     edge [pre]                            (s1')
     edge [post]                           (s2')
     edge [post,bend right] node[swap] {2} (w1');
   \node [transition] (l2') [right=of c2'] {}
     edge [pre]                            (c2')
     edge [pre]                            (s1')
     edge [post]                           (s2')
     edge [post,bend left]  node {2}       (w2');
 \end{scope}

и на финише фон:

  \begin{scope}[on background layer]
    \node (r1) [fill=black!10,rounded corners,fit=(w1)(w2)(e1)(e2)(l1)(l2)] {};
    \node (r2) [fill=black!10,rounded corners,fit=(w1')(w2')(e1')(e2')(l1')(l2')] {};
  \end{scope}

  \draw [shorten >=1mm,->,thick,decorate,
         decoration={snake,amplitude=.4mm,segment length=2mm,
                     pre=moveto,pre length=1mm,post length=2mm}]
    (r1) -- (r2) node [above=1mm,midway,text width=3cm,align=center]
      {replacement of the \textcolor{red}{capacity} by \textcolor{red}{two places}};
\end{tikzpicture}

получим такую красоту:

step13

7.13 - Графики в TIKZ для Latex

Дружелюбный функционал для полной графики в Latex. Картинки, иконки, графики и пр.

Дружелюбный функционал для полной графики в Latex. Картинки, иконки, графики и пр. Очень мощный пакет в котором можно нарисовать все.

Установка пакета

\usepackage{tikz}

Использование пакета

Окружение {tikzpicture} или команды \tikzpicture и \endtikzpicture

coordinate

\documentclass{article} % say
\usepackage{tikz}
\begin{document}
We are working on
\begin{tikzpicture}
  \draw (-1.5,0) -- (1.5,0);
  \draw (0,-1.5) -- (0,1.5);
\end{tikzpicture}.
\end{document}

Нарисует точки в координатах и проведет через них кривую

curve

\begin{tikzpicture}
  \filldraw [gray] (0,0) circle [radius=2pt]
                   (1,1) circle [radius=2pt]
                   (2,1) circle [radius=2pt]
                   (2,0) circle [radius=2pt];
  \draw (0,0) .. controls (1,1) and (2,1) .. (2,0);
\end{tikzpicture}

Цвет

filldraw [gray] — зальет фигуру серым цветом

Кривые

.. controls — укажет контрольные точки для кривой Безье.

Окружность

circle [radius=10pt] — нарисует окружность

нарисуем эллипс

\tikz \draw (0,0) ellipse [x radius=20pt, y radius=10pt];

Поворот рисунка

\draw[rotate=30] — развернет рисунок на 30гр.

нарисуем квадраты

 \draw (0,0) rectangle (0.5,0.5);
 \draw (-0.5,-0.5) rectangle (-1,-1);

Нарисуем сетку

\tikz \draw[step=2pt] (0,0) grid (10pt,10pt);

нарисует сетку козявочку coz

circle

\begin{tikzpicture}
  \draw[step=.5cm,gray,very thin] (-1.4,-1.4) grid (1.4,1.4);
  \draw (-1.5,0) -- (1.5,0);
  \draw (0,-1.5) -- (0,1.5);
  \draw (0,0) circle [radius=1cm];
\end{tikzpicture}

в draw — определим шаг, цвет и толщину линий

Установим настройку стилей по умолчанию

Глобально в переменной Ra grid

\tikzset{Ra grid/.style={help lines,color=blue!50}}

или локально в переменной Karl's grid karlgrid

\begin{tikzpicture}
  [Karl's grid/.style ={help lines,color=#1!50},
   Karl's grid/.default=blue]

  \draw[Karl's grid]     (0,0) grid (1.5,2);
  \draw[Karl's grid=red] (2,0) grid (3.5,2);
\end{tikzpicture}

Толщина линий

  • ultra thin
  • very thin
  • thin
  • semithick
  • thick
  • very thick
  • ultra thick
 \draw[ultra thin] (-1.5,1.1) -- (1.5,1.1);
\draw[very thin] (-1.5,1.6) -- (1.5,1.6);
\draw[thin] (-1.5,2.1) -- (1.5,2.1);
\draw[semithick] (-1.5,2.6) -- (1.5,2.6);
\draw[very thick] (-1.5,3.1) -- (1.5,3.1);
\draw[ultra thick] (-1.5,3.6) -- (1.5,3.6);

lines

\begin{tikzpicture}[line width=5pt] — любая толщина

Стиль линии

  • loosely dashed,
  • densely dashed,
  • loosely dotted,
  • densely dotted
 \draw[loosely dashed, ultra thick] (-1.5,-3.6) -- (1.5,-3.6);
\draw[densely dashed, ultra thick] (-1.5,-3.1) -- (1.5,-3.1);
\draw[loosely dotted, ultra thick] (-1.5,-2.6) -- (1.5,-2.6);
\draw[densely dotted, ultra thick] (-1.5,-2.1) -- (1.5,-2.1);

lines

dash pattern — можно определить сложный паттерн

Нарисуем дугу

arc[start angle=10, end angle=80, radius=10pt]

Элипсоидная дуга

\tikz \draw (0,0)
    arc [start angle=0, end angle=315,
         x radius=1.75cm, y radius=1cm];

Масштабирование

\begin{tikzpicture}[scale=3]
  \draw[step=.5cm,gray,very thin] (-1.4,-1.4) grid (1.4,1.4);
  \draw (-1.5,0) -- (1.5,0);
  \draw (0,-1.5) -- (0,1.5);
  \draw (0,0) circle [radius=1cm];
  \draw (3mm,0mm) arc [start angle=0, end angle=30, radius=3mm];
\end{tikzpicture}

после определения окружения, ставим [scale=3]

Клиппинг

или обрезание рисунка

\clip (-0.1,-0.2) rectangle (1.1,0.75);

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

\begin{tikzpicture}[scale=3]
  \clip (-0.1,-0.2) rectangle (1.1,0.75);
  \draw[step=.5cm,gray,very thin] (-1.4,-1.4) grid (1.4,1.4);
  \draw (-1.5,0) -- (1.5,0);
  \draw (0,-1.5) -- (0,1.5);
  \draw (0,0) circle [radius=1cm];
  \draw (3mm,0mm) arc [start angle=0, end angle=30, radius=3mm];
\end{tikzpicture}

clip

Основные команды рисования

\path[draw, clip] или \path[clip] или \path[draw] — братья по смыслу и к ним же \draw[clip]

Параболы, синусы и изгибы

% чертит параболу в квадрате
\tikz \draw (0,0) rectangle (1,1)  (0,0) parabola (1,1);
% чертит параболу и изгиб, по дороге поменяем размерность координат x и y
\tikz \draw[x=1pt,y=1pt] (0,0) parabola bend (4,16) (6,12);

A sine \tikz \draw[x=1ex,y=1ex] (0,0) sin (1.57,1); curve.

Нарисует прямо в тексте кривулину. A sine (-tikz- diagram) curve.

А вот эта штука покажет, что такое sin и cos на самом деле:

\tikz \draw[x=3.57ex,y=1ex] (0,0) sin (4,1) cos (6,-14) sin (8,12) 

sin

да,именно так — sin поднимаемся, cos — опускаемся

Закрасить пространство

\fill[green!20!white] (0,0) -- (3mm,0mm)
    arc [start angle=0, end angle=30, radius=3mm] -- (0,0);
	
% или сразу рисуем и красим
\filldraw[fill=green!20!white, draw=green!50!black] (0,0) -- (3mm,0mm)
    arc [start angle=0, end angle=30, radius=3mm] -- cycle;

Замыкание контуров

\begin{tikzpicture}[line width=5pt]
  \draw (0,0) -- (1,0) -- (1,1) -- (0,0);
  \draw (2,0) -- (3,0) -- (3,1) -- cycle;
  \useasboundingbox (0,1.5); % make bounding box higher
\end{tikzpicture}

cycle — плавно замкнет контур, похожа на последнюю команду -- (0,0) но работает лучше

Градиент

Команды shade и shadedraw

\begin{tikzpicture}[rounded corners,ultra thick]
  \shade[top color=yellow,bottom color=black] (0,0) rectangle +(2,1);
  \shade[left color=yellow,right color=black] (3,0) rectangle +(2,1);
  \shadedraw[inner color=yellow,outer color=black,draw=yellow] (6,0) rectangle +(2,1);
  \shade[ball color=green] (9,.5) circle (.5cm);
\end{tikzpicture}

shade

Координаты точек

(x,y) — с указанием размерности или по умолчанию в см.

(30:1cm) — полярные координаты 30 градусов и 1 см.

Относительные перемещения

+(x,y) — переместиться относительно последней точки на x и y

++(x,y) — переместить указатель, но ничего не чертить, чертит только команда --.

\begin{tikzpicture}[scale=3]
  \clip (-0.1,-0.2) rectangle (1.1,0.75);
  \draw[step=.5cm,gray,very thin] (-1.4,-1.4) grid (1.4,1.4);
  \draw (-1.5,0) -- (1.5,0);
  \draw (0,-1.5) -- (0,1.5);
  \draw (0,0) circle [radius=1cm];
  \filldraw[fill=green!20,draw=green!50!black] (0,0) -- (3mm,0mm)
      arc [start angle=0, end angle=30, radius=3mm] -- cycle;
  \draw[red,very thick]  (30:1cm) -- +(0,-0.5);
  \draw[blue,very thick] (30:1cm) ++(0,-0.5) -- (0,0);
\end{tikzpicture}

sine

Определяем свои команды

\begin{tikzpicture}
  \def\rectanglepath{-- ++(1cm,0cm)  -- ++(0cm,1cm)  -- ++(-1cm,0cm) -- cycle}
  \draw (0,0) \rectanglepath;
  \draw (1.5,0) \rectanglepath;
\end{tikzpicture}

нарисует два квадратика

или идентично:

\tikz \draw (0,0) rectangle +(1,1)  (1.5,0) rectangle +(1,1);

1,{tan(30)}) — так тоже умеет. Любую функцию для расчета координат.

Координаты по пересекающимся линиям

\path [name path=upward line] (1,0) -- (1,1);
\path [name path=sloped line] (0,0) -- (30:1.5cm);
% Рисуем невидимые пути. \path без атрибутов, просто перемещает указатель
% (добавить библиотеку `\usetikzlibrary{intersections}' после загрузки tikz)
\draw [name intersections={of=upward line and sloped line, by=x}] % нашли точку пересечения и назвали ее x
  [very thick,orange] (1,0) -- (x); % нарисовали линию от (1,0) до точки пересечения

Стрелки

\draw[->] (-1.5,0) -- (1.5,0);
\draw[->] (0,-1.5) -- (0,1.5);

->, <-, <->, <<-, ->>

или использовать специальную библиотеку Documentation arrow

\usetikzlibrary {arrows.meta}
\begin{tikzpicture}[>=Stealth]

Облать видимости

\begin{tikzpicture}[ultra thick]
  \draw (0,0) -- (0,1);
  \begin{scope}[thin]
    \draw (1,0) -- (1,1);
    \draw (2,0) -- (2,1);
  \end{scope}
  \draw (3,0) -- (3,1);
\end{tikzpicture}

Окружение {scope}

Преобразования

xshift=2pt — смещает все точки на 2pt по x

\begin{tikzpicture}[even odd rule,rounded corners=2pt,x=10pt,y=10pt]
  \filldraw[fill=yellow!80!black] (0,0)   rectangle (1,1)
        [xshift=5pt,yshift=5pt]   (0,0)   rectangle (1,1)
                    [rotate=30]   (-1,-1) rectangle (2,2);
\end{tikzpicture}

Самое интересное во всем этом процессе, что когда ты пишешь эти строки и видишь, как все это происходит по настоящему в твоем Latex документе — приходишь в восторг!

xshift и yshift смещают по осям, shift={(1,0)} смещает в точку shift={+(0,0)} или относительную точку.

rotate или rotate around вращают объект относительно точки

scale, xscale, yscale — масштабирует xscale=-1 схлопывает фигуру

xslant, yslant — наклоняет

cm — опция для произвольных преобразований по матрице

Повторения и циклы

Можно использовать независимый пакет для \foreach или он автоматически подключен в Tikz

Синтаксис команды: \foreach ⟨variable⟩ in {⟨list of values⟩} ⟨commands⟩

Пример:

\foreach \x in {1,2,3} {$x =\x$, }

x=1, x=2, x=3,
\begin{tikzpicture}[scale=3]
  \clip (-0.1,-0.2) rectangle (1.1,1.51);
  \draw[step=.5cm,gray,very thin] (-1.4,-1.4) grid (1.4,1.4);
  \filldraw[fill=green!20,draw=green!50!black] (0,0) -- (3mm,0mm)
      arc [start angle=0, end angle=30, radius=3mm] -- cycle;
  \draw[->] (-1.5,0) -- (1.5,0);
  \draw[->] (0,-1.5) -- (0,1.5);
  \draw (0,0) circle [radius=1cm];

  \foreach \x in {-1cm,-0.5cm,0.5cm,1cm}
    \draw [red](\x,-1pt) -- (\x,1pt);
  \foreach \y in {-1cm,-0.5cm,0.5cm,1cm}
    \draw [blue](-1pt,\y) -- (1pt,\y);
\end{tikzpicture}

Поставил меточки на осях координат foreach

\tikz \foreach \x in {1,...,10}
        \draw (\x,0) circle (0.4cm);

еще вариант для диапазона значений: цикл в цикле

\begin{tikzpicture}
  \foreach \x in {1,2,...,5,7,8,...,12}
    \foreach \y in {1,...,5}
    {
      \draw (\x,\y) +(-.5,-.5) rectangle ++(.5,.5);
      \draw (\x,\y) node{\x,\y};
    }
\end{tikzpicture}

node

Nodes

\begin{tikzpicture}
  \draw (0,0) rectangle (2,2);
  \draw (0.5,0.5) node [fill=yellow!80!black]
                       {Text at \texttt{node 1}}
     -- (1.5,1.5) node {Text at \texttt{node 2}};
\end{tikzpicture}

любой текст или все что нам нужно можно вставить в Node и поместить в нужную точку координат рисунка

Фон можно закрасить [fill=white] node2

Якоря по сторонам света

На всех рисунках есть якоря со сторонами света:

  • north
  • south
  • east
  • west

и их комбинации anchor=south west и т.д.

above rigth тоже, что south west

below=1pt — можно задавать смещение

\usetikzlibrary {intersections}
\begin{tikzpicture}[scale=3]
  \clip (-2,-0.2) rectangle (2,0.8);
  \draw[step=.5cm,gray,very thin] (-1.4,-1.4) grid (1.4,1.4);
  \filldraw[fill=green!20,draw=green!50!black] (0,0) -- (3mm,0mm)
    arc [start angle=0, end angle=30, radius=3mm] -- cycle;
  \draw[->] (-1.5,0) -- (1.5,0) coordinate (x axis);
  \draw[->] (0,-1.5) -- (0,1.5) coordinate (y axis);
  \draw (0,0) circle [radius=1cm];

  \draw[very thick,red]
    (30:1cm) -- node[left=1pt,fill=white] {$\sin \alpha$} (30:1cm |- x axis);
  \draw[very thick,blue]
    (30:1cm |- x axis) -- node[below=2pt,fill=white] {$\cos \alpha$} (0,0);
  \path [name path=upward line] (1,0) -- (1,1);
  \path [name path=sloped line] (0,0) -- (30:1.5cm);
  \draw [name intersections={of=upward line and sloped line, by=t}]
    [very thick,orange] (1,0) -- node [right=1pt,fill=white]
    {$\displaystyle \tan \alpha \color{black}=
      \frac{{\color{red}\sin \alpha}}{\color{blue}\cos \alpha}$} (t);

  \draw (0,0) -- (t);

  \foreach \x/\xtext in {-1, -0.5/-\frac{1}{2}, 1}
    \draw (\x cm,1pt) -- (\x cm,-1pt) node[anchor=north,fill=red!20] {$\xtext$};
  \foreach \y/\ytext in {-1, -0.5/-\frac{1}{2}, 0.5/\frac{1}{2}, 1}
    \draw (1pt,\y cm) -- (-1pt,\y cm) node[anchor=east,fill=red!20] {$\ytext$};
\end{tikzpicture}

node3

Текст по контуру

\begin{tikzpicture}
  \draw (0,0) .. controls (6,1) and (9,1) ..
    node[near start,sloped,above] {near start}
    node {midway}
    node[very near end,sloped,below] {very near end} (12,0);
\end{tikzpicture}

text

Полностью пример

\begin{tikzpicture}
  [scale=3,line cap=round,
  % Styles
  axes/.style=,
  important line/.style={very thick},
  information text/.style={rounded corners,fill=red!10,inner sep=1ex}]

  % Colors
  \colorlet{anglecolor}{green!50!black}
  \colorlet{sincolor}{red}
  \colorlet{tancolor}{orange!80!black}
  \colorlet{coscolor}{blue}

  % The graphic
  \draw[help lines,step=0.5cm] (-1.4,-1.4) grid (1.4,1.4);

  \draw (0,0) circle [radius=1cm];

  \begin{scope}[axes]
    \draw[->] (-1.5,0) -- (1.5,0) node[right] {$x$} coordinate(x axis);
    \draw[->] (0,-1.5) -- (0,1.5) node[above] {$y$} coordinate(y axis);

    \foreach \x/\xtext in {-1, -.5/-\frac{1}{2}, 1}
      \draw[xshift=\x cm] (0pt,1pt) -- (0pt,-1pt) node[below,fill=white] {$\xtext$};

    \foreach \y/\ytext in {-1, -.5/-\frac{1}{2}, .5/\frac{1}{2}, 1}
      \draw[yshift=\y cm] (1pt,0pt) -- (-1pt,0pt) node[left,fill=white] {$\ytext$};
  \end{scope}

  \filldraw[fill=green!20,draw=anglecolor] (0,0) -- (3mm,0pt)
    arc [start angle=0, end angle=30, radius=3mm];
  \draw (15:2mm) node[anglecolor] {$\alpha$};

  \draw[important line,sincolor]
    (30:1cm) -- node[left=1pt,fill=white] {$\sin \alpha$} (30:1cm |- x axis);

  \draw[important line,coscolor]
    (30:1cm |- x axis) -- node[below=2pt,fill=white] {$\cos \alpha$} (0,0);

  \path [name path=upward line] (1,0) -- (1,1);
  \path [name path=sloped line] (0,0) -- (30:1.5cm);
  \draw [name intersections={of=upward line and sloped line, by=t}]
    [very thick,orange] (1,0) -- node [right=1pt,fill=white]
    {$\displaystyle \tan \alpha \color{black}=
      \frac{{\color{red}\sin \alpha}}{\color{blue}\cos \alpha}$} (t);

  \draw (0,0) -- (t);

  \draw[xshift=1.85cm]
    node[right,text width=6cm,information text]
    {
      The {\color{anglecolor} angle $\alpha$} is $30^\circ$ in the
      example ($\pi/6$ in radians). The {\color{sincolor}sine of
        $\alpha$}, which is the height of the red line, is
      \[
      {\color{sincolor} \sin \alpha} = 1/2.
      \]
      By the Theorem of Pythagoras ...
    };
\end{tikzpicture}

Для node задали ширину текста text width=6cm

Макросы

\usetikzlibrary {angles,quotes}
\begin{tikzpicture}[scale=3]
  \coordinate (A) at (1,0);
  \coordinate (B) at (0,0);
  \coordinate (C) at (30:1cm);

  \draw (A) -- (B) -- (C)
        pic [draw=green!50!black, fill=green!20, angle radius=9mm,
             "$\alpha$"] {angle = A--B--C};
\end{tikzpicture}

Команда pic создает макрос для последующего использования кода.

8 - Пакет Xcolor и colortbl

Обзор документации пакетов Xcolor и colortbl

Пакет xcolor и colortbl - управление цветами в LaTeX

Установка и базовое использование

\usepackage{xcolor} % Основной пакет для работы с цветами
\usepackage[table]{xcolor} % Альтернативный вариант с загрузкой colortbl
% или
\usepackage{colortbl} % Пакет для цветных таблиц

Цветовые модели

Пакет поддерживает несколько цветовых моделей:

Модель Компоненты Диапазон значений
rgb red, green, blue [0, 1] для каждого
cmyk cyan, magenta, yellow, black [0, 1] для каждого
gray оттенки серого [0, 1]
HTML RRGGBB 000000 до FFFFFF
RGB Red, Green, Blue 0-255 для каждого

Предопределенные цвета

Базовые цвета:

red, green, blue, cyan, magenta, yellow, black, white, gray, darkgray, lightgray

Дополнительные цвета:

brown, lime, olive, orange, pink, purple, teal, violet

Расширенные палитры:

\usepackage[dvipsnames]{xcolor} % 68 CMYK цветов
\usepackage[svgnames]{xcolor} % 151 RGB цвет
\usepackage[x11names]{xcolor} % 317 RGB цветов

Основные команды

Определение цветов

\definecolor{myred}{rgb}{1,0,0} % Чистый красный
\definecolor{mygray}{gray}{0.5} % Серый 50%
\definecolor{myblue}{HTML}{1F77B4} % Синий в HEX

Изменение существующих цветов

\colorlet{lightblue}{blue!20} % Светло-синий (20% от blue)
\colorlet{darkred}{red!80!black} % Темно-красный

Использование цветов

\textcolor{red}{Красный текст} % Цвет текста
\colorbox{yellow}{Желтый фон} % Фон текста
\fcolorbox{blue}{white}{Рамка} % Рамка и фон

Работа с таблицами (colortbl)

\begin{tabular}{|>{\columncolor{yellow!20}}c|c|}
\hline
\rowcolor{blue!10} 
Заголовок 1 & Заголовок 2 \\
\hline
Ячейка 1 & \cellcolor{green!20}Ячейка 2 \\
\hline
\end{tabular}

Смешивание цветов

\color{red!50!blue} % Фиолетовый (50% красного + 50% синего)
\color{green!40!white!60} % Светло-зеленый

Прозрачность (требует pdfTeX или LuaTeX)

\textcolor{red!50}{Полупрозрачный текст}

Примеры использования

Цветной текст с рамкой:

\fcolorbox{black}{yellow!30}{
  \textcolor{blue!80!black}{
    Важное сообщение!
  }
}

Градиентный фон:

\colorlet{startcolor}{red!20}
\colorlet{endcolor}{red!60}
\colorlet{middlecolor}{red!40}

\begin{tabular}{|p{3cm}|}
\arrayrulecolor{white}
\hline
\rowcolor{startcolor} Строка 1 \\
\rowcolor{middlecolor} Строка 2 \\
\rowcolor{endcolor} Строка 3 \\
\hline
\end{tabular}

Цветные математические формулы:

\[
\textcolor{blue}{E} = \textcolor{red}{m}\textcolor{green}{c^2}
\]

\[
\colorbox{yellow!20}{
  \color{blue}
  \int_a^b f(x)dx
}
\]

Советы

  1. Для документов, которые будут печататься, используйте CMYK цвета
  2. Для веб-документов лучше подходят RGB/HTML цвета
  3. Используйте мягкие цвета (!20-!40) для фонов
  4. Сохраняйте контраст между текстом и фоном
  5. Для сложных таблиц используйте \rowcolors из xcolor
\rowcolors{1}{blue!10}{white} % Чередование цветов строк
\begin{tabular}{cc}
A & B \\ 
C & D \\
E & F \\
\end{tabular}

Этот пакет предоставляет полный контроль над цветами в вашем LaTeX документе, от простого окрашивания текста до сложного оформления таблиц и математических формул.

9 - Пакет longtable

Применение longtable с тонкими настройками в Latex

Пакет Longtable

Размещение пакета

https://ctan.org/pkg/longtable

Официальная документация

https://mirror.macomnet.net/pub/CTAN/macros/latex/required/tools/longtable.pdf

Установка

\usepackage{longtable} %собственно сам пакет для работы с таблицами
\usepackage{xcolor} %чтобы работать с цветами
\usepackage{colortbl} %чтобы работать с цветными таблицами

Особенности

Полная приемственность от tabular и tabularx, поэтому можно только им и пользоваться.

Очень понадобятся первоначальные настройки для формата таблицы

\newcolumntype{C}[1]{>{\columncolor{white}\ttfamily\centering\arraybackslash}p{#1cm}}
\newcolumntype{R}[1]{>{\columncolor{white}\ttfamily\raggedleft\arraybackslash}p{#1cm}}
\newcolumntype{L}[1]{>{\columncolor{white}\ttfamily\raggedright\arraybackslash}p{#1cm}}
\newcolumntype{B}[1]{>{\columncolor{white}\ttfamily\bfseries\raggedright\arraybackslash}p{#1cm}}

\renewcommand{\tabcolsep}{0.05cm}
\renewcommand{\arraystretch}{1.7}

\newcolumntype похожа на \newcommand но только для настройки таблиц. Работает со всеми пакетами расширяющие стандартый пакет таблиц: xtab, xtabular, tabularx и longtable.

https://ctan.org/pkg/tabularx https://mirror.truenetwork.ru/CTAN/macros/latex/required/tools/tabularx.pdf

оттуда и возьмем описание команд:

\arraybackslash

\raggedright, \raggedleft, \centering — после этих команд изменяется поведение команды \\ и \\*, вот, чтобы этого не произошло и применяем команду \arraybackslash.

>{\raggedright\arraybackslash}X

\newcolumntype

определяет новые параметры колонки и назначает их переменной Y или какую напишем, но только из одной буквы. Мне алфавита хватало всегда. \newcolumntype{Y}{>{\small\raggedright\arraybackslash}X}

после знака {> пишем любые команды для определения шрифта, цвета, выравнивания и т.д. Обычно это удобно связывать с шириной колонки и передавать значение через переменную в p{#1}.

Количество переменных может быть любое, главное в них самому не запутаться.

После определения новых типов колонок их можно использовать в заголовке описания таблицы наравне с lcrpm

\tabularxcolumn

Изменяет тип колонки X

\newcommand{\tabularxcolumn}[1]{p{#1}} — соответствует \parbox[t] — и определено по умолчанию \renewcommand{\tabularxcolumn}[1]{>{\small}m{#1}} — соответствует \parbox[m] — контент выравнивается по центру и типа так я могу переопределить, но у меня ничего не получилось, зато мои настройки \newcolumn работают шикарно.

ширина колонки

Умный Latex по умолчанию всегда пытается создать одинаковые колонки с размером \hsize, но мы можем переопределить пропорционально ширину каждой колонки. Первая будет половина от стандартной ширины, а вторая в 3 раза больше.

{>{\hsize=.5\hsize\linewidth=\hsize}X >{\hsize=1.5\hsize\linewidth=\hsize}X}

Дальше tabularx упрощает работы со сносками. Но я на этом пакете заканчиваю и перехожу к longtable.

Сделал себе мастер таблицу и закатал в yasnippet

# -*- mode: snippet -*-
# name: longtable
# key: longtable
# --
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%LONGTABLE
\begin{center}
\rowcolors{2}{gray!10}{white} \\arrayrulecolor{gray!20} %раскрасим в два цвета строки
\begin{longtable}{c|c} %описание таблицы

%%%%%%%%%%%%%%% заголовок на первой странице
\caption[Название таблицы короткое]{Название таблицы длинное\label{tab:}}\\\
\rowcolor{blue!40} %раскрасим заголовок таблицы
\multicolumn{1}{c}{Наименование} % название первой колонки
& \multicolumn{1}{c}{Описание} % название второй колонки
% при большем количестве колонок последнюю строчку повторить столько же раз
% готовый раздел скопировать в раздел Заголовок на второй странице
\endfirsthead % конец заголовка
%%%%%%%%%%%%%%%%% конец заголовка на первой странице

%%%%%%%%%%%%%%% Заголовок на второй странице
\caption{продолжение таблицы на следующей странице}\\\
\rowcolor{blue!40}
\multicolumn{1}{c}{Наименование}
& \multicolumn{1}{c}{Описание}
\endhead %конец заголовка
%%%%%%%%%%%%%%%%% конец заголовка на второй странице

%%%%%%%%%%%%%%%%%%%%% BODY TABLE
Первый & Второй\\\\
Третий & Четвертый\\\\
%%%%%%%%%%%%%%%%%%%%%

\end{longtable}
\end{center}

table

Команды для высоты строк и отступов между колонками

\renewcommand{\tabcolsep}{0.05cm}
\renewcommand{\arraystretch}{1.7}
  • первая определит отступ между колонками
  • вторая высоту строк в таблице

[!INFO] Собственно мне всего перечисленного хватало практически на 90% всех таблиц.

Длина таблицы на странице

По умолчанию длина таблицы 20 строк, но можно изменить с помощью команты

\setcounter{LTchunksize}{10}

и будет 10!

Изменить нумерацию таблиц

\renewcommand\LTcaptype{⟨counter ⟩}

  1. У таблицы могут быть первый Header и после его описания нужно поставить \endfirsthead
  2. После определения заголовков на 2-й и следующих таблицах поставить \endhead.
  3. Если таблица на одной странице, то пункт 2 не нужен.
  4. \endfoot также заканчивает описание последней строки таблицы на странице
  5. \endlastfoot описывает последнюю строку таблицы

\сaption

\caption{...} команда эквивалентна \multicolumn{n}{c}{\parbox{\LTcapwidth}{…}} она просто объединяет все колонки и пишется как полноценная строка таблицы.

\caption[Опциональное имя, используется в списке таблиц]{Полноценное имя таблицы\label{long}}.

\multicolumn

объединяет колонки \multicolumn{numcols}{cols}{text}

  1. количество объединяемых колонок
  2. формат колонок lcrmp
  3. Собственно текст в этой ячейке с применением всех возможных комманд и боксов, а также \multirow для объединения строк. Но для нее нужно подключить пакет \usepackage{multirow}

\kill

делаем строку для определения ширины столбцов и вместо \\ ставим \kill. Строка не будет отображаться в таблице, но ширину настроит.

Выравнивание таблицы на странице

LTleft и LTright

\setlength\LTleft\parindent 
\setlength\LTright\fill

устанавливаем отступ для всей таблицы слева и справа, но один параметр нужно сотавлять тягучим \fill

\setlength\LTleft{0pt} 
\setlength\LTright{0pt} 
\begin{longtable}{@{\extracolsep{...}}...}

\extracolsep — делает резиновым столбец.

Сводная таблица

Параметры

\LTleft Glue to the left of the table. (\fill)
\LTright Glue to the right of the table. (\fill)
\LTpre Glue before the table. (\bigskipamount)
\LTpost Glue after the table. (\bigskipamount)
\LTcapwidth The width of a parbox containing the caption. (4in)
\LTchunksize The number of rows per chunk. (20)

Optional arguments to \begin{longtable}

none Position as specified by \LTleft and \LTright.
[c] Centre the table.
[l] Place the table flush left.
[r] Place the table flush right.

Commands to end table rows

\ Specifies the end of a row
\\[⟨dim⟩] Ends row, then adds vertical space (as in the tabular environment).
\\* The same as \ but disallows a page break after the row.
\tabularnewline Alternative to \\ for use in the scope of \raggedright and similar commands that redefine \\.
\kill Row is ‘killed’, but is used in calculating widths.
\endhead Specifies rows to appear at the top of every page.
\endfirsthead Specifies rows to appear at the top of the first page.
\endfoot Specifies rows to appear at the bottom of every page.
\endlastfoot Specifies rows to appear at the bottom of the last page.

Longtable caption commands

\caption{⟨caption⟩} Caption ‘Table ?: ⟨caption⟩’, and a ‘⟨caption⟩’ entry in the list of tables.
\caption[⟨lot⟩]{⟨caption⟩} Caption ‘Table ?: ⟨caption⟩’, and a ‘⟨lot⟩’ entry in the list of tables.
\caption[]{⟨caption⟩} Caption ‘Table ?: ⟨caption⟩’, but no entry in the list of tables.
\caption*{⟨caption⟩} Caption ‘⟨caption⟩’, but no entry in the list of tables.

Commands available at the start of a row

\pagebreak Force a page break.
\pagebreak[⟨val ⟩] A ‘hint’ between 0 and 4 of the desirability of a break.
\nopagebreak Prohibit a page break.
\nopagebreak[⟨val ⟩] A ‘hint’ between 0 and 4 of the undesirability of a break.
\newpage Force a page break.

Footnote commands available inside longtable

\footnote Footnotes, but may not be used in the table head & foot.
\footnotemark Footnotemark, may be used in the table head & foot.
\footnotetext Footnote text, use in the table body.

Setlongtables

\setlongtables Obsolete command. Does nothing now.

Multirow замолвите слово

Объединяет строки в таблице

Подключить через команду

\usepackage{multirow}

\multirow[〈vpos 〉]{〈nrows 〉}[〈bigstruts 〉]{〈width 〉}[〈vmove 〉]{〈text 〉}

  • vpostcb выравнивает текст в общей ячейке по [t] [c] [b] (необязательный параметр)
  • nrows — количество строк
  • bigstruts — это распорки или больше похоже на заполнение текста (я не использовал)
  • width — ширина ячейки с текстом. Обычно (*), но если используем \multirow то не все колонки могут быть заполнены текстом
  • vmove — это как \raisebox — поднимает текст вверх или вниз. Удобная штука. Можно отрицательные и положительные значения.
  • text — собственно сам текст

\multicolumn{2}{c}{\multirow{3}{*}{Multi-multi}} — с multirow использовать только в таком порядке, а не наоборот.

[!NOTE] В этом пакете еще есть утилиты для работы с большими скобками на объединенные строки.

10 - Newfont

Моя история подключения различных шрифтов в Latex

Удивительное путешествие в мир создания интегрированных шрифтов в Latex

История началась с французской компании, которая попросила меня написать несколько документаций на свои изделия.

Так как я сначала подумал,что отделаюсь легким испугом, то первую работу сделал в XARA. Замечательный редактор, но когда в моем документе перевалило за 50 страниц, я понял, что ошибся с выбором инструмента.

Потом было несколько документов по 4-8 страниц. Что не составило проблем сделать в XARA.

Но когда дело дошло до очередного 80-ти страничного документа, я решил просто сделать в Latex.

Эта компания использовала свои фирменные шрифты, поэтому шрифты скачал в интернет, подключил модуль \usepackage{fontspec} и вуаля!!!

\setmainfont{AllRoundGothic-Book}[
  BoldFont = AllRoundGothic-Bold ,
  ItalicFont = AllRoundGothic-BookOblique ]
\setsansfont{AllRoundGothic-XLig}
\setmonofont{Calibri}[
Extension = .ttf ,
BoldFont = Calibri_bold]      % задаёт \sffamily, шрифт без засечек

Настроил цвета через пакет \usepackage{xcolor}

%%%%%%%%% COLOR %%%%%%%%%%%%%%%5
\definecolor{BleuProfond}{RGB}{7,29,73}%#071D49
\definecolor{BleuLBA}{RGB}{65,182,230}
\definecolor{GrisA}{RGB}{37,40,42}
\definecolor{GrisC}{RGB}{178,180,178}

Подключил нужные раскладки и настроил свои fontfamily

\newfontfamily\boldfont{AllRoundGothic-Bold}
\newfontfamily\demifont{AllRoundGothic-Demi}
\newfontfamily\demifontwhite{AllRoundGothic-Demi}[Color = white]
\newfontfamily\mediumfont{AllRoundGothic-Medium}
\newfontfamily\boldfontbleu{AllRoundGothic-Bold}[Color = BleuProfond]
\newfontfamily\boldfontlba{AllRoundGothic-Bold}[Color = BleuLBA]
\newfontfamily\boldfontwhite{AllRoundGothic-Bold}[Color = white]

\newfontfamily\lc[Scale=MatchLowercase]{AllRoundGothic-Demi}[Color = BleuProfond]
\newfontfamily\uc[Scale=MatchUppercase]{AllRoundGothic-Demi}
\newfontfamily\ac[Scale=MatchAveragecase]{AllRoundGothic-Demi}
\newfontfamily\numamco{Calibri}

Собственно все!

Дальше рутина по созданию стиля страницы. Очень приятный XELATEX с которым мы достаточно быстро справились с поставленной задачей (убрал только привычный мне %\usepackage{hyperref}), потому-что на него странно ругался компилятор. (вычислил эксперементально).

Но все мои познания подключения шрифтов начались тогда, когда заказчик попросил сделать оглавление кликабельное с возможностью переходить по ссылкам на страницы.

Оказывается не XELATEX не LUALATEX при всей своей красоте поддержки TrueType шрифтов напрямую, отказываются работать с \usepackage[xetex]{hyperref} даже в таком варианте.

Копирую шрифты в папку проекта

Есть варианты создать свою структуру и прописать настройки к ней, но в этом варианте я ограничиваюсь настройкой в рабочей директории.

Подключать буду три шрифта:

- AllRoundGothic-Bold.ttf 
- AllRoundGothic-Book.ttf 
- AllRoundGothic-Demi.ttf 

Подготовительные мероприятия

Нахожу в Latex (T1-WGL4.enc) на Manjaro он спрятался в /opt/texlive/2024/texmf-dist/fonts/enc/ttf2pk/base

Его тоже копирую в рабочуюдиректорию, чтобы ничего не потерялось. Для кирилических шрифтов копируем T2A.enc, он находится по соседству: /opt/texlive/2024/texmf-dist/fonts/enc/t2.

Теперь все готово для подключения.

Создаю TeX Font Metrics (tfm)

Файлы с расширением tfm хранят необработанные шрифты, а файлы vpl виртуальные шрифты.

ttf2tfm AllRoundGothic-Demi.ttf -q -T T1-WGL4.enc -v ecAllRoundGothic-Demi.vpl recAllRoundGothic-Demi.tfm >> ttfonts.map
ttf2tfm AllRoundGothic-Bold.ttf -q -T T1-WGL4.enc -v ecAllRoundGothic-Bold.vpl recAllRoundGothic-Bold.tfm >> ttfonts.map
ttf2tfm AllRoundGothic-Book.ttf -q -T T1-WGL4.enc -v ecAllRoundGothic-Book.vpl recAllRoundGothic-Dook.tfm >> ttfonts.map

Можно посмотреть в ttfont.map, должно получиться что-то вроде:

recAllRoundGothic-Bold   AllRoundGothic-Bold.ttf Encoding=T1-WGL4.enc
recAllRoundGothic-Book   AllRoundGothic-Book.ttf Encoding=T1-WGL4.enc
recAllRoundGothic-Demi   AllRoundGothic-Demi.ttf Encoding=T1-WGL4.enc

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

ttf2tfm AllRoundGothic-Book.ttf -q -T T1-WGL4.enc -s .167 -v ecAllRoundGothic-Book.vpl recAllRoundGothic-Dook.tfm >> ttfonts.map

Но я так не делал, потому-что было не нужно.

Создаю Virtual Fonts (vf)

vptovf ecAllRoundGothic-Demi.vpl ecAllRoundGothic-Demi.vf ecAllRoundGothic-Demi.tfm                                     
vptovf ecAllRoundGothic-Bold.vpl ecAllRoundGothic-Bold.vf ecAllRoundGothic-Bold.tfm                                     
vptovf ecAllRoundGothic-Book.vpl ecAllRoundGothic-Book.vf ecAllRoundGothic-Book.tfm                                     

Но если бы я создавал какой-нибудь times, то нужно было создавать по всем законам толстые, наклонные и т.д.

vptovf ectimes.vpl ectimes.vf ectimes.tfm
vptovf ectimesi.vpl ectimesi.vf ectimesi.tfm
vptovf ectimesbd.vpl ectimesbd.vf ectimesbd.tfm
vptovf ectimesbi.vpl ectimesbi.vf ectimesbi.tfm
vptovf ectimeso.vpl ectimeso.vf ectimeso.tfm
vptovf ectimesbdo.vpl ectimesbdo.vf ectimesbdo.tfm

Что имеем по итогу?

-rw-r--r-- 1 edge edge     555 ноя 12 16:31 ecAllRoundGothic-Bold.log
-rw-r--r-- 1 edge edge    1792 ноя 12 16:26 ecAllRoundGothic-Bold.tfm
-rw-r--r-- 1 edge edge    1784 ноя 12 16:26 ecAllRoundGothic-Bold.vf
-rw-r--r-- 1 edge edge   22500 ноя 12 16:19 ecAllRoundGothic-Bold.vpl
-rw-r--r-- 1 edge edge    1780 ноя 12 16:26 ecAllRoundGothic-Book.tfm
-rw-r--r-- 1 edge edge    1784 ноя 12 16:26 ecAllRoundGothic-Book.vf
-rw-r--r-- 1 edge edge   22365 ноя 12 16:20 ecAllRoundGothic-Book.vpl
-rw-r--r-- 1 edge edge    1788 ноя 12 16:25 ecAllRoundGothic-Demi.tfm
-rw-r--r-- 1 edge edge    1784 ноя 12 16:25 ecAllRoundGothic-Demi.vf
-rw-r--r-- 1 edge edge   22434 ноя 12 16:21 ecAllRoundGothic-Demi.vpl

del *.vpl они нам больше не нужны. Из них создали *.vf

Дальше размещаем по структурам каталогов Latex для постоянного использования или ничего не делаем, а все храним в рабочей папке. И все будет работать.

Вместо заключения

В latex вставляем такие простые вещи:

\font\myfont=ecAllRoundGothic-Bold
\font\mybigfont=ecAllRoundGothic-Bold at 36pt
\font\bookfont=ecAllRoundGothic-Book
\font\demifont=ecAllRoundGothic-Demi
\myfont Hello, I am being typeset in AllRoundGothic

\mybigfont Me too...

или назначаем по умолчанию, как описывал раньше.

Но, получаем:

itog

Для постоянного использования шрифта

Создаем файл .fd я этого не делал, но из образца записываю. Там подключали times.

\ProvidesFile{t1tnr.fd}[Put your description of font here]

\DeclareFontFamily{T1}{tnr}{}

\DeclareFontShape{T1}{tnr}{b}{n}{<->ectimesbd}{}
\DeclareFontShape{T1}{tnr}{b}{sl}{<-> ectimesbdo}{}
\DeclareFontShape{T1}{tnr}{b}{it}{<-> ectimesbi}{}

\DeclareFontShape{T1}{tnr}{m}{n}{<-> ectimes}{}
\DeclareFontShape{T1}{tnr}{m}{sl}{<-> ectimeso}{}
\DeclareFontShape{T1}{tnr}{m}{it}{<-> ectimesi}{}

\DeclareFontShape{T1}{tnr}{bx}{n}{<->ssub * tnr/b/n}{}
\DeclareFontShape{T1}{tnr}{bx}{sl}{<->ssub * tnr/b/sl}{}
\DeclareFontShape{T1}{tnr}{bx}{it}{<->ssub * tnr/b/it}{}

\endinput

Затем использование в документе будет выглядеть:

documentclass{article}
\begin{document}
\usefont{T1}{tnr}{m}{sl} 

Hello, I am being typeset in Times New Roman Slanted 

\end{document}

Или прописать прямо в преамбуле

\documentclass{article}

\renewcommand{\encodingdefault}{T1}
\renewcommand{\rmdefault}{tnr}

\begin{document}

Hello, I am being typeset in \textsl{Times New Roman Slanted} 

\end{document}

Проверяем:

pdftex story

This is pdfTeX, Version 3.141592653-2.6-1.40.26 (TeX Live 2024) (preloaded format=pdftex)
 restricted \write18 enabled.
entering extended mode
(/opt/texlive/2024/texmf-dist/tex/plain/knuth-lib/story.tex [1{/opt/texlive/202
4/texmf-var/fonts/map/pdftex/updmap/pdftex.map}])

*\bye

Подключение шрифтов Adobe (afm)

Создаем afm шрифты

ttf2afm -e T1-WGL4.enc -o rectimes.afm times.ttf
ttf2afm -e T1-WGL4.enc -o rectimesi.afm timesi.ttf
ttf2afm -e T1-WGL4.enc -o rectimesbd.afm timesbd.ttf
ttf2afm -e T1-WGL4.enc -o rectimesbi.afm timesbi.ttf

Создаем tfm и map

afm2tfm rectimes.afm -T T1-WGL4.enc rectimes.tfm >>winfonts.map
afm2tfm rectimesi.afm -T T1-WGL4.enc rectimesi.tfm >>winfonts.map
afm2tfm rectimesbd.afm -T T1-WGL4.enc rectimesbd.tfm >>winfonts.map
afm2tfm rectimesbi.afm -T T1-WGL4.enc rectimesbi.tfm >>winfonts.map
afm2tfm rectimes.afm -T T1-WGL4.enc -s .167 rectimeso.tfm >>winfonts.map
afm2tfm rectimesbd.afm -T T1-WGL4.enc -s .167 rectimesbdo.tfm >>winfonts.map

Редактируем map файл

rectimes TimesNewRomanPSMT " T1Encoding ReEncodeFont " <times.ttf T1-WGL4.enc
rectimesi TimesNewRomanPS-ItalicMT " T1Encoding ReEncodeFont " <timesi.ttf T1-WGL4.enc
rectimesbd TimesNewRomanPS-BoldMT " T1Encoding ReEncodeFont " <timesbd.ttf T1-WGL4.enc
rectimesbi TimesNewRomanPS-BoldItalicMT " T1Encoding ReEncodeFont " <timesbi.ttf T1-WGL4.enc
rectimeso TimesNewRomanPSMT " .167 SlantFont T1Encoding ReEncodeFont " <times.ttf T1-WGL4.enc
rectimesbdo TimesNewRomanPS-BoldMT " .167 SlantFont T1Encoding ReEncodeFont " <timesbd.ttf T1-WGL4.enc

Далее можно разложить по правильным директориям или оставить в рабочей дирректории.

У Latex есть много своих встроенных шрифтов

Подключаем

\usepackage{DejaVuSans}
\renewcommand*\familydefault{\sfdefault} 

и пользуемся без геммороя.

11 - Pdfpages

Вдруг понадобилось вставить титульную страницу, сделанную на XARA. Пришлось подключить пакет pdfpages

Подключение пакета

Для установки пакета в преамбуле документа пишем:

\usepackage[⟨options ⟩]{pdfpages}

Родная документация

https://mirror.macomnet.net/pub/CTAN/macros/latex/contrib/pdfpages/pdfpages.pdf

Сам пакет на SPAN

https://ctan.org/pkg/pdfpages

Опции при подключении

⟨option⟩

  • final: режим по умолчанию, вставляет страницы в документ
  • draft: не вставляет страницу, но вставляет ссылку в боксе
  • demo: вставляет пустую страницу
  • nodemo: отключает демо

Вставка документа

\includepdf[⟨key=val ⟩]{⟨filename⟩}

Вставляет файл где укажешь.

Key=val могут быть различными.

Если нужно вставить избранные страницы, используем ключ page

pages={3,5,6,8})
pages={4-9}
pages={3,{},8-11,15}

nup — укладывает логические страницы на лист (что-то вроде микространиц) nup=⟨xnup⟩x⟨ynup⟩

landscape=false — по умолчанию, но можно развернуть, если нужно

и еще куча всяких опций для какого-то боловства. Мне пока хватает этого.

12 - Titleps

Оформление стилей страниц, заголовков и оглавления. Продвинутый пакет. Оставляю его для настроек различных стилей документов.

Совместно с TITLESEC бомбическая штука по настройке стилей страниц. Обзор документации.

Пакет TITLEPS

Установка пакета

Для установки пакета в преамбуле документа пишем:

\usepackage[pagestyles]{titlesec}

Страница репозитория

https://ctan.org/pkg/titleps

Документация

https://mirror.truenetwork.ru/CTAN/macros/latex/contrib/titlesec/titleps.pdf

Определение стиля страницы

\newpagestyle{⟨name⟩}[⟨global-style⟩]{⟨commands⟩} 

\renewpagestyle{⟨name⟩}[⟨global-style⟩]{⟨commands⟩}

Они их почему-то называют верхние и нижние команды.

\sethead[⟨even-left⟩][⟨even-center⟩][⟨even-right⟩] {⟨odd-left⟩}{⟨odd-center⟩}{⟨odd-right⟩}

\setfoot[⟨even-left⟩][⟨even-center⟩][⟨even-right⟩] {⟨odd-left⟩}{⟨odd-center⟩}{⟨odd-right⟩}

А теперь по-порядку.

Все — т.е четные, это не обязательные параметры, а — обязательные.

— верх левый четной страницы.

Первая группа комманд

– \thechapter, \thesection, \thesubsection. . . --- печатают номера заголовков
– \chaptertitle, \sectiontitle, \subsectiontitle. . . --- печатают наименования заголовков  
– (только для titlesec) \ifthechapter{⟨true⟩}{⟨false⟩}, \ifthesection{⟨true⟩}{⟨false⟩}, \ifthesubsection{⟨true⟩}{⟨false⟩}. . . --- проверяют где сейчас находится страница  
– любые другие команды

Вторая группа комманд

относится ко всему, что есть на странице: - \thepage - другие не включенные в первую группу

Установка MARKSов

\settitlemarks{⟨level-name⟩,⟨sublevel-name⟩,⟨subsublevel-name⟩...}

\settitlemarks*{⟨level-name⟩,⟨sublevel-name⟩,⟨subsublevel-name⟩...}

Устанавливает, какие команды ...title должны быть определены и когда выдаются метки; допускается любое количество уровней (1, 2, 3…). Например, \settitlemarks{chapter,section}

Установка RULES

\headrule 
\footrule 
\setheadrule{⟨length⟩} 
\setfootrule{⟨length⟩}

линии будут проведены под или над калантитулом

Установка отступов RULES

\makeheadrule 
\makefootrule

\renewcommand{\makeheadrule}{\rule[-.3\baselineskip]{\linewidth}{⟨dim⟩}}

Этот пример из документации создаст две линнии в HEADER

\renewcommand{\makeheadrule}{% 
\makebox[0pt][l]{\rule[.7\baselineskip]{\linewidth}{0.8pt}}% 
\color[named]{Red}% 
\rule[-.3\baselineskip]{\linewidth}{0.4pt}}

\markboth and \markleft

В документации целая дискуссия по поводу не нужности \markboth и что достаточно \markleft.

Пока не вдаюсь в подробности, но в пакете есть функция \setmarkboth{⟨code-to-use⟩}, чтобы переопределить markboth.

Headline/footline ширина

\widenhead[⟨even-left⟩][⟨even-right⟩]{⟨odd-left⟩}{⟨odd-right⟩}

\widenhead*{⟨even-right/odd-left⟩}{⟨even-left/odd-right⟩}

Этот параметр соответственно добавляет ширину header и footer-ов.

\widenhead*{0pt}{6pc}
тоже самое
\widenhead[6pc][0pt]{0pt}{6pc}

nopatches — это опция в преамбуле пакета для самостоятельной тонкой настройки с помощью \sectionmark.

Marks

Марксы можно получить 4 способами:

- top marks 
- first marks 
- botttom marks 
- next top marks

13 - Titlesec

Оформление стилей страниц, заголовков и оглавления. Продвинутый пакет. Оставляю его для настроек различных стилей документов.

Обзор документации.

Пакет TITLESEC

Подключение пакета

Для установки пакета в преамбуле документа пишем:

\usepackage[explicit]{titlesec}

Родная документация

https://mirror.macomnet.net/pub/CTAN/macros/latex/contrib/titlesec/titlesec.pdf

Сам пакет на SPAN

https://ctan.org/pkg/titlesec

команда explicit мне будет нужна, чтобы в настройках заголовков указывать {#1} для подстановки в нужное место.

В пакете есть так называемые простые настройки и продвинутые.

Простые настройки

Что можно изменять в формате

Для настройки формата заголовка используем три параметра:

  1. Тип шрифта rm sf tt md bf up it sl sc по умолчанию в заголовках стоит \bf.
  2. Размер шрифта big medium small tiny
  3. Выравнивание заголовка raggedleft center raggedright
  4. compact — задает более компактный вид и уменьшает пробелы
  5. uppercase — выведет все буквы заглавными (говорят не всегда работает)

Основные команды в простом режиме

titlelabel

\titlelabel{⟨label-format ⟩} Эта команда изменяет формат метки заголовка

\titlelabel{\thetitle\quad}

т.е можно настроить буквенный вывод, изменить длину пробела, поставить точку и т.д.

titleformat

\titleformat*{⟨command ⟩}{⟨format⟩} Собственно сам формат заголовка.

command — это \section, \subsection и т.д.

format — соответственно, все, что было сказано выше. Размер шрифта, семейство шрифта и выравнивание.

\titleformat*{\section}{\Large\sf}

Собственно для простой настройки и все!!!

Продвинутые настройки

titleformat

\titleformat{⟨command ⟩}[⟨shape⟩]{⟨format⟩}{⟨label ⟩}{⟨sep⟩}{⟨before-code⟩}[⟨after-code⟩]

command:

это:

  • \part,
  • \chapter,
  • \section,
  • \subsection,
  • \subsubsection,
  • \paragraph,
  • \subparagraph.

shape:

это:

  • hang — значение по умолчанию (висящая метка)
  • block — заголовок помещает в блок. Можно добавлять рисунки и прочее.
  • display — помещает метку в отдельный абзац.
\titleformat{\section}[display] 
{\fontsize{120}{20}\boldfont} 
{\vbox{\hfil\thesection}\hfil}{0em}
{\LARGE\uppercase{#1}}

\titlespacing{\section} {0pc}{20.5ex plus .1ex minus .2ex}{30.5ex minus .1ex}[0pc]

Пример заголовка

Вот так получится.

  • runin — в документации пишут, что как стандартный параграф, но особо не заметил разницы. Наверно бесполезная вещь.
\titleformat{\subsection}[runin] 
{\fontsize{44}{10}\boldfont} 
{\thesection}{0.5em}
{\LARGE\uppercase{#1}}

\titlespacing{\section} {0pc}{20.5ex plus .1ex minus .2ex}{30.5ex minus .1ex}[0pc]

Образец заголовка

Использую пакет fontspec для большей красоты настроек. fontsize оттуда.

  • leftmargin — тяжело понять, лучше увидеть. Все выравнивает по левому краю.
\titleformat{\subsection}[leftmargin] 
{\boldfont} 
{\thesection}{1.5em}
{\Large\uppercase{#1}}

\titlespacing{\subsection} {-15pc}{2.5ex plus .1ex minus .2ex}{3.5ex minus .1ex}[5pc]
...

\subsection{Subsection test two line}

Образец заголовка

И еще одна интересная заметка для заголовка: если я меняю первый параметр в \titlespacing на 3pc то получится:

Образец заголовка

  • rightmargin — как leftmargin, но только вправо. Но у меня результата не получилось. Все улетает за пределы страницы.

titlespasing изменил третий параметр в отрицательную величину, и добился результата.

  • drop/wrap — реально оборачивает текст вокруг заголовка
\titleformat{\subsection}[wrap] 
{\Large\boldfont} 
{\thesection}{1.5em}
{\uppercase{#1}}

\titlespacing{\subsection}{2pc}{4.5ex plus .1ex minus .2ex}{8.5ex plus .2ex minus .1ex}[2pc]

но нужно правильно настроить 3-й параметр в \titlespacing я для своего заголовка поставил 8.5ex, в общем подбираем экспериментально.

Но получилось: Образец заголовка

\titlespacing{\subsection}{12pc}{8.5ex plus .1ex minus .2ex}{8.5ex plus .2ex minus .1ex}[6pc]

поменял настройки на 12pc и заголовок стал выглядеть приятнее, Образец заголовка для сравнения если я поставлю drop то будет перенос строк по другому режиму: см. ниже: Образец заголовка

  • frame — также переносит метку в отдельный параграф как display, но еще рисует рамку

Образец заголовка

format

Все что угодно из латекса. Ставится перед заголовком и действует на метку и заголовок. Цвет, шрифт, размер и пр.

\titleformat{\section}[display] 
{\color{red}\fontsize{120}{20}\boldfont} 
{\vbox{\hfil\thesection}\hfil}{0em}
{\LARGE\uppercase{#1}}

label

метка раздела. Чтобы все работало корректно лучше ставить, если предусмотрено стилем. Т.к., когда будет применяться команда заголовка со *, то номер подавится автоматически.

\thesection
\thesubsection
\thesubsubsection
...

sep

отступ от метки. Тоже нельзя оставлять пустым. 0pt но поставь.

before-code

самая звездная штука. В нее можно поставить вообще все и в качестве аргумента вляпать #1 как текст заголовка.

\titleformat{\section} 
{\LARGE\boldfontwhite} 
{}{.5em}
{\colorbox{BleuLBA}{\parbox{21cm}{\rule[-5pt]{0pt}{21pt}\hspace{1.5cm}\thesection\, \uppercase{#1}}}}

это я сделал для французов в синей рамочке белыми буквами. Но тут есть одна ошибка. Надеюсь с ней разобраться. Это номер заголовка.

Образец заголовка

after-code

тоже самое, что и before, только код ставит после заголовка. Любой!

chaptertitlename

изменяет название главы по умолчанию

\renewcommand{\chaptertitlename}{Новое название главы}

titlespacing

\titlespacing*{⟨command ⟩}{⟨left⟩}{⟨before-sep⟩}{⟨after-sep⟩}[⟨right-sep⟩]

Нужная команда для настроек пространства заголовка

Версия со звездочкой убирает отступ абзаца, следующего за заголовком, за исключением случаев удаления, переноса и запуска, где эта возможность не имеет смысла.

command

команда заголовка \section и т.д.

left

обязательный параметр, может быть положительный и отрицательный делает отступ заголовка влево и вправо.

Помогает при настройке с параметром drop и wrap.

before-sep

буквально вертикаьный отступ перед заголовком

after-sep

двигает текст после заголовка вертикально и горизонтально. Важен при настройке текста с обтеканием.

right-sep

необязательный параметр для установки отступа справа для установок с hang, block и display. Помогает залезать в правое поле. Это \beforetitleunit и \aftertitleunit тонкие настройки клея в заголовках. Я не использую.

А теперь я добился того, ради чего затевал этот конспект. Я настроил заголовок без ошибок:

%%%%%%%%%%%%%%% SECTION %%%%%%%%%%%%%5000
\titleformat{\section} [hang]
{\LARGE\boldfontwhite} 
{\llap{\colorbox{BleuLBA}{\parbox{2cm}{\rule[-5pt]{0pt}{21pt}\filleft\thesection}}}}{0em}
{\colorbox{BleuLBA}{\parbox{21cm}{\rule[-5pt]{0pt}{21pt}\filright \uppercase{#1}}}}

\titlespacing{\section} {0pc}{2.5ex plus .1ex minus .2ex}{3.5ex minus .1ex}[0pc]

Результат смотрим ниже: Образец заголовка

Дополнительные команды выравнивания

\filright \filcenter \filleft \fillast \filinner \filouter в принципе благодаря им очень хорошо настроил и решил свою задачу выше.

Они заполняют пространство перед или после заголовкаа, в зависимости от названия.

\wordsep — пространство между слов в заголовке

indentafter noindentafter — обходит настройки отступов страницы

rigidchapters rubberchapters — регулирует пространство между титулом главы и текстом.

bottomtitles nobottomtitles nobottomtitles*

Устанавливаем минимальное пространство внизу страницы, чтобы заголовок не переносился на новую страницу.

\renewcommand{\bottomtitlespace}{⟨length ⟩}

aftersep largestsep

По умолчанию, когда есть два последовательных заголовка, между ними используется пространство ⟨after-sep⟩ от первого. Иногда это нежелательное поведение, особенно когда пространство ⟨before-sep⟩ намного больше, чем пространство ⟨after-sep⟩ (в противном случае предпочтительнее выглядит значение по умолчанию).

pageatnewline — этот странный параметр насильно разрывает заголовок на разные страницы, хотя по умолчанию команды \\ \\* подавлены.

\nostruts nostruts — подавляет умничество latex при изменении высоты пространства в заголовках.

RULES

Добавляет линии под заголовками и не только.

\titleline[⟨align⟩]{⟨horizontal material ⟩} 
\titlerule[⟨height ⟩] 
\titlerule*[⟨width ⟩]{⟨text ⟩}

Можно добавить прямо в текст и получить результат для одного заголовка:

\section{Title first}
\label{sec:title-first}
\titlerule[.8pt]% 
\vspace{1pt}% 
\titlerule

или можно эту же конструкцию добавить в настройки \titleformat. Образец заголовка

calcwidth — изменяет формат переноса строк для режима wrap

PAGE STYLES

\assignpagestyle{⟨command ⟩}{⟨pagestyle⟩}
...
\assignpagestyle{\chapter}{empty}

любой главе или странице можно назначить стиль по умолчанию.

Breaks

\sectionbreak \subsectionbreak \subsubsectionbreak \paragraphbreak \subparagraphbreak \⟨section⟩break

\newcommand{\sectionbreak}{\clearpage}
или
\newcommand{\sectionbreak}{% 
\addpenalty{-300}% 
\vspace*{0pt}}

эта утилита настраивает автоматический разрыв страниц при достижения заданных параметров в разделах.

\chaptertolists — изменяет отступы перед заголовками

\newcommand{\chaptertolists}{}

а этот будет пустой

Команды в преамбуле

explicit

позволяет указывать в titleformat #1 как место для текста заголовка

\titleformat{\section} 
{..} 
{\thesection}{..}{#1.}

newparttoc oldparttoc

используется если \part была переопределена, помогает настроить TOC

clearempty

Изменяет поведение \cleardoublepage, чтобы на пустых страницах использовался стиль пустой страницы.

toctitles

Изменяет поведение необязательного аргумента в заголовках разделов, так что он устанавливает только заголовки в квадратных скобках, а не записи оглавления, которые будут основаны на полном заголовке.

newlinetospace

Заменяет каждое вхождение символов \ или \* в заголовках на пробел в заголовках и записях оглавления.

Расширенные настройки

⟨key⟩=⟨value⟩, ⟨key⟩=⟨value⟩, ⟨key⟩, ⟨key⟩,...

Первый аргумент как \titleformat, так и \titlespaceing имеет расширенный синтаксис, который позволяет устанавливать разные форматы в зависимости от контекста.

  • name= Допустимые значения: \chapter, \section и т. д.
  • page= Допустимые значения: odd или even.
  • numberless Бесполезный ключ. В этом нет необходимости, если вы не хотите установить разные нумерованные (без этого ключа) и ненумерованные (с безномерными) варианты.
\titleformat{name=\section,page=even}[leftmargin]
{\filleft\scshape}{\thesection}{.5em}{} 

\titleformat{name=\section,page=odd}[rightmargin]
{\filright\scshape}{\thesection}{.5em}{}

Создание новыхуровней заголовков

\titleclass{⟨name ⟩}{⟨class ⟩}  \titleclass{⟨name⟩}{⟨class⟩}[⟨super-level-cmd ⟩]

Существует три класса:

  • page — это часть книги, на одной странице,
  • top — это \chapter, который начинает страницу и помещает заголовок вверху,
  • straight предназначен для заголовков в середине текста.

В первом случае \titleclass{\part}{straight} заменяется просто класс.

Во втором случае, можно создать новые подуровни:

\titleclass{\subchapter}{straight}[\chapter] %новый класс
\newcounter{subchapter} %новый счетчик
\renewcommand{\thesubchapter}{\Alph{subchapter}} %буквенный счетчик

уровни секций изменяются автоматически

Глава 0 – уровень \section — 1 уровень и т.д.

loadonly

Обнулит все настройки уровней и позволит создавать свои уровни с нуля.

\titleclass

\titleclass{⟨name ⟩}[⟨start-level-num ⟩]{⟨class ⟩}

добавляет высшего уровня заголовок (0) или (-1) и дальше создаем сои новые уровни.

FootNotes

В заголовки можно добавлять ссылки footnotes, но чтобы они не показывались в оглавлении нужно в преамбулу добавить:

\usepackage[stable]{footmisc}

Номер заголовка в BOX

Полезная вещь. Особенно когда колдуешь с отступами за пределы печатаемой области или работаешь с цветами.

\titleformat{\section} 
{..} 
{\makebox[2em]{\thesection}}{..}{..}

или

\titleformat{\section} [hang]
{\LARGE\boldfontwhite} 
{\llap{\colorbox{BleuLBA}{\parbox{2cm}{\rule[-5pt]{0pt}{21pt}\filleft\thesection}}}}{0em}
{\colorbox{BleuLBA}{\parbox{21cm}{\rule[-5pt]{0pt}{21pt}\filright \uppercase{#1}}}}

Подавляет нумерацию заголовков

\setcounter{secnumdepth}{0}

или

\newenvironment{exercises} 
{\setcounter{secnumdepth}{0}} 
{\setcounter{secnumdepth}{2}}

или

\newenvironment{exercises} 
{\setcounter{secnumdepth}{0}%
\addtocontents{toc}{\protect\setcounter{tocdepth}{0}\ignorespaces}} 

{\setcounter{secnumdepth}{2}%
\addtocontents{toc}{\protect\setcounter{tocdepth}{2}\ignorespaces}}

Как пометить заголовки со сзвездочкой

\newcommand{\secmark}{} 
	\newenvironment{advanced} 
		{\renewcommand{\secmark}{*}} 
		{} 
\titleformat{\section} {..} 
{\thesection\secmark\quad}{..}{..}  

В документе пишим  

\begin{advanced} 
\section{...} ... 
\end{advanced}

Этот раздел будет со звездочкой.

Крутой код по настройке стилей страниц

\documentclass[14pt,a4paper,twoside]{extbook}
\usepackage[utf8]{inputenc} %
\usepackage[T1]{fontenc}
\usepackage{lmodern} %
\usepackage[pagestyles]{titlesec}
\usepackage[x11names]{xcolor} %
\usepackage{theorem}
\newtheorem{worked example}{Worked Example}[chapter]
\newtheorem{solution}{SOLUTION}[chapter]
%\usepackage{anyfontsize}
\usepackage{amsfonts}
\usepackage{textcomp}
\usepackage{enumerate}
\setlength\headheight{21pt}

\newcommand{\hsp}{\hspace{20pt}}
\newcommand{\ntl}{\newline \newline}

\titleformat{\chapter}[hang]{\fontsize{50}{60}\bfseries\color[rgb]{0,0.5,0.75}}{\thechapter\hsp\fontsize{90}{60}\selectfont\textcolor{black}{|}\hsp}{0pt}{\thispagestyle{empty}\Huge\bfseries}

\titleformat{\section}{\large\bfseries}{}{0pt}{\textcolor[rgb]{0,0.5,0.75}{Topic \thesection} \ }[{\titlerule[0.8pt]}]

\usepackage{blindtext}

\newpagestyle{mine}{%
\setlength\fboxsep{10pt}
\sethead[\bfseries\llap{\colorbox{SteelBlue3}{\parbox{\dimexpr\marginparsep + \marginparwidth\relax}{\hspace{20pt}\color{white}\thepage\vphantom{|}}}}%
\colorbox{SlateGray2!40}{\parbox{\dimexpr\linewidth-2\fboxsep}{~\thechapter~|\hspace{0.75em}\chaptertitle}}][][]%
{}{}{\bfseries\colorbox{SlateGray2!40}{\parbox{\dimexpr\linewidth-2\fboxsep}{\thesection~|\hspace{0.75em}\sectiontitle}}%
\rlap{\colorbox{SteelBlue3}{\parbox{\dimexpr\marginparsep + \marginparwidth\relax}{\hspace{20pt}\color{white}\thepage\vphantom{|}}}}}
\setfoot{}{}{}
}

\pagestyle{mine}

\begin{document}

\chapter{{NUMBER}}%\textcolor{black}
\section{BIDMAS.}
\blindtext[10]

\end{document} 

Выдает шикарную вещь: Образец заголовка

14 - Пакет fontenc - Управление кодировками шрифтов в LaTeX

Загрузка шрифтов в Latex. Package titlesec

Пакет fontenc - Управление кодировками шрифтов в LaTeX

Введение

Пакет fontenc является критически важным для правильного отображения текста в LaTeX-документах, особенно при работе с не-ASCII символами (кириллицей, диакритическими знаками и др.).

Установка и базовое использование

\usepackage[<кодировки>]{fontenc}

Основные кодировки

Для латинских алфавитов:

  • T1 - Расширенная латинская кодировка (поддержка акцентов, лигатур)
  • OT1 - Базовая кодировка TeX (устаревшая)

Для кириллицы:

  • T2A - Основная кириллическая кодировка
  • T2B - Альтернативная кириллическая кодировка
  • T2C - Дополнительная кириллическая кодировка

Примеры комбинаций:

\usepackage[T1,T2A]{fontenc} % Латинские и кириллические символы
\usepackage[T1]{fontenc} % Только латинские символы

Полный список поддерживаемых кодировок

Кодировка Описание
OT1 Базовая кодировка TeX
T1 Расширенная латинская
T2A Основная кириллица
T2B Альтернативная кириллица
T2C Дополнительная кириллица
LY1 Улучшенная кодировка для LaTeX
Другие специализированные кодировки

Команды пакета

Основные команды:

  1. \fontencoding{<кодировка>} - Переключает текущую кодировку шрифта
  2. \selectfont - Применяет изменения кодировки

Пример использования команд:

{\fontencoding{T1}\selectfont Текст в T1 кодировке}
{\fontencoding{T2A}\selectfont Текст в T2A кодировке}

Практические примеры

Пример 1: Базовое использование

\usepackage[T1,T2A]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[english,russian]{babel}

\begin{document}
Латинские символы: Café, naïve

Кириллические символы: Пример русского текста
\end{document}

Пример 2: Смешение кодировок в документе

{\fontencoding{T1}\selectfont
This text uses T1 encoding for proper hyphenation of words like "naïve".}

{\fontencoding{T2A}\selectfont
Этот текст использует кодировку T2A для корректного отображения кириллицы.}

Пример 3: Определение нового кодированного шрифта

\DeclareFontFamily{T2A}{cmr}{}
\DeclareFontShape{T2A}{cmr}{m}{n}{<-> ecrm1000}{}

Проблемы и решения

Проблема 1: Неправильное отображение кириллицы

Решение:

\usepackage[T2A]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[russian]{babel}

Проблема 2: Разрывы слов с диакритическими знаками

Решение:

\usepackage[T1]{fontenc} % Для правильного разрыва слов типа "naïve"

Проблема 3: Конфликты кодировок

Решение: Явное указание кодировок:

\usepackage[T1,T2A]{fontenc}

Совместимость с другими пакетами

С inputenc:

\usepackage[T1,T2A]{fontenc}
\usepackage[utf8]{inputenc} % Рекомендуется всегда использовать utf8

С babel:

\usepackage[T1,T2A]{fontenc}
\usepackage[english,russian]{babel}

С современными шрифтовыми пакетами (fontspec):

\usepackage{fontspec} % Для XeLaTeX/LuaLaTeX
% fontenc не нужен при использовании fontspec

Расширенные возможности

Определение собственных кодировок:

\DeclareFontEncoding{XYZ}{}{}
\DeclareErrorFont{XYZ}{cmr}{m}{n}{10}

Настройка подстановок шрифтов:

\DeclareFontSubstitution{T2A}{cmr}{m}{n}

Рекомендации

  1. Для документов с кириллицей всегда используйте:
    \usepackage[T2A]{fontenc}
    
  2. Для документов с европейскими языками:
    \usepackage[T1]{fontenc}
    
  3. Для многоязычных документов:
    \usepackage[T1,T2A]{fontenc}
    
  4. При использовании XeLaTeX/LuaLaTeX вместо fontenc используйте fontspec

Заключение

Пакет fontenc обеспечивает критически важную функциональность для правильного отображения текста в различных языках. Правильная настройка кодировок шрифтов предотвращает множество проблем с отображением символов и переносом слов.

15 - Пакет fontspec - Управление кодировками шрифтов в XeLaTeX

Полное руководство по пакету fontspec для XeLaTeX и LuaLaTeX

Введение в fontspec

Пакет fontspec предоставляет мощную систему выбора и настройки шрифтов для движков XeTeX и LuaTeX. Он заменяет традиционный подход с использованием fontenc и inputenc, предлагая прямую работу со шрифтами системы через Unicode.

Основные возможности

  • Доступ к любым системным шрифтам (OTF, TTF)
  • Полная поддержка Unicode
  • Гибкое управление начертаниями шрифтов
  • Настройка параметров шрифтов
  • Работа с OpenType-функциями

Установка и загрузка

\usepackage{fontspec} % В преамбуле документа

Основные команды

1. Установка основного шрифта

\setmainfont{<название шрифта>}[<опции>]

Пример:

\setmainfont{TeX Gyre Termes}[
  Path = /usr/local/texlive/texmf-local/fonts/opentype/,
  Extension = .otf,
  UprightFont = *-regular,
  BoldFont = *-bold,
  ItalicFont = *-italic,
  BoldItalicFont = *-bolditalic
]

2. Установка моноширинного шрифта

\setmonofont{<название шрифта>}[<опции>]

3. Установка шрифта без засечек

\setsansfont{<название шрифта>}[<опции>]

4. Временное изменение шрифта

\newfontfamily\<команда>{<название шрифта>}[<опции>]

Пример:

\newfontfamily\cyrillicfont{PT Serif}
\newfontfamily\cyrillicfontsf{PT Sans}
\newfontfamily\cyrillicfonttt{PT Mono}

Основные опции шрифтов

Пути и файлы

Опция Описание
Path Путь к файлам шрифтов
Extension Расширение файлов
UprightFont Обычное начертание
BoldFont Полужирное начертание
ItalicFont Курсивное начертание
BoldItalicFont Полужирный курсив

Характеристики шрифта

Опция Описание
Ligatures Управление лигатурами
Numbers Стиль цифр
Scale Масштабирование
Color Цвет шрифта
WordSpace Межсловные пробелы

OpenType-функции

Опция Описание
Renderer Рендерер (Basic/Node)
Script Скрипт (Cyrillic, Latin и др.)
Language Язык
FeatureFile Файл с OpenType-фичами

Примеры конфигураций

Базовая настройка для русского/английского

\usepackage{polyglossia}
\setmainlanguage{russian}
\setotherlanguage{english}

\setmainfont{PT Serif}[
  Ligatures=TeX,
  Extension=.ttf,
  UprightFont=*-Regular,
  BoldFont=*-Bold,
  ItalicFont=*-Italic,
  BoldItalicFont=*-BoldItalic
]

\setsansfont{PT Sans}[
  Ligatures=TeX,
  Extension=.ttf,
  UprightFont=*-Regular,
  BoldFont=*-Bold,
  ItalicFont=*-Italic,
  BoldItalicFont=*-BoldItalic
]

\setmonofont{PT Mono}[
  Scale=0.9,
  Extension=.ttf,
  UprightFont=*-Regular
]

Использование разных шрифтов для разных языков

\usepackage{polyglossia}
\setdefaultlanguage{russian}
\setotherlanguage{english}

\defaultfontfeatures{Ligatures=TeX}

\setmainfont{EB Garamond}[
  Language=English,
  Script=Latin
]

\newfontfamily\cyrillicfont{PT Serif}[
  Language=Russian,
  Script=Cyrillic
]

OpenType-фичи

Включение дополнительных возможностей

\setmainfont{Some Font}[
  RawFeature={
    +ss01; % Альтернативные глифы
    +onum; % Старостильные цифры
    +frac; % Дроби
    +c2sc; % Капитель из прописных
  }
]

Доступные OpenType-фичи

  • +liga - стандартные лигатуры
  • +dlig - декоративные лигатуры
  • +tnum - табличные цифры
  • +pnum - пропорциональные цифры
  • +smcp - капитель из строчных
  • +c2sc - капитель из прописных
  • +frac - дроби
  • +ss01-+ss20 - альтернативные наборы глифов

Работа с математическими шрифтами

\usepackage{unicode-math} % Должен загружаться после fontspec

\setmathfont{TeX Gyre Termes Math}
\setmathfont{XITS Math}[range={\mathcal,\mathbfcal}]
\setmathfont{STIX Two Math}[range={\mathscr}]

Продвинутые техники

Динамическое изменение шрифтов

\newfontfamily\headfont{Helvetica Neue}[Scale=1.2]
\newcommand{\heading}[1]{{\headfont\Large #1}}

Использование символов за пределами Unicode BMP

\newfontface\emojifont{Segoe UI Emoji}[Renderer=Harfbuzz]
\newcommand{\showemoji}[1]{{\emojifont #1}}

Вертикальное выравнивание

\newfontfamily\vertfont{SomeFont}[Vertical=RotatedGlyphs]

Решение проблем

Шрифт не находится

\setmainfont{Arial}[
  Path=/Users/username/Library/Fonts/,
  Extension=.ttf
]

Конфликты кодировок

\usepackage{fontspec}
% Не загружать fontenc или inputenc!

Проблемы с переносами

\usepackage{polyglossia}
\setmainlanguage{russian}
\setmainfont{Some Font}[Language=Russian]

Заключение

Пакет fontspec предоставляет:

  1. Полный доступ к системным шрифтам
  2. Гибкую систему настройки шрифтов
  3. Поддержку современных OpenType-возможностей
  4. Удобную работу с многоязычными документами
  5. Интеграцию с математическими шрифтами через unicode-math

Для максимальной эффективности используйте fontspec в сочетании с:

  • polyglossia для языковой поддержки
  • unicode-math для математических шрифтов
  • microtype для улучшенной типографики