Добро пожаловать в раздел спецпроектов! Здесь вы найдете полезные справочные материалы, инструкции и гайды по различным темам, которые помогут вам в работе, учебе и повседневной жизни.
И многое другое – новые проекты добавляются регулярно!
1 - База знаний по здоровью и здоровому образу жизни
В этом разделе собираю материалы по здоровью человека из собственным разработок и полезные статьи, которые привлекли мое внимание.
Здоровье — это не просто отсутствие болезней, а целостное состояние гармонии тела, ума и духа. В этом разделе собраны мои личные наработки, проверенные практики и системный подход к восстановлению и укреплению здоровья без медикаментов.
Здесь вы найдете конкретные методы, основанные на:
Цигун — древней китайской гимнастике, восстанавливающей энергетический баланс,
Остеопатии — мягких мануальных техниках, помогающих телу вернуть естественную подвижность,
Кинезиотерапии — движении как лекарстве для суставов и мышц,
Дыхательных практиках — инструментах управления стрессом и энергией,
Питании — осознанном подходе к еде как источнику жизненных сил,
Мировоззрении — психологических и духовных принципах, формирующих основу здоровья.
Каждый из этих элементов — часть единой мозаики. Внедряя их в повседневность, можно не только избавиться от конкретных недугов, но и создать прочный фундамент для долгой, активной и осознанной жизни.
Этот раздел — для тех, кто готов брать ответственность за свое здоровье в свои руки и искать естественные пути исцеления. Добро пожаловать в мир, где тело, разум и дух работают в согласии!
1.1 - Общие практики для укрепления и восстановления здоровья
В этом разделе собираю материалы по здоровью человека имеющие отношение к общим практикам и направленным на оздоровление всего организма.
Общие практики
Здоровье — это не просто отсутствие болезней, а состояние гармонии тела, ума и духа. В этом разделе собраны статьи, посвящённые универсальным практикам укрепления здоровья, которые подходят людям любого возраста и уровня физической подготовки.
Здесь вы найдёте проверенные рекомендации по питанию, движению, ментальному балансу и профилактике заболеваний. Независимо от того, только начинаете ли вы заботиться о себе или ищете способы оптимизировать уже привычный ритм жизни, эти материалы помогут сделать каждый день более энергичным, осознанным и наполненным vitality.
Помните: маленькие, но регулярные шаги к здоровью часто значат больше, чем радикальные изменения. Давайте вместе создавать прочный фундамент для долгой и активной жизни!
1.1.1 - Техники массажа
Раздел справочник, посвящен описанию различных техник массажа
1.1.1.1 - Общий массаж
Схема общего массажа для взрослого человека
Схема общего массажа для взрослого человека
Общий массаж обычно проводится в положении лежа на спине, на животе и на боку, охватывая основные группы мышц. Последовательность может варьироваться, но классическая схема выглядит так:
flowchart TD
A[Начало массажа] --> B[Спина]
B --> B1[Поглаживание]
B1 --> B2[Растирание]
B2 --> B3[Разминание]
B3 --> B4[Вибрация]
B4 --> B5[Поглаживание]
B --> C[Шея и воротниковая зона]
C --> C1[Поглаживание]
C1 --> C2[Растирание]
C2 --> C3[Разминание]
C3 --> C4[Поглаживание]
C --> D[Ноги: Задняя поверхность]
D --> D1[Бедро: П-Р-Р-В]
D1 --> D2[Голень: П-Р-Р]
D2 --> D3[Стопа: Растирание]
D --> E[Вторая нога: аналогично]
E --> F[Перед: Грудная клетка]
F --> F1[Поглаживание]
F1 --> F2[Растирание]
F2 --> F3[Разминание]
F --> G[Живот]
G --> G1[Круговые поглаживания]
G1 --> G2[Разминание косых мышц]
G --> H[Руки]
H --> H1[Плечо: П-Р-Р]
H1 --> H2[Предплечье: П-Р-Р]
H2 --> H3[Кисть: Растирание]
H --> I[Лицо-голова]
I --> I1[Поглаживание лба]
I1 --> I2[Массаж волосистой части]
I --> J[Завершение]
J --> J1[Общее поглаживание]
J1 --> K[Конец сеанса]
Тайминг общего массажа (60-90 минут)
Время указано ориентировочно и может корректироваться в зависимости от целей (расслабление/тонизирование) и индивидуальных потребностей.
1. Спина – 15-20 минут
Поглаживание – 2-3 мин.
Растирание – 3-5 мин.
Разминание – 7-10 мин.
Вибрация – 2-3 мин.
Завершающее поглаживание – 1-2 мин.
2. Шея и воротниковая зона – 5-7 минут
Поглаживание – 1 мин.
Растирание – 2 мин.
Разминание – 2-3 мин.
Поглаживание – 1 мин.
3. Ноги (задняя поверхность) – 10-12 минут на каждую ногу
a) S-образное разминание валика по широчайшей мышце спины снизу вверх и поясничных мышц
b) глубокие вращательные движения по паравертебральным мышцам (1) - подушечками 4-х пальцев, (2) - основанием ладони или (3) - подушечками больших пальцев
с) S-образное разминание трепецевидной мышцы (валик) и гребенчатое разминание лопаточной зоны
при работе с трацецией, голова пациента повернута в противоположную сторону
5. Передняя часть тела (положение – лежа на спине)
Грудная клетка:
Поглаживание от центра к подмышкам.
Растирание межреберных мышц.
Разминание большой грудной мышцы.
Живот (по желанию, осторожно):
Круговые поглаживания по часовой стрелке.
Легкое разминание косых мышц.
6. Руки (плечо, предплечье, кисть)
Плечо (дельтовидная мышца):
Поглаживание → растирание → разминание.
Предплечье:
Растирание и разминание мышц-сгибателей/разгибателей.
Кисть и пальцы:
Растирание каждого пальца, ладони.
7. Лицо и голова (по желанию, легкими движениями)
Поглаживание лба, висков, круговые движения вокруг глаз.
Легкое разминание волосистой части головы.
8. Завершение
Общее успокаивающее поглаживание спины или конечностей.
Длительность: 60–90 минут.
Рекомендации:
Интенсивность зависит от состояния пациента (расслабляющий или тонизирующий эффект).
Избегать давления на позвоночник, лимфоузлы, область почек.
Использовать массажное масло/крем для лучшего скольжения.
Что такое поглаживание в массаже?
Поглаживание
Базовый массажный приём, при котором руки скользят по коже с разной степенью надавливания. Это первое и последнее движение в любой технике: оно подготавливает тело к массажу и помогает расслабиться после интенсивного воздействия.
Как выполняется?
Основные правила:
Движения – плавные, ритмичные, чаще всего по направлению к лимфоузлам (например, от кисти к подмышке).
Сила давления – от лёгкого (едва касаясь кожи) до умеренного (чувствуется давление на мышцы, но без дискомфорта).
Руки – расслабленные, пальцы прижаты друг к другу (не «царапают» кожу).
Темп – медленный, успокаивающий.
Техника на разных зонах тела
1. Спина
Как делать:
Ладонями от поясницы к шее, затем от позвоночника к бокам.
Можно одной или двумя руками (например, «ёлочка» от позвоночника).
Сила:
Начало: лёгкое скольжение.
Завершение: более глубокое, с давлением на мышцы.
Результат:
Улучшает кровообращение, снимает напряжение.
2. Ноги
Как делать:
От стопы к бедру (по ходу лимфотока).
Бёдра: обхватывающие движения ладонями.
Икры: осторожно, без сильного нажима (зона чувствительная).
Сила:
Лёгкая на голенях, умеренная на бёдрах.
Результат:
Снимает отёки, уменьшает усталость.
3. Руки
Как делать:
От кисти к плечу, обхватывая руку ладонью.
Пальцы: мягкие продольные движения.
Сила:
Лёгкая на запястьях, чуть сильнее на предплечьях.
Результат:
Расслабляет после работы за компьютером.
4. Живот
Как делать:
Только по часовой стрелке (по ходу кишечника).
Круговые движения ладонью без надавливания.
Сила:
Очень лёгкая, без давления.
Результат:
Помогает пищеварению, снимает спазмы.
5. Шея и лицо
Как делать:
От плеч к затылку (шея), от центра лба к вискам (лицо).
Поглаживание – это не просто «провести рукой», а осознанное движение, которое задаёт ритм всему массажу!
Что такое растирание в массаже?
Растирание
Более интенсивный приём, чем поглаживание, при котором руки не просто скользят по коже, а сдвигают и растягивают ткани. Это помогает разогреть мышцы, улучшить подвижность суставов и «разбить» напряжение.
Как выполняется?
Основные правила:
Движения – энергичные, но не резкие, могут быть прямолинейными, круговыми или спиралевидными.
Сила давления – умеренная или сильная (зависит от зоны), но без боли.
Руки – плотно прилегают к телу, часто используются пальцы, ребро ладони или кулаки.
Темп – быстрее, чем при поглаживании, но ритмичный.
Техника на разных зонах тела
1. Спина
Как делать:
Ребром ладони – вдоль позвоночника (не давить на позвонки!).
Круговые движения пальцами – вокруг лопаток и поясницы.
«Пиление» – ребрами ладоней вверх-вниз по мышцам.
Сила:
Умеренная на мягких тканях, слабее возле позвоночника.
Результат:
Разогревает мышцы, уменьшает «хруст» в спине.
2. Ноги
Как делать:
Бёдра – круговые движения кулаками или основанием ладони.
Голени – пальцами вдоль икроножной мышцы.
Стопы – большим пальцем прорабатывать свод стопы.
Сила:
Сильнее на бёдрах, слабее на голенях (там меньше мышц).
Результат:
Помогает при «забитых» мышцах после тренировки.
3. Руки
Как делать:
Плечи и предплечья – спиралевидные движения пальцами.
Локти – осторожно, круговые растирания (если нет воспаления).
Сила:
Средняя, особенно на напряжённых участках (например, у офисных работников).
Стимулирует пищеварение, но не применяется при болях!
5. Шея и лицо
Как делать:
Шея – круговые движения пальцами вдоль позвоночника.
Лицо – только лёгкие спиральки на висках и скулах.
Сила:
Минимальная, особенно на лице.
Результат:
Снимает головную боль, но требует осторожности.
Какой должен быть результат?
Кожа: становится тёплой, может слегка покраснеть.
Ощущения: тепло, лёгкое «жжение» в мышцах, но не боль.
Ошибки:
Растирание костей или суставов (например, коленей).
Давление на родинки или воспалённые участки.
Важно
Растирание – это «мостик» между поглаживанием и разминанием. Оно подготавливает тело к глубокому воздействию!
Что такое разминание в массаже?
Разминание
Основной массажный приём, при котором мышцы захватывают, приподнимают и сдавливают, чтобы глубоко проработать ткани. Это самый интенсивный этап массажа, который снимает спазмы, улучшает кровообращение и «разминает» даже застарелые зажимы.
Как выполняется?
Основные правила:
Движения – медленные, плавные, но с чётким захватом мышц.
Сила давления – сильная, но контролируемая (без боли!).
Руки – работают как «щипцы»: пальцы захватывают мышцу, ладонь фиксирует.
Темп – медленнее, чем при растирании (1–2 движения в секунду).
Техника на разных зонах тела
1. Спина
Как делать:
Ординарное разминание – мышцу захватывают, приподнимают и «перекатывают» между пальцами.
Двойное кольцевое – две руки работают попеременно, как месят тесто (S образное).
Валяние – мышцу сжимают между ладонями (для широчайших).
Сила:
Сильная на крупных мышцах (лопатки, поясница), слабее у позвоночника.
Результат:
Устраняет «комки» в трапециевидной мышце, снимает боль в пояснице.
2. Ноги
Как делать:
Бёдра – двойное кольцевое разминание (как спираль от колена к ягодице).
Икры – щипцеобразное (большой палец против остальных).
Стопы – разминание подушечки большого пальца и пятки.
Сила:
Очень сильная на бёдрах (если нет варикоза), умеренная на голенях.
Результат:
Восстанавливает мышцы после нагрузок, уменьшает судороги.
3. Руки
Как делать:
Плечи (дельты) – ординарное разминание.
Предплечья – щипцами вдоль кости (осторожно!).
Кисти – круговые движения большим пальцем.
Сила:
Средняя, особенно на напряжённых участках (например, у теннисистов).
Результат:
Убирает «деревянность» в руках, улучшает подвижность.
4. Живот
Как делать:
Только при отсутствии противопоказаний! Лёгкие волнообразные движения.
Косые мышцы – мягко сжимают пальцами.
Сила:
Минимальная, без давления на внутренние органы.
Результат:
Улучшает тонус мышц, но применяется редко.
5. Шея
Как делать:
Трапеции – щипцеобразное разминание (от уха к плечу).
Умеренная, без резких движений (опасно для сосудов!).
Результат:
Снимает головную боль от напряжения.
Какой должен быть результат?
Мышцы: становятся мягкими, исчезают уплотнения.
Ощущения: глубокое тепло, расслабление, иногда приятная «ломота».
Ошибки:
Резкие рывки (может вызвать спазм).
Разминание лимфоузлов или родинок.
Важно
Разминание – это «сердце» массажа! Оно требует больше всего времени и внимания.
Что такое вибрация в массаже?
Вибрация
Заключительный энергичный приём, при котором мышцы и ткани подвергаются быстрым колебательным движениям. Он напоминает лёгкую «дрожь» или «постукивание» и используется для тонизирования мышц, улучшения кровообращения и снятия остаточного напряжения.
Как выполняется?
Основные правила:
Движения – быстрые, ритмичные, но не грубые.
Сила давления – варьируется от лёгкой (сотрясение) до интенсивной (похлопывание).
Инструменты – ладони, пальцы, ребро ладони или кулаки (в зависимости от зоны).
Темп – от 2 до 5 движений в секунду.
Техника на разных зонах тела
1. Спина
Как делать:
Похлопывание – расслабленной ладонью (пальцы слегка согнуты, чтобы смягчить удар).
Рубление – ребром ладони (быстро и поверхностно, без боли).
Пунктирование – кончиками пальцев вдоль позвоночника (лёгкие точечные удары).
Сила:
Средняя на пояснице, слабее на рёбрах.
Результат:
Пробуждает мышцы, усиливает приток крови.
2. Ноги
Как делать:
Бёдра – похлопывание кулаком (расслабленным, как «мягкий молоточек»).
Голени – лёгкое рубление (избегать кости!).
Стопы – точечная вибрация большим пальцем (на рефлексогенных зонах).
Сила:
Сильная на бёдрах, минимальная на голенях.
Результат:
Снимает усталость, «оживляет» мышцы после долгой ходьбы.
3. Руки
Как делать:
Плечи/предплечья – встряхивание (захватить руку и быстро потрясти).
Кисти – лёгкое постукивание пальцами.
Сила:
Умеренная, особенно на зажатых участках.
Результат:
Улучшает подвижность суставов.
4. Живот
Как делать:
Только лёгкое сотрясение (ладонь кладётся на живот и быстро вибрирует).
Шея – кончиками пальцев (лёгкие «пробежки» вдоль мышц).
Лицо – только точечная вибрация на висках и скулах (очень нежно!).
Сила:
Минимальная.
Результат:
Снимает головную боль, но требует осторожности.
Какой должен быть результат?
Мышцы: ощущение бодрости, лёгкое «покалывание».
Кожа: может слегка покраснеть (приток крови).
Ошибки:
Слишком резкие удары (останутся синяки).
Вибрация на костях или воспалённых участках.
Важно
Вибрация – это не просто «тряска», а контролируемое воздействие. Её часто сочетают с разминанием для лучшего эффекта.
1.1.1.2 - Массаж шейно-воротниковой зоны
Пошаговый план выполнения массажа шейно-воротниковой зоны.
Детальный классический массаж шейно-воротниковой зоны (ШВЗ)
Классический массаж шейно-воротниковой зоны направлен на расслабление мышц, улучшение кровообращения, снятие напряжения и профилактику остеохондроза. Зона включает:
Шейный отдел (задняя и боковые поверхности шеи)
Воротниковая зона (верхняя часть спины, надплечья, область лопаток)
Показания:
Мышечное напряжение, спазмы
Головные боли, головокружения
Остеохондроз шейного отдела
Нарушение осанки
Синдром хронической усталости
Противопоказания:
Острые воспалительные процессы
Грыжи шейного отдела
Гипертония (с осторожностью)
Тромбозы, атеросклероз
Кожные заболевания
Общие установки
Движение снизу—вверх и послойно углубляемся.
Положение массажиста
Стоя сбоку или стоя сзади.
Техника выполнения массажа
1. Подготовка
Пациент сидит на стуле, голова слегка наклонена вперед, руки расслаблены, можно положить их на стол или колени.
Массажист стоит сзади.
На кожу наносится массажное масло или крем для лучшего скольжения.
2. Поглаживание (3 мин)
Плоскостное поглаживание – ладонями от подлопаточной зоны через надплечья, плечи и обхватывающим движением вниз к подмышечным лимфоузлам и повторяем 3 раза
Скользящее движение до волосистой части головы паравертебрально (пальцы касаются тела тыльной стороной фаланг) и от волосистой части головы прижимаем ладони к коже и с небольшим усилием опускаемся по шее, надплечью, дельта, по боковой линии возвращаемся в исходную точку. Повторяем 3 раза.
Поперечное обхватывающее поглаживание - из стойки сбоку попеременно поглаживание от позвоночника лотерально через надплечье и дельту. Постепенно переходим в движениях к подключичной зоне. Проглаживание выполняем ладонями с небольшим нажимом от позвоночника лотерально, возвращаемся с легким контактом с кожей пациента и повторяем проглаживание лотерально.
Цель: разогрев кожи, улучшение лимфотока.
3. Растирание (5 мин)
Особенность растирания
Растирание выполняется с небольшим давлением, активизируя кровоток в коже и поверхностном мышечном слое. Усилие не вызывающее боли у пациента и не такое большое, чтобы прорабатывались глубокие слои мышц. Работаем с кожей, подкожным слоем и поверхностными мышцами.
Прямолинейное и круговое растирание подушечками пальцев вдоль позвоночника и мышц шеи снизу-вверх с переходом на надплечье и трапецию.
Пиление – ребром ладони вдоль паравертебрально и по трапеции перпендикулярно. Немного интенсивнее, чем поглаживание руки стоят с левой и правой стороны позвоночника и совершают растирающие движения в противонаправлении. На второй фазе пропиливаем сначала одну сторону трапеции с постепенным опусканием но нижней части лопатки, затем другую сторону.
Выжимание – всей ладонью от позвоночника лотерально выжимаем через лопаточную зону. Второе выжимание от шеи к дельте через трапецию. Выжимание выполняем плотно прилегающими ладонями от позвоночника лотерально. Сначала выжимаем лопаточную зону, затем поднимаемся вверх к трапеции и шеи. 3-4 повторения. Руки при выполнении выжимания не отрываются от тела пациента. Обратно руки возвращаются легким скольжением по коже в исходную точку.
Перетерание плеча — разнонаправленными движениями перетераем по направлению к надплечью.
После каждого растирающего упражнения выполнить поглаживание.
4. Разминание (10–12 мин – основная часть)
Особенность разминания
Разминание выполняется, в отличии от растирания, на глубоких слоях. Усилие не вызывающее боли у пациента, но достаточное для проработки глубоких слоев мышц.
Вращательное разминание 4-мя пальцами — опора на большой палец и подушечками 4-х пальцев выполняем разминающие вращательные движения и поднимаемся снизу вверх от лопаток к шее (до волосистой части головы). От волосистой части головы по шее и трапециевидной мышце опускаемся к плечевому суставу выполняя вращательные движения подушечками 4-х пальцев с опорой на большой палец. Повторить 2-3 прохода.
Вращательное разминание фалангами пальцев — выполняем разминание по схеме похожей, как описано выше, вращательными движениями от лопаточной зоны до волосистой части головы паравертебрально и от шеи к плечевым суставам, далее вокруг плечевого сустава, плечо, лопаточная зона. Рабочей поверхностью являются тыльные стороны 1-й и 2-й фаланги 4-х пальцев рук с опорой на большой палец. Движения более амплитудные и прорабатывают большую площадь во время вращения. Выполняем 2-3 прохода.
Вращательное разминание большими пальцами — опора на четыре пальца и большими пальцами выполняем разминающие вращательные движения и поднимаемся снизу вверх от лопаток к шее (до волосистой части головы). 2-3 прохода.
Встаньте сбоку и выполняйте вращательное движение с противоположной стороны шеи от волосистой части по трапеции в сторону плечевого сустава. Выполняем вращение большим пальцем с опорой на четыре пальца. После вращательного движения большим пальцем, выполните выжимающие движения большим пальцем небольшими строчками от шеи к плечевому суставу. Повторить 2-3 прохода.
Кольцевое разминание – мышца захватывается большим и остальными пальцами, разминается волнообразно (движение рук разнонаправленно навстречу друг-другу). Перекатываем валик. Разминаем лопаточную зону, переходим на зону шеи и трапеции и перекатываем валик не выпуская его. Движение выполняется по спине в сторону подмышечных лимфоузлов. По шее движения выполняются в сторону подключичных лимфоузлов. При переходе между левой и правой стороной трапеции, отдельно прорабатываем волной шейный отдел, слегка оттянув кожу с мышцами на шее.
Поперечное глубокое выжимание — техника выполняется кулочками (тыльной стороной фаланг пальцев рук выжимаем от позвоночника лотерально всю межлопаточную зону от C7-TH6) выполняем стоя сбоку от пациента на противоположной стороне.
Щипцеобразное разминание – мышцы шеи разминаются пальцами, как щипцами. Руки чередуются или выполняем одной рукой с постепенным увеличением силы и глубины проработки.
Техника выполнения: Скользящим движением опускаемся вниз щипцами (большой палец с одной стороны шеи, 4 пальца с другой), в нижней точке слегка сжимаем мышцы и вытягиваем мышцы вверх. Пальцы совершают легкое вращательное движение в сагитальной плоскости и поступательное вверх-вниз и вперед-назад.
Проработка мест крепления мышц шеи по основанию черепа – мягкими вращательными движениями большим пальцем с опорой на четыре пальца проработать места крепления мышц шеи к основанию черепа. Отдельно проработать проблемные зоны. На шее, трапеции, лопатках.
Проработка межлопаточной зоны — глубокими пунктирными движениями от позвоночника к лопатке проработать межлопаточные мышцы. Используйте технику проработки суставами 2-3-й фаланги пальцев с нажимом и легким подкручиванием по ходу движения руки.
Цель: глубокая проработка мышц, снятие спазмов.
После каждого разминающего действия выполнить поглаживание.
5. Вибрация (2–3 мин)
Пунктирование – кончиками пальцев легкие постукивания области шеи с тыльной стороны и по боковой поверхности, области надплечья и лопаток.
Похлопывание – ладонью вогнутой формы (осторожно в области шеи).
Пассивные движения (аккуратные повороты головы в стороны, наклоны).
Рекомендации
Длительность сеанса: 20–30 минут.
Курс: 10–12 процедур (2–3 раза в неделю).
После массажа – покой 10–15 минут, избегать переохлаждения.
Эффект: снятие боли, улучшение подвижности шеи, снижение усталости, профилактика мигреней.
1.2 - О буддизме простым языком
Этот раздел не учебник. Это справочник о некоторых понятиях Буддизма и его философских аспектах.
1.2.1 - Медитации для различных вопросов
Различные медитации для разрешения различных жизненных вопросов
Смысл буддийских медитаций заключается в глубоком внутреннем исследовании, позволяющем напрямую пережить и осознать Четыре Благородные Истины, закон кармы, принцип анатмана (не-я) и элементы Восьмеричного пути. Через практики осознанности (сатипаттхана), сосредоточения (самадхи) и аналитической медитации (випассана) практикующий развивает ясность ума, которая раскрывает: непостоянство и страдательную природу существования (дуккха), причины страдания в виде жажды и неведения, возможность освобождения через угасание привязанностей, а также действенность Восьмеричного пути как средства трансформации сознания.
Медитация становится лабораторией, где теоретические положения Дхармы проверяются на личном опыте – наблюдая возникновение и исчезновение мыслей, эмоций и ощущений, практик убеждается в иллюзорности “я” (анатман) и закономерности кармических последствий, что постепенно освобождает ум от омрачений и ведет к пробуждению.
Шаблон для факт-карты при медитации для разрешения различных вопросов
(материал для медитаций 9-10-11-12-13)
1.2.1.1 - 1. Неведение
Медитация на познание Неведения (Авидья)
Цель"
Пробуждение (просветление) — полное устранение авидьи и выход из сансары.
1. Подготовка
Перед медитацией важно вспомнить Четыре Благородные Истины и принцип анатмана (отсутствия “Я”), чтобы направить ум к правильному пониманию.
Настройка:
Примите удобную позу, успокойте дыхание.
Осознайте, что неведение (авидья) — это корень страдания (дуккхи).
Поставьте намерение увидеть, как неведение проявляется в вашем уме, и ослабить его влияние.
2. Цепочка наблюдений и рассуждений
(1) Наблюдение за незнанием Четырёх Благородных Истин
Вопрос для размышления: “Действительно ли я понимаю природу страдания? Вижу ли я, как мои желания и привязанности ведут к дуккхе?”
Метод:
Вспомните моменты, когда вы страдали из-за неполучения желаемого.
Осознайте, что само желание обладать (танха) — причина страдания.
Поймите, что даже счастье — непостоянно, и цепляние за него ведёт к боли.
(2) Иллюзия отдельного “Я” (Анатман)
Вопрос для размышления: “Кто страдает? Есть ли постоянное “Я”, или это просто поток мыслей, чувств и ощущений?”
Метод:
Наблюдайте за мыслями и эмоциями без отождествления.
Спросите себя: “Где находится это “Я”? В теле? В уме? В воспоминаниях?”
Увидьте, что “Я” — это лишь ярлык, наклеенный на изменчивые процессы.
(3) Цепляние за преходящее как за вечное
Вопрос для размышления: “За что я цепляюсь? Деньги, отношения, статус, здоровье — разве это вечно?”
Метод:
Представьте, как всё, что вам дорого, исчезает (практика созерцания непостоянства).
Осознайте, что даже ваше тело стареет и умрёт.
Поймите, что страдание возникает, когда мы требуем, чтобы преходящее было постоянным.
(4) Искажённое восприятие реальности
Вопрос для размышления: “Почему я считаю непостоянное — постоянным, страдательное — приятным, безличное — “собой”?”
Метод:
Разбирайте любой объект привязанности (например, любимую вещь):
Она вечна? Нет, она сломается или потеряется.
Она приносит истинное счастье? Нет, удовольствие от неё временно.
Есть ли в ней “сущность”? Нет, это просто материя, собранная в определённой форме.
3. Разрыв кармических импульсов
Когда вы осознаёте, что неведение — это ошибочное восприятие реальности, происходит ослабление кармических связей.
Как это работает?
Вы перестаёте автоматически реагировать желанием или отвращением.
Видя непостоянство, вы меньше цепляетесь.
Понимая анатман, вы не отождествляетесь с мыслями и эмоциями.
Результат:
Уменьшение новых кармических отпечатков (санскар).
Ослабление силы прошлой кармы (поскольку нет подпитки неведением).
Постепенный выход из круга сансары.
4. Заключение
Эта медитация — не разовое действие, а постепенное очищение ума. Чем чаще вы наблюдаете проявления неведения, тем слабее его власть.
1.2.1.2 - 2. Кармические отпечатки
Медитация на устранение кармических отпечатков. Исполнение жизненного воплощения.
Медитация на разрыв колеса сансары через осознание кармы и Восьмеричный Путь
Цель
Осознать свои кармические отпечатки (санскары), чтобы они перестали проявляться.
Сгладить уже созревшие кармические последствия через мудрость и правильное действие.
Направить ум на освобождение, следуя Восьмеричному Пути.
1. Подготовка: Осознание кармы и Восьмеричного Пути
Перед медитацией вспомните:
Закон кармы – каждое действие (телом, речью, умом) оставляет отпечаток, ведущий к последствиям.
Восьмеричный Путь – путь к прекращению страдания через:
Правильное Понимание (мудрость)
Правильное Намерение (отказ от жажды, злобы, жестокости)
Правильная Речь (исключение лжи, грубости, пустословия)
Правильные Действия (ненасилие, честность, непричинение вреда)
Правильный Образ Жизни (незапятнанный добыча)
Правильное Усилие (отказ от дурных мыслей, культивация благих)
Правильное Осознавание (медитация на тело, чувства, ум, дхармы)
Правильное Сосредоточение (глубокая медитация, ведущая к прозрению)
Настройка:
Примите удобную позу, успокойте дыхание.
Примите твёрдое намерение: “Я осознаю свою карму, чтобы освободиться от её негативного влияния”.
2. Основная практика: Осознание кармических отпечатков
(1) Наблюдение за прошлыми действиями (кармические семена)
Вспомните недавние поступки (речь, мысли, дела), которые могли создать негативную карму.
Вопросы для анализа:
“Было ли это действие продиктовано жадностью, гневом или неведением?”
“Как оно повлияло на других? Как оно влияет на меня сейчас?”
Метод очищения:
Признайте ошибку без самобичевания.
Создайте противоположный кармический импульс (например, если был гнев – развивайте доброту).
(2) Осознание врождённых кармических тенденций
Заметьте повторяющиеся страдания в жизни:
Постоянные конфликты?
Болезни?
Тревоги или привязанности?
Вопрос:“Какие кармические причины могли привести к этому?”
Метод очищения:
Примите эти трудности как уроки, а не наказание.
Практикуйте терпение и непривязанность, чтобы не усиливать карму.
(3) Прекращение новых кармических отпечатков
Наблюдайте текущие мысли и намерения.
Как только возникает:
Желание обладать → напомните себе о непостоянстве.
Гнев → осознайте его пустотность (нет “я”, которое гневается).
Заблуждение → вспомните Четыре Благородные Истины.
Метод:
“Я не буду подпитывать эту карму. Я выбираю свободу.”
3. Интеграция Восьмеричного Пути
(1) Правильное Понимание (Мудрость)
“Всё непостоянно. Всё – страдание (дуккха). Всё – без “я” (анатман).”
“Мои страдания вызваны кармой, но я могу её преодолеть.”
(2) Правильное Намерение
“Я отказываюсь от жажды, гнева и иллюзий.”
“Я стремлюсь к освобождению, а не к временным наслаждениям.”
(3) Правильные Речь, Действия, Образ Жизни
В повседневной жизни:
Говорите правду, но мягко.
Не вредите другим (включая животных).
Избегайте профессий, связанных с обманом или насилием.
(4) Правильное Усилие
Отсекайте дурные мысли, как только они возникают.
Развивайте:
Доброту (метта)
Сострадание (каруна)
Радость за других (мудита)
Невозмутимость (упеккха)
(5) Правильное Осознавание (Сати)
Наблюдайте за телом, чувствами, умом, явлениями без отождествления.
“Это просто явление, а не “я” или “моё”.”
(6) Правильное Сосредоточение (Самадхи)
Углубляйте медитацию, пока ум не станет ясным и свободным от цепляний.
4. Заключение: Разрыв колеса сансары
Поймите: Сансара – это цикл, подпитываемый неведением и кармой.
Каждое осознанное действие ослабляет её хватку.
Конечная цель: Пробуждение (Нирвана) – состояние вне кармы и страдания.
1.2.1.3 - 3. Сознание
Сознание это то, чем человек может на земле разорвать круг сансары. Правильное управление сознанием, ведет к освобождению и свободе.
Медитация сознания: Разрыв круга сансары через прямое осознание
Цель
Прозреть непостоянство (анитья) и отсутствие “Я” (анатта) в потоке восприятия.
Остановить отождествление с шестью чувствами (зрение, слух, обоняние, вкус, осязание, ум).
Достичь состояния “не-возникновения” (ниродха), где сознание больше не цепляется.
1. Подготовка: Настройка на прозрение
Примите позу для медитации (сидя или лёжа), успокойте дыхание.
Намерение: “Я осознаю шестеро врат восприятия (глаза, уши, нос, язык, тело, ум) и увижу их пустотность.
Я разорву отождествление и остановлю вращение сансары.”
Вспомните:
“Всё, что возникает – исчезает (анитья).”
“Нет “Я” в этом потоке (анатта).”
“Сансара – это цепляние за иллюзии.”
2. Основная практика: Осознание шести чувств
(1) Осознание зрения (глаза)
Откройте глаза, замечайте формы, цвета, движения.
Вопрос:“Кто видит? Есть ли “наблюдатель”, или есть просто видение?”
Прозрение:
Формы появляются и исчезают – они непостоянны.
Нет “смотрящего” – есть лишь процесс зрения.
“Это не моё, это не я, это не моё “Я”.”
(2) Осознание слуха (уши)
Прислушайтесь к звукам: далёким, близким, тишине.
Вопрос:“Кто слышит? Есть ли “слушатель”, или есть просто звук?”
Прозрение:
Звуки приходят и уходят – они пусты.
Нет “Я” в слушании – есть лишь вибрации.
“Звук возникает и исчезает сам по себе.”
(3) Осознание обоняния (нос)
Заметьте запахи (или их отсутствие).
Вопрос:“Кто чувствует запах? Есть ли “обоняющий”, или есть просто запах?”
Прозрение:
Запах – это химическая реакция, не имеющая “Я”.
“Нет того, кто нюхает – есть лишь временное явление.”
(4) Осознание вкуса (язык)
Если во рту есть вкус (слюна, остатки пищи), наблюдайте его.
Вопрос:“Кто ощущает вкус? Есть ли “дегустатор”, или есть просто вкусовые сигналы?”
“Если нет цепляния, карма не создаёт новую сансару.”
Метод:
Когда возникает желание/отвращение – наблюдайте без реакции.
“Это просто явление, пустое от “Я”.”
(3) Состояние “не-возникновения”
В глубокой медитации ум успокаивается, цепляние прекращается.
Опыт:
“Нет больше “я”, которое страдает.”
“Нет больше кармы, которая ведёт к перерождению.”
“Есть только ясность, свободная от сансары.”
4. Заключение: Выход за пределы сансары
Когда сознание перестаёт цепляться:
Прекращается кармическое накопление (нет новых санскар).
Старая карма растворяется (как огонь без топлива).
Сансара останавливается – сознание больше не вовлекается в рождение и смерть.
Финальное осознание: “Нет ни глаза, ни уха, ни носа, ни языка, ни тела, ни ума.
Нет ни форм, ни звуков, ни запахов, ни вкусов, ни прикосновений, ни мыслей.
Нет ни наблюдателя, ни наблюдаемого.
Есть только свобода – за пределами сансары.”
1.2.1.4 - 4. Имя-форма
Осознаем свои тела и разрываем круг сансары через устранение влияния на свое тела.
Медитация на осознание «Имя-Форма» (Нама-Рупа) как ключа к разрыву сансары
Цель
Прямое переживание непостоянства и безличности компонентов «Имя-Форма».
Разрушение иллюзии «Я» через анализ психических и физических процессов.
Прекращение кармического подкрепления сансары за счёт освобождения от отождествления.
1. Подготовка: Настройка ума
Поза: устойчивая, с прямой спиной (сидя или лёжа).
Намерение: «Я исследую Нама-Рупа, чтобы увидеть их пустотность и разорвать сансару».
Основная опора: «Нет „я“ в Нама-Рупа. Это просто процессы, зависящие от причин».
2. Основная практика: Анализ «Имя-Форма»
(1) Наблюдение за «Формой» (Рупа)
Фокус: физическое тело (дыхание, сердцебиение, покалывания, тяжесть/лёгкость).
Вопросы:
«Из чего состоит это тело? Кости, кровь, органы – но где здесь „я“?»
«Тело меняется каждую секунду. Кто им владеет?»
Ключевое прозрение: «Рупа – это временное скопление элементов (земля, вода, огонь, воздух). Нет „хозяина“ в этом процессе».
(2) Наблюдение за «Именем» (Нама)
Разбираем каждый компонент ума:
a) Чувства (ведана)
Заметьте: приятное/неприятное/нейтральное в текущий момент.
Вопрос:«Кто чувствует? Или есть просто возникающие ощущения?»
b) Восприятие (сання)
Осознайте, как ум «называет» объекты («стол», «холод», «боль»).
Вопрос:«Есть ли „тот, кто знает“, или это просто ярлыки?»
c) Воля (четана)
Наблюдайте импульсы: «хочу двигаться», «не хочу это слышать».
Вопрос:«Откуда берутся эти желания? Кто их контролирует?»
d) Контакт (пхасса)
Поймайте момент соприкосновения чувств с объектом (например, звук + ухо → «шум»).
Вопрос:«Есть ли „испытатель“ контакта, или это просто условие?»
e) Внимание (манасикара)
Отследите, как ум «выбирает», на что смотреть/думать.
Вопрос:«Кто направляет внимание? Или это автоматический процесс?»
Итог: «Нама – это набор функций, как программа. Нет „пользователя“ за ними».
3. Глубокий анализ: Как Нама-Рупа питает сансару
Цепляние:
«Если я считаю тело „собой“, а мысли – „своими“, то рождается страдание».
Кармический механизм:
«Отождествление → действие (карма) → новое рождение (сансара)».
Точка разрыва:
«Без отождествления с Нама-Рупа карма теряет силу».
4. Разрыв сансары: Практические шаги
(1) Отделение сознания от Нама-Рупа
Метод:
Повторять: «Это не моё, это не я, это не моё „Я“» – к каждому компоненту тела и ума.
Эффект:
Ослабление кармических импульсов.
(2) Прекращение подпитки кармы
Наблюдайте:
Как «желание сохранить Нама-Рупа» ведёт к действиям (например: «я должен защитить это тело» → страх → новая карма).
Решение: «Тело и ум – временные инструменты. Они не требуют защиты».
(3) Прямое постижение зависимости
Формула: «Без Нама нет Рупа, без Рупа нет Нама. Но оба пусты от „я“».
Пример:
«Если ум (Нама) не распознаёт тело (Рупа) как „своё“, то где сансара?»
5. Финальное осознание
Без Нама-Рупа нет «рождения» → нет основы для сансары.
Без цепляния нет кармы → нет топлива для перерождений.
Только чистое сознание (виньяна), свободное от отождествлений, выходит за пределы.
Заключительная фраза: «Нама-Рупа – как река.
Я – не капля в ней, я – тот, кто видит реку.
Когда видение становится абсолютным, река исчезает.
Остаётся только свобода».
1.2.1.5 - 5. Медитация на осознание шести сфер чувств (Шадаятана) для освобождения от страданий
Эта медитация направлена на осознание шести органов чувств (глаза, уши, нос, язык, тело, ум) и их взаимодействия с внешним миром.
Через глубокое наблюдение мы увидим, как привязанности и желания, возникающие в этих сферах, приковывают нас к страданиям. Осознав их природу, мы сможем ослабить их хватку и сделать шаг к освобождению от колеса сансары.
1. Подготовка
Примите удобное положение сидя с прямой спиной. Закройте глаза или опустите взгляд. Настройтесь на естественное дыхание, позволяя телу расслабиться.
“Позвольте уму успокоиться. Ощутите, как дыхание входит и выходит, не цепляясь ни за что. Пусть тело и ум придут в состояние тихого, ясного присутствия.”
2. Осознание шести сфер чувств
Глаза (зрение)
Обратите внимание на то, что видите, даже если глаза закрыты. Заметьте свет, тени, образы. “Осознайте: глаза воспринимают формы, цвета, но сами по себе они лишь инструменты. Видимое — непостоянно, оно приходит и уходит. Не цепляйтесь за зримые образы, не отвергайте их. Просто наблюдайте, как они появляются и исчезают, не создавая желания или отвращения.”
Уши (слух)
Прислушайтесь к звукам вокруг: далёким и близким, громким и тихим. “Звуки возникают и растворяются в пустоте. Уши улавливают их, но сами звуки не имеют собственной природы. Позвольте им быть, не цепляясь за приятное, не сопротивляясь неприятному. Просто слушайте, как эхо в горах — оно приходит и уходит само.”
Нос (обоняние)
Ощутите запахи вокруг: может, аромат благовоний, воздуха или просто отсутствие запаха. “Запахи приходят и уходят, как ветер. Нос их воспринимает, но они не принадлежат вам. Не стремитесь удержать приятный аромат, не избегайте неприятного. Осознайте их мимолётность.”
Язык (вкус)
Ощутите вкус во рту: нейтральный, сладкий, горький — какой есть. “Вкус — лишь временное явление. Даже самый изысканный вкус исчезает. Не жаждите его продления, не бегите от горечи. Наблюдайте, как вкус растворяется в пустоте.”
Тело (осязание)
Почувствуйте прикосновение одежды, воздуха, поверхности, на которой сидите. “Ощущения в теле постоянно меняются: тепло, холод, давление, лёгкость. Они непостоянны. Тело — лишь проводник, а не владелец этих чувств. Позвольте им приходить и уходить, не отождествляясь с ними.”
Ум (мысли, эмоции)
Наблюдайте за потоком мыслей и эмоций. “Ум создаёт образы, воспоминания, желания. Но мысли — как облака: они появляются и исчезают. Не цепляйтесь за них, не подавляйте. Осознайте: ум — лишь шестая сфера чувств, а не “я”. Наблюдайте за ним со стороны, как за течением реки.”
3. Разрыв привязанностей
Теперь осознайте, как через эти шесть сфер возникают желания:
“Глаза хотят видеть приятное, уши — слышать гармоничные звуки, нос — вдыхать ароматы, язык — наслаждаться вкусом, тело — комфорт, ум — приятные мысли.”
“Но все эти желания — ловушки. Они создают привязанности, а значит — страдания. Поймите: ни одно чувство не принадлежит вам. Они пусты, непостоянны, лишены “я”.”
“Позвольте шести сферам быть, но не позволяйте им управлять вами. Как зеркало отражает, но не цепляется за отражения, так и вы — осознавайте, но не цепляйтесь.”
4. Освобождение
Представьте, как все ощущения, мысли, восприятия проходят сквозь вас, не оставляя следа. “Шесть сфер чувств — лишь врата, а не дом. Вы — не тело, не ум, не чувства. Вы — осознавание за пределами всех форм. Сансара держится на привязанности к чувствам, но когда осознаёшь их пустоту — колесо останавливается.”
Побудьте в этом состоянии чистого осознания, без цепляния, без отождествления.
“Пусть это осознание шести сфер чувств остаётся с вами в повседневной жизни. Наблюдайте, но не цепляйтесь. Так вы ослабите оковы сансары и приблизитесь к освобождению.”
1.2.1.6 - 6. Медитация на осознание Контакта (Спарша / Phassa) для прекращения страданий
Контакт (Спарша) — это встреча органа чувств, его объекта и соответствующего сознания. Именно здесь рождаются ощущения, а за ними — жажда, привязанности и страдания.
Осознав природу контакта, мы можем прервать автоматические реакции ума и остановить вращение колеса сансары.
Цель
Наблюдать момент контакта, не вовлекаясь в цепь: “контакт → ощущение → жажда → цепляние → страдание”.
1. Подготовка к медитации
Примите удобную позу, закройте глаза. Дышите естественно, отпуская напряжение. “Пусть тело успокоится, а ум станет ясным и бдительным. Осознайте настоящее мгновение — здесь и сейчас.”
2. Осознание шести дверей контакта
Напомните себе:
*“Контакт происходит в шести сферах:
Глаза + форма → зрительное сознание
Уши + звук → слуховое сознание
Нос + запах → обонятельное сознание
Язык + вкус → вкусовое сознание
Тело + прикосновение → тактильное сознание
Ум + мысль → умственное сознание”*
“Каждый миг где-то происходит контакт. Но кто его хозяин?”
3. Наблюдение контакта в реальном времени
а) Контакт через тело
Ощутите прикосновение одежды, воздуха, поверхности под вами. “Есть тело, есть касание, есть сознание прикосновения. Но нет того, кто ощущает. Есть лишь процесс: “тело → касание → осознавание”. Нет “я” в этом контакте.”
б) Контакт через звуки
Прислушайтесь к любому звуку. “Звук ударяет в ухо, возникает слуховое сознание. Но где “слушатель”? Нет никого за этим процессом — только пустота, в которой звук появляется и исчезает.”
в) Контакт через ум
Наблюдайте мысль. “Ум соприкоснулся с образом, памятью, идеей. Возникло умственное сознание. Но это не “моя” мысль. Она пришла из ниоткуда и уйдёт в никуда. Нет “я”, которое думает.”
4. Разрушение иллюзии “я” в контакте
*“Обычно мы говорим: “Я вижу”, “Я слышу”, “Я чувствую”. Но где это “я”?
Нет “видящего” — есть только глаз, форма и зрительное сознание.
Нет “слышащего” — есть только ухо, звук и слуховое сознание.
Нет “думающего” — есть только ум, мысль и умственное сознание.”*
“Контакт происходит, но никто не контактирует. Ощущение есть, но никто не ощущает. Всё происходит само — без хозяина, без “я”.”
5. Прекращение цепочки страдания
Теперь проследите, как из контакта рождается страдание:
Контакт (глаз видит форму)
Ощущение (приятное/неприятное/нейтральное)
Жажда (хочу больше/хочу избавиться)
Цепляние (отождествление: “это моё”, “это я”)
Страдание (если не получаю желаемое или сталкиваюсь с нежеланным)
“Но если увидеть, что в контакте нет “я”, то где тогда жажда? Где цепляние? Где страдание? Всё рассыпается, как песочный замок.”
6. Пребывание за пределами контакта
Перенесите внимание на то, что осознаёт сам контакт. “Кто знает, что есть контакт? Кто наблюдает? Даже этот вопрос — лишь мысль, ещё один контакт. Вернитесь в тишину до всяких ярлыков.”
“Нет глаза, нет формы, нет зрения — есть лишь чистое осознавание, в котором всё возникает и исчезает. Это и есть свобода.”
7. Завершение
Медленно возвращайтесь к обычному восприятию. Пошевелите пальцами, откройте глаза.
“Пусть это понимание контакта остаётся с вами. Всякий раз, когда возникает ощущение, спрашивайте: “Кто чувствует?” И увидите: есть лишь процесс, но нет страдающего. Так колесо сансары теряет свою силу.”
1.2.1.7 - 7. Медитация на преодоление чувства (Ведана) для остановки колеса сансары
Чувство (Ведана) — это мгновенная оценка любого контакта как приятного, неприятного или нейтрального. Именно из этой оценки рождается цепь: ощущение → жажда → привязанность → страдание.
Цель медитации:
— Научиться осознавать чувства до того, как они запустят реакцию ума.
— Увидеть их пустотную природу, чтобы они больше не возникали как источник страдания.
1. Подготовка: Осознание шести дверей чувств
Сядьте в удобную позу, закройте глаза. Дышите спокойно.
*“Чувства возникают в шести сферах:
Глаза (приятный/неприятный образ)
Уши (приятный/неприятный звук)
Нос (приятный/неприятный запах)
Язык (приятный/неприятный вкус)
Тело (приятное/неприятное прикосновение)
Ум (приятная/неприятная мысль)”*
“Все они мимолетны. Ни одно чувство не длится вечно. Но ум цепляется за приятное и бежит от неприятного — так вращается колесо сансары.”
2. Наблюдение чувств без отождествления
Шаг 1: Осознайте текущее чувство
Спросите себя:
“Что я чувствую прямо сейчас? Приятное? Неприятное? Нейтральное?”
“Где оно проявляется? В теле? В уме?”
Не пытайтесь изменить его — просто знайте, что оно есть.
Шаг 2: Увидьте его непостоянство
“Это чувство уже меняется. Даже сильная боль ослабевает, даже великая радость уходит. Оно не принадлежит вам — оно просто проходит через вас.”
Шаг 3: Отделите чувство от “я”
*“Обычно мы говорим: “Мне больно”, “Мне приятно”. Но где это “я”?
Нет “того, кому больно” — есть просто боль.
Нет “того, кто радуется” — есть просто радость.
Чувства приходят и уходят, но никто не чувствует.”*
Страдание (если не получаю желаемое или сталкиваюсь с нежеланным)
“Но если чувство осознано как пустое и безличное — жажда не возникает. Нет жажды — нет привязанности. Нет привязанности — нет страдания.”
4. Глубокая практика: Невозникновение чувства
Теперь — ключевой момент: прекратите кормить чувства вниманием.
Если возникает приятное чувство: “Оно уже исчезает. Не цепляйся. Не называй его “моим наслаждением”.”
Если возникает неприятное чувство: “Оно не твоё. Это просто волна. Разотождествись — и оно пройдет без следа.”
Если нейтральное чувство: “Даже безразличие — иллюзия. Не спи в неосознанности.”
“Чувства подобны искрам — если не раздувать их, они гаснут сами.”
5. Выход за пределы чувств
Перенесите внимание на того, кто знает чувства. “Кто осознаёт, что есть чувство?
Даже этот вопрос — лишь мысль.
Вернись в тишину, где нет ни приятного, ни неприятного — только чистое знание.”
“Когда чувства больше не владеют тобой — колесо сансары останавливается.”
6. Завершение
Медленно вернитесь к обычному восприятию. Пошевелите пальцами, откройте глаза.
“Пусть эта осознанность сопровождает тебя всегда.
Приятное приходит — не цепляйся.
Неприятное приходит — не сопротивляйся.
Нейтральное — не игнорируй.
Так ты разорвешь оковы чувств и выйдешь из круга страданий.”
Как применять в жизни:
В моменты сильных эмоций спрашивайте: “Кто это чувствует?”
Наблюдайте, как чувства возникают и исчезают, не вовлекаясь.
Помните: нет “вашей” боли или “вашей” радости — есть лишь пустотные волны опыта.
Эта практика ведёт к вираге (бесстрастию) и ниродхе (прекращению возникновения страдания).
Жажда (Танха) – это тот крючок, который цепляет нас за колесо сансары. Она проявляется в трех формах: Жажда чувственных удовольствий, Жажда существования и становления, Жажда не-существования
Введение в природу Жажды
Жажда (Танха) – это тот крючок, который цепляет нас за колесо сансары. Она проявляется в трех формах:
Жажда чувственных удовольствий (кама-танха)
Жажда существования и становления (бхава-танха)
Жажда не-существования (вибхава-танха)
Эта медитация поможет вам распознать и растворить механизм жажды в самом его корне.
1. Подготовка: Осознание текущего состояния
Примите удобную позу. Закройте глаза. Сделайте три глубоких вдоха и выдоха.
“Обратите внимание: прямо сейчас в вашем уме уже есть какие-то желания. Может быть, это тонкое ожидание приятного переживания от медитации? Или легкое раздражение от постороннего звука? Это и есть проявления жажды – тяга к приятному и отвращение от неприятного.”
2. Распознавание трех видов жажды
а) Жажда удовольствий (Кама-танха)
Вспомните недавнее желание:
Вкусной еды
Приятных впечатлений
Комфортных ощущений
“Посмотрите: когда возникает это желание, появляется напряжение. Ум создает образ того, чего нет, и страдает от этого разрыва между реальностью и фантазией. Но где вы будете, когда получите желаемое? То же самое “я” будет искать новое желание.”
б) Жажда становления (Бхава-танха)
Обратите внимание на:
Стремление к достижениям
Желание изменить себя
Мечты о будущем
“Эта жажда заставляет нас бесконечно совершенствоваться, но куда? Каждое достижение рождает новую цель. Нет конца этому бегу.”
в) Жажда не-существования (Вибхава-танха)
Наблюдайте:
Желание убежать от проблем
Мысли вроде “лучше бы этого не было”
Усталость от существования
“Даже отрицание – это форма жажды. Пытаясь убежать от чего-то, мы по-прежнему привязаны к этому через сопротивление.”
3. Анатомия Жажды: как она возникает
Проследите цепочку:
Контакт (например: глаз + красивая вещь)
Чувство (приятное ощущение)
Жажда (“Хочу это!”)
Цепляние (“Это должно быть моим!”)
Страдание (если не получаю)
“Разорвите эту цепь на третьем шаге. Когда появляется приятное чувство – просто осознайте его, не превращая в желание.”
4. Практика растворения Жажды
Упражнение 1: Наблюдение без вовлечения
Выберите небольшое текущее желание (например, желание почесаться или изменить позу).
*“Осознайте это желание, но не удовлетворяйте его сразу. Наблюдайте, как оно:
Возникает
Набирает силу
Ослабевает
Исчезает
Вы увидите: жажда – это просто волна в уме. Она приходит и уходит, если ее не подпитывать.”*
Упражнение 2: Вопрос к источнику
Когда возникает сильное желание, спросите:
“Кто хочет этого?”
“Что будет, если это не получить?”
“Где будет это желание через год?”
“Вы обнаружите: нет того, кто желает – есть лишь пустой процесс возникновения мысли.”
5. Глубокая практика: Прекращение подпитки
Представьте, что ваш ум – это океан. Жажда – это волны на поверхности.
“Не пытайтесь остановить волны – это создаст новые волны усилий. Просто осознайте глубину океана под ними. В этой глубине нет жажды – есть лишь покой.”
6. Выход за пределы Жажды
Перенесите внимание на того, кто осознает желания.
“Кто знает, что есть жажда?
Этот вопрос тоже исчезает…
Остается лишь чистое пространство осознавания,
в котором желания возникают и растворяются,
как узоры на воде.”
7. Завершение
Медленно возвращайтесь к обычному состоянию. Пошевелите пальцами. Откройте глаза.
“Пусть это понимание сопровождает вас.
Когда появляется желание – встречайте его как гостя,
но не как хозяина.
Так вы перестанете быть рабом жажды
и сделаете шаг к свободе.”
Практическое применение
В повседневной жизни создавайте паузу между желанием и действием.
Спрашивайте: “Действительно ли это мне нужно или это просто автоматизм ума?”
Наблюдайте, как многие желания исчезают, если их не подпитывать вниманием.
Помните: Нет жажды – нет цепляния. Нет цепляния – нет кармы. Нет кармы – остановка колеса сансары.
1.2.1.9 - 9. Медитации Правильные взгляды
Описывается алгоритм построения факт-карты и последующей медитации для формирования правильного взгляда.
Алгоритм составления факт-карты и проведения медитации
1. Подготовка
Возьмите лист бумаги (факт-карту) и ручку.
В центре листа напишите объект исследования (человек, ситуация, эмоция и т. д.).
Вокруг объекта будут располагаться четыре блока анализа:
Четыре Благородные Истины
Закон кармы
Анатта (Не-я)
Иллюзорность мира
mindmap
root((Факт-карта:<br>Мой муж))
1. Четыре Благородные Истины
1.1 Дуккха
▪ Его равнодушие ранит
▪ Конфликты вызывают боль
1.2 Причина
▪ Ожидание идеального поведения
▪ Привязанность к "моему" счастью
1.3 Прекращение
▪ Отпускание требований
▪ Принятие несовершенства
1.4 Путь
▪ Практика правильной речи
▪ Развитие осознанности
2. Закон кармы
2.1 Его карма
▪ Поведение — следствие прошлых причин
▪ Обусловленности характера
2.2 Моя карма
▪ Гнев создает будущие страдания
▪ Терпение улучшает отношения
3. Анатта Не-я
3.1 Нет неизменной сущности
▪ Он — поток меняющихся состояний
▪ "Плохой муж" — временный ярлык
3.2 Мои проекции
▪ Приписывание постоянных качеств
▪ Ошибка отождествления
4. Иллюзорность мира
4.1 Ожидания как иллюзия
▪ "Он должен..." — конструкция ума
▪ Брачные роли — социальный договор
4.2 Реальность без ярлыков
▪ Конфликт существует только в восприятии
▪ Пустота форм
2. Заполнение факт-карты
1. Четыре Благородные Истины
Первая истина (Страдание – дуккха):
Какие страдания или дискомфорт связаны с этим объектом?
Пример: “Когда жена критикует меня, я чувствую злость и обиду.”
Вторая истина (Причина страдания – желания и привязанности):
Какие мои ожидания, цепляния или эгоистичные желания вызывают страдание?
Пример: “Я хочу, чтобы она всегда была ласковой и соглашалась со мной.”
Если я перестану требовать от неё идеальности, мои страдания уменьшатся.
Если я приму её такой, какая она есть, конфликтов станет меньше.
Четвёртая истина (Путь к прекращению страдания – Восьмеричный путь):
Мне нужно развивать правильные взгляды: видеть её не как “свою собственность”, а как человека с собственными кармическими причинами поведения.
2. Закон кармы
Её характер и поступки – результат её прошлых действий и условий.
Мои реакции на неё – это моя карма. Если я злюсь, я создаю причины для будущих страданий.
Наши конфликты – это кармическая связь, которую можно изменить через осознанность.
3. Анатта (Не-я)
Она не является неизменной “сущностью” – её настроения, мысли и поведение постоянно меняются.
Моё представление о ней – лишь проекция моего ума, а не её истинная природа.
Нет “плохой” или “хорошей” жены – есть лишь обусловленные проявления.
4. Иллюзорность мира
Моё восприятие жены субъективно и зависит от моего состояния.
Конфликты – это игра ума, а не абсолютная реальность.
Если я перестану цепляться за свои ожидания, иллюзия “проблемы” исчезнет.
Выводы после медитации
Отказ от идеализации: Моя жена – не объект, который должен соответствовать моим ожиданиям. Она такая, какая есть, и мои страдания возникают из-за привязанности к желаемому образу.
Принятие непостоянства: Её настроения и поведение меняются – это естественно. Мне не нужно реагировать на каждую эмоцию как на что-то личное.
Кармическая ответственность: Мои негативные реакции ухудшают наши отношения. Если я изменю своё отношение, изменится и наша динамика.
Иллюзия “я” и “она”: Конфликты возникают из-за отождествления (“я прав, она виновата”). Если увидеть, что нет фиксированного “я”, исчезнет и почва для конфликта.
Практика правильных взглядов: Вместо осуждения – понимание. Вместо гнева – осознание причин её поведения. Вместо привязанности – мудрость не-обладания.
Итог: Правильные взгляды помогают увидеть жену без искажений эго и уменьшить страдания в отношениях.
Пример факт карты жены к исследованию мужа:
Факт-карта: “Мой муж”
Объект исследования: Мой муж
1. Четыре Благородные Истины
Первая истина (Дуккха – страдание):
Иногда его поведение вызывает у меня разочарование (например, когда он игнорирует мои просьбы).
Наши ссоры оставляют чувство одиночества и непонимания.
Его холодность или резкость ранит меня.
Вторая истина (Причина страдания – желания и привязанности):
Я хочу, чтобы он всегда был внимательным и заботливым (привязанность к идеалу).
Я расстраиваюсь, когда он не соответствует моим ожиданиям.
Мне больно, когда он уделяет время работе/друзьям больше, чем мне (цепляние за «моё» внимание).
Если я перестану требовать от него постоянной идеальности, мои страдания уменьшатся.
Если я приму его таким, какой он есть, конфликтов станет меньше.
Четвёртая истина (Путь – Восьмеричный путь):
Мне нужно развивать правильные взгляды: видеть его не как «источник моих страданий», а как человека со своими кармическими уроками.
Практиковать правильную речь (не обвинять) и правильное усилие (контролировать обиду).
2. Закон кармы
Его характер и поступки – результат его прошлой кармы и условий.
Мои эмоциональные реакции (обида, гнев) создают новую негативную карму.
Наши конфликты – это общая кармическая задача, которую можно решить через осознанность.
3. Анатта (Не-я)
Он не является «плохим» или «хорошим» – его поведение зависит от обстоятельств.
Моё представление о нём – лишь проекция моего ума («он должен быть таким-то»).
Нет неизменного «мужа» – есть лишь поток действий, слов и мыслей.
4. Иллюзорность мира
Мои претензии к нему – это игра моего эго, а не абсолютная истина.
Конфликты существуют только потому, что я верю в их реальность.
Если я отпущу ожидания, исчезнет и проблема.
Выводы после медитации
Отказ от идеализации
Мой муж – не персонаж из моих фантазий, а живой человек со своими недостатками.
Принятие непостоянства
Его настроение, внимание и даже любовь – это переменчивые явления, а не «навсегда».
Кармическая ответственность
Мои обиды и претензии лишь усугубляют ситуацию. Если я изменюсь, изменится и наша динамика.
Разоблачение иллюзий
Страдание возникает из-за веры в то, что «он должен делать меня счастливой». Это заблуждение.
Практика мудрости
Вместо обид – понимание.
Вместо требований – благодарность за то, что есть.
Итог: Эта практика помогает увидеть мужа без искажений эго и снизить уровень страданий в отношениях.
Как применять эту факт-карту?
Заполняйте её честно – без самообмана.
Медитируйте на каждый пункт по 5–10 минут, наблюдая свои эмоции.
Пересматривайте через время – если что-то изменилось, обновите записи.
Действуйте – после осознаний меняйте своё поведение, а не ждите изменений от мужа.
1.2.1.10 - 10. Медитации Правильные намерения
Описывается алгоритм построения факт-карты и последующей медитации для формирования правильных намерений.
Важное дополнение
Этот алгоритм с описанием построения факт карты для взращивания в себе правильных намерений, как логическое продолжение предыдущей практики Правильные взгляды. Перед началом практики, обязательно изучите предыдущий материал
Факт-карта для ② Правильных намерений (Самма санкаппа)
Объект исследования: Мой муж
mindmap
root((Правильные намерения<br>Самма санкаппа))
Устранить
Жажда - "Требование идеала"
Злоба - "Обиды и проекции"
Жестокость - "Месть за боль"
Культивировать
Метта - Добрые пожелания
Каруна - Понимание его боли
Упеккха - Свобода от ожиданий
Действия
Речь - Без обвинений
Мысли - "Он тоже страдает"
Медитация - Визуализация света
1. Препятствия и их причины
① Жажда (Танха)
Проявление:
Требую, чтобы он всегда был внимательным («Он должен дарить мне любовь!»)
Цепляюсь за идеал «идеального мужа» из прошлого опыта
Причина:
Страх одиночества, потребность в подтверждении значимости
② Злоба (Доса)
Проявление:
Раздражение, когда он забывает о моих просьбах
Внутренний диалог: «Он эгоист, ему всё равно!»
Причина:
Обиды из прошлого, проекция собственной неуверенности
③ Жестокость (Вьяпада)
Проявление:
Мысленные пожелания «пусть он почувствует, как мне больно!»
Утром мысленно повторять: «Пусть он будет счастлив, здоров и свободен от страданий»
Находить 3 конкретные вещи, за которые благодарна ему сегодня
② Развитие сострадания (Каруна)
Практика:
Напоминать себе: «Его поведение — следствие его боли. Он тоже страдает»
Перед сном визуализировать его как ребёнка, нуждающегося в любви
③ Воспитание непривязанности (Упеккха)
Практика:
Заменять «Он должен…» на «Я выбираю спокойствие вне зависимости от его поступков»
Медитация на непостоянство: наблюдать, как его настроения/действия меняются, как облака
3. Конкретные действия
Ситуация
Старое намерение
Новое намерение
Действие
Он забыл о важной дате
«Он специально меня игнорирует!»
«Возможно, он перегружен. Я спокойно напомню»
Сказать: «Я ценю, когда ты помнишь такие моменты. Давай вместе отметим в выходные?»
Он критикует меня
«Он меня не уважает!»
«Его слова — его тревоги, а не моя суть»
Глубокий вдох - ответить: «Я услышала тебя. Давай обсудим это без обвинений»
Выводы
Осознание - Выбор: Каждый раз, когда возникает гнев или жажда, вспоминать: «Это мой ум создаёт страдание. Я выбираю метту вместо злобы».
Постепенность: Начинать с малого — например, 1 день без мысленных обвинений.
Поддержка: Использовать утверждение для сложных моментов: «Пусть и он, и я обретём мир. Всё изменчиво».
Итог: Правильные намерения перестраивают кармические паттерны, превращая конфликты в возможности для роста. Как сказал Будда: «Ненависть не прекращается ненавистью. Она прекращается только любовью».
Эта карта — инструмент для ежедневной работы. Пересматривайте её каждую неделю, отмечая прогресс.
1.2.1.11 - 11. Медитации Правильная речь
Описывается алгоритм построения факт-карты и последующей медитации для формирования правильной речи.
Факт-карта: Правильная речь (Самма вача) в отношениях с мужем
Объект исследования: Моё общение с мужем
1. Четыре аспекта отказа (что есть → страдания → карма → практика)
Аспект
Что есть сейчас
К чему приводит (дуккха)
Кармические последствия
Как практиковать
① Ложь
Умалчиваю свои истинные чувства («Всё нормально»)
Накопление обиды, потеря доверия
Цикл недопонимания → усиление одиночества
Говорить правду мягко: «Я чувствую грусть, когда ты отдаляешься» вместо молчания
② Сплетни
Жалуюсь подругам: «Он никогда меня не слышит!»
Рост негатива, проецирование образа «плохого мужа»
Укрепление разобщённости в отношениях
Обсуждать проблемы напрямую с ним, без оценок: «Мне важно, чтобы мы слышали друг друга»
③ Грубость
Кричу: «Ты вообще думаешь хоть иногда?!»
Мгновенная боль → долгие обиды
Карма гнева → ответная агрессия или холодность
Пауза перед реакцией. Замена на: «Я злюсь, потому что…» (без «ты-обвинений»)
④ Пустословие
Часы разговоров о бытовых мелочах без смысла
Усталость, ощущение пустоты в общении
Трата энергии на бесполезную карму
Сократить болтовню. Задать осмысленный вопрос: «Что для тебя важно сейчас?»
2. Уровни практики
① Этический (что исключить)
Ложь из страха конфликта
Сарказм и унизительные шутки
Обсуждение его с родственниками в негативном ключе
② Психологический (мотивы речи)
Перед словами спрашивать:
Говорю ли я из обиды или из желания решить проблему?
Будут ли эти слова полезны?
③ Медитативный (осознанность)
Ежедневно 5 минут наблюдать:
Какие эмоции стоят за моими словами?
Как моя речь влияет на атмосферу в доме?
3. Конкретные шаги для изменений
Упражнение «Три вопроса» перед говорением:
Это правда?
Это необходимо сейчас?
Это сказано с добротой?
Метта-диалоги:
Раз в день говорить мужу что-то поддерживающее без повода: «Я ценю, что ты…»
День молчания:
1 день в месяц без светских разговоров — только осмысленная речь.
4. Связь с другими шагами Восьмеричного пути
Правильные взгляды: Понимать, что грубость — это проявление моей собственной неуравновешенности, а не его «плохости».
Правильные намерения: Перед разговором настроиться на сострадание, а не на победу в споре.
Правильные действия: Подкреплять речь честными поступками (не говорить «мне важно внимание», а самой проявлять его).
mindmap
root((Объект:<br>Моя речь с мужем))
1. Текущие проблемы
1.1 Ложь
▪ "Говорю 'Всё нормально', когда обижена"
1.2 Сплетни
▪ "Жалуюсь маме на его привычки"
1.3 Грубость
▪ "Кричу в ссорах"
1.4 Пустословие
▪ "Часы разговоров ни о чём"
2. Последствия
2.1 Мои страдания
▪ "Накопление обиды"
2.2 Его страдания
▪ "Он закрывается"
2.3 Карма
▪ "Цикл взаимных обид"
3. Практика изменений
3.1 Замены
▪ Ложь → "Я чувствую..."
▪ Крик → Пауза + "Я-высказывания"
3.2 Упражнения
▪ "Три вопроса" перед речью
▪ День метта-речи
4. Связь с Восьмеричным путём
4.1 С взглядами
▪ "Речь отражает мои заблуждения"
4.2 С намерениями
▪ "Говорю из гнева или любви?"
4.3 С действиями
▪ "Слова согласуются с поступками"
5. Прогресс
5.1 Успехи
▪ "Не кричала неделю"
5.2 Трудности
▪ "Сложно избегать сплетен"
Ключевые элементы схемы:
Центральный объект - фокус исследования (ваше общение)
5 основных ветвей:
Текущие проблемы (4 вида вредной речи)
Последствия (дуккха и карма)
Практика (конкретные замены и упражнения)
Интеграция с духовным путём
Отслеживание прогресса
Формат записей:
▪ Конкретные примеры из вашей жизни
▪ Стрелки трансформации (ложь → “Я-высказывания”)
Как использовать:
Заполняйте ветви своими примерами
Добавляйте даты к пунктам “Прогресс”
Соединяйте связанные мысли стрелками (в ручном режиме)
Пересматривайте перед важными разговорами
Рекомендации
Речь — это карма в действии. Каждое слово формирует будущее качество отношений.
Осознанность побеждает автоматизмы. Даже пауза в 3 секунды перед ответом меняет динамику конфликта.
Трансформация речи = трансформация ума. Чистая речь очищает сознание от агрессии и иллюзий.
«Пусть мои слова будут мягкими, как лепестки, и правдивыми, как земля под ногами» (парафраз буддийской молитвы).
1.2.1.12 - 12. Медитация правильные действия
Описывается алгоритм построения факт-карты и последующей медитации для формирования правильных действий.
Факт-карта: Правильные действия (Самма камманта) в семейной жизни
Объект исследования: Мои повседневные поступки в отношениях с мужем
mindmap
root((Факт-карта<br>Самма камманта))
Основные принципы
["Не вредить"]
Физические действия
Эмоциональные воздействия
Кармические последствия
["Помогать"]
Акты щедрости
Поддержка
Совместная практика
Уровни анализа
Этический
Запрещённые действия
Границы дозволенного
Психологический
Мотивация
Эмоциональные триггеры
Медитативный
Осознание тела
Наблюдение импульсов
Практические инструменты
Упражнение "Три действия"
Утренний ритуал
Дневное наблюдение
Вечерняя практика
Метта-ритуалы
Безусловная помощь
День без жалоб
Связи с Восьмеричным путём
Правильные взгляды
Правильная речь
Правильный образ жизни
Пример медитации
Восстановление ситуации
Анализ телесных реакций
Ментальная репетиция
1. Два ключевых принципа (что есть - страдания - карма - практика)
Принцип
Что есть сейчас
К чему приводит (дуккха)
Кармические последствия
Как практиковать
① Не вредить
Кричу во время ссор, хлопаю дверьми
Муж замыкается, растёт дистанция
Цикл взаимной агрессии - разлад
Заменить физические реакции на паузу и дыхание (3 вдоха перед действием)
Игнорирую его просьбы («Сделаю потом»)
Накопление resentment (скрытой обиды)
Карма безответственности - потеря доверия
Выполнять мелкие просьбы сразу («Помогу с посудой сейчас»)
② Помогать
Жду, чтобы он первый проявлял заботу
Ощущение «нам нечего дать друг другу»
Карма ожидания - застой в отношениях
Инициатива без условий: приготовить его любимое блюдо «просто так»
Экономлю на общих праздниках («Деньги важнее»)
Потеря радости в совместном быте
Карма скупости - обеднение эмоций
Вложиться в переживание (например, устроить пикник вместо дорогого ресторана)
Какие 3 покупки в моём чеке противоречат принципу ахимсы?
Какой % дохода идёт на этичные аналоги?
Пример замены:
Текущее
Альтернатива
Фаст-фуд
Веганское кафе
Бытовая химия
Эко-средства
2. Ресурсы
Практика:
Замер потребления за месяц (вода, свет, газ).
Ввести «зелёные» ритуалы:
Выключать воду при чистке зубов.
Использовать обе стороны бумаги.
Контрольные точки:
Сколько мусора я выбрасываю ежедневно?
Есть ли у меня «мусорный» день (разбор завалов)?
II. Профессиональный уровень (Карма-йога)
Фокус: Этичность источника дохода.
mindmap
root((Профессиональная этика<br>Цель: Работа как служение))
Этический аудит
Вредные аспекты
Производственные цепочки
Клиенты/партнёры
Экологический след
Альтернативы
Перевод в этичное подразделение
Смена специализации
Ресурсный баланс
Время
Соотношение работы/практики
Осознанные перерывы
Энергия
Не навреди коллегам
Эмоциональный интеллект
Трансформация
Минимальная планка
Отказ от откровенно вредных задач
Идеальный сценарий
Создание этичного стартапа
Профпереподготовка
1. Аудит работы
Шаги:
Выписать все задачи за неделю.
Оценить по шкале:
🔴 — Прямой вред (обман, насилие).
🟡 — Косвенный вред (поддержка неэтичных систем).
🟢 — Помощь другим.
Ключевые вопросы:
Какие 20% моей работы приносят наибольший вред?
Есть ли «серая» зона, которую можно исправить?
Пример трансформации:
Должность
Проблема
Решение
Менеджер
Продажа кредитов
Перейти в микрофинансы НКО
2. Энергобаланс
Действия:
Фиксировать уровень стресса по 10-балльной шкале.
Ввести «дхарма-паузы»:
5 минут медитации перед сложными переговорами.
Осознанные обеды без гаджетов.
Вопросы для рефлексии:
Я работаю ради денег или смысла?
Какие навыки я могу прокачать для более этичной карьеры?
III. Глобальный уровень (Планетарная ответственность)
Фокус: Влияние на макросистемы.
mindmap
root((Глобальная ответственность<br>Цель: Сангха как модель общества))
Системные рычаги
Политика
Голосование за концепции человечности (Русский космизм)
Участие в экодвижениях
Экономика
Банки с этичной политикой
Технологии очищающие Планету
Невидимые связи
Цифровая карма
Хостинг на "чистой" энергии
Блокировка токсичных ресурсов
Пищевые цепочки
Бойкот монокультур
Поддержка пермакультуры
Утопическая матрица
Общинные модели
Экопоселения
Кооперативы
Образование
Просветительские курсы
1. Инвестиции
Практика:
Отказаться от акций компаний, связанных с:
Оружием.
Ископаемым топливом.
Вопросы:
Знаю ли я, куда идут мои пенсионные накопления?
Какой банк меньше всего вредит экологии?
2. Активность
Конкретные шаги:
Участвовать в волонтерских движениях по уборке города, лесов, рек.
Не проходить мимо бросающих мусор, попросить убрать.
Чек-лист вовлечённости:
Сколько часов в месяц я уделяю волонтёрству?
Кого из моих друзей я вдохновил на этичные изменения?
Вопросы для составления факт-карт
Конкретные вопросы для составления факт-карт: Правильный образ жизни (Самма аджива)
I. Отношения в семье
Цель
Осознанное взаимодействие без вреда и цепляния.
1. Коммуникация
Как часто я говорю с партнёром/детьми осознанно (без телефона, оценки, спешки)?
Какие 3 фразы я чаще всего говорю в конфликтах? Можно ли заменить их на нейтральные?
Когда я в последний раз искренне спрашивал: «Что ты чувствуешь сейчас?» вместо «Почему ты так делаешь?»
2. Распределение обязанностей
Какие домашние дела вызывают у меня раздражение? Почему?
Есть ли дела, которые я делаю «за других», а потом обижаюсь?
Как можно перераспределить обязанности, чтобы каждый чувствовал справедливость?
3. Личные границы
Где я прогибаюсь в ущерб себе? (Например, терплю крики, нарушение личного времени.)
Какие мои действия нарушают границы других? (Например, проверяю телефон партнёра.)
II. Работа и карьера
Цель
Честный заработок без эксплуатации и стресса.
1. Этичность профессии
Приносит ли моя работа пользу другим? Если нет, как я могу это изменить?
Есть ли в моей работе скрытый вред? (Например, манипуляции в продажах, поддержка коррупционных схем.)
Могу ли я честно ответить ребёнку, чем я занимаюсь на работе?
2. Баланс работа/личная жизнь
Сколько часов в день я фактически посвящаю работе (включая мысли о ней)?
Какие 3 действия на работе истощают меня больше всего? Можно ли их устранить?
Когда я в последний раз брал отпуск без чувства вины?
3. Отношения в коллективе
Есть ли люди, с которыми я избегаю контакта? Почему?
Поддерживаю ли я сплетни или интриги? Если да, как остановиться?
Как я реагирую на несправедливость к коллегам? (Молчу, поддерживаю, защищаю?)
III. Принятие кризисов (экономических, политических)
Цель
Сохранять ясность ума и не создавать лишних страданий.
1. Реакция на нестабильность
Какие страхи у меня вызывает кризис? (Потеря денег, статуса, безопасности?)
Как часто я проверяю новости, и как это влияет на моё состояние?
Какие конкретные действия я могу сделать, чтобы снизить тревогу? (Например, создать финансовую подушку.)
2. Экономические решения
Какие траты я могу уменьшить без ущерба для счастья?
Есть ли у меня зависимость от потребления (шопинг как способ справиться со стрессом)?
Как я могу помочь другим в кризис? (Например, поддержать местный бизнес вместо корпораций.)
3. Политическая обстановка
Участвую ли я в конструктивных действиях (голосование, волонтёрство) или только в спорах?
Как я реагирую на людей с противоположными взглядами? (Агрессия, игнор, попытка диалога?)
Какие конкретные шаги я могу сделать, чтобы улучшить ситуацию вокруг себя?
IV. Интеграция в факт-карту
Пример структуры:
Область: [Семья/Работа/Кризисы]
Текущее состояние: [Конкретная проблема, например: «Каждый спор с женой переходит в крик»] Вопросы для анализа:
Что запускает мой гнев? (Усталость, страх, беспомощность?)
Как я могу выразить те же эмоции без повышения голоса?
Какое одно действие я сделаю сегодня для улучшения? (Например: «Сначала подумаю, потом отвечу».) Критерий успеха: [Через неделю: на 50% меньше ссор с переходом на крик.]
Как использовать:
Выбрать 1 сферу (семья, работа, кризисы).
Ответить на вопросы письменно.
Наметить 1–3 конкретных шага.
Проверять прогресс раз в неделю.
Важно: Не пытаться охватить всё сразу. Лучше медленные, но устойчивые изменения.
1.2.2 - Колесо сансары
Различные понятия о колесе сансары
“Неведение” (авидья, пали — авиджа)
— это коренная причина страданий и циклического перерождения. Это первое звено в цепи “12 звеньев взаимозависимого возникновения” (пратитья-самутпада), которая удерживает существ в сансаре.
Что такое Неведение?
Это фундаментальное непонимание истинной природы реальности, проявляющееся в:
Незнании Четырёх Благородных Истин (о страдании, его причине, прекращении и пути).
Иллюзии отдельного “Я” (анатма/анатта) — вера в постоянную, независимую душу.
Цеплянии за преходящее (счастье, материальные блага, даже собственное тело) как за вечное.
Искажённом восприятии (принятие непостоянного за постоянное, страдательного за благо, безличного за “я”).
Как Неведение порождает сансару?
Из-за авидьи возникают:
Кармические импульсы (санскары) — действия, основанные на заблуждениях.
Жажда существования (танха) — желание перерождаться, даже если это ведёт к страданию.
Цикл перерождений в шести мирах сансары (от богов до адских существ).
Как преодолеть Неведение?
Через пробуждение (бодхи):
Мудрость (праджня) — изучение Дхармы, глубокое размышление.
Этичное поведение (шила) и развитие осознанности (смрити).
Пример:
Как человек в темноте принимает верёвку за змею, так и мы из-за авидьи видим в мире то, чего нет. Просветление — это свет, рассеивающий тьму неведения.
Второе звено в колесе сансары (бхавачакре) — это “Санскары” (санскр. संस्कार, пали — санкхары),
что означает “формирующие факторы” или “кармические импульсы”. Они возникают из первого звена — Неведения (авидьи) — и запускают цепь кармических последствий, ведущих к новым перерождениям.
Что такое Санскары?
Это:
Умственные, словесные и физические волевые действия (карма), совершённые под влиянием неведения.
Привычные шаблоны мышления и поведения, которые формируют будущий опыт.
“Семена” кармы, сохраняющиеся в потоке сознания (читта-сантана) и созревающие в виде последствий.
Как Санскары работают в цепи зависимого возникновения?
Нейтральные (но даже они поддерживают цикл перерождений).
Примеры Санскар:
Желание повторить удовольствие (например, зависимость от чего-либо).
Гнев или жадность, оставляющие “отпечаток” в уме.
Механические привычки (даже неосознанные, вроде автоматических реакций).
Как ослабить влияние Санскар?
Осознанность (сати) — наблюдение за своими мотивами и действиями.
Медитация — очищение ума от автоматических реакций.
Практика мудрости (праджня) — понимание непостоянства и отсутствия “Я”.
Важно: Санскары — это не фатум, а привычки ума. Буддизм учит, что их можно изменить через практику!
“Ум — предтеча всех состояний.
Если кто-то говорит или действует с нечистым умом,
страдание следует за ним, как колесо за следом быка.”
— Дхаммапада 1:1
Третье звено колеса сансары: “Сознание” (Виджняна / Виññāṇa)
Сознание (виджняна на санскрите, винняна на пали) — это третье звено в цепи зависимого возникновения (пратитья-самутпада), следующее за санскарами (кармическими импульсами). Оно играет ключевую роль в процессе перерождения и формировании опыта.
Что такое “Сознание” в буддизме?
Это не постоянная душа, а поток осознавания, который:
Зависит от условий (санскар, органов чувств, объектов восприятия).
Меняется мгновенно (нет фиксированного “я” в этом потоке).
Является основой для нового рождения (переносит кармические отпечатки в следующую жизнь).
В буддизме выделяют 6 видов сознания, связанных с органами чувств и умом:
Санскары “заряжают” сознание кармическими семенами, которые затем проявляются в следующем перерождении.
В момент зачатия (или в бардо, согласно тибетской традиции) поток сознания соединяется с оплодотворённой яйцеклеткой, давая начало новой жизни.
📌 Пример:
Представь, что сознание — это река, а кармические отпечатки (санскары) — это краска, которая окрашивает её течение. В зависимости от “цвета” кармы, река (сознание) течёт в сторону счастливого или несчастливого перерождения.
Как выйти из цикла?
Поскольку сознание зависит от неведения и кармы, освобождение (нирвана) достигается через:
Прозрение в непостоянство (анитья) и отсутствие “Я” (анатта).
Прекращение отождествления с потоком сознания (например, через медитацию “Кто осознаёт?”).
Разрушение кармических привычек (санскар), питающих этот поток.
“Когда мудрый уничтожает неведение знанием,
сознание, лишённое опоры, не возникает вновь.”
— СН 12.38 (Саньютта-никая)
4. “Имя-форма” (Нама-рупа / Nāma-rūpa)
Это психофизическая основа будущего существа, возникающая после того, как сознание (виджняна) входит в новое рождение.
Что такое “Имя-форма”?
“Нама” (имя) → психические составляющие:
чувства, восприятие, воля, контакт с объектами, внимание.
Это не “личность”, а набор функций ума.
“Рупа” (форма) → физическое тело (или его зачаток в утробе/новом рождении).
Пример из человеческого рождения:
После зачатия сознание + карма формируют:
“Форма” → зародыш, развивающееся тело.
“Имя” → зарождающиеся психические процессы (например, первые реакции на боль, звук и т. д.).
Как это работает в цепи сансары?
Неведение → Санскары → Сознание → “Имя-форма” → …
Без “имени-формы” сознание не может проявляться в мире (как компьютер без “железа” и “программ”).
В тибетском буддизме это звено связывают с состоянием “бардо” (промежуточное существование), где сознание ищет новое воплощение.
5. “Шесть сфер чувств” (Шад-аятана / Saḷāyatana)
Пятое звено — это возникновение шести органов восприятия, через которые существо взаимодействует с миром:
Глаза (зрение).
Уши (слух).
Нос (обоняние).
Язык (вкус).
Тело (осязание).
Ум (мышление).
Почему это важно?
Без этих “врат” невозможно переживание страдания (дуккхи).
Они создают основу для контакта (6-е звено) и последующих страстей.
6. “Контакт” (Спарша / Phassa)
Шестое звено — момент соприкосновения органа чувств, объекта и сознания:
Глаз + форма + зрительное сознание = контакт.
Ум + мысль + умственное сознание = контакт.
Пример:
Когда вы видите красивый предмет (форма), глаз (орган) и сознание соединяются — возникает “контакт”, который может породить желание или отвращение.
7. “Чувство” (Ведана / Vedanā)
Седьмое звено — ощущение от контакта:
Приятное (ведёт к жажде).
Неприятное (ведёт к отвращению).
Нейтральное (часто игнорируется, но тоже поддерживает неведение).
Ключевой момент:
Само по себе чувство — ещё не страдание, но реакция на него запускает следующее звено…
8. “Жажда” (Тришна / Taṇhā)
Восьмое звено — желание или отвращение, возникающее из чувств:
“Хочу это повторить!” (удовольствие).
“Хочу это уничтожить!” (боль).
Это главный “двигатель” сансары.
Пример:
Вы едите сладкое → возникает приятное чувство → появляется жажда съесть ещё.
9. “Цепляние” (Упадана / Upādāna)
Девятое звено — усиление жажды в цепляние:
За идеи (“Я должен быть успешным!”).
За вещи (“Это МОЁ!”).
За людей (“Он должен любить меня!”).
Чем сильнее цепляние, тем болезненнее рождение.
10. “Становление” (Бхава / Bhava)
Десятое звено — формирование новой кармы для перерождения:
Карма “действия” (создаёт условия для следующей жизни).
Карма “результата” (определяет, где и как вы родитесь).
Пример:
Ненависть → карма → рождение в мире страданий.
Щедрость → карма → рождение в благоприятных условиях.
11. “Рождение” (Джати / Jāti)
Одиннадцатое звено — фактическое новое рождение в одном из 6 миров сансары:
Боги (дэвы).
Асуры (демоны-ревнивцы).
Люди.
Животные.
Преты (голодные духи).
Адские существа.
Рождение неизбежно ведёт к смерти. Любое рождение является причиной смерти.
12. “Старость и смерть” (Джара-марана / Jarā-maraṇa)
Двенадцатое звено — завершение цикла:
Болезни, увядание, смерть.
Но после смерти — снова неведение, если нет пробуждения!
Как разорвать цепь?
Через пробуждение (бодхи):
Осознать 12 звеньев → увидеть механизм страдания.
Пресечь жажду и цепляние (медитация, мудрость).
Выйти за пределы сансары → нирвана.
“Кто видит зависимое возникновение — тот видит Дхарму.”
— Будда
1.2.3 - Четыре благородные истины
Четыре Благородные Истины — это основа учения Будды
Четыре Благородные Истины (Чатвари Арьясатья)
Четыре Благородные Истины — это основа учения Будды, которое он впервые изложил в своей проповеди в Сарнатхе после Просветления. Они описывают природу страдания и путь к его прекращению.
1. Истина о Страдании (Дуккха)
“Рождение — страдание, старость — страдание, болезнь — страдание, смерть — страдание. Соединение с неприятным — страдание, разлучение с приятным — страдание. Не получить желаемого — страдание. Короче говоря, пять совокупностей, подверженных цеплянию, — это страдание.”
— Дхаммачакка-паваттана Сутта
Что означает?
“Дуккха” — не просто боль, а глубокая неудовлетворённость, присущая сансарическому существованию.
3 аспекта дуккхи:
Обычное страдание (боль, горе).
Страдание от изменений (счастье, которое проходит).
Страдание обусловленности (даже нейтральные состояния пронизаны непостоянством).
Пример: Даже радость от встречи с близким человеком содержит семя страдания, потому что рано или поздно придётся расстаться.
2. Истина о Причине Страдания (Тришна/Танха)
“Это жажда, ведущая к новым рождениям, связанная с наслаждением и страстью, ищущая удовольствия то здесь, то там; а именно: жажда чувственных наслаждений, жажда существования и жажда несуществования.”
Что означает?
“Танха” (жажда) — это цепляние за желания, которое питает сансару.
Пример: Как врач ставит диагноз (1-я истина), находит причину болезни (2-я), подтверждает возможность излечения (3-я) и назначает лечение (4-я).
Как применять эти истины в жизни?
Признай страдание (не отрицай трудности).
Найди его причину (что тобой движет — страх, жажда, неведение?).
Поверь, что освобождение возможно (Будда и многие монахи достигли его).
Иди по Восьмеричному Пути (начни с малого: осознанность, этика, мудрость).
“Как океан имеет один вкус — вкус соли, так и учение Будды имеет один вкус — вкус освобождения.”
— Упали-сутта
1.2.4 - Восьмеричный путь
основные положения благородного восьмиричного пути
Благородный Восьмеричный Путь (Арья Аштанга Марга)
Это практическое руководство, данное Буддой для прекращения страдания (дуккхи) и достижения пробуждения (нирваны). Он объединяет мудрость, нравственность и сосредоточение в единую систему.
Три группы практики
1. Мудрость (Праджня)
① Правильные взгляды (Самма диттхи)
Понимание Четырёх Благородных Истин, закона кармы и не-я (анатта).
Отказ от иллюзий («я вечен», «мир справедлив», «после смерти ничего нет»). Пример: Видеть, что гнев — это не «моя сущность», а временное состояние ума.
О правильных взглядах
Подробнее
Правильные взгляды (Самма диттхи) – основа духовного пути
Правильные взгляды – это первый и фундаментальный шаг Восьмеричного пути, формирующий основу для всей буддийской практики. Это не просто интеллектуальное знание, а глубокое понимание истинной природы реальности, освобождающее ум от заблуждений.
Ничто во Вселенной (включая «личность») не обладает неизменной сущностью.
Иллюзия «я» – источник привязанностей и страданий.
Пример:
Неправильный взгляд: «Я – это мои мысли, и они определяют меня».
Правильный взгляд: «Мысли и эмоции приходят и уходят – они не являются моей сутью».
2. Отказ от ложных воззрений (диттхи)
Будда выделял 10 видов заблуждений, которые искажают восприятие:
Отрицание кармы («Действия не имеют последствий»).
Материализм («После смерти нет перерождения»).
Фатализм («Всё предопределено, и я ничего не могу изменить»).
Этернализм («Душа вечна и неизменна»).
Нигилизм («Добро и зло – условности»).
Скептицизм («Истину невозможно познать»).
Крайний аскетизм («Страдание само по себе очищает»).
Культ личности («Учитель – бог, и только он может спасти»).
Догматизм («Моя религия – единственно верная»).
Отождествление с телом/умом («Я – это моё тело или мои чувства»).
Пример:
Неправильный взгляд: «Если я буду молиться, боги даруют мне удачу».
Правильный взгляд: «Мои действия, а не внешние силы, определяют мою жизнь».
3. Практическое применение
Правильные взгляды – это не теория, а образ мышления, который проявляется в:
✔ Осознанности – наблюдении за умом без отождествления.
✔ Анализе – «Это страдание? Каков его источник?».
✔ Отказе от крайностей – избегании фанатизма и цинизма.
Пример из жизни:
Ситуация: Кто-то вас оскорбил.
Неправильная реакция: «Он плохой, я должен ответить тем же».
Правильный взгляд: «Его гнев вызван его собственной болью – моя злость только усилит страдания».
4. Как развивать Самма диттхи?
Изучение Дхармы – чтение сутр, обсуждение с учителем.
Размышление – анализ своих убеждений: «Откуда это мнение? Оно основано на истине?».
Медитация – наблюдение за непостоянством мыслей и чувств.
Проверка на опыте – применение учений в повседневности.
Вывод:
Правильные взгляды – это путь от неведения к мудрости. Они не навязываются слепо, а проверяются личным опытом, ведя к подлинной свободе.
Следующий шаг – Правильные намерения (Самма санкаппа), где эти взгляды превращаются в мотивацию к действию.
Культивирование доброжелательности, сострадания и непривязанности.
О правильном намерении
Подробнее
Правильные намерения — это развитие чистых и благотворных мотивов, которые лежат в основе наших мыслей, слов и поступков. Этот шаг тесно связан с первым — Правильным воззрением, поскольку понимание истинной природы реальности (непостоянства, страдания и отсутствия вечного “я”) формирует основу для искренних и мудрых намерений.
1. Отказ от разрушительных состояний ума
Правильные намерения предполагают осознанный отказ от трех корней неблагой кармы:
Жажды (танха) — стремления к чувственным удовольствиям, обладанию, власти, которые ведут к привязанности и страданию.
Злобы (вьяпада) — гнева, ненависти, вражды, разрушающих внутренний покой и гармонию с окружающими.
Эти три яда ума порождают страдание, поэтому их преодоление — ключ к духовному развитию.
2. Культивирование благородных качеств
Вместо негативных побуждений практикующий развивает три противоположных, но взаимосвязанных качества:
Доброжелательность (метта) — безусловную дружелюбие, желание счастья всем живым существам.
Сострадание (каруна) — активное сопереживание страданиям других и стремление помочь.
Непривязанность (муддита) — радость за успехи других без зависти, а также свободу от эгоистичных желаний.
Глубокая трансформация ума
Правильные намерения — это не просто подавление негативных мыслей, а их замена позитивными. Например:
Вместо зависти — радость за других.
Вместо гнева — терпение и понимание.
Вместо жадности — щедрость и удовлетворенность.
Этот процесс требует осознанности (сати) и постоянной практики, включая медитацию любящей доброты (метта-бхавана).
Роль в духовном пути
Самма санкаппа укрепляет нравственную дисциплину (шила) и создает основу для правильной речи, действий и образа жизни. Без чистых намерений даже внешне благие поступки могут быть омрачены скрытыми мотивами.
Таким образом, Правильные намерения — это внутренняя работа по очищению ума, ведущая к подлинной гармонии, мудрости и освобождению от страданий.
Изображение в колесе Сансары
Подробнее
В традиционном изображении колеса сансары (бхавачакра) три основных яда ума, соответствующие корням страдания, символизируются тремя животными в центре колеса Сансары:
Три яда в колесе сансары
Жажда (танха, или лобха — жадность)
Изображается в виде петуха (иногда петуха или птицы).
Символизирует ненасытное желание, привязанность к удовольствиям, страсть и эгоистичные устремления.
Злоба (вьяпада, или доса — ненависть)
Представлена змеёй (или змеёй, изрыгающей яд).
Олицетворяет гнев, агрессию, отвращение и разрушительные эмоции.
Заблуждение (моха — неведение)
Изображается как свинья (иногда кабан).
Символ невежества, тупости, иллюзии и непонимания истинной природы реальности.
Почему именно эти животные?
Петух — ассоциируется с гордостью, сексуальностью и безудержным стремлением к удовлетворению желаний.
Змея — традиционный символ яда, скрытой угрозы и мгновенной агрессии.
Свинья — в буддийской символике означает слепоту к духовным истинам, привязанность к материальному и неразборчивость.
Их взаимосвязь
В колесе сансары животные часто изображены кусающими друг друга, образуя замкнутый круг. Это показывает, как три яда подпитывают друг друга:
Жажда приводит к разочарованию и злобе,
Злоба усиливает неведение,
Неведение порождает новые жажды.
Отличие от формулировки в Правильных намерениях
В контексте Самма санкаппы (Правильных намерений) акцент делается на вьяпаду (злобу) и вихимсу (жестокость) как проявления ненависти, а моха (неведение) рассматривается отдельно — как корень всех омрачений. Однако в колесе сансары три яда представлены в их фундаментальном единстве.
Три животных в центре бхавачакры — наглядная иллюстрация того, как жажда, злоба и неведение удерживают существ в цикле страданий. Преодоление этих ядов через Правильные намерения (развитие доброжелательности, сострадания и мудрости) — ключ к выходу из сансары.
Лекарство от трех ядов
Подробнее
Три яда → Три антидота
1. Жажда/Привязанность (танха, лобха)
Негативное проявление:
Эгоистичные желания, жадность, цепляние за удовольствия, статус или людей.
Антидот → Непривязанность (муддита + упеккха)
Радость за других без сравнения с собой (муддита).
③ Правильная речь (Самма вача) – искусство осознанного общения
Правильная речь – третий шаг Восьмеричного пути, формирующий основу этичного взаимодействия с миром. Это не просто запрет на определённые слова, а глубокая практика осознанности в общении, направленная на прекращение страдания – как своего, так и чужого. В буддизме речь считается мощным кармическим действием: она может исцелять или ранить, объединять или разрушать.
1. Четыре аспекта отказа в Правильной речи
① Отказ от лжи (мусавада)
Суть: Искажение истины, даже с «благими» намерениями, создаёт кармические последствия и размывает границу между реальностью и иллюзией.
Почему? Ложь порождает недоверие, страх разоблачения и усугубляет неведение (моха).
Как практиковать?
Говорить правду мягко, но ясно.
Если правда может навредить – молчать или искать мудрый способ выражения.
Пример: Вместо «Ты прекрасно выглядишь!» (если это неправда) – «Я ценю твоё старание».
② Отказ от сплетен и раздора (писунавача)
Суть: Речь, разделяющая людей, основана на зависти, осуждении или желании возвыситься.
Почему? Сплетни питают конфликты, разрушают гармонию и отравляют ум говорящего.
Как практиковать?
Избегать обсуждения отсутствующих.
Если необходимо – говорить нейтрально, без оценок.
Пример: Вместо «Он всегда опаздывает, безответственный!» – «Сегодня он пришёл позже agreed времени».
③ Отказ от грубости (пхарусавача)
Суть: Резкие, оскорбительные слова причиняют боль и укрепляют гнев (доса).
Почему? Грубость – это проявление неприязни, которая возвращается бумерангом.
Как практиковать?
Заменять критику на конструктивные предложения.
В гневе – делать паузу перед ответом.
Пример: Вместо «Ты ничего не понимаешь!» – «Я вижу это иначе, давай обсудим».
Не вредить: не убивать, не воровать, не причинять страданий.
Помогать: быть щедрым, соблюдать этику.
О правильных действиях
Подробнее
④ Правильные действия (Самма камманта) – основа нравственной жизни
Правильные действия – четвёртый шаг Восьмеричного пути, воплощающий мудрость и сострадание в повседневных поступках. Это не просто свод запретов, а осознанный выбор поведения, который уменьшает страдания и создаёт условия для духовного роста. В буддизме тело считается инструментом кармы, поэтому каждое действие – это семя, из которого вырастают последствия.
1. Два ключевых принципа Правильных действий
① Не вредить (ахимса)
Суть: Отказ от насилия в любых формах – физических, эмоциональных, косвенных.
Почему? Вред другим разрушает внутренний покой и усиливает цикл страданий.
Как практиковать?
Не убивать – уважение ко всем формам жизни (включая животных, насекомых).
Не воровать – отказ от присвоения чужого, даже через обман или манипуляции.
Не причинять страданий – избегать действий, ведущих к боли (например, эксплуатации людей).
Пример: Веганство как осознанный выбор или отказ от работы, связанной с оружием.
② Помогать (дана и метта)
Суть: Активное созидание добра через щедрость, заботу и этичное поведение.
Почему? Благие поступки очищают ум и создают условия для счастья.
Как практиковать?
Быть щедрым – делиться ресурсами, временем, знаниями без ожидания награды.
Соблюдать этику – в отношениях (верность, уважение), профессии (честность), обществе.
Пример: Волонтёрство, донорство, поддержка тех, кто в беде.
2. Три уровня Правильных действий
① Физический (тело)
Воздержание от убийства, воровства, сексуальной вредоносности (измена, эксплуатация).
② Энергетический (мотивация)
Осознание: «Почему я это делаю?» – из жадности, страха или сострадания?
③ Глобальный (карма)
Понимание последствий: даже «нейтральные» поступки (например, покупка товаров, сделанных рабами) могут причинять страдания.
Малые шаги – начать с простого: не давить муравья, купить еду бездомному.
Работа с намерениями – перед действием спрашивать: «Это уменьшит страдания?».
4. Связь с другими шагами Восьмеричного пути
Без Правильных взглядов действия становятся слепыми.
Без Правильной речи – лицемерными («говорю о добре, но творю зло»).
Без Правильного усилия – спонтанными, без дисциплины.
Вывод:
Правильные действия – это практика мудрости в движении. Они превращают теорию Дхармы в живую реальность, создавая основу для медитации и пробуждения.
Следующий шаг – Правильный образ жизни (Самма аджива), где принципы применяются к профессии и социуму.
⑤ Правильный образ жизни (Самма аджива)
Честный заработок (без обмана, продажи оружия, наркотиков и т.д.).
Простота, без эксплуатации других.
О правильном образе жизни
Подробнее
⑤ Правильный образ жизни (Самма аджива) — осознанное существование в гармонии с Дхармой
Правильный образ жизни — пятый шаг Восьмеричного пути, объединяющий все предыдущие принципы (взгляды, намерения, речь, действия) в целостную систему повседневного бытия. Это не просто отказ от «плохих» профессий, но глубокая переоценка своего места в мире, где работа, потребление и социальные отношения становятся частью духовной практики.
1. Основные принципы Правильного образа жизни
① Честный заработок
Суть: Профессия не должна вредить другим существам прямо или косвенно.
⑥ Правильные усилия (Самма ваяма) — дисциплина ума на пути к освобождению
Правильные усилия — шестой шаг Восьмеричного пути, формирующий осознанный контроль над умственными процессами. Это не борьба с собой, а искусство трансформации сознания через системную работу с мыслями, эмоциями и привычками. Будда сравнивал этот процесс с уходом за садом: нужно выпалывать сорняки и взращивать цветы.
1. Три уровня Правильных усилий
① Предотвращение зла (самвара)
Суть: Не допускать возникновения неблагих состояний ума.
Пример: При чувстве зависти — сразу переключиться на дыхание или благодарность.
② Преодоление возникшего зла (пахана)
Суть: Устранение уже появившихся омрачений.
Методы:
Анализ: «Почему эта мысль возникла? Какие последствия она несёт?».
Антидоты:
Гнев → медитация на любящую доброту (метта).
Жадность → размышление о непостоянстве.
Пример: При вспышке гнева — мысленно пожелать счастья «обидчику».
③ Развитие благого (бхавана)
Суть: Сознательное культивирование добродетелей.
Практики:
Метта — регулярные пожелания добра всем существам.
Размышление о Дхарме — чтение сутр, анализ учений.
Пример: Утром задавать намерение: «Сегодня я буду внимателен к своим словам».
④ Сохранение благого (ануракхана)
Суть: Поддержание чистых состояний ума.
Как?
Не прерывать добрые привычки (например, ежедневную медитацию).
Защищать ум от «рецидивов» старых паттернов.
Пример: После медитации — сохранять осознанность в быту, а не терять её сразу.
2. Четыре прикладных принципа
① Баланс
Избегать крайностей:
Напряжение → ведёт к истощению.
Расслабленность → ведёт к лени.
Совет Будды: «Как настраивают лютню — не слишком туго, не слишком слабо».
② Постепенность
Начинать с малого:
5 минут медитации вместо 2 часов.
Контроль одного негативного состояния (например, критики).
③ Постоянство
Усилия — это ежедневная практика, а не разовые подвиги.
④ Мудрость
Понимать: «Я не есть мои мысли» — наблюдать их без отождествления.
3. Ошибки в практике
Подавление эмоций → ведёт к неврозам.
Чрезмерный самоконтроль → превращается в гордыню.
Игнорирование «теневых» мыслей → они возвращаются сильнее.
Решение:
Работать не «против» тьмы, а «за» свет — через развитие противоположных качеств.
4. Связь с другими шагами пути
Без Правильных взглядов усилия слепы («зачем я это делаю?»).
Без Правильной речи/действий — лицемерны («медитирую, но грублю людям»).
Без Правильного сосредоточения — неустойчивы (ум скачет).
Вывод:
Правильные усилия — это топливо для духовного пути. Они превращают теорию в живую трансформацию.
Следующий шаг — Правильное осознавание (Самма сати), углубляющее внимание к настоящему моменту.
⑦ Правильная осознанность (Самма сати)
Наблюдение за телом, чувствами, умом и явлениями без цепляния.
Практика медитации (анапанасати, випассана).
О правильной осознанности
Подробнее
⑦ Правильная осознанность (Самма сати) — искусство пробуждённого присутствия
Правильная осознанность — седьмой шаг Восьмеричного пути, представляющий собой чистое, нецепляющееся внимание к реальности «здесь и сейчас». Это не просто концентрация, а глубинное понимание природы ума и тела, раскрывающее Четыре Благородные Истины в непосредственном опыте. Будда называл осознанность «единственным путём» (Сатипаттхана-сутта), ведущим к освобождению.
1. Четыре основы осознанности (Сатипаттхана)
① Осознавание тела (каянупассана)
Что наблюдать:
Дыхание (анапанасати).
Позы и движения (ходьба, сидение, еда).
Телесные ощущения (зуд, напряжение, боль).
Цель:
Видеть тело как непостоянный процесс, а не «я».
Пример: При ходьбе замечать: «Поднимается нога, переносится, опускается».
② Осознавание чувств (веданупассана)
Что наблюдать:
Приятные, неприятные и нейтральные ощущения.
Их возникновение и исчезновение.
Цель:
Перестать отождествляться с эмоциями («я зол» → «есть гнев»).
Пример: При боли сказать: «Есть напряжение в плече», а не «Я страдаю».
③ Осознавание ума (читтанупассана)
Что наблюдать:
Состояния сознания (жадный, рассеянный, сосредоточенный ум).
Мысли как временные явления.
Цель:
Увидеть, что ум — не хозяин, а поток изменчивых состояний.
Пример: Наблюдать: «Сейчас ум беспокоится о будущем».
④ Осознавание явлений (дхамманупассана)
Что наблюдать:
Пять помех (желание, гнев, лень, беспокойство, сомнение).
Четыре Благородные Истины в действии.
Цель:
Прямое постижение непостоянства (аничча), страдания (дуккха) и не-я (анатта).
Пример: Заметить: «Эта злость возникла из-за привязанности к мнению».
10–30 минут в день сидеть с прямой спиной, наблюдая дыхание или тело.
При отвлечении — мягко возвращаться к объекту.
② Повседневная осознанность
Во время еды: Чувствовать вкус, текстуру, не отвлекаясь на телефон.
В разговоре: Слушать, не планируя ответ.
В движении: Замечать шаги, как в ходячей медитации.
③ «Метки» для ясности
Мысленно отмечать:
«Дыхание… Мысль… Звук…» — без анализа.
Это предотвращает «погружение» в иллюзии.
3. Ошибки и их преодоление
Ошибка
Решение
Попытки «остановить» ум
Позволять мыслям приходить и уходить
Самокритика за отвлечения
Принимать их как часть практики
Ожидание «озарений»
Фокусироваться на процессе, а не результате
4. Почему это ключ к пробуждению?
Раскрывает три характеристики бытия:
Непостоянство (аничча) — всё изменяется.
Страдание (дуккха) — цепляние к преходящему.
Не-я (анатта) — нет отдельного «наблюдателя».
Обрывает цепь зависимого возникновения:
Без осознанности → неведение → жажда → страдание.
5. Связь с другими шагами
Без Правильных усилий осознанность поверхностна.
Без Правильного сосредоточения внимание скачет.
Без Правильных взглядов превращается в механическое «наблюдение».
Вывод:
Правильная осознанность — это прямой путь к ниббане. Она превращает каждый момент в возможность пробуждения.
Следующий шаг — Правильное сосредоточение (Самма самадхи), углубляющее осознанность до единения с объектом.
⑧ Правильное сосредоточение (Самма самадхи)
Глубокая медитация (джханы), ведущая к:
Успокоению ума.
Прозрению в природу реальности.
О правильном сосредоточении
Подробнее
⑧ Правильное сосредоточение (Самма самадхи) — врата к освобождению
Правильное сосредоточение — завершающий шаг Восьмеричного пути, представляющий собой глубинное состояние медитативного погружения, где ум становится единым с объектом созерцания. Это не просто “расслабление”, а мощный инструмент для прорыва сквозь иллюзии к прямому постижению истины.
1. Суть Правильного сосредоточения
① Что это?
Состояние полного погружения (джхана), где:
Исчезают отвлечения.
Ум становится ясным, как горное озеро.
Возникает прямое знание (не интеллектуальное!).
② Зачем нужно?
Без сосредоточения:
Осознанность остаётся поверхностной.
Мудрость (пання) не может проявиться в полноте.
С сосредоточением:
Ум видит реальность как есть — непостоянную, безличную, наполненную страданием.
Это не линейный путь, а взаимосвязанная система. Например, без этики медитация становится бессмысленной, а без мудрости — слепой.
«Как дождь проникает в дом с плохой крышей, так страсти проникают в неразвитый ум.
Как дождь не проникает в дом с хорошей крышей, так страсти не проникают в развитый ум».
— Дхаммапада 1:13-14
1.2.5 - Закон кармы
Закон Кармы в буддизме: Причина и Следствие
Карма (санскр. कर्म, пали камма) — это закон причинно-следственной связи, который определяет, как наши действия (физические, речевые и умственные) влияют на настоящее и будущее.
Ключевая идея: “Мысли становятся поступками, поступки становятся судьбой.”
3 Основных Принципа Кармы
1. Карма — это не судьба, а процесс
Буддизм отрицает фатализм: будущее зависит от текущих действий.
Даже прошлая карма может быть изменена через осознанные усилия.
2. Карма — не только “наказание и награда”
Это не механика «греха и воздаяния», а естественный закон, подобный посеву семян:
Посадил яблоню → получил яблоки (а не груши).
Совершил зло → получил страдание (но можно “пересадить семена”).
3. Карма связана с намерением
Мотив важнее действия:
Подать милостыню из жалости → благая карма.
Подать милостыню ради похвалы → карма слабее.
Виды Кармы
1. По времени созревания
Мгновенная — результат сразу (например, ударил кого-то → получил ответный удар).
Отложенная — последствия через годы или в следующей жизни.
Привычная — накопленные шаблоны (например, хронический гнев ведёт к рождению в агрессивной среде).
“Ежедневная” (ложь, сплетни) → менее серьёзные, но накопительные эффекты.
Благородная (помощь другим, медитация) → ведёт к освобождению.
Как Карма влияет на перерождение?
Перед смертью ум цепляется за самые сильные кармические отпечатки → определяет следующее рождение.
Примеры:
Жадность → рождение голодным духом (претой).
Гнев → попадание в адские миры.
Щедрость → рождение богом или богатым человеком.
Медитация и мудрость → выход из колеса сансары.
Как работать с кармой?
Осознавать действия — наблюдать за телом, речью, умом.
Исправлять ошибки — раскаяние + изменение поведения.
Создавать благую карму:
Даяние (дана) — помощь другим без ожидания награды.
Нравственность (шила) — соблюдение 5 заповедей.
Медитация (бхавана) — очищение ума.
“Незначительные поступки, совершаемые постоянно,
становятся привычкой и определяют судьбу.”
— Будда
Ошибки в понимании кармы
«Карма — это судьба» → Нет, это динамичный процесс.
«Болезнь = наказание за грехи» → Не всегда: есть и природные причины.
«Можно “отмолить” плохую карму» → Буддизм учит, что действия важнее молитв.
Практический пример
Ситуация: Вы разозлились и накричали на коллегу.
Кармический эффект:
Ухудшение отношений (мгновенная карма).
Привычка к гневу (привычная карма → возможное перерождение в агрессивной среде).
Исправление:
Осознать гнев.
Извиниться.
Тренировать терпение (медитация, анализ причин гнева).
1.2.5.1 - Становление
В буддизме понятие бхава (санскр. भव, пали bhava) означает становление или процесс существования. Это один из ключевых элементов в цепи пратитья-самутпады (зависимого возникновения), где бхава возникает из упаданы (цепляния) и ведёт к джати (рождению).
Карма действия (крийя-карма) и карма результата (випака-карма)
В буддизме карма (пали камма) — это закон причины и следствия, но её можно разделить на два аспекта:
Карма действия (крийя-карма)
Это само действие, совершаемое телом, речью или умом.
Оно может быть:
Благим (кушала) — ведущим к счастью (например, щедрость, доброта).
Неблагим (акушала) — ведущим к страданию (например, ложь, убийство).
Нейтральным — не имеющим значимых последствий.
Важен мотив (четана) — именно намерение определяет кармический вес поступка.
Карма результата (випака-карма)
Это последствия действий, которые созревают в будущем.
Может проявиться:
В этой жизни (если условия благоприятны).
В следующем перерождении.
В отдалённых будущих жизнях.
Не все последствия проявляются сразу: некоторые “спят” в потоке сознания, пока не созреют условия.
Как бхава связана с кармой?
Бхава — это процесс формирования будущего существования через кармические импульсы.
Действия (крийя-карма) создают предрасположенности, которые влияют на випака-карму (результат), определяя следующее рождение.
Пока есть цепляние (упадана) и кармические отпечатки, процесс бхавы (становления) продолжается, а с ним — и цикл перерождений (сансара).
Как выйти из цикла бхавы?
Согласно буддизму, прекращение кармического становления возможно через:
Мудрость (праджня) — понимание непостоянства и отсутствия “я”.
Этичное поведение (шила) — избегание неблагих действий.
Созерцание (самадхи) — устранение привязанностей.
Таким образом, бхава — это динамический процесс, поддерживаемый кармой, а прекращение кармических циклов ведёт к нирване (освобождению).
1.2.5.2 - Виды кармы
В буддизме карма (пали камма, санскр. карма) — это не просто судьба, а сложный механизм причинно-следственных связей, формирующих переживания и перерождения. Помимо кармы действия (крийя-карма) и кармы результата (випака-карма), традиция выделяет и другие виды кармы.
1. Классификация по времени созревания
(1) Дивьям-карма (Немедленная карма)
Проявляется в этой жизни.
Пример:
Убийца может быстро столкнуться с последствиями (болезнь, тюрьма).
Щедрый человек быстро обретает уважение и поддержку.
(2) Упападжа-карма (Карма следующего рождения)
Созревает в следующей жизни.
Пример:
Сильная привязанность к богатству может привести к рождению голодным духом (претой).
Глубокая медитация — к перерождению в мире богов (дэвов).
(3) Апарапари-карма (Отсроченная карма)
Проявится через несколько жизней.
Пример:
Совершённое в прошлых жизнях убийство может привести к болезням в далёком будущем.
(4) Ахоси-карма (Исчерпанная карма)
Карма, которая не успела созреть из-за отсутствия условий или из-за духовной практики.
Пример:
Пробуждение (просветление) останавливает созревание старой кармы.
2. Классификация по функции
(1) Джаннака-карма (Порождающая карма)
Определяет основные условия следующего рождения (вид тела, продолжительность жизни, социальный статус).
Пример:
Жестокость ведёт к рождению в аду, щедрость — в мире людей или богов.
(2) Упатхамбака-карма (Поддерживающая карма)
Не определяет рождение напрямую, но влияет на качество жизни.
Пример:
Даже родившись человеком, можно страдать от болезней из-за прошлых вредных действий.
(3) Упапилака-карма (Подавляющая карма)
Ослабляет действие другой кармы.
Пример:
Даже имея хорошую карму для долгой жизни, можно умереть рано из-за сильной негативной кармы.
(4) Упагхатака-карма (Разрушающая карма)
Полностью уничтожает потенциальные последствия другой кармы.
Пример:
Пробуждение (нирвана) останавливает все кармические процессы.
3. Классификация по весу
(1) Гурука-карма (Тяжёлая карма)
Действия с сильными последствиями: убийство, достижение глубоких медитативных состояний.
Пример:
Убийство родителей создаёт карму, которая перевешивает многие благие поступки.
(2) Бахи-карма (Привычная карма)
Поступки, которые часто повторяются, становятся кармически значимыми.
Пример:
Постоянная ложь формирует склонность к обману в будущих жизнях.
(3) Ачинтья-карма (Неопределённая карма)
Действия, последствия которых могут быть изменены до созревания.
Пример:
Раскаяние и практика Дхармы могут смягчить или устранить карму.
Обобщение
Буддийское учение о карме — это не фатализм, а гибкая система, где:
Прошлые действия влияют на настоящее.
Текущие поступки формируют будущее.
Осознанность и практика могут изменить кармические тенденции.
Освобождение (нирвана) достигается не через накопление “хорошей кармы”, а через прекращение кармического процесса — выход из цикла бхавы (становления).
1.2.6 - Анатман (Анатта) — Учение о «Не-Я»
отсутствие вечной, неизменной души или независимого «Я»
Анатман (санскр. अनात्मन्, пали анатта) — это одно из ключевых понятий буддизма, которое означает отсутствие вечной, неизменной души или независимого «Я». Это не просто философская идея, а прямое указание на природу реальности, которое помогает выйти из страдания.
Что отрицает анатман?
Постоянное «Я» — нет неизменной сущности, которая переходит из жизни в жизнь.
Контролирующее «Я» — иллюзия, что мы полностью управляем телом, чувствами и мыслями.
Обособленное «Я» — представление, что мы отделены от мира.
Пример:
Мы говорим: «Моё тело, мои мысли, мои чувства» — но где тогда тот, кто этим владеет? При детальном анализе такого «хозяина» найти невозможно.
Три признака существования (Трилакшана)
Учение об анатмане тесно связано с тремя характеристиками бытия:
Анитья (непостоянство) — всё изменяется.
Дуккха (страдание) — цепляние за непостоянное ведёт к боли.
Анатта (не-Я) — ничто не является «собой» навечно.
Пример с рекой:
Река кажется одной и той же, но её вода никогда не повторяется. Так и человек — поток элементов (скандх), но нет неизменной сущности «я».
5 Скандх (совокупностей)
Будда объяснял, что то, что мы называем «Я», — это просто временная комбинация пяти процессов:
Скандха
Что включает?
Почему это не «Я»?
1. Рупа (форма)
Тело, материальные объекты
Тело стареет, болеет, его нельзя контролировать.
2. Ведана (чувства)
Приятное, неприятное, нейтральное
Чувства возникают и исчезают сами.
3. Сання (восприятие)
Распознавание объектов (например, «это яблоко»)
Зависит от органов чувств и памяти.
4. Санскары (умственные формирования)
Мысли, привычки, воля
Мысли приходят и уходят без нашего ведома.
5. Виджняна (сознание)
Осознавание объектов
Сознание зависит от условий (нет независимого «наблюдателя»).
Нет ни одной скандхи, которую можно было бы назвать «Я», потому что все они:
Непостоянны (анитья).
Неуправляемы (мы не решаем, когда родиться или заболеть).
Пусты от самосущего «я» (зависимы от причин).
Зачем нужно понимать анатман?
Освобождение от страдания — если нет «Я», то некому страдать.
Разрушение эгоизма — меньше привязанности к «моё».
Пробуждение (нирвана) — выход за пределы иллюзий.
«Видеть не-Я — значит видеть истину.
Видя истину, человек освобождается».
— СН 22.15 (Саньютта-никая)
Ошибки в понимании анатмана
«Значит, меня вообще нет» → Нет, есть процесс (поток скандх), но нет неизменной сущности.
«Это пессимизм» → Наоборот: если нет «Я», то нечего терять, и можно быть свободным.
«Значит, всё бессмысленно» → Смысл в пробуждении и помощи другим.
Как применять учение на практике?
Наблюдай за «нематериальностью» себя:
В медитации спрашивай: «Кто думает? Кто чувствует?» — и ищи «хозяина».
Анализируй скандхи:
Когда злишься, спроси: «Это «я» злюсь, или просто возник гнев?».
Отпускай цепляние:
Помни, что даже «твои» взгляды и убеждения — временные явления.
Пример из жизни:
Вы расстроились из-за критики. Но если разобрать:
Критика → просто звук.
Обида → временная реакция ума.
«Я обиделся» → иллюзия, что есть кто-то, кто «владеет» обидой.
«Как собраны вместе спицы в колесной ступице,
так собраны в этом теле и ум, и материя.
Когда Дхамма понята,
рождение уничтожено,
и нет больше становления».
— Итивуттака 1.1
1.2.7 - Вопросы через буддизм
Как философия буддизма отвечает на вопросы жизни.
1.2.7.1 - О душе
В буддизме концепция «души» (атмана) радикально отличается от привычных представлений.
1. Отрицание души (Анатмавада)
Нет вечной души → Будда отвергал идею неизменного «Я» (согласно учению анатты).
Вместо души есть поток сознания (виньяна) – непрерывная цепь мгновенных состояний ума, связанных кармой.
«Где нет ни „я“, ни „моего“, там нет и „души“»
— СН 12.15 (Саньютта-никая)
2. Из чего состоит «псевдо-душа»?
Условная «личность» – это пять совокупностей (скандх), которые ошибочно принимаются за «Я»:
Тело (рупа)
Ощущения (ведана)
Восприятие (сання)
Воля/карма (санскара)
Сознание (виньяна)
Пример:
Когда вы говорите «я злюсь», это лишь временная комбинация:
«Рождение» → Новый поток сознания возникает мгновенно при зачатии (при наличии кармы + неведения).
«Смерть» → Поток не исчезает, а перепроецируется в новую форму (человек, животное, бог и т.д.).
Исчезновение → Только при нирване, когда прекращаются:
Цепляние за «Я»
Кармические импульсы
Перерождения
«Как пламя гаснет, когда кончается топливо, так и сознание угасает, лишённое опоры»
— Дхаммапада 47
4. Назначение потока сознания
В сансаре:
Быть носителем кармы (как река несёт песок).
Опылять страдание (дуккха) через отождествление с телом/умом.
В нирване:
Поток прекращается (но не «уничтожается» – просто нет условий для возникновения).
Остаётся безусловная свобода вне понятий «бытия/небытия».
5. Почему это важно?
Если бы душа существовала, освобождение было бы невозможно (ведь «я» оставалось бы в ловушке).
Без души есть шанс разорвать сансару через:
Прозрение в непостоянство
Отказ от цепляния
Прекращение кармических семян
Практический вывод
Медитируйте на вопрос: «Если нет души, то что перерождается?»
Ответ: «Ничто. Есть лишь пустой процесс, подобный волне на воде. Когда ветер кармы стихает – волна успокаивается».
Это и есть конец страдания.
1.2.7.2 - Что дает жизнь живому
В буддизме вопрос о жизненной силе рассматривается через призму обусловленного существования, а не биологической энергии в материалистическом понимании.
1. Буддийская альтернатива “жизненной силе”
Вместо концепции энергии буддизм говорит о:
Пяти совокупностях (скандхах) — динамическом процессе, создающем иллюзию “живого существа”
Зависимом возникновении (пратитья-самутпада) — 12 звеньях, объясняющих механизм существования
Кармической силе (четана) — намерении как основном двигателе перерождений
2. Что поддерживает жизнь?
С буддийской перспективы жизнь существует благодаря:
Пище для поддержания (ахара):
Материальная пища (кабалинкара-ахара)
Контакт чувств с объектами (пхасса)
Умственное намерение (мано-санчетана)
Сознание (виньяна)
Кармических импульсах:
Прошлые намерения создают текущие условия жизни
Настоящие действия формируют будущие рождения
3. Биологические процессы в буддийском контексте
Хотя буддизм не отрицает физиологию, он интерпретирует ее иначе:
Тело (рупа) — временное сочетание четырех элементов (земля, вода, огонь, воздух)
Жизненная способность (дживитиндрия) — один из 22 психических факторов, поддерживающих телесные функции
Тепло тела — признак наличия сознания (в текстах говорится, что при смерти “жизненное тепло угасает”)
Нет отдельной “жизненной энергии” — есть комплекс условий
Процессы жизни полностью безличны (анатта)
То, что мы называем “жизнью” — просто цепь мгновенных состояний
Практическое значение:
Осознание этого помогает:
Увидеть непостоянство всех жизненных процессов
Ослабить привязанность к телу как “я”
Направить усилия на прекращение страдания, а не продление биологического существования
“Как свеча горит не за счет ‘жизненной силы огня’, а благодаря горючему веществу и условиям, так и существование поддерживается комплексом причин, а не некоей ‘душой’ или ‘энергией’” (Мадджхима-никая)
1.2.7.3 - О живом и неживом
В буддизме объяснение жизни, сознания и различия между живым и неживым строится на концепции зависимого возникновения (пратитья-самутпада) и теории пяти совокупностей (скандх).
1. Почему живое становится живым?
В буддизме нет понятия “жизненной силы” или души — есть поток обусловленных процессов, которые создают иллюзию “живого существа”.
Ключевые условия для возникновения жизни:
Кармические причины (санскары) → прошлые действия формируют условия для нового рождения.
Сознание (виньяна) → переходит из предыдущего существования (но не как “душа”, а как продолжающийся поток).
Имя-форма (нама-рупа) → психические и физические компоненты, которые развиваются вместе.
“Когда есть это — возникает то. С прекращением этого — прекращается то” (Пратитья-самутпада, СН 12.1).
Пример:
После смерти существа его карма и неведение приводят к новому соединению сознания + тела в утробе или иной форме (например, в мире богов или животных).
2. Почему у живого есть сознание?
Сознание (виньяна) — это не постоянная сущность, а цепь мгновенных актов осознавания, зависящих от:
Шести органов чувств (глаза, уши, нос, язык, тело, ум)
Шести типов объектов (зримые формы, звуки и т.д.)
Контакта (пхасса) между ними
Сознание возникает только при наличии:
Чувственного основания (например, глаз для зрения).
Внешнего объекта (например, свет).
Внимания (манасикара) → без него даже при наличии глаза и света осознавания не будет.
У неживого (например, камня) нет сознания, потому что:
Нет органов чувств для контакта с объектами.
Нет кармической основы для поддержания потока виньяны.
3. Что отличает живое от неживого?
Живое
Неживое
Имеет пять совокупностей (скандхи)
Нет скандх (только материальные элементы)
Обладает сознанием (виньяна)
Нет сознания
Подвержено карме и перерождениям
Не создаёт карму
Испытывает страдание (дуккха)
Не испытывает страдания
Способно к намеренным действиям (четана)
Действует только по физическим законам
Главный критерий:
Живое → может формировать карму через намерения (например, человек, животное, божество).
Неживое → не может создавать карму (например, камень, вода, огонь).
4. Почему живое становится живым? Механизм перерождения
Неведение (авидья) → фундаментальная причина сансары.
Кармические импульсы (санскары) → прошлые действия “толкают” сознание к новому рождению.
Сознание (виньяна) → находит подходящие условия (утроба, яйцо, иное измерение).
Имя-форма (нама-рупа) → начинают развиваться психические и физические процессы.
Шесть сфер чувств → появляются органы восприятия.
Пример:
После смерти человека его несозревшая карма ищет новое “место” для проявления.
Если карма связана с миром людей → сознание притягивается к зачатию.
В момент зачатия возникает новый поток “жизни” (но это не “переселение души”, а продолжение причинно-следственной цепи).
5. Есть ли сознание у неживого?
Нет в традиционном понимании.
Но в махаяне некоторые тексты говорят о “зародышевой природе Будды” (татхагатагарбха) во всём сущем — потенциальной возможности пробуждения даже в “неживых” элементах (например, в растениях или воде).
В тибетском буддизме есть концепция “сознания среды” (например, у священных гор), но это скорее метафора.
6. Как прекращается этот процесс?
Через пробуждение (нирвану):
Устранение неведения → понимание, что нет “я” в пяти скандхах.
Прекращение кармы → отсутствие новых действий, ведущих к перерождению.
Угасание сознания → не в смысле уничтожения, а как “огонь без топлива”.
“Когда мудрый полностью освобождается, его сознание, не находя опоры, не возникает вновь” (СН 12.38).
Живое становится живым не из-за “жизненной силы”, а из-за:
кармических причин,
потока сознания,
соединения ума и тела.
Неживое не обладает этим механизмом. Ключ к освобождению — прозреть эту зависимость и выйти из цикла.
Практика:
Медитируйте на вопрос: “Если нет „я“ в этом теле и уме, то что же тогда рождается и умирает?”
Ответ: “Ничто. Есть лишь пустой процесс, подобный волне на воде. Когда ветер кармы стихает — волна успокаивается”.
1.2.7.4 - О теле и телах
Как буддизм рассматривает назначение различных тел у человека.
В буддизме (особенно в Махаяне и Ваджраяне) описывается несколько “тел” или уровней существования, которые есть у живых существ. Эти “тела” не физические, а скорее аспекты бытия.
1. Грубое тело (Стхула-рупа)
Что это: Физическое тело из плоти и крови.
Для чего:
Взаимодействие с материальным миром
Испытывание грубых форм страдания и удовольствия
Инструмент для накопления кармы через действия
Примеры: Тело человека, животного, насекомого.
2. Тонкое тело (Сукшма-шарира)
Что это:
Энергетическая система (нади, чакры - в тантрическом буддизме)
Эмоции и тонкие психические процессы
Для чего:
Перенос сознания между жизнями (в бардо)
Опыт сновидений и тонких состояний сознания
Хранение кармических отпечатков
Особенности: Именно это тело перерождается, а не “душа”.
3. Причинное тело (Карана-шарира)
Что это:
Глубинные кармические тенденции
Корневые причины перерождений
Для чего:
Поддержание непрерывности сансары
Хранение самых глубоких привычек ума
Как работает: Это “тело” - фактически поток неведения (авидья), заставляющий нас перерождаться.
У Будд и Просветленных существ добавляются:
4. Тело Блаженства (Самбхогакая)
Что это:
Тонкая форма просветленных существ
“Тело” будд и бодхисаттв в чистых землях
Для чего:
Помощь продвинутым практикующим
Передача глубоких учений
Пример: Авалокитешвара, Манджушри.
5. Истинное тело (Дхармакая)
Что это:
Абсолютная природа реальности
Пустотность и ясность за пределами форм
Для чего:
Источник всех проявлений
Конечная цель практики
Особенность: Не является “телом” в обычном смысле - это природа ума всех существ.
6. Проявленное тело (Нирманакая)
Что это:
Физические проявления будд в мире
Для чего:
Учение обычным существам
Пример для подражания
Пример: Исторический Будда Шакьямуни.
Как это работает в перерождениях?
После смерти грубое тело распадается.
Тонкое тело сохраняет сознание и переходит в бардо.
Причинное тело “тянет” это сознание в новое рождение.
В новом рождении формируется новое грубое тело.
Практическое значение
Медитации на тонкое тело помогают понять иллюзорность “я”.
Работа с причинным телом ведет к прекращению перерождений.
Постижение Дхармакаи - это и есть Просветление.
Важно: Эти “тела” не существуют независимо - они взаимопроникающие аспекты одного потока опыта.
1.2.7.5 - Кармическая основа размножения
В буддизме желание размножаться объясняется через призму глубинных психологических и кармических механизмов, а не генетики в современном научном понимании.
1. Кармическая основа размножения
Танха (жажда) → фундаментальная причина:
Сексуальное влечение как проявление жажды чувственных удовольствий (кама-танха)
Инстинкт продолжения рода как жажда существования (бхава-танха)
Карма прошлых жизней → существа, имевшие сильную привязанность к сексуальности, чаще рождаются в мирах с половым размножением
“Из жажды возникает цепляние” (СН 12.38)
2. Роль генов с буддийской перспективы
Буддизм не отрицает биологию, но интерпретирует её через призму учения о:
Четырёх питах (ахара):
Обычная пища (физическая основа)
Контакт чувств (стимуляция желаний)
Умственное намерение (кармический импульс)
Сознание (поток, ищущий воплощения)
Гены — это современное название “материальной пищи”, но:
Они лишь условие, а не причина размножения
Без кармической жажды гены были бы “пустой программой”
3. Психологические механизмы
Упадана (цепляние) за:
Своё генетическое продолжение (иллюзия “мои дети”)
Телесные удовольствия
Авидья (неведение) → заблуждение, что размножение принесёт истинное удовлетворение
4. Уровни проявления
Уровень
Буддийский термин
Современный аналог
Глубинный
Бхава-танха
Инстинкт выживания вида
Эмоциональный
Кама-танха
Сексуальное влечение
Физический
Рупа-скандха
Генетические механизмы
5. Как выйти за пределы инстинкта?
Осознание → видеть размножение как проявление жажды
Созерцание:
Непостоянства тела
Страданий, связанных с рождением
Отсутствия “я” в генетическом коде
Развитие:
Брахмачарьи (целибата) для монахов
Осознанного родительства для мирян
Парадокс: Даже Будда имел физическое тело с генами, но полностью освободился от обусловленности ими. Это показывает — биология создаёт условия, но не определяет сознание.
Что такое гены
Гены — это современное объяснение механизма, но корень размножения — в уме. Пока есть цепляние за существование, природа будет находить биологические пути его реализации.
1.2.7.6 - Одновременность всех процессов
Анализ утверждения: все процессы в колесе сансары происходят одновременно, т.е. человек находится постоянно в неведении, его побуждают кармические импульсы совершать поступки и испытывать жажду и цепляние и ониже формируют новую карму, происходит непрерывное рождение и старение
1. “Все процессы в колесе сансары происходят одновременно”
С одной стороны, в буддизме (особенно в школах Махаяны и Ваджраяны) действительно есть идея взаимозависимого возникновения (пратитья-самутпада), где все 12 нидан (звеньев) могут рассматриваться не как линейная цепь, а как взаимосвязанная система.
Например, авидья (неведение) поддерживает самскары (кармические импульсы), а те, в свою очередь, питают виджняну (сознание), и так далее — всё это работает циклично и одновременно.
В тантре и дзогчене иногда говорят, что сансара и нирвана — это одно, а иллюзия времени создаёт видимость последовательности.
Но:
В Тхераваде и раннем буддизме акцент делается на постепенном развитии кармы и перерождений.
“Одновременность” здесь скорее означает, что причины и следствия переплетены, а не что всё происходит буквально в один момент.
2. “Человек постоянно находится в неведении, его побуждают кармические импульсы”
Да, это верно.
Авидья (неведение) — корень сансары, из-за неё возникают жажда (танха) и цепляние (упадана), которые ведут к новым действиям (карма).
Кармические импульсы (самскары) действительно подталкивают к поступкам, создавая новые кармические семена.
3. “Непрерывное рождение и старение”
Это соответствует учению о мгновенных перерождениях (кшаника-вада).
В буддизме нет вечной души, но есть поток сознания (сантана), который каждое мгновение “умирает и рождается” под влиянием кармы.
Физическая смерть — лишь один из этапов, но процесс ментального рождения (становления, бхава) происходит постоянно.
Вывод
Утверждение в целом верно, особенно с точки зрения недвойственных школ (Махаяна, Ваджраяна), где сансара рассматривается как динамический, мгновенно обновляющийся процесс.
Однако:
В классическом (Тхеравадинском) подходе больше акцента на постепенном накоплении и созревании кармы.
“Одновременность” не означает, что прошлое и будущее смешаны, а скорее то, что причины и следствия взаимосвязаны в каждый момент.
Таким образом, сансара — это непрерывный поток обусловленного существования, в котором:
Неведение порождает жажду.
Жажда ведёт к действиям (карма).
Действия формируют новые условия перерождения.
Цикл повторяется до пробуждения (нирваны).
Этот процесс можно осознать и прекратить через практику (медитация, мудрость, этика).
1.2.7.7 - Состояние смерти
В буддизме состояние смерти и схожие изменённые состояния сознания рассматриваются как важные моменты, связанные с работой ума, кармой и возможностью духовного прозрения.
1. Смерть (марана)
Главное переходное состояние между жизнями, определяемое кармой.
В тибетском буддизме (Ваджраяна) подробно описаны “бардо смерти” (промежуточное состояние):
Бардо умирания (чхикхай бардо) – распад элементов тела и ума.
Бардо дхарматы (чёньи бардо) – переживание чистого света (возможность освобождения).
Бардо становления (сидпа бардо) – поиск нового рождения.
2. Сон (нидра, суптина)
Рассматривается как “малая смерть” – временное отключение грубого сознания.
В йогачаре и тантре практикуют “ясный сон” (осознанные сновидения) для духовной тренировки.
Аналогия с бардо: в снах могут проявляться кармические впечатления (васаны).
3. Обморок (мурчха)
Внезапная потеря сознания, похожая на кратковременную смерть.
В текстах упоминается редко, но трактуется как временный разрыв непрерывности ума (сантаны).
4. Оргазм (сукха-вега)
В тантрическом буддизме (не во всех школах!) используется как:
Объект осознавания (в практике “превращения яда в нектар”).
Символ слияния мудрости и метода (в символике яб-юм).
В обычном состоянии – проявление цепляния за удовольствие (рага).
5. Медитативное погружение (самадхи)
Не является аналогом смерти, но включает состояния остановки обычного восприятия:
Ниродха-самапатти – полное прекращение ментальной активности (только у архатов).
Асаньджни-самадхи – “бессознательное” самадхи (в некоторых школах).
6. Состояния при болезни (гьял-рим)
В тибетской медицине некоторые болезни вызывают изменённые состояния, близкие к предсмертным.
Сравнительная таблица
Состояние
Сходство со смертью
Духовный смысл в буддизме
Смерть
Полный распад тела/ума
Переход в бардо, кармический выбор
Сон
Частичное отключение ума
Тренировка осознанности (в тантре)
Обморок
Временная потеря сознания
Пример непостоянства
Оргазм
Кратковременный “раствор”
Объект тантрической трансформации
Самадхи
Остановка обычного ума
Путь к нирване
Буддизм говорит
Буддизм рассматривает эти состояния как:
Доказательство непостоянства (аничча).
Возможности для осознания природы ума (особенно в Ваджраяне).
Этапы в непрерывном потоке сознания (сантана).
Наиболее глубоко разработана теория смерти и бардо, остальные состояния служат её частными случаями или тренировочными “полигонами” для практики.
1.2.7.8 - 9 месяцев беременности
В буддийской концепции пратитья-самутпады (зависимого возникновения) 12 нидан действительно описывают процесс перерождения, но их временные рамки не жёстко привязаны к 9 месяцам беременности
1. Точное соответствие нидан и этапов зачатия/развития
“Сознание” (виджняна) – действительно ключевая нидана для зачатия. В момент смерти предыдущая виджняна (с кармическими отпечатками) ищет новое воплощение.
“Имя-и-форма” (нама-рупа) – начало формирования психических и физических структур в утробе.
“Шесть сфер чувств” (шадаятана) – развитие органов чувств у плода.
“Соприкосновение” (спарша) – первые ментальные реакции (например, на звуки или состояние матери).
“Жажда” (танха) и “Цепляние” (упадана) – внутриутробные кармические тенденции (например, “стремление” родиться).
Но:
Эти процессы могут быть растянуты или сжаты во времени в зависимости от кармы.
В некоторых комментариях (например, в «Висуддхимагге») говорится, что жажда и цепляние – это не только внутриутробные, но и предыдущие ментальные акты, приведшие к перерождению.
2. Почему 9 месяцев – условность?
Не все существа рождаются из утробы (есть яйцекладущие, самозарождающиеся, чудесные рождения – как у богов или обитателей адов).
В Абхидхарме уточняется, что для адовых существ или дэвов “формирование” тела может происходить мгновенно.
Даже у людей кармически обусловленные этапы могут не совпадать с биологическими (например, сознание может “ждать” подходящего момента для зачатия годами).
3. Альтернативное толкование: ниданы как вневременной цикл
В школах Махаяны (особенно в Йогачаре) ниданы иногда трактуют как постоянно действующий психический процесс, а не только как описание беременности.
Например:
“Жажда” и “цепляние” возникают ежесекундно в уме обычного человека.
“Рождение” и “старость” – это каждое новое мгновение существования в сансаре.
В этом случае “9 месяцев” – лишь метафора для иллюстрации непрерывности кармического потока.
Точки зрения
Да, в классической интерпретации (особенно в Тхераваде) этапы от “сознания” до “рождения” можно условно сопоставить с внутриутробным развитием, но:
Это не строго 9 месяцев – срок зависит от вида перерождения.
Некоторые ниданы (танха, упадана) работают ещё до зачатия.
В Махаяне акцент смещается на мгновенное развёртывание нидан в уме.
То есть биологическое рождение – лишь частный случай “рождения” (джати) как нового кармического цикла.
1.2.7.9 - Суточный круг сансары
Суточный цикл человека действительно можно рассматривать как микрокосм колеса сансары, где этапы дня отражают 12 нидан зависимого возникновения.
1. Пробуждение (момент “рождения” в новый день)
Нидана 12: Джати (Рождение)
Пробуждение = “рождение” в новый цикл активности.
Аналогия: как при физическом рождении сознание входит в новый мир, так и утром ум “входит” в дневную реальность.
2. Утренняя растерянность (неведение)
Нидана 1: Авидья (Неведение)
Первые минуты после сна — ум затуманен, нет ясности.
Аналогия: как авидья в сансаре скрывает истинную природу реальности, так и сонное состояние искажает восприятие.
3. Формирование планов на день (кармические импульсы)
Нидана 2: Самскары (Кармические формации)
Мысли типа “Сегодня нужно сделать X, Y, Z” — это ментальные импульсы, формирующие день.
Аналогия: как самскары определяют следующее рождение, так и утренние намерения задают тон дню.
4. Осознание себя (“сознание” дня)
Нидана 3: Виджняна (Сознание)
Полное пробуждение, осознание “я есть” и начало взаимодействия с миром.
Аналогия: как виджняна в момент зачатия запускает новую жизнь, так и утреннее осознание запускает день.
5. Включение в деятельность (“имя-и-форма”)
Нидана 4: Нама-рупа (Имя-и-форма)
Ум (нама) начинает идентифицировать себя с телом (рупа): “Я — Петя, мне надо на работу”.
Аналогия: как в утробе закладывается психика и тело, так и утром формируется “персона” дня.
6. Включение чувств (“шесть сфер”)
Нидана 5: Шадаятана (Шесть чувственных основ)
Глаза видят, уши слышат — контакт с миром через органы чувств.
Аналогия: как у плода развиваются органы, так и после пробуждения включается восприятие.
7. Первые реакции на мир (“соприкосновение”)
Нидана 6: Спарша (Контакт)
Первый утренний кофе, сообщения в телефоне — ум реагирует на раздражители.
Аналогия: как в утробе плод впервые “чувствует” среду, так и человек утром вступает в контакт с миром.
Аналогия: как ведана в сансаре окрашивает опыт, так и утренние впечатления задают эмоциональный фон дня.
9. Появление желаний (“жажда”)
Нидана 8: Танха (Жажда)
“Хочу ещё кофе”, “не хочу идти на работу”.
Аналогия: как танха ведёт к новым перерождениям, так и дневные желания создают карму.
10. Закрепление привязанностей (“цепляние”)
Нидана 9: Упадана (Цепляние)
“Мой телефон”, “моя работа”, “мои проблемы”.
Аналогия: как упадана фиксирует карму, так и дневные привязанности укрепляют эго.
11. Активные действия (“становление”)
Нидана 10: Бхава (Становление)
Человек погружается в дела, создавая новую карму.
Аналогия: как бхава ведёт к новому рождению, так и дневная активность формирует будущие последствия.
12. Вечерняя усталость и сон (“старость-и-смерть”)
Нидана 11-12: Джара-марана (Старость и смерть)
Усталость, спад энергии, засыпание = “микросмерть” дня.
Аналогия: как смерть завершает жизнь, так и сон завершает цикл дня.
Суточный круг
Каждый день — это мини-сансара:
Утро = рождение в новый кармический цикл.
День = накопление впечатлений и действий.
Вечер = “распад” и переход в неведенье (сон).
Осознавая это, можно практиковать освобождение даже в повседневности:
Видеть непостоянство (аничча) в смене дня и ночи.
Прекращать цепляние за дневные события перед сном.
Использовать пробуждение как аналог “перерождения” для нового начала.
1.2.7.10 - Как жить просветленному мирянину
В буддизме вопрос о том, как сочетать просветление с мирскими обязательствами, решается не через жёсткий выбор «либо-либо», а через мудрость и сострадание.
1. Просветление ≠ автоматический уход из мира
Будда после пробуждения 45 лет учил людей, хотя мог уйти в нирвану сразу.
Многие архаты и бодхисаттвы (например, Вималакирти) оставались в миру, помогая другим.
Суть просветления — не в бегстве от жизни, а в освобождении от привязанности к ней.
Вывод: Сам факт пробуждения не обязывает человека бросать семью или работу.
2. Как поступать с обязательствами?
а) Если человек — архат (достигший нирваны)
Он больше не создаёт новой кармы, но может завершить текущие дела без страдания и цепляния.
Пример:
Будда заботился о своей бывшей жене (Яшодхаре) и сыне (Рахуле), приняв их в Сангху.
Сарипутта продолжал учить, пока не закончил свои обязательства.
б) Если человек — бодхисаттва (стремящийся помочь другим)
Он сознательно остаётся в сансаре, чтобы вести к освобождению близких.
Пример:
Авалокитешвара («Тот, кто слышит плач мира») откладывает нирвану, пока все существа не освободятся.
в) Если человек — мирянин (упасака) с пробуждённым умом
Он меняет отношение к обязанностям, но не обязательно отказывается от них:
Семья: воспитывает детей с мудростью, но без привязанности.
Работа: выполняет её как дану (щедрость), а не как кармическую ловушку.
Родители: заботится о них, но без идеи «я — спаситель».
3. Что важнее: уйти или остаться?
Негативная карма возникает не от самих действий, а от мотивации:
Если бросить семью из эгоизма («хочу спокойно медитировать») — это создаст дурную карму.
Если остаться из страха осуждения — это тоже привязанность.
Правильный подход:
Закончить важные обязательства (например, вырастить детей), но делать это с непривязанностью.
Если близкие готовы принять его путь — постепенно уйти в монашество (как сделал Будда).
Если нет — оставаться просветлённым мирянином, как Анатхапиндика (богатый купец-архат).
4. Практические шаги для просветлённого домохозяина
Перестать создавать новую карму:
Делать всё с осознанностью, но без жажды результата.
Превратить обязанности в практику:
Воспитание детей → метта (любящая доброта).
Работа → правильные средства к существованию.
Постепенно уменьшать привязанности:
Не требовать от семьи «понимать» его состояние.
Если близкие страдают от его отрешённости — искать баланс (как Царь Ашока, который правил после пробуждения).
5. Крайние случаи: когда можно уйти?
Если семья не зависит от него (дети выросли, жена согласна).
Если его присутствие вредит другим (например, родные лишь сильнее цепляются за него).
Если он ясно видит, что остаться — значит подпитывать иллюзии близких.
Но даже тогда уход должен быть без ненависти и отвращения, а с состраданием.
Баланс
Буддизм не требует резко рвать связи после просветления. Главное — не цепляться за них. Можно:
Остаться, но жить как «гость в своём доме» (без отождествления).
Уйти, но только после выполнения ключевых обязательств.
Найти баланс, как Будда, который не бросил своих учеников, но и не цеплялся за них.
Как сказано в «Дхаммападе»:
«Просветлённый идёт по миру, как лист, уносимый ветром — ни к чему не прилипая и ни за что не цепляясь».
Важен не внешний поступок, а внутренняя свобода.
2 - Справочники и документация по Protocol Buffer
Технические справочники и официальная документация и переводы по Protocol Buffer.
Protocol Buffers (Protobuf) — это эффективный и высокопроизводительный механизм сериализации структурированных данных от Google. Позволяет определять структуры данных один раз и генерировать код для их чтения и записи на различных языках программирования.
Что такое Protocol Buffers?
Protocol Buffers — это:
Языково-независимый формат для сериализации структурированных данных
Бинарный протокол, который значительно компактнее и быстрее JSON/XML
Система контрактов между сервисами через .proto файлы
Кросс-платформенное решение с поддержкой 10+ языков программирования
Ключевые преимущества
📏 Компактный размер — до 90% меньше JSON
⚡ Высокая скорость — сериализация в 6 раз быстрее
🔒 Строгая типизация — контроль данных на этапе компиляции
🔄 Версионность — обратная и прямая совместимость
🌍 Мультиязычность — единый контракт для всех языков
Как это работает?
Определяете структуры данных в .proto файлах
Генерируете код для нужных языков программирования
Используете сгенерированные классы в вашем приложении
Области применения
Микросервисная архитектура — коммуникация между сервисами
curl http://localhost:11434/api/generate -d '{
"model": "qwen3:4b",
"prompt": "Напиши руководство по Git в markdown",
"format": "markdown",
"stream": false
}'
HTML запрос:
curl http://localhost:11434/api/generate -d '{
"model": "qwen3:4b",
"prompt": "Создай простую HTML страницу с заголовком и параграфом",
"format": "html",
"stream": false
}'
Важные замечания:
Не все модели одинаково хорошо поддерживают все форматы
Формат - это указание модели, а не гарантия
Лучше всего работают JSON и text
Для сложных форматов лучше явно указывать в промпте
Комбинирование с промптом:
# Более надежный способcurl http://localhost:11434/api/generate -d '{
"model": "qwen3:4b",
"prompt": "Верни ответ в формате JSON: {\"name\": \"string\", \"age\": number}",
"format": "json",
"stream": false
}'
Большинство моделей лучше всего работают с json и text форматами.
Параметры в options:
5. "temperature": 0.8
Что делает: Контролирует случайность ответов (0.0-1.0)
Применение:
0.1 - детерминированные, повторяемые ответы
0.8 - креативные, разнообразные ответы
1.0 - максимальная случайность
Пример: "temperature": 0.3 для фактологических ответов
6. "top_p": 0.9
Что делает: nucleus sampling - учитывает только топ-N% вероятных слов
Применение:
0.1 - только самые вероятные слова
0.9 - более разнообразный выбор
Пример: "top_p": 0.7
7. "top_k": 40
Что делает: Ограничивает выбор только топ-K слов
Применение:
10 - только 10 самых вероятных слов
40 - хороший баланс
Пример: "top_k": 20
Толкование
Подробное объяснение top_p и top_k
top_p (также known as nucleus sampling) - это алгоритм выборки, который ограничивает генерацию только теми словами, кумулятивная вероятность которых попадает в верхние P% распределения.
Как это работает:
Сортировка вероятностей: Модель ранжирует все возможные следующие слова по вероятности
Кумулятивная сумма: Складывает вероятности от самой высокой к самой низкой
Выбор ядра: Берет только те слова, чья кумулятивная сумма ≤ top_p
Перераспределение вероятностей: Нормализует вероятности выбранных слов
Математическая формула:
Выбрать множество V таких что: ∑(p(x) для x в V) ≥ p
где p = значение top_p (0.0-1.0)
# Сегодняseed=42 → "Ответ А"# Завтра seed=42 → "Ответ А"(тот же самый)# После перезагрузкиseed=42 → "Ответ А"(все равно тот же)
Практическое применение:
1. Тестирование и отладка
# Тестирование изменений промптаseed=42 + prompt="Версия 1" → Результат А
seed=42 + prompt="Версия 2" → Результат Б
# Можно точно сравнить улучшения
2. Воспроизведение результатов
# Найден хороший результат → сохраняем seedcurl ... -d '{
"prompt": "Креативное название",
"seed": 78901, # ← ЗАПОМНИТЬ ЭТОТ SEED
"temperature": 0.3
}'# Результат: "Небесный аромат" (сохраняем для производства)
3. A/B тестирование моделей
# Сравнение моделей на одинаковых данныхseed=42 + model="qwen3:4b" → Результат А
seed=42 + model="llama3:8b" → Результат Б
# Честное сравнение без случайности
4. Обучение и демонстрации
# Демо для клиента - всегда одинаковый результатseed=12345 → "Ваш идеальный бизнес-план..."
Важные ограничения:
1. Temperature должен быть низким
{"seed":42,"temperature":0.9,// ❌ Высокая randomness
"top_p":0.9// ❌ Высокая randomness
}// Результат НЕ будет детерминированным!
# Модель обновилась → результаты могут изменитьсяseed=42 + model=v1.0 → Результат А
seed=42 + model=v1.1 → Результат Б (может отличаться)
Практические примеры настроек:
Для детерминированного кода:
{"seed":12345,"temperature":0.1,"top_p":0.2,"top_k":10,"prompt":"Напиши функцию на Python для сложения чисел"}
Для воспроизводимых аналитических ответов:
{"seed":67890,"temperature":0.2,"top_p":0.4,"prompt":"Проанализируй преимущества технологии блокчейн"}
Для тестирования промптов:
{"seed":11111,"temperature":0.1,"prompt":"Версия 1 промпта..."}// Меняем только промпт, сохраняем seed
Как выбрать хороший seed?
# Любое целое число"seed": 42"seed": 1234567890"seed": 999888777# Но лучше избегать:"seed": 0# Иногда особый случай"seed": 1# Слишком простой"seed": 123456# Нормально
Пример полного workflow:
Экспериментируем без seed, находим хорошие параметры
Фиксируем параметры и промпт
Добавляем"seed": 12345 для воспроизводимости
Сохраняем конфигурацию для production
{"model":"qwen3:4b","prompt":"Генерируй креативные названия для кофе","seed":424242,"temperature":0.3,"top_p":0.6,"top_k":30,"num_predict":50}
Seed - это мощный инструмент для обеспечения воспроизводимости и отладки LLM приложений!
14. "mirostat": 0
Что делает: Алгоритм контроля перплексии (0, 1, 2)
Применение:
0 - выключено
1 или 2 - для контроля качества
Толкование
Подробное объяснение MIROSTAT
Mirostat - это алгоритм контроля качества текста, который динамически регулирует параметры генерации чтобы поддерживать заданный уровень перплексии (сложности/предсказуемости текста).
Как это работает:
Mirostat постоянно измеряет перплексию генерируемого текста и подстраивает параметры в реальном времени чтобы достичь целевого значения.
Аналогия:
Представьте круиз-контроль в автомобиле:
Без mirostat: Вы сами управляете газом/тормозом
С mirostat: Автоматически поддерживает заданную скорость
✅ Длинные тексты (избегает деградации качества)
✅ Консистентность (техдокументация, руководства)
✅ Точный контроль сложности текста
✅ Автоматизация генерации контента
Когда НЕ использовать:
❌ Короткие ответы (излишне сложно)
❌ Максимальная скорость (дополнительные вычисления)
❌ Эксперименты (проще использовать temperature)
❌ Очень креативные задачи (может ограничивать)
Отладка Mirostat:
Если текст слишком простой:
{"mirostat_tau":6.0}// Увеличить перплексию
Если текст слишком сложный:
{"mirostat_tau":3.0}// Уменьшить перплексию
Если качество нестабильное:
{"mirostat_eta":0.05}// Уменьшить скорость обучения
15. "num_ctx": 2048
Что делает: Размер контекстного окна
Применение: Зависит от модели
16. "num_thread": 8
Что делает: Количество потоков для вычислений
Применение: Обычно равно количеству ядер CPU
Дополнительные параметры:
17. "template": "{{ .Prompt }}"
Что делает: Шаблон для форматирования промпта
Применение:
"template":"Ответь как эксперт: {{ .Prompt }}\nОтвет:"
18. "context": [1, 2, 3]
Что делает: Контекст предыдущего взаимодействия
Применение: Для продолжения диалога
Толкование
Подробное объяснение CONTEXT
Context - это массив чисел, который представляет собой “память” предыдущего взаимодействия с моделью. Это позволяет продолжить диалог или текст точно с того места, где остановились.
Как это работает технически:
Контекст содержит эмбеддинги (векторные представления) предыдущего взаимодействия:
Кодирование: Текст → числовой вектор
Сохранение: Вектор сохраняется в context
Восстановление: При следующем запросе вектор передается обратно
Продолжение: Модель “помнит” предыдущий разговор
Практический пример workflow:
Шаг 1: Первый запрос
response=$(curl -s http://localhost:11434/api/generate -d '{
"model": "qwen3:4b",
"prompt": "Расскажи о преимуществах Python",
"stream": false
}')# Извлекаем ответ И контекстanswer=$(echo$response| jq -r '.response')context=$(echo$response| jq '.context')
# Разные контексты для разных темcontext_python=$(cat python_context.json)context_js=$(cat js_context.json)
Воспроизведение диалогов:
# Для тестирования можно сохранить и воспроизвести# exact диалог с одинаковым context
Пример для продакшена:
# Псевдокод для веб-приложенияsessions={}defhandle_message(user_id,message):ifuser_idnotinsessions:# Новый диалогresponse=ollama.generate(prompt=message)sessions[user_id]={'context':response['context'],'history':[message,response['response']]}else:# Продолжение диалогаresponse=ollama.generate(prompt=message,context=sessions[user_id]['context'])sessions[user_id]['context']=response['context']sessions[user_id]['history'].extend([message,response['response']])returnresponse['response']
Полноценный пример запроса из командной строки и полным набором параметров с учетом контекста
# Создаем конфигурационный файл для первого запросаcat > first_request.txt << 'EOF'
Расскажи о преимуществах языка Python для data science
EOF# Первый запрос с полными параметрами через stdinecho"=== Первый запрос ==="response1=$(ollama run qwen3:4b --temperature 0.7 --top-p 0.9 --top-k 40\
--num-predict 256 --seed 42 --mirostat 2 --mirostat-tau 5.0 --mirostat-eta 0.1 \
--repeat-penalty 1.1 --stop "\n" --stop "###" < first_request.txt)echo"$response1"# Сохраняем промпт для второго запросаcat > second_request.txt << 'EOF'
А какие недостатки у Python для data science по сравнению с R?
EOF# Второй запрос (Ollama run не поддерживает context напрямую, # поэтому используем альтернативный подход)echo -e "\n=== Второй запрос ==="ollama run qwen3:4b --temperature 0.5 --top-p 0.8 --top-k 30\
--num-predict 200 --seed 123 --repeat-penalty 1.2 < second_request.txt
3.1.1.4 - Alias для zsh с конфигурационным файлом YAML
Полноценный пример создания рабочего alias для командной оболочки zsh с запросом из командной строки и полным набором параметров с подключением внешнего файла настроек yaml
# Alias для работы с конфигурационным файломalias ollama-config='func() {
local config_file="$1"
local prompt="$2"
if [ ! -f "$config_file" ]; then
echo "Config file $config_file not found!"
return 1
fi
# Читаем конфигурацию из файла
local model=$(yq eval ".model" "$config_file")
local temperature=$(yq eval ".options.temperature" "$config_file")
local top_p=$(yq eval ".options.top_p" "$config_file")
local top_k=$(yq eval ".options.top_k" "$config_file")
local num_predict=$(yq eval ".options.num_predict" "$config_file")
local seed=$(yq eval ".options.seed" "$config_file")
# Выполняем запрос
ollama run "$model" --temperature "$temperature" --top-p "$top_p" \
--top-k "$top_k" --num-predict "$num_predict" --seed "$seed" "$prompt"
}; func'# Alias для JSON конфигурацииalias ollama-json='func() {
local config_file="$1"
local prompt="$2"
if [ ! -f "$config_file" ]; then
echo "Config file $config_file not found!"
return 1
fi
# Используем jq для извлечения параметров
local model=$(jq -r ".model" "$config_file")
local temperature=$(jq -r ".options.temperature" "$config_file")
local top_p=$(jq -r ".options.top_p" "$config_file")
ollama run "$model" --temperature "$temperature" --top-p "$top_p" "$prompt"
}; func'
# Установите yq для работы с YAML: brew install yqollama-config ollama_config.yaml "Расскажи о machine learning"# Или с JSON конфигомollama-json config.json "Напиши код на Python"
3.1.1.5 - Запуск модели из Ollama с конфигурационным файлом JSON
Полноценный пример создания запроса из командной строки и полным набором параметров с подключением внешнего файла настроек JSON
3.1.1.6 - Запуск модели из Ollama с конфигурационным файлом JSON и контекстом
Полноценный пример создания запроса из командной строки и полным набором параметров с подключением внешнего файла настроек JSON с контекстом
Продвинутый пример с контекстом и многошаговым диалогом
Создаем скрипт advanced_dialog.sh:
#!/bin/bash
CONFIG_FILE="dialog_config.json"CONTEXT_FILE="context.json"# Функция для отправки запросаsend_request(){localprompt="$1"localcontext="${2:-null}"localrequest_data=$(jq --arg prompt "$prompt" --argjson context "$context"'
{
model: .model,
prompt: $prompt,
stream: false,
format: .format,
options: .options,
template: .template,
context: $context
}'"$CONFIG_FILE") curl -s http://localhost:11434/api/generate \
-H "Content-Type: application/json"\
-d "$request_data"}# Основной диалогecho"🤖 Начинаем диалог с AI"# Шаг 1echo"👤: Расскажи о Python"response1=$(send_request "Расскажи о Python")answer1=$(echo$response1| jq -r '.response')context=$(echo$response1| jq '.context')echo"🤖: $answer1"# Сохраняем контекстecho"$context" > "$CONTEXT_FILE"# Шаг 2 с контекстомecho -e "\n👤: А какие у него недостатки?"response2=$(send_request "А какие у него недостатки?""$(cat $CONTEXT_FILE)")answer2=$(echo$response2| jq -r '.response')echo"🤖: $answer2"# Обновляем контекстecho"$(echo$response2| jq '.context')" > "$CONTEXT_FILE"# Шаг 3echo -e "\n👤: Что посоветуешь для изучения?"response3=$(send_request "Что посоветуешь для изучения?""$(cat $CONTEXT_FILE)")answer3=$(echo$response3| jq -r '.response')echo"🤖: $answer3"
Конфигурационный файл dialog_config.json:
{"model":"qwen3:4b","format":"text","template":"Ответь дружелюбно и подробно: {{ .Prompt }}\n\n","options":{"temperature":0.7,"top_p":0.9,"top_k":40,"num_predict":200,"stop":["\n\n","###"],"repeat_penalty":1.1,"seed":12345,"mirostat":1,"mirostat_tau":5.0,"mirostat_eta":0.1}}
Запуск:
chmod +x advanced_dialog.sh
./advanced_dialog.sh
3.1.1.7 - Запуск модели Ollama с конфигурационным файлом JSON из NODE.JS
Полноценный пример создания запроса из NODE.JS с подключением внешнего файла настроек JSON
JavaScript/Node.js пример с полными параметрами
Установите зависимости:
npm init -y
npm install axios
ollama-client.js:
constaxios=require('axios');classOllamaClient{constructor(baseURL='http://localhost:11434'){this.baseURL=baseURL;this.context=null;}/**
* Генерация текста с полным набором параметров
*/asyncgenerate({prompt,model='qwen3:4b',stream=false,format='text',temperature=0.7,top_p=0.9,top_k=40,num_predict=256,stop=['\n','###'],repeat_penalty=1.1,presence_penalty=0.0,frequency_penalty=0.0,seed=null,mirostat=0,mirostat_tau=5.0,mirostat_eta=0.1,num_ctx=2048,num_thread=8,template=null,useContext=true}){constpayload={model,prompt,stream,format,options:{temperature,top_p,top_k,num_predict,stop,repeat_penalty,presence_penalty,frequency_penalty,mirostat,mirostat_tau,mirostat_eta,num_ctx,num_thread}};// Добавляем опциональные параметры
if(seed!==null){payload.options.seed=seed;}if(template){payload.template=template;}if(useContext&&this.context){payload.context=this.context;}try{constresponse=awaitaxios.post(`${this.baseURL}/api/generate`,payload,{timeout:30000});// Сохраняем контекст для следующего запроса
if(useContext&&response.data.context){this.context=response.data.context;}returnresponse.data;}catch(error){console.error('Ошибка запроса:',error.message);return{error:error.message};}}/**
* Чат-интерфейс с поддержкой истории
*/asyncchat(messages,model='qwen3:4b',options={}){try{constresponse=awaitaxios.post(`${this.baseURL}/api/chat`,{model,messages,stream:false,options},{timeout:30000});returnresponse.data;}catch(error){console.error('Ошибка чата:',error.message);return{error:error.message};}}/**
* Очистить контекст
*/clearContext(){this.context=null;}/**
* Сохранить контекст в файл
*/asyncsaveContext(filename){constfs=require('fs').promises;try{awaitfs.writeFile(filename,JSON.stringify(this.context,null,2));console.log(`Контекст сохранен в ${filename}`);}catch(error){console.error('Ошибка сохранения контекста:',error.message);}}/**
* Загрузить контекст из файла
*/asyncloadContext(filename){constfs=require('fs').promises;try{constdata=awaitfs.readFile(filename,'utf8');this.context=JSON.parse(data);console.log(`Контекст загружен из ${filename}`);}catch(error){console.error('Ошибка загрузки контекста:',error.message);}}}// Пример использования
asyncfunctionmain(){constclient=newOllamaClient();// Пример 1: Простая генерация
console.log('=== Пример 1: Простая генерация ===');constresult1=awaitclient.generate({prompt:'Расскажи о JavaScript и его особенностях',model:'qwen3:4b',temperature:0.7,top_p:0.9,num_predict:200,seed:42,format:'text'});console.log('Ответ:',result1.response||result1.error);// Пример 2: Продолжение с контекстом
console.log('\n=== Пример 2: Продолжение с контекстом ===');constresult2=awaitclient.generate({prompt:'А какие современные фреймворки используются?',temperature:0.5,top_p:0.8});console.log('Ответ:',result2.response||result2.error);// Пример 3: Чат с историей
console.log('\n=== Пример 3: Чат-интерфейс ===');constchatResult=awaitclient.chat([{role:'user',content:'Привет! Расскажи о Node.js'},{role:'assistant',content:'Node.js - это JavaScript runtime...'},{role:'user',content:'Какие пакеты самые популярные?'}],'qwen3:4b',{temperature:0.6,top_p:0.85});console.log('Чат ответ:',chatResult.message?.content||chatResult.error);// Пример 4: Сохранение и загрузка контекста
awaitclient.saveContext('context.json');client.clearContext();awaitclient.loadContext('context.json');// Пример 5: Генерация кода с специфическими параметрами
console.log('\n=== Пример 5: Генерация кода ===');constcodeResult=awaitclient.generate({prompt:'Напиши простой HTTP сервер на Node.js',temperature:0.3,top_p:0.7,num_predict:300,seed:12345,format:'code',stop:['```']});console.log('Сгенерированный код:');console.log(codeResult.response||codeResult.error);}// Запуск примера
main().catch(console.error);
package.json для JavaScript:
{"name":"ollama-client","version":"1.0.0","description":"Ollama client with full parameters support","main":"ollama-client.js","scripts":{"start":"node ollama-client.js","dev":"node ollama-client.js"},"dependencies":{"axios":"^1.6.0"},"keywords":["ollama","ai","llm","javascript"],"author":"Your Name","license":"MIT"}
3.1.1.8 - Запуск модели Ollama на языке Go
Полноценный пример создания запроса к модели ИИ на языке программирования Go
Go пример с полными параметрами
Установите зависимости:
go mod init ollama-client
go get github.com/valyala/fasthttp
main.go:
packagemainimport("encoding/json""fmt""log""strings""time""github.com/valyala/fasthttp")typeOllamaOptionsstruct{Temperaturefloat32`json:"temperature"`TopPfloat32`json:"top_p"`TopKint`json:"top_k"`NumPredictint`json:"num_predict"`Stop[]string`json:"stop"`RepeatPenaltyfloat32`json:"repeat_penalty"`PresencePenaltyfloat32`json:"presence_penalty"`FrequencyPenaltyfloat32`json:"frequency_penalty"`Seedint64`json:"seed,omitempty"`Mirostatint`json:"mirostat"`MirostatTaufloat32`json:"mirostat_tau"`MirostatEtafloat32`json:"mirostat_eta"`NumCtxint`json:"num_ctx"`NumThreadint`json:"num_thread"`}typeOllamaRequeststruct{Modelstring`json:"model"`Promptstring`json:"prompt"`Streambool`json:"stream"`Formatstring`json:"format,omitempty"`OptionsOllamaOptions`json:"options"`Templatestring`json:"template,omitempty"`Context[]int`json:"context,omitempty"`}typeOllamaResponsestruct{Modelstring`json:"model"`Responsestring`json:"response"`Context[]int`json:"context,omitempty"`Donebool`json:"done"`Errorstring`json:"error,omitempty"`}typeOllamaClientstruct{BaseURLstringContext[]int}funcNewOllamaClient(baseURLstring)*OllamaClient{ifbaseURL==""{baseURL="http://localhost:11434"}return&OllamaClient{BaseURL:baseURL}}func(c*OllamaClient)Generate(promptstring,optionsOllamaOptions)(OllamaResponse,error){request:=OllamaRequest{Model:"qwen3:4b",Prompt:prompt,Stream:false,Format:"text",Options:options,}iflen(c.Context)>0{request.Context=c.Context}requestBody,err:=json.Marshal(request)iferr!=nil{returnOllamaResponse{},err}req:=fasthttp.AcquireRequest()deferfasthttp.ReleaseRequest(req)req.SetRequestURI(c.BaseURL+"/api/generate")req.Header.SetMethod("POST")req.Header.SetContentType("application/json")req.SetBody(requestBody)resp:=fasthttp.AcquireResponse()deferfasthttp.ReleaseResponse(resp)client:=&fasthttp.Client{ReadTimeout:30*time.Second,}iferr:=client.Do(req,resp);err!=nil{returnOllamaResponse{},err}varresponseOllamaResponseiferr:=json.Unmarshal(resp.Body(),&response);err!=nil{returnOllamaResponse{},err}// Сохраняем контекст для следующих запросовifresponse.Context!=nil{c.Context=response.Context}returnresponse,nil}func(c*OllamaClient)ClearContext(){c.Context=nil}funcmain(){client:=NewOllamaClient("")// Пример 1: Простая генерацияoptions1:=OllamaOptions{Temperature:0.7,TopP:0.9,TopK:40,NumPredict:200,Stop:[]string{"\n","###"},RepeatPenalty:1.1,Seed:42,Mirostat:2,MirostatTau:5.0,MirostatEta:0.1,}fmt.Println("=== Пример 1: Простая генерация ===")response1,err:=client.Generate("Расскажи о Go языке программирования",options1)iferr!=nil{log.Fatal("Ошибка:",err)}fmt.Printf("Ответ: %s\n",response1.Response)// Пример 2: Продолжение с контекстомoptions2:=OllamaOptions{Temperature:0.5,TopP:0.8,TopK:30,NumPredict:150,RepeatPenalty:1.2,}fmt.Println("\n=== Пример 2: Продолжение с контекстом ===")response2,err:=client.Generate("Какие у него преимущества?",options2)iferr!=nil{log.Fatal("Ошибка:",err)}fmt.Printf("Ответ: %s\n",response2.Response)// Пример 3: Генерация кодаoptions3:=OllamaOptions{Temperature:0.3,TopP:0.7,NumPredict:300,Seed:12345,}fmt.Println("\n=== Пример 3: Генерация кода ===")response3,err:=client.Generate("Напиши HTTP сервер на Go",options3)iferr!=nil{log.Fatal("Ошибка:",err)}fmt.Printf("Код: %s\n",response3.Response)// Очищаем контекстclient.ClearContext()fmt.Println("\nКонтекст очищен")}
3.1.1.9 - Запуск модели Ollama на языке программирования Python
Полноценный пример создания запроса к модели ИИ на языке Python
Python пример с полными параметрами
Установите зависимости:
pip install requests python-dotenv
ollama_client.py:
importrequestsimportjsonimportosfromtypingimportDict,Any,List,OptionalclassOllamaClient:def__init__(self,base_url:str="http://localhost:11434"):self.base_url=base_urlself.context=Nonedefgenerate(self,prompt:str,model:str="qwen3:4b",stream:bool=False,format:str="text",temperature:float=0.7,top_p:float=0.9,top_k:int=40,num_predict:int=256,stop:List[str]=None,repeat_penalty:float=1.1,presence_penalty:float=0.0,frequency_penalty:float=0.0,seed:int=None,mirostat:int=0,mirostat_tau:float=5.0,mirostat_eta:float=0.1,num_ctx:int=2048,num_thread:int=8,template:str=None,use_context:bool=True)->Dict[str,Any]:"""
Генерация текста с полным набором параметров
"""ifstopisNone:stop=["\n","###"]payload={"model":model,"prompt":prompt,"stream":stream,"format":format,"options":{"temperature":temperature,"top_p":top_p,"top_k":top_k,"num_predict":num_predict,"stop":stop,"repeat_penalty":repeat_penalty,"presence_penalty":presence_penalty,"frequency_penalty":frequency_penalty,"mirostat":mirostat,"mirostat_tau":mirostat_tau,"mirostat_eta":mirostat_eta,"num_ctx":num_ctx,"num_thread":num_thread}}# Добавляем опциональные параметрыifseedisnotNone:payload["options"]["seed"]=seediftemplate:payload["template"]=templateifuse_contextandself.context:payload["context"]=self.contexttry:response=requests.post(f"{self.base_url}/api/generate",json=payload,timeout=30)response.raise_for_status()result=response.json()# Сохраняем контекст для следующего запросаifuse_contextand"context"inresult:self.context=result["context"]returnresultexceptrequests.exceptions.RequestExceptionase:print(f"Ошибка запроса: {e}")return{"error":str(e)}defchat(self,messages:List[Dict[str,str]],model:str="qwen3:4b",**kwargs)->Dict[str,Any]:"""
Чат-интерфейс с поддержкой истории сообщений
"""payload={"model":model,"messages":messages,"stream":False,"options":kwargs.get("options",{})}try:response=requests.post(f"{self.base_url}/api/chat",json=payload,timeout=30)response.raise_for_status()returnresponse.json()exceptrequests.exceptions.RequestExceptionase:print(f"Ошибка чата: {e}")return{"error":str(e)}defclear_context(self):"""Очистить контекст"""self.context=None# Пример использованияdefmain():client=OllamaClient()# Пример 1: Простая генерацияprint("=== Пример 1: Простая генерация ===")result1=client.generate(prompt="Расскажи о преимуществах Python для data science",model="qwen3:4b",temperature=0.7,top_p=0.9,num_predict=150,seed=42,format="text")print("Ответ:",result1.get("response","Ошибка"))# Пример 2: Продолжение с контекстомprint("\n=== Пример 2: Продолжение с контекстом ===")result2=client.generate(prompt="А какие недостатки у Python?",temperature=0.5,top_p=0.8)print("Ответ:",result2.get("response","Ошибка"))# Пример 3: Чат с историейprint("\n=== Пример 3: Чат-интерфейс ===")chat_result=client.chat(messages=[{"role":"user","content":"Привет! Как тебя зовут?"},{"role":"assistant","content":"Привет! Я помощник на основе AI."},{"role":"user","content":"Расскажи о машинном обучении"}],model="qwen3:4b",options={"temperature":0.7,"top_p":0.9})print("Чат ответ:",chat_result.get("message",{}).get("content","Ошибка"))# Пример 4: Сброс контекстаclient.clear_context()print("\nКонтекст очищен")if__name__=="__main__":main()
advanced_example.py - продвинутый пример:
importjsonfromollama_clientimportOllamaClientdefadvanced_example():client=OllamaClient()# Многошаговый диалог с сохранением контекстаsteps=["Расскажи о языке программирования Go","Какие у него преимущества перед Python?","А недостатки какие?","Напиши простой HTTP сервер на Go"]fori,promptinenumerate(steps,1):print(f"\n--- Шаг {i}: {prompt} ---")result=client.generate(prompt=prompt,model="qwen3:4b",temperature=0.7ifi>1else0.5,top_p=0.9,num_predict=200ifi<4else300,seed=12345,format="text"ifi<4else"code")if"response"inresult:print(f"Ответ: {result['response']}")else:print(f"Ошибка: {result.get('error','Неизвестная ошибка')}")# Сохраняем контекст в файлifclient.context:withopen("context.json","w")asf:json.dump(client.context,f)print("\nКонтекст сохранен в context.json")if__name__=="__main__":advanced_example()
3.2 - Язык программирования LUA
Lua — это бесплатное программное обеспечение, распространяемое в исходном коде. Его можно использовать для любых целей, включая коммерческие, совершенно бесплатно.
Все версии доступны для загрузки. Эта документация пишется для текущей версии — Lua 5.4, а текущий релиз — Lua 5.4.8.
Lua
Lua — это бесплатное программное обеспечение, распространяемое в исходном коде. Его можно использовать для любых целей, включая коммерческие, совершенно бесплатно.
Все версии доступны для загрузки. Текущая версия — Lua 5.4, а текущий релиз — Lua 5.4.8.
Инструменты
Основной репозиторий модулей Lua — это LuaRocks. Также смотрите Awesome Lua. Предварительно скомпилированные библиотеки и исполняемые файлы Lua доступны на LuaBinaries. Вики lua-users содержит множество пользовательских дополнений для Lua.
Сборка
Lua реализован на чистом ANSI C и компилируется без изменений на всех платформах, где есть компилятор ANSI C. Lua также компилируется без проблем как C++.
Lua очень легко собрать и установить. В пакете есть подробные инструкции, но вот простой пример терминальной сессии, которая загружает текущий релиз Lua и собирает его на распространенных платформах:
curl -L -R -O https://www.lua.org/ftp/lua-5.4.8.tar.gz
tar zxf lua-5.4.8.tar.gz
cd lua-5.4.8
make all test
Введение
Lua — это мощный, эффективный, легковесный и встраиваемый язык сценариев. Он поддерживает процедурное программирование, объектно-ориентированное программирование, функциональное программирование, программирование на основе данных и описание данных.
Lua сочетает в себе простую процедурную синтаксис с мощными конструкциями описания данных, основанными на ассоциативных массивах и расширяемой семантике. Lua является динамически типизированным языком, работает путем интерпретации байт-кода с помощью виртуальной машины на основе регистров и имеет автоматическое управление памятью с помощью генерационного сборщика мусора, что делает его идеальным для конфигурации, сценариев и быстрого прототипирования.
Lua реализован как библиотека, написанная на чистом C, общепринятом подмножестве стандартного C и C++. Распределение Lua включает в себя хост-программу под названием lua, которая использует библиотеку Lua для предоставления полного, автономного интерпретатора Lua, как для интерактивного, так и для пакетного использования. Lua предназначен как мощный, легковесный, встраиваемый язык сценариев для любой программы, которая в этом нуждается, а также как мощный, но легковесный и эффективный автономный язык.
Как язык расширения, Lua не имеет понятия “главной” программы: он работает встраиваемым в хост-клиент, называемым программой встраивания или просто хостом. (Часто этот хост — это автономная программа lua.) Хост-программа может вызывать функции для выполнения фрагмента кода Lua, может записывать и считывать переменные Lua, а также может регистрировать функции C, которые будут вызываться кодом Lua. С помощью функций C Lua может быть расширен для работы с широким спектром различных областей, создавая таким образом настраиваемые языки программирования, которые разделяют синтаксическую основу.
Lua является бесплатным программным обеспечением и предоставляется, как обычно, без каких-либо гарантий, как указано в его лицензии. Реализация, описанная в этом руководстве, доступна на официальном сайте Lua, www.lua.org.
Как и любой другой справочный мануал, этот документ в некоторых местах может быть сухим. Для обсуждения решений, стоящих за дизайном Lua, смотрите технические статьи, доступные на сайте Lua. Для подробного введения в программирование на Lua смотрите книгу Роберто, “Программирование на Lua”.
3.2.1 - Базовые концепции языка LUA
Этот раздел описывает основные концепции языка.
2.1 – Значения и типы
Lua — это динамически типизированный язык. Это означает, что переменные не имеют типов; только значения имеют типы. В языке отсутствуют определения типов. Все значения имеют свой собственный тип.
Все значения в Lua являются значениями первого класса. Это означает, что все значения могут храниться в переменных, передаваться в качестве аргументов другим функциям и возвращаться в качестве результатов.
В Lua есть восемь основных типов: nil, boolean, number, string, function, userdata, thread и table.
Тип nil имеет одно единственное значение — nil, основное свойство которого заключается в том, что оно отличается от любого другого значения; оно часто представляет отсутствие полезного значения.
Тип boolean имеет два значения: false и true. Оба nil и false делают условие ложным; их вместе называют ложными значениями. Любое другое значение делает условие истинным. Несмотря на свое название, false часто используется как альтернатива nil, с ключевым отличием в том, что false ведет себя как обычное значение в таблице, в то время как nil в таблице представляет отсутствующий ключ.
Тип number представляет как целые числа, так и вещественные (числа с плавающей запятой), используя два подтипа: integer и float. Стандартный Lua использует 64-битные целые числа и числа с двойной точностью (64 бита), но вы также можете скомпилировать Lua так, чтобы он использовал 32-битные целые числа и/или числа с одинарной точностью (32 бита). Опция с 32 битами как для целых чисел, так и для чисел с плавающей запятой особенно привлекательна для малых машин и встроенных систем. (Смотрите макрос LUA_32BITS в файле luaconf.h.)
Если не указано иное, любое переполнение при манипуляциях с целыми значениями оборачивается, согласно обычным правилам арифметики с дополнительным кодом. (Другими словами, фактический результат — это уникальное представимое целое число, которое равно математическому результату по модулю 2n, где n — это количество битов целого типа.)
Lua имеет явные правила о том, когда используется каждый подтип, но также автоматически выполняет преобразования между ними по мере необходимости (см. §3.4.3). Поэтому программист может в основном игнорировать разницу между целыми числами и числами с плавающей запятой или полностью контролировать представление каждого числа.
Тип string представляет собой неизменяемые последовательности байтов. Lua является 8-битным чистым языком: строки могут содержать любое 8-битное значение, включая встроенные нули (’\0’). Lua также не зависит от кодировки; он не делает предположений о содержимом строки. Длина любой строки в Lua должна помещаться в целое число Lua.
Lua может вызывать (и манипулировать) функциями, написанными как на Lua, так и на C (см. §3.4.10). Обе они представлены типом function.
Тип userdata предоставляется для хранения произвольных данных C в переменных Lua. Значение userdata представляет собой блок необработанной памяти. Существует два вида userdata: полное userdata, которое является объектом с блоком памяти, управляемым Lua, и легкое userdata, которое просто представляет собой значение указателя C. У userdata нет предопределенных операций в Lua, кроме присваивания и теста идентичности. С помощью метатаблиц программист может определить операции для значений полного userdata (см. §2.4). Значения userdata не могут быть созданы или изменены в Lua, только через C API. Это гарантирует целостность данных, принадлежащих хост-программе и библиотекам C.
Тип thread представляет собой независимые потоки выполнения и используется для реализации корутин (см. §2.6). Потоки Lua не связаны с потоками операционной системы. Lua поддерживает корутины на всех системах, даже на тех, которые не поддерживают потоки нативно.
Тип table реализует ассоциативные массивы, то есть массивы, которые могут иметь в качестве индексов не только числа, но и любое значение Lua, кроме nil и NaN. (Not a Number — это специальное значение с плавающей запятой, используемое стандартом IEEE 754 для представления неопределенных числовых результатов, таких как 0/0.) Таблицы могут быть гетерогенными; то есть они могут содержать значения всех типов (кроме nil). Любой ключ, связанный со значением nil, не считается частью таблицы. Напротив, любой ключ, который не является частью таблицы, имеет связанное значение nil.
Таблицы являются единственным механизмом структурирования данных в Lua; их можно использовать для представления обычных массивов, списков, символических таблиц, множеств, записей, графов, деревьев и т. д. Для представления записей Lua использует имя поля в качестве индекса. Язык поддерживает это представление, предоставляя a.name как синтаксический сахар для a[“name”]. В Lua есть несколько удобных способов создания таблиц (см. §3.4.9).
Как и индексы, значения полей таблицы могут быть любого типа. В частности, поскольку функции являются значениями первого класса, поля таблицы могут содержать функции. Таким образом, таблицы также могут содержать методы (см. §3.4.11).
Индексирование таблиц следует определению сырого равенства (raw equality) в языке. Выражения a[i] и a[j] обозначают один и тот же элемент таблицы тогда и только тогда, когда i и j сыро равны (то есть равны без учёта метаметодов).
В частности:
Числа с плавающей точкой, имеющие целочисленные значения, считаются равными соответствующим целым числам (например, 1.0 == 1).
Чтобы избежать неоднозначностей, любое число с плавающей точкой, используемое в качестве ключа и равное целому числу, преобразуется в это целое число.
Пример:
Если написать a[2.0] = true, то фактически в таблицу будет вставлен ключ 2 (целое число), а не 2.0.
Ключевые моменты:
Сырое равенство (raw equality) — сравнение без метаметодов.
Целые и дробные числа — 1.0 и 1 считаются одинаковыми ключами.
Автоматическое преобразование — a[2.0] превращается в a[2].
Это важно учитывать при работе с таблицами, чтобы избежать неожиданного поведения.
Таблицы, функции, потоки и значения (полного) userdata являются объектами: переменные на самом деле не содержат эти значения, а только ссылки на них. Присваивание, передача параметров и возвращение функций всегда манипулируют ссылками на такие значения; эти операции не подразумевают никакого рода копирования.
Функция библиотеки type возвращает строку, описывающую тип данного значения (см. type).
2.2 – Окружения и глобальное окружение
Как мы обсудим далее в §3.2 и §3.3.3, любое обращение к свободному имени (то есть имени, не привязанному к какому-либо объявлению) var синтаксически переводится в _ENV.var. Более того, каждый блок компилируется в области внешней локальной переменной с именем _ENV (см. §3.3.2), так что само _ENV никогда не является свободным именем в блоке.
Несмотря на существование этой внешней переменной _ENV и перевод свободных имен, _ENV является совершенно обычным именем. В частности, вы можете определять новые переменные и параметры с этим именем. Каждое обращение к свободному имени использует _ENV, который виден в данной точке программы, следуя обычным правилам видимости Lua (см. §3.5).
Любая таблица, используемая в качестве значения _ENV, называется окружением.
Lua хранит особое окружение, называемое глобальным окружением. Это значение хранится по специальному индексу в C-регистре (см. §4.3). В Lua глобальная переменная _G инициализируется этим же значением. (_G никогда не используется внутренне, поэтому изменение его значения повлияет только на ваш собственный код.)
Когда Lua загружает блок, значение по умолчанию для его переменной _ENV — это глобальное окружение (см. load). Таким образом, по умолчанию свободные имена в коде Lua ссылаются на записи в глобальном окружении и, следовательно, также называются глобальными переменными. Более того, все стандартные библиотеки загружаются в глобальное окружение, и некоторые функции там работают с этим окружением. Вы можете использовать load (или loadfile), чтобы загрузить блок с другим окружением. (В C вам нужно загрузить блок, а затем изменить значение его первого upvalue; см. lua_setupvalue.)
2.3 – Обработка ошибок
Несколько операций в Lua могут вызывать ошибку. Ошибка прерывает нормальный поток выполнения программы, который может продолжиться, поймав ошибку.
Lua-код может явно вызвать ошибку, вызвав функцию error. (Эта функция никогда не возвращает значение.)
Чтобы поймать ошибки в Lua, вы можете выполнить защищенный вызов, используя pcall (или xpcall). Функция pcall вызывает заданную функцию в защищенном режиме. Любая ошибка во время выполнения функции останавливает ее выполнение, и управление немедленно возвращается в pcall, который возвращает код состояния.
Поскольку Lua является встроенным языком расширения, код Lua начинает выполняться по вызову из C-кода в хост-программе. (Когда вы используете Lua в автономном режиме, приложение lua является хост-программой.) Обычно этот вызов защищен; поэтому, когда происходит незащищенная ошибка во время компиляции или выполнения блока Lua, управление возвращается в хост, который может предпринять соответствующие меры, такие как вывод сообщения об ошибке.
Каждый раз, когда возникает ошибка, объект ошибки передается с информацией об ошибке. Сам Lua генерирует только ошибки, объект ошибки которых является строкой, но программы могут генерировать ошибки с любым значением в качестве объекта ошибки. Обработка таких объектов ошибок зависит от программы Lua или ее хоста. По историческим причинам объект ошибки часто называется сообщением об ошибке, даже если он не обязательно должен быть строкой.
Когда вы используете xpcall (или lua_pcall в C), вы можете передать обработчик сообщений, который будет вызван в случае ошибок. Эта функция вызывается с оригинальным объектом ошибки и возвращает новый объект ошибки. Она вызывается до того, как ошибка развернет стек, чтобы собрать больше информации об ошибке, например, проверяя стек и создавая трассировку стека. Этот обработчик сообщений также защищен защищенным вызовом; поэтому ошибка внутри обработчика сообщений снова вызовет обработчик сообщений. Если этот цикл продолжается слишком долго, Lua прерывает его и возвращает соответствующее сообщение. Обработчик сообщений вызывается только для обычных ошибок времени выполнения. Он не вызывается для ошибок выделения памяти и для ошибок при выполнении финализаторов или других обработчиков сообщений.
Lua также предлагает систему предупреждений (см. warn). В отличие от ошибок, предупреждения никоим образом не мешают выполнению программы. Обычно они просто генерируют сообщение для пользователя, хотя это поведение можно адаптировать из C (см. lua_setwarnf).
2.4 – Метатаблицы и метаметоды
Каждое значение в Lua может иметь метатаблицу. Эта метатаблица — это обычная таблица Lua, которая определяет поведение оригинального значения при определенных событиях. Вы можете изменить несколько аспектов поведения значения, установив конкретные поля в его метатаблице. Например, когда нечисловое значение является операндом сложения, Lua проверяет наличие функции в поле __add метатаблицы значения. Если она находит такую функцию, Lua вызывает ее для выполнения сложения.
Ключом для каждого события в метатаблице является строка с именем события, предшествующая двумя подчеркиваниями; соответствующее значение называется метазначением. Для большинства событий метазначение должно быть функцией, которая затем называется метаметодом. В предыдущем примере ключом является строка “__add”, а метаметодом — функция, выполняющая сложение. Если не указано иное, метаметодом может быть любое вызываемое значение, которое является либо функцией, либо значением с метаметодом __call.
Вы можете запросить метатаблицу любого значения, используя функцию getmetatable. Lua запрашивает метаметоды в метатаблицах, используя сырой доступ (см. rawget).
Вы можете заменить метатаблицу таблиц, используя функцию setmetatable. Вы не можете изменить метатаблицу других типов из кода Lua, кроме как с помощью библиотеки debug (§6.10).
Таблицы и полное userdata имеют индивидуальные метатаблицы, хотя несколько таблиц и userdata могут делить свои метатаблицы. Значения всех других типов делят одну единственную метатаблицу на тип; то есть, существует одна единственная метатаблица для всех чисел, одна для всех строк и т. д. По умолчанию значение не имеет метатаблицы, но библиотека строк устанавливает метатаблицу для типа строк (см. §6.4).
Подробный список операций, контролируемых метатаблицами, приведен ниже. Каждое событие идентифицируется своим соответствующим ключом. По соглашению, все ключи метатаблиц, используемые Lua, состоят из двух подчеркиваний, за которыми следуют строчные латинские буквы.
__add: операция сложения (+). Если любой операнд для сложения не является числом, Lua попытается вызвать метаметод. Он начинает с проверки первого операнда (даже если это число); если этот операнд не определяет метаметод для __add, то Lua проверит второй операнд. Если Lua находит метаметод, он вызывает этот метаметод с двумя операндами в качестве аргументов, и результат вызова (приведенный к одному значению) является результатом операции. В противном случае, если метаметод не найден, Lua вызывает ошибку.
__sub: операция вычитания (-). Поведение аналогично операции сложения.
__mul: операция умножения (*). Поведение аналогично операции сложения.
__div: операция деления (/). Поведение аналогично операции сложения.
__mod: операция взятия остатка (%) . Поведение аналогично операции сложения.
__pow: операция возведения в степень (^). Поведение аналогично операции сложения.
__unm: операция отрицания (унарный -). Поведение аналогично операции сложения.
__idiv: операция целочисленного деления (//). Поведение аналогично операции сложения.
__band: побитовая операция И (&). Поведение аналогично операции сложения, за исключением того, что Lua попытается вызвать метаметод, если любой операнд не является ни целым числом, ни числом с плавающей запятой, приводимым к целому (см. §3.4.3).
__bor: побитовая операция ИЛИ (|). Поведение аналогично побитовой операции И.
__bxor: побитовая операция исключающего ИЛИ (двойной ~). Поведение аналогично побитовой операции И.
__bnot: побитовая операция НЕ (унарный ~). Поведение аналогично побитовой операции И.
__shl: побитовый сдвиг влево («). Поведение аналогично побитовой операции И.
__shr: побитовый сдвиг вправо (»). Поведение аналогично побитовой операции И.
__concat: операция конкатенации (..). Поведение аналогично операции сложения, за исключением того, что Lua попытается вызвать метаметод, если любой операнд не является ни строкой, ни числом (которое всегда приводимо к строке).
__len: операция длины (#). Если объект не является строкой, Lua попытается вызвать его метаметод. Если метаметод существует, Lua вызывает его с объектом в качестве аргумента, и результат вызова (всегда приведенный к одному значению) является результатом операции. Если метаметода нет, но объект является таблицей, то Lua использует операцию длины таблицы (см. §3.4.7). В противном случае Lua вызывает ошибку.
__eq: операция равенства (==). Поведение аналогично операции сложения, за исключением того, что Lua попытается вызвать метаметод только тогда, когда сравниваемые значения являются либо обеими таблицами, либо обоими полными userdata и они не равны по примитивному сравнению. Результат вызова всегда преобразуется в логическое значение.
__lt: операция “меньше чем” (<). Поведение аналогично операции сложения, за исключением того, что Lua попытается вызвать метаметод только тогда, когда сравниваемые значения не являются ни обоими числами, ни обеими строками. Более того, результат вызова всегда преобразуется в логическое значение.
__le: операция “меньше или равно” (<=). Поведение аналогично операции “меньше чем”.
__index: операция доступа по индексу table[key]. Это событие происходит, когда table не является таблицей или когда ключ отсутствует в таблице. Метазначение ищется в метатаблице таблицы. Метазначение для этого события может быть либо функцией, либо таблицей, либо любым значением с метазначением __index. Если это функция, она вызывается с таблицей и ключом в качестве аргументов, и результат вызова (приведенный к одному значению) является результатом операции. В противном случае окончательный результат — это результат индексации этого метазначения с ключом. Эта индексация является обычной, а не сырой, и, следовательно, может вызвать другой метаметод __index.
__newindex: операция присваивания по индексу table[key] = value. Как и событие индексации, это событие происходит, когда table не является таблицей или когда ключ отсутствует в таблице. Метазначение ищется в метатаблице таблицы. Как и в случае с индексацией, метазначение для этого события может быть либо функцией, либо таблицей, либо любым значением с метазначением __newindex. Если это функция, она вызывается с таблицей, ключом и значением в качестве аргументов. В противном случае Lua повторяет присваивание индексации для этого метазначения с тем же ключом и значением. Это присваивание является обычным, а не сырым, и, следовательно, может вызвать другой метаметод __newindex.
Каждый раз, когда вызывается метазначение __newindex, Lua не выполняет примитивное присваивание. Если это необходимо, сам метаметод может вызвать rawset для выполнения присваивания.
__call: операция вызова func(args). Это событие происходит, когда Lua пытается вызвать значение, не являющееся функцией (то есть func не является функцией). Метаметод ищется в func. Если он присутствует, метаметод вызывается с func в качестве первого аргумента, за которым следуют аргументы оригинального вызова (args). Все результаты вызова являются результатами операции. Это единственный метаметод, который позволяет возвращать несколько результатов.
3.3 - Authelia
Описание настройки Authelia. Интсрумент для аутентификации пользователей на сайте.
Структура Authelia
Базовая схема взаимодействия Authelia с сервисами
---
config:
theme: redux
---
flowchart LR
A["Пользователь"] -- Запрос --> B["Reverse Proxy Nginx/Traefik"]
B -- Проверка аутентификации --> C["Authelia"]
C -- Данные пользователей --> D["Хранилище: PostgreSQL/MySQL"]
C -- 2FA/SMS --> E["Провайдер: Twilio/Email"]
C -- Разрешить/Запретить --> B
B -- Доступ разрешен --> F["Защищенный сервис"]
B:::Aqua
C:::Rose
F:::Peach
classDef Aqua stroke-width:1px, stroke-dasharray:none, stroke:#46EDC8, fill:#DEFFF8, color:#378E7A
classDef Rose stroke-width:2px, stroke-dasharray:none, stroke:#FF5978, fill:#FFDFE5, color:#8E2236
classDef Peach stroke-width:1px, stroke-dasharray:none, stroke:#FBB35A, fill:#FFEFDB, color:#8F632D
style D fill:#FFD600
style E fill:#C8E6C9
Детализированная архитектура Authelia
graph TD
subgraph Authelia
A[Frontend] -->|API| B[Backend]
B --> C[Аутентификация]
B --> D[Авторизация]
B --> E[2FA]
C -->|LDAP/OIDC| F[Identity Provider]
D -->|ACL| G[Политики доступа]
E -->|TOTP/SMS| H[Провайдеры 2FA]
end
I[Reverse Proxy] -->|Запросы| B
B -->|Сессии| J[Redis]
F -->|Пользователи| K[PostgreSQL]
3.3.1 - Конфигурация Authelia
Конфигурация оформляется в виде файла config.template.yml который располагается в каждой секции сайта.
Файл конфигурации Authelia
Конфигурация оформляется в виде файла config.template.yml который располагается в каждой секции сайта.
docker run authelia/authelia:latest authelia config validate --config /config/configuration.yml
Смотреть файл конфигурации
# yamllint disable rule:comments-indentation---################################################################################# Authelia Configuration ##################################################################################### Notes:#### - the default location of this file is assumed to be configuration.yml unless otherwise noted## - when using docker the container expects this by default to be at /config/configuration.yml## - the default location where this file is loaded from can be overridden with the X_AUTHELIA_CONFIG environment var## - the comments in this configuration file are helpful but users should consult the official documentation on the## website at https://www.authelia.com/ or https://www.authelia.com/configuration/prologue/introduction/## - this configuration file template is not automatically updated#### Certificates directory specifies where Authelia will load trusted certificates (public portion) from in addition to## the system certificates store.## They should be in base64 format, and have one of the following extensions: *.cer, *.crt, *.pem.# certificates_directory: '/config/certificates/'## The theme to display: light, dark, grey, auto.# theme: 'light'## Set the default 2FA method for new users and for when a user has a preferred method configured that has been## disabled. This setting must be a method that is enabled.## Options are totp, webauthn, mobile_push.# default_2fa_method: ''#### Server Configuration### server:## The address for the Main server to listen on in the address common syntax.## Formats:## - [<scheme>://]<hostname>[:<port>][/<path>]## - [<scheme>://][hostname]:<port>[/<path>]## Square brackets indicate optional portions of the format. Scheme must be 'tcp', 'tcp4', 'tcp6', 'unix', or 'fd'.## The default scheme is 'unix' if the address is an absolute path otherwise it's 'tcp'. The default port is '9091'.## If the path is specified this configures the router to handle both the `/` path and the configured path.# address: 'tcp://:9091/'## Set the path on disk to Authelia assets.## Useful to allow overriding of specific static assets.# asset_path: '/config/assets/'## Disables writing the health check vars to /app/.healthcheck.env which makes healthcheck.sh return exit code 0.## This is disabled by default if either /app/.healthcheck.env or /app/healthcheck.sh do not exist.# disable_healthcheck: false## Authelia by default doesn't accept TLS communication on the server port. This section overrides this behaviour.# tls:## The path to the DER base64/PEM format private key.# key: ''## The path to the DER base64/PEM format public certificate.# certificate: ''## The list of certificates for client authentication.# client_certificates: []## Server headers configuration/customization.# headers:## The CSP Template. Read the docs.# csp_template: ''## Server Buffers configuration.# buffers:## Buffers usually should be configured to be the same value.## Explanation at https://www.authelia.com/c/server#buffer-sizes## Read buffer size adjusts the server's max incoming request size in bytes.## Write buffer size does the same for outgoing responses.## Read buffer.# read: 4096## Write buffer.# write: 4096## Server Timeouts configuration.# timeouts:## Read timeout in the duration common syntax.# read: '6 seconds'## Write timeout in the duration common syntax.# write: '6 seconds'## Idle timeout in the duration common syntax.# idle: '30 seconds'## Server Endpoints configuration.## This section is considered advanced and it SHOULD NOT be configured unless you've read the relevant documentation.# endpoints:## Enables the pprof endpoint.# enable_pprof: false## Enables the expvars endpoint.# enable_expvars: false## Configure the authz endpoints.# authz:# forward-auth:# implementation: 'ForwardAuth'# authn_strategies: []# ext-authz:# implementation: 'ExtAuthz'# authn_strategies: []# auth-request:# implementation: 'AuthRequest'# authn_strategies: []# legacy:# implementation: 'Legacy'# authn_strategies: []#### Log Configuration### log:## Level of verbosity for logs: info, debug, trace.# level: 'debug'## Format the logs are written as: json, text.# format: 'json'## File path where the logs will be written. If not set logs are written to stdout.# file_path: '/config/authelia.log'## Whether to also log to stdout when a log_file_path is defined.# keep_stdout: false#### Telemetry Configuration### telemetry:#### Metrics Configuration### metrics:## Enable Metrics.# enabled: false## The address for the Metrics server to listen on in the address common syntax.## Formats:## - [<scheme>://]<hostname>[:<port>][/<path>]## - [<scheme>://][hostname]:<port>[/<path>]## Square brackets indicate optional portions of the format. Scheme must be 'tcp', 'tcp4', 'tcp6', 'unix', or 'fd'.## The default scheme is 'unix' if the address is an absolute path otherwise it's 'tcp'. The default port is '9959'.## If the path is not specified it defaults to `/metrics`.# address: 'tcp://:9959/metrics'## Metrics Server Buffers configuration.# buffers:## Read buffer.# read: 4096## Write buffer.# write: 4096## Metrics Server Timeouts configuration.# timeouts:## Read timeout in the duration common syntax.# read: '6 seconds'## Write timeout in the duration common syntax.# write: '6 seconds'## Idle timeout in the duration common syntax.# idle: '30 seconds'#### TOTP Configuration#### Parameters used for TOTP generation.# totp:## Disable TOTP.# disable: false## The issuer name displayed in the Authenticator application of your choice.# issuer: 'authelia.com'## The TOTP algorithm to use.## It is CRITICAL you read the documentation before changing this option:## https://www.authelia.com/c/totp#algorithm# algorithm: 'SHA1'## The number of digits a user has to input. Must either be 6 or 8.## Changing this option only affects newly generated TOTP configurations.## It is CRITICAL you read the documentation before changing this option:## https://www.authelia.com/c/totp#digits# digits: 6## The period in seconds a Time-based One-Time Password is valid for.## Changing this option only affects newly generated TOTP configurations.# period: 30## The skew controls number of Time-based One-Time Passwords either side of the current one that are valid.## Warning: before changing skew read the docs link below.# skew: 1## See: https://www.authelia.com/c/totp#input-validation to read## the documentation.## The size of the generated shared secrets. Default is 32 and is sufficient in most use cases, minimum is 20.# secret_size: 32## The allowed algorithms for a user to pick from.# allowed_algorithms:# - 'SHA1'## The allowed digits for a user to pick from.# allowed_digits:# - 6## The allowed periods for a user to pick from.# allowed_periods:# - 30## Disable the reuse security policy which prevents replays of one-time password code values.# disable_reuse_security_policy: false#### WebAuthn Configuration#### Parameters used for WebAuthn.# webauthn:## Disable WebAuthn.# disable: false## Enables logins via a Passkey.# enable_passkey_login: false## The display name the browser should show the user for when using WebAuthn to login/register.# display_name: 'Authelia'## Conveyance preference controls if we collect the attestation statement including the AAGUID from the device.## Options are none, indirect, direct.# attestation_conveyance_preference: 'indirect'## The interaction timeout for WebAuthn dialogues in the duration common syntax.# timeout: '60 seconds'## Authenticator Filtering.# filtering:## Prohibits registering Authenticators that claim they can export their credentials in some way.# prohibit_backup_eligibility: false## Permitted AAGUID's. If configured specifically only allows the listed AAGUID's.# permitted_aaguids: []## Prohibited AAGUID's. If configured prohibits the use of specific AAGUID's.# prohibited_aaguids: []## Selection Criteria controls the preferences for registration.# selection_criteria:## The attachment preference. Either 'cross-platform' for dedicated authenticators, or 'platform' for embedded## authenticators.# attachment: 'cross-platform'## The discoverability preference. Options are 'discouraged', 'preferred', and 'required'.# discoverability: 'discouraged'## User verification controls if the user must make a gesture or action to confirm they are present.## Options are required, preferred, discouraged.# user_verification: 'preferred'## Metadata Service validation via MDS3.# metadata:## Enable the metadata fetch behaviour.# enabled: false## Enable Validation of the Trust Anchor. This generally should be enabled if you're using the metadata. It## ensures the attestation certificate presented by the authenticator is valid against the MDS3 certificate that## issued the attestation certificate.# validate_trust_anchor: true## Enable Validation of the Entry. This ensures that the MDS3 actually contains the metadata entry. If not enabled## attestation certificates which are not formally registered will be skipped. This may potentially exclude some## virtual authenticators.# validate_entry: true## Enabling this allows attestation certificates with a zero AAGUID to pass validation. This is important if you do## use non-conformant authenticators like Apple ID.# validate_entry_permit_zero_aaguid: false## Enable Validation of the Authenticator Status.# validate_status: true## List of statuses which are considered permitted when validating an authenticator's metadata. Generally it is## recommended that this is not configured as any other status the authenticator's metadata has will result in an## error. This option is ineffectual if validate_status is false.# validate_status_permitted: ~## List of statuses that should be prohibited when validating an authenticator's metadata. Generally it is## recommended that this is not configured as there are safe defaults. This option is ineffectual if validate_status## is false, or validate_status_permitted has values.# validate_status_prohibited: ~#### Duo Push API Configuration#### Parameters used to contact the Duo API. Those are generated when you protect an application of type## "Partner Auth API" in the management panel.# duo_api:# disable: false# hostname: 'api-123456789.example.com'# integration_key: 'ABCDEF'## Secret can also be set using a secret: https://www.authelia.com/c/secrets# secret_key: '1234567890abcdefghifjkl'# enable_self_enrollment: false#### Identity Validation Configuration#### This configuration tunes the identity validation flows.identity_validation:## Reset Password flow. Adjusts how the reset password flow operates.reset_password:## Maximum allowed time before the JWT is generated and when the user uses it in the duration common syntax.# jwt_lifespan: '5 minutes'## The algorithm used for the Reset Password JWT.# jwt_algorithm: 'HS256'## The secret key used to sign and verify the JWT.jwt_secret:'a_very_important_secret'## Elevated Session flows. Adjusts the flow which require elevated sessions for example managing credentials, adding,## removing, etc.# elevated_session:## Maximum allowed lifetime after the One-Time Code is generated that it is considered valid.# code_lifespan: '5 minutes'## Maximum allowed lifetime after the user uses the One-Time Code and the user must perform the validation again in## the duration common syntax.# elevation_lifespan: '10 minutes'## Number of characters the one-time password contains.# characters: 8## In addition to the One-Time Code requires the user performs a second factor authentication.# require_second_factor: false## Skips the elevation requirement and entry of the One-Time Code if the user has performed second factor## authentication.# skip_second_factor: false#### NTP Configuration#### This is used to validate the servers time is accurate enough to validate TOTP.# ntp:## The address of the NTP server to connect to in the address common syntax.## Format: [<scheme>://]<hostname>[:<port>].## Square brackets indicate optional portions of the format. Scheme must be 'udp', 'udp4', or 'udp6'.## The default scheme is 'udp'. The default port is '123'.# address: 'udp://time.cloudflare.com:123'## NTP version.# version: 4## Maximum allowed time offset between the host and the NTP server in the duration common syntax.# max_desync: '3 seconds'## Disables the NTP check on startup entirely. This means Authelia will not contact a remote service at all if you## set this to true, and can operate in a truly offline mode.# disable_startup_check: false## The default of false will prevent startup only if we can contact the NTP server and the time is out of sync with## the NTP server more than the configured max_desync. If you set this to true, an error will be logged but startup## will continue regardless of results.# disable_failure: false#### Definitions#### The definitions are used in other areas as reference points to reduce duplication.### definitions:## The user attribute definitions.# user_attributes:## The name of the definition.# definition_name:## The common expression language expression for this definition.# expression: ''## The network definitions.# network:## The name of the definition followed by the list of CIDR network addresses in this definition.# internal:# - '10.10.0.0/16'# - '172.16.0.0/12'# - '192.168.2.0/24'# VPN:# - '10.9.0.0/16'#### Authentication Backend Provider Configuration#### Used for verifying user passwords and retrieve information such as email address and groups users belong to.#### The available providers are: `file`, `ldap`. You must use only one of these providers.# authentication_backend:## Password Change Options.# password_change:## Disable both the HTML element and the API for password change functionality.# disable: false## Password Reset Options.# password_reset:## Disable both the HTML element and the API for reset password functionality.# disable: false## External reset password url that redirects the user to an external reset portal. This disables the internal reset## functionality.# custom_url: ''## The amount of time to wait before we refresh data from the authentication backend in the duration common syntax.## To disable this feature set it to 'disable', this will slightly reduce security because for Authelia, users will## always belong to groups they belonged to at the time of login even if they have been removed from them in LDAP.## To force update on every request you can set this to '0' or 'always', this will increase processor demand.## See the below documentation for more information.## Refresh Interval docs: https://www.authelia.com/c/1fa#refresh-interval# refresh_interval: '5 minutes'#### LDAP (Authentication Provider)#### This is the recommended Authentication Provider in production## because it allows Authelia to offload the stateful operations## onto the LDAP service.# ldap:## The address of the directory server to connect to in the address common syntax.## Format: [<scheme>://]<hostname>[:<port>].## Square brackets indicate optional portions of the format. Scheme must be 'ldap', 'ldaps', or 'ldapi`.## The default scheme is 'ldapi' if the address is an absolute path otherwise it's 'ldaps'.## The default port is '636', unless the scheme is 'ldap' in which case it's '389'.# address: 'ldaps://127.0.0.1:636'## The LDAP implementation, this affects elements like the attribute utilised for resetting a password.## Acceptable options are as follows:## - 'activedirectory' - for Microsoft Active Directory.## - 'freeipa' - for FreeIPA.## - 'lldap' - for lldap.## - 'custom' - for custom specifications of attributes and filters.## This currently defaults to 'custom' to maintain existing behaviour.#### Depending on the option here certain other values in this section have a default value, notably all of the## attribute mappings have a default value that this config overrides, you can read more about these default values## at https://www.authelia.com/c/ldap#defaults# implementation: 'custom'## The dial timeout for LDAP in the duration common syntax.# timeout: '20 seconds'## Use StartTLS with the LDAP connection.# start_tls: false## TLS configuration.# tls:## The server subject name to check the servers certificate against during the validation process.## This option is not required if the certificate has a SAN which matches the address options hostname.# server_name: 'ldap.example.com'## Skip verifying the server certificate entirely. In preference to setting this we strongly recommend you add the## certificate or the certificate of the authority signing the certificate to the certificates directory which is## defined by the `certificates_directory` option at the top of the configuration.## It's important to note the public key should be added to the directory, not the private key.## This option is strongly discouraged but may be useful in some self-signed situations where validation is not## important to the administrator.# skip_verify: false## Minimum TLS version for the connection.# minimum_version: 'TLS1.2'## Maximum TLS version for the connection.# maximum_version: 'TLS1.3'## The certificate chain used with the private_key if the server requests TLS Client Authentication## i.e. Mutual TLS.# certificate_chain: |# -----BEGIN CERTIFICATE-----# ...# -----END CERTIFICATE-----# -----BEGIN CERTIFICATE-----# ...# -----END CERTIFICATE-----## The private key used with the certificate_chain if the server requests TLS Client Authentication## i.e. Mutual TLS.# private_key: |# -----BEGIN PRIVATE KEY-----# ...# -----END PRIVATE KEY-----## Connection Pooling configuration.# pooling:## Enable Pooling.# enable: false## Pool count.# count: 5## Retries to obtain a connection during the timeout.# retries: 2## Timeout before the attempt to obtain a connection fails.# timeout: '10 seconds'## The distinguished name of the container searched for objects in the directory information tree.## See also: additional_users_dn, additional_groups_dn.# base_dn: 'dc=example,dc=com'## The additional_users_dn is prefixed to base_dn and delimited by a comma when searching for users.## i.e. with this set to OU=Users and base_dn set to DC=a,DC=com; OU=Users,DC=a,DC=com is searched for users.# additional_users_dn: 'ou=users'## The users filter used in search queries to find the user profile based on input filled in login form.## Various placeholders are available in the user filter which you can read about in the documentation which can## be found at: https://www.authelia.com/c/ldap#users-filter-replacements#### Recommended settings are as follows:## - Microsoft Active Directory: (&({username_attribute}={input})(objectCategory=person)(objectClass=user))## - OpenLDAP:## - (&({username_attribute}={input})(objectClass=person))## - (&({username_attribute}={input})(objectClass=inetOrgPerson))#### To allow sign in both with username and email, one can use a filter like## (&(|({username_attribute}={input})({mail_attribute}={input}))(objectClass=person))# users_filter: '(&({username_attribute}={input})(objectClass=person))'## The additional_groups_dn is prefixed to base_dn and delimited by a comma when searching for groups.## i.e. with this set to OU=Groups and base_dn set to DC=a,DC=com; OU=Groups,DC=a,DC=com is searched for groups.# additional_groups_dn: 'ou=groups'## The groups filter used in search queries to find the groups based on relevant authenticated user.## Various placeholders are available in the groups filter which you can read about in the documentation which can## be found at: https://www.authelia.com/c/ldap#groups-filter-replacements#### If your groups use the `groupOfUniqueNames` structure use this instead:## (&(uniqueMember={dn})(objectClass=groupOfUniqueNames))# groups_filter: '(&(member={dn})(objectClass=groupOfNames))'## The group search mode to use. Options are 'filter' or 'memberof'. It's essential to read the docs if you wish to## use 'memberof'. Also 'filter' is the best choice for most use cases.# group_search_mode: 'filter'## Follow referrals returned by the server.## This is especially useful for environments where read-only servers exist. Only implemented for write operations.# permit_referrals: false## The username and password of the admin user.# user: 'cn=admin,dc=example,dc=com'## Password can also be set using a secret: https://www.authelia.com/c/secrets# password: 'password'## The attributes for users and objects from the directory server.# attributes:## The distinguished name attribute if your directory server supports it. Users should read the docs before## configuring. Only used for the 'memberof' group search mode.# distinguished_name: ''## The attribute holding the username of the user. This attribute is used to populate the username in the session## information. For your information, Microsoft Active Directory usually uses 'sAMAccountName' and OpenLDAP## usually uses 'uid'. Beware that this attribute holds the unique identifiers for the users binding the user and## the configuration stored in database; therefore only single value attributes are allowed and the value must## never be changed once attributed to a user otherwise it would break the configuration for that user.## Technically non-unique attributes like 'mail' can also be used but we don't recommend using them, we instead## advise to use a filter to perform alternative lookups and the attributes mentioned above## (sAMAccountName and uid) to follow https://datatracker.ietf.org/doc/html/rfc2307.# username: 'uid'## The attribute holding the display name of the user. This will be used to greet an authenticated user.# display_name: 'displayName'## The attribute holding the mail address of the user. If multiple email addresses are defined for a user, only## the first one returned by the directory server is used.# mail: 'mail'## The attribute which provides distinguished names of groups an object is a member of.## Only used for the 'memberof' group search mode.# member_of: 'memberOf'## The attribute holding the name of the group.# group_name: 'cn'#### File (Authentication Provider)#### With this backend, the users database is stored in a file which is updated when users reset their passwords.## Therefore, this backend is meant to be used in a dev environment and not in production since it prevents Authelia## to be scaled to more than one instance. The options under 'password' have sane defaults, and as it has security## implications it is highly recommended you leave the default values. Before considering changing these settings## please read the docs page below:## https://www.authelia.com/r/passwords#tuning#### Important: Kubernetes (or HA) users must read https://www.authelia.com/t/statelessness### file:# path: '/config/users_database.yml'# watch: false# search:# email: false# case_insensitive: false# password:# algorithm: 'argon2'# argon2:# variant: 'argon2id'# iterations: 3# memory: 65536# parallelism: 4# key_length: 32# salt_length: 16# scrypt:# variant: 'scrypt'# iterations: 16# block_size: 8# parallelism: 1# key_length: 32# salt_length: 16# pbkdf2:# variant: 'sha512'# iterations: 310000# salt_length: 16# sha2crypt:# variant: 'sha512'# iterations: 50000# salt_length: 16# bcrypt:# variant: 'standard'# cost: 12#### Password Policy Configuration.### password_policy:## The standard policy allows you to tune individual settings manually.# standard:# enabled: false## Require a minimum length for passwords.# min_length: 8## Require a maximum length for passwords.# max_length: 0## Require uppercase characters.# require_uppercase: true## Require lowercase characters.# require_lowercase: true## Require numeric characters.# require_number: true## Require special characters.# require_special: true## zxcvbn is a well known and used password strength algorithm. It does not have tunable settings.# zxcvbn:# enabled: false## Configures the minimum score allowed.# min_score: 3#### Privacy Policy Configuration#### Parameters used for displaying the privacy policy link and drawer.# privacy_policy:## Enables the display of the privacy policy using the policy_url.# enabled: false## Enables the display of the privacy policy drawer which requires users accept the privacy policy## on a per-browser basis.# require_user_acceptance: false## The URL of the privacy policy document. Must be an absolute URL and must have the 'https://' scheme.## If the privacy policy enabled option is true, this MUST be provided.# policy_url: ''#### Access Control Configuration#### Access control is a list of rules defining the authorizations applied for one resource to users or group of users.#### If 'access_control' is not defined, ACL rules are disabled and the 'deny' rule is applied, i.e., access is denied## to everyone. Otherwise restrictions follow the rules defined.#### Note: One can use the wildcard * to match any subdomain.## It must stand at the beginning of the pattern. (example: *.example.com)#### Note: You must put patterns containing wildcards between simple quotes for the YAML to be syntactically correct.#### Definition: A 'rule' is an object with the following keys: 'domain', 'subject', 'policy' and 'resources'.#### - 'domain' defines which domain or set of domains the rule applies to.#### - 'subject' defines the subject to apply authorizations to. This parameter is optional and matching any user if not## provided. If provided, the parameter represents either a user or a group. It should be of the form## 'user:<username>' or 'group:<groupname>'.#### - 'policy' is the policy to apply to resources. It must be either 'bypass', 'one_factor', 'two_factor' or 'deny'.#### - 'resources' is a list of regular expressions that matches a set of resources to apply the policy to. This parameter## is optional and matches any resource if not provided.#### Note: the order of the rules is important. The first policy matching (domain, resource, subject) applies.# access_control:## Default policy can either be 'bypass', 'one_factor', 'two_factor' or 'deny'. It is the policy applied to any## resource if there is no policy to be applied to the user.# default_policy: 'deny'# rules:## Rules applied to everyone# - domain: 'public.example.com'# policy: 'bypass'## Domain Regex examples. Generally we recommend just using a standard domain.# - domain_regex: '^(?P<User>\w+)\.example\.com$'# policy: 'one_factor'# - domain_regex: '^(?P<Group>\w+)\.example\.com$'# policy: 'one_factor'# - domain_regex:# - '^appgroup-.*\.example\.com$'# - '^appgroup2-.*\.example\.com$'# policy: 'one_factor'# - domain_regex: '^.*\.example\.com$'# policy: 'two_factor'# - domain: 'secure.example.com'# policy: 'one_factor'## Network based rule, if not provided any network matches.# networks:# - 'internal'# - 'VPN'# - '192.168.1.0/24'# - '10.0.0.1'# - domain:# - 'secure.example.com'# - 'private.example.com'# policy: 'two_factor'# - domain: 'singlefactor.example.com'# policy: 'one_factor'## Rules applied to 'admins' group# - domain: 'mx2.mail.example.com'# subject: 'group:admins'# policy: 'deny'# - domain: '*.example.com'# subject:# - 'group:admins'# - 'group:moderators'# policy: 'two_factor'## Rules applied to 'dev' group# - domain: 'dev.example.com'# resources:# - '^/groups/dev/.*$'# subject: 'group:dev'# policy: 'two_factor'## Rules applied to user 'john'# - domain: 'dev.example.com'# resources:# - '^/users/john/.*$'# subject: 'user:john'# policy: 'two_factor'## Rules applied to user 'harry'# - domain: 'dev.example.com'# resources:# - '^/users/harry/.*$'# subject: 'user:harry'# policy: 'two_factor'## Rules applied to user 'bob'# - domain: '*.mail.example.com'# subject: 'user:bob'# policy: 'two_factor'# - domain: 'dev.example.com'# resources:# - '^/users/bob/.*$'# subject: 'user:bob'# policy: 'two_factor'#### Session Provider Configuration#### The session cookies identify the user once logged in.## The available providers are: `memory`, `redis`. Memory is the provider unless redis is defined.session:## The secret to encrypt the session data. This is only used with Redis / Redis Sentinel.## Secret can also be set using a secret: https://www.authelia.com/c/secretssecret:'insecure_session_secret'## Cookies configures the list of allowed cookie domains for sessions to be created on.## Undefined values will default to the values below.# cookies:# -## The name of the session cookie.# name: 'authelia_session'## The domain to protect.## Note: the Authelia portal must also be in that domain.# domain: 'example.com'## Required. The fully qualified URI of the portal to redirect users to on proxies that support redirections.## Rules:## - MUST use the secure scheme 'https://'## - The above 'domain' option MUST either:## - Match the host portion of this URI.## - Match the suffix of the host portion when prefixed with '.'.# authelia_url: 'https://auth.example.com'## Optional. The fully qualified URI used as the redirection location if the portal is accessed directly. Not## configuring this option disables the automatic redirection behaviour.#### Note: this parameter is optional. If not provided, user won't be redirected upon successful authentication## unless they were redirected to Authelia by the proxy.#### Rules:## - MUST use the secure scheme 'https://'## - MUST not match the 'authelia_url' option.## - The above 'domain' option MUST either:## - Match the host portion of this URI.## - Match the suffix of the host portion when prefixed with '.'.# default_redirection_url: 'https://www.example.com'## Sets the Cookie SameSite value. Possible options are none, lax, or strict.## Please read https://www.authelia.com/c/session#same_site# same_site: 'lax'## The value for inactivity, expiration, and remember_me are in seconds or the duration common syntax.## All three of these values affect the cookie/session validity period. Longer periods are considered less secure## because a stolen cookie will last longer giving attackers more time to spy or attack.## The inactivity time before the session is reset. If expiration is set to 1h, and this is set to 5m, if the user## does not select the remember me option their session will get destroyed after 1h, or after 5m since the last## time Authelia detected user activity.# inactivity: '5 minutes'## The time before the session cookie expires and the session is destroyed if remember me IS NOT selected by the## user.# expiration: '1 hour'## The time before the cookie expires and the session is destroyed if remember me IS selected by the user. Setting## this value to -1 disables remember me for this session cookie domain. If allowed and the user uses the remember## me checkbox this overrides the expiration option and disables the inactivity option.# remember_me: '1 month'## Cookie Session Domain default 'name' value.# name: 'authelia_session'## Cookie Session Domain default 'same_site' value.# same_site: 'lax'## Cookie Session Domain default 'inactivity' value.# inactivity: '5m'## Cookie Session Domain default 'expiration' value.# expiration: '1h'## Cookie Session Domain default 'remember_me' value.# remember_me: '1M'#### Redis Provider#### Important: Kubernetes (or HA) users must read https://www.authelia.com/t/statelessness### redis:# host: '127.0.0.1'# port: 6379## Use a unix socket instead# host: '/var/run/redis/redis.sock'## The connection timeout in the duration common syntax.# timeout: '5 seconds'## The maximum number of retries on a failed command. Set it to 0 to disable retries.# max_retries: 3## Username used for redis authentication. This is optional and a new feature in redis 6.0.# username: 'authelia'## Password can also be set using a secret: https://www.authelia.com/c/secrets# password: 'authelia'## This is the Redis DB Index https://redis.io/commands/select (sometimes referred to as database number, DB, etc).# database_index: 0## The maximum number of concurrent active connections to Redis.# maximum_active_connections: 8## The target number of idle connections to have open ready for work. Useful when opening connections is slow.# minimum_idle_connections: 0## The Redis TLS configuration. If defined will require a TLS connection to the Redis instance(s).# tls:## The server subject name to check the servers certificate against during the validation process.## This option is not required if the certificate has a SAN which matches the host option.# server_name: 'myredis.example.com'## Skip verifying the server certificate entirely. In preference to setting this we strongly recommend you add the## certificate or the certificate of the authority signing the certificate to the certificates directory which is## defined by the `certificates_directory` option at the top of the configuration.## It's important to note the public key should be added to the directory, not the private key.## This option is strongly discouraged but may be useful in some self-signed situations where validation is not## important to the administrator.# skip_verify: false## Minimum TLS version for the connection.# minimum_version: 'TLS1.2'## Maximum TLS version for the connection.# maximum_version: 'TLS1.3'## The certificate chain used with the private_key if the server requests TLS Client Authentication## i.e. Mutual TLS.# certificate_chain: |# -----BEGIN CERTIFICATE-----# ...# -----END CERTIFICATE-----# -----BEGIN CERTIFICATE-----# ...# -----END CERTIFICATE-----## The private key used with the certificate_chain if the server requests TLS Client Authentication## i.e. Mutual TLS.# private_key: |# -----BEGIN PRIVATE KEY-----# ...# -----END PRIVATE KEY-----## The Redis HA configuration options.## This provides specific options to Redis Sentinel, sentinel_name must be defined (Master Name).# high_availability:## Sentinel Name / Master Name.# sentinel_name: 'mysentinel'## Specific username for Redis Sentinel. The node username and password is configured above.# sentinel_username: 'sentinel_specific_user'## Specific password for Redis Sentinel. The node username and password is configured above.# sentinel_password: 'sentinel_specific_pass'## The additional nodes to pre-seed the redis provider with (for sentinel).## If the host in the above section is defined, it will be combined with this list to connect to sentinel.## For high availability to be used you must have either defined; the host above or at least one node below.# nodes:# - host: 'sentinel-node1'# port: 6379# - host: 'sentinel-node2'# port: 6379## Choose the host with the lowest latency.# route_by_latency: false## Choose the host randomly.# route_randomly: false#### Regulation Configuration#### This mechanism prevents attackers from brute forcing the first factor. It bans the user if too many attempts are made## in a short period of time.# regulation:## Regulation Mode.# modes:# - 'user'## The number of failed login attempts before user is banned. Set it to 0 to disable regulation.# max_retries: 3## The time range during which the user can attempt login before being banned in the duration common syntax. The user## is banned if the authentication failed 'max_retries' times in a 'find_time' seconds window.# find_time: '2 minutes'## The length of time before a banned user can login again in the duration common syntax.# ban_time: '5 minutes'#### Storage Provider Configuration#### The available providers are: `local`, `mysql`, `postgres`. You must use one and only one of these providers.# storage:## The encryption key that is used to encrypt sensitive information in the database. Must be a string with a minimum## length of 20. Please see the docs if you configure this with an undesirable key and need to change it, you MUST use## the CLI to change this in the database if you want to change it from a previously configured value.# encryption_key: 'you_must_generate_a_random_string_of_more_than_twenty_chars_and_configure_this'#### Local (Storage Provider)#### This stores the data in a SQLite3 Database.## This is only recommended for lightweight non-stateful installations.#### Important: Kubernetes (or HA) users must read https://www.authelia.com/t/statelessness### local:## Path to the SQLite3 Database.# path: '/config/db.sqlite3'#### MySQL / MariaDB (Storage Provider)### mysql:## The address of the MySQL server to connect to in the address common syntax.## Format: [<scheme>://]<hostname>[:<port>].## Square brackets indicate optional portions of the format. Scheme must be 'tcp', 'tcp4', 'tcp6', or 'unix`.## The default scheme is 'unix' if the address is an absolute path otherwise it's 'tcp'. The default port is '3306'.# address: 'tcp://127.0.0.1:3306'## The database name to use.# database: 'authelia'## The username used for SQL authentication.# username: 'authelia'## The password used for SQL authentication.## Can also be set using a secret: https://www.authelia.com/c/secrets# password: 'mypassword'## The connection timeout in the duration common syntax.# timeout: '5 seconds'## MySQL TLS settings. Configuring this requires TLS.# tls:## The server subject name to check the servers certificate against during the validation process.## This option is not required if the certificate has a SAN which matches the address options hostname.# server_name: 'mysql.example.com'## Skip verifying the server certificate entirely. In preference to setting this we strongly recommend you add the## certificate or the certificate of the authority signing the certificate to the certificates directory which is## defined by the `certificates_directory` option at the top of the configuration.## It's important to note the public key should be added to the directory, not the private key.## This option is strongly discouraged but may be useful in some self-signed situations where validation is not## important to the administrator.# skip_verify: false## Minimum TLS version for the connection.# minimum_version: 'TLS1.2'## Maximum TLS version for the connection.# maximum_version: 'TLS1.3'## The certificate chain used with the private_key if the server requests TLS Client Authentication## i.e. Mutual TLS.# certificate_chain: |# -----BEGIN CERTIFICATE-----# ...# -----END CERTIFICATE-----# -----BEGIN CERTIFICATE-----# ...# -----END CERTIFICATE-----## The private key used with the certificate_chain if the server requests TLS Client Authentication## i.e. Mutual TLS.# private_key: |# -----BEGIN PRIVATE KEY-----# ...# -----END PRIVATE KEY-----#### PostgreSQL (Storage Provider)### postgres:## The address of the PostgreSQL server to connect to in the address common syntax.## Format: [<scheme>://]<hostname>[:<port>].## Square brackets indicate optional portions of the format. Scheme must be 'tcp', 'tcp4', 'tcp6', or 'unix`.## The default scheme is 'unix' if the address is an absolute path otherwise it's 'tcp'. The default port is '5432'.# address: 'tcp://127.0.0.1:5432'## List of additional server instance configurations to fallback to when the primary instance is not available.# servers:# -## The Address of this individual instance.# address: 'tcp://127.0.0.1:5432'## The TLS configuration for this individual instance.# tls:# server_name: 'postgres.example.com'# skip_verify: false# minimum_version: 'TLS1.2'# maximum_version: 'TLS1.3'# certificate_chain: |# -----BEGIN CERTIFICATE-----# ...# -----END CERTIFICATE-----# -----BEGIN CERTIFICATE-----# ...# -----END CERTIFICATE-----# private_key: |# -----BEGIN PRIVATE KEY-----# ...# -----END PRIVATE KEY-----## The database name to use.# database: 'authelia'## The schema name to use.# schema: 'public'## The username used for SQL authentication.# username: 'authelia'## The password used for SQL authentication.## Can also be set using a secret: https://www.authelia.com/c/secrets# password: 'mypassword'## The connection timeout in the duration common syntax.# timeout: '5 seconds'## PostgreSQL TLS settings. Configuring this requires TLS.# tls:## The server subject name to check the servers certificate against during the validation process.## This option is not required if the certificate has a SAN which matches the address options hostname.# server_name: 'postgres.example.com'## Skip verifying the server certificate entirely. In preference to setting this we strongly recommend you add the## certificate or the certificate of the authority signing the certificate to the certificates directory which is## defined by the `certificates_directory` option at the top of the configuration.## It's important to note the public key should be added to the directory, not the private key.## This option is strongly discouraged but may be useful in some self-signed situations where validation is not## important to the administrator.# skip_verify: false## Minimum TLS version for the connection.# minimum_version: 'TLS1.2'## Maximum TLS version for the connection.# maximum_version: 'TLS1.3'## The certificate chain used with the private_key if the server requests TLS Client Authentication## i.e. Mutual TLS.# certificate_chain: |# -----BEGIN CERTIFICATE-----# ...# -----END CERTIFICATE-----# -----BEGIN CERTIFICATE-----# ...# -----END CERTIFICATE-----## The private key used with the certificate_chain if the server requests TLS Client Authentication## i.e. Mutual TLS.# private_key: |# -----BEGIN PRIVATE KEY-----# ...# -----END PRIVATE KEY-----#### Notification Provider#### Notifications are sent to users when they require a password reset, a WebAuthn registration or a TOTP registration.## The available providers are: filesystem, smtp. You must use only one of these providers.# notifier:## You can disable the notifier startup check by setting this to true.# disable_startup_check: false#### File System (Notification Provider)#### Important: Kubernetes (or HA) users must read https://www.authelia.com/t/statelessness### filesystem:# filename: '/config/notification.txt'#### SMTP (Notification Provider)#### Use a SMTP server for sending notifications. Authelia uses the PLAIN or LOGIN methods to authenticate.## [Security] By default Authelia will:## - force all SMTP connections over TLS including unauthenticated connections## - use the disable_require_tls boolean value to disable this requirement## (only works for unauthenticated connections)## - validate the SMTP server x509 certificate during the TLS handshake against the hosts trusted certificates## (configure in tls section)# smtp:## The address of the SMTP server to connect to in the address common syntax.# address: 'smtp://127.0.0.1:25'## The connection timeout in the duration common syntax.# timeout: '5 seconds'## The username used for SMTP authentication.# username: 'test'## The password used for SMTP authentication.## Can also be set using a secret: https://www.authelia.com/c/secrets# password: 'password'## The sender is used to is used for the MAIL FROM command and the FROM header.## If this is not defined and the username is an email, we use the username as this value. This can either be just## an email address or the RFC5322 'Name <email address>' format.# sender: 'Authelia <admin@example.com>'## HELO/EHLO Identifier. Some SMTP Servers may reject the default of localhost.# identifier: 'localhost'## Subject configuration of the emails sent. {title} is replaced by the text from the notifier.# subject: '[Authelia] {title}'## This address is used during the startup check to verify the email configuration is correct.## It's not important what it is except if your email server only allows local delivery.# startup_check_address: 'test@authelia.com'## By default we require some form of TLS. This disables this check though is not advised.# disable_require_tls: false## Disables sending HTML formatted emails.# disable_html_emails: false# tls:## The server subject name to check the servers certificate against during the validation process.## This option is not required if the certificate has a SAN which matches the address options hostname.# server_name: 'smtp.example.com'## Skip verifying the server certificate entirely. In preference to setting this we strongly recommend you add the## certificate or the certificate of the authority signing the certificate to the certificates directory which is## defined by the `certificates_directory` option at the top of the configuration.## It's important to note the public key should be added to the directory, not the private key.## This option is strongly discouraged but may be useful in some self-signed situations where validation is not## important to the administrator.# skip_verify: false## Minimum TLS version for the connection.# minimum_version: 'TLS1.2'## Maximum TLS version for the connection.# maximum_version: 'TLS1.3'## The certificate chain used with the private_key if the server requests TLS Client Authentication## i.e. Mutual TLS.# certificate_chain: |# -----BEGIN CERTIFICATE-----# ...# -----END CERTIFICATE-----# -----BEGIN CERTIFICATE-----# ...# -----END CERTIFICATE-----## The private key used with the certificate_chain if the server requests TLS Client Authentication## i.e. Mutual TLS.# private_key: |# -----BEGIN PRIVATE KEY-----# ...# -----END PRIVATE KEY-----#### Identity Providers### identity_providers:#### OpenID Connect (Identity Provider)#### It's recommended you read the documentation before configuration of this section.## See: https://www.authelia.com/c/oidc/provider# oidc:## The hmac_secret is used to sign OAuth2 tokens (authorization code, access tokens and refresh tokens).## HMAC Secret can also be set using a secret: https://www.authelia.com/c/secrets# hmac_secret: 'this_is_a_secret_abc123abc123abc'## The JWK's issuer option configures multiple JSON Web Keys. It's required that at least one of the JWK's## configured has the RS256 algorithm. For RSA keys (RS or PS) the minimum is a 2048 bit key.# jwks:# -## Key ID embedded into the JWT header for key matching. Must be an alphanumeric string with 7 or less characters.## This value is automatically generated if not provided. It's recommended to not configure this.# key_id: 'example'## The key algorithm used with this key.# algorithm: 'RS256'## The key use expected with this key. Currently only 'sig' is supported.# use: 'sig'## Required Private Key in PEM DER form.# key: |# -----BEGIN PRIVATE KEY-----# ...# -----END PRIVATE KEY-----## Optional matching certificate chain in PEM DER form that matches the key. All certificates within the chain## must be valid and current, and from top to bottom each certificate must be signed by the subsequent one.# certificate_chain: |# -----BEGIN CERTIFICATE-----# ...# -----END CERTIFICATE-----# -----BEGIN CERTIFICATE-----# ...# -----END CERTIFICATE-----## Enables additional debug messages.# enable_client_debug_messages: false## SECURITY NOTICE: It's not recommended changing this option and values below 8 are strongly discouraged.# minimum_parameter_entropy: 8## SECURITY NOTICE: It's not recommended changing this option, and highly discouraged to have it set to 'never'## for security reasons.# enforce_pkce: 'public_clients_only'## SECURITY NOTICE: It's not recommended changing this option. We encourage you to read the documentation and fully## understanding it before enabling this option.# enable_jwt_access_token_stateless_introspection: false## The signing algorithm used for signing the discovery and metadata responses. An issuer JWK with a matching## algorithm must be available when configured. Most clients completely ignore this and it has a performance cost.# discovery_signed_response_alg: 'none'## The signing key id used for signing the discovery and metadata responses. An issuer JWK with a matching key id## must be available when configured. Most clients completely ignore this and it has a performance cost.# discovery_signed_response_key_id: ''## Authorization Policies which can be utilized by clients. The 'policy_name' is an arbitrary value that you pick## which is utilized as the value for the 'authorization_policy' on the client.# authorization_policies:# policy_name:# default_policy: 'two_factor'# rules:# - policy: 'one_factor'# subject: 'group:services'# networks:# - '192.168.1.0/24'## The lifespans configure the expiration for these token types in the duration common syntax. In addition to this## syntax the lifespans can be customized per-client.# lifespans:## Configures the default/fallback lifespan for given token types. This behaviour applies to all clients and all## grant types but you can override this behaviour using the custom lifespans.# access_token: '1 hour'# authorize_code: '1 minute'# id_token: '1 hour'# refresh_token: '90 minutes'## Cross-Origin Resource Sharing (CORS) settings.# cors:## List of endpoints in addition to the metadata endpoints to permit cross-origin requests on.# endpoints:# - 'authorization'# - 'pushed-authorization-request'# - 'token'# - 'revocation'# - 'introspection'# - 'userinfo'## List of allowed origins.## Any origin with https is permitted unless this option is configured or the## allowed_origins_from_client_redirect_uris option is enabled.# allowed_origins:# - 'https://example.com'## Automatically adds the origin portion of all redirect URI's on all clients to the list of allowed_origins,## provided they have the scheme http or https and do not have the hostname of localhost.# allowed_origins_from_client_redirect_uris: false## Clients is a list of registered clients and their configuration.## It's recommended you read the documentation before configuration of a registered client.## See: https://www.authelia.com/c/oidc/registered-clients# clients:# -## The Client ID is the OAuth 2.0 and OpenID Connect 1.0 Client ID which is used to link an application to a## configuration.# client_id: 'myapp'## The description to show to users when they end up on the consent screen. Defaults to the ID above.# client_name: 'My Application'## The client secret is a shared secret between Authelia and the consumer of this client.# yamllint disable-line rule:line-length# client_secret: '$pbkdf2-sha512$310000$c8p78n7pUMln0jzvd4aK4Q$JNRBzwAo0ek5qKn50cFzzvE9RXV88h1wJn5KGiHrD0YKtZaR/nCb2CJPOsKaPK0hjf.9yHxzQGZziziccp6Yng' # The digest of 'insecure_secret'.## Sector Identifiers are occasionally used to generate pairwise subject identifiers. In most cases this is not## necessary. It is critical to read the documentation for more information.# sector_identifier_uri: 'https://example.com/sector.json'## Sets the client to public. This should typically not be set, please see the documentation for usage.# public: false## Redirect URI's specifies a list of valid case-sensitive callbacks for this client.# redirect_uris:# - 'https://oidc.example.com:8080/oauth2/callback'## Request URI's specifies a list of valid case-sensitive TLS-secured URIs for this client for use as## URIs to fetch Request Objects.# request_uris:# - 'https://oidc.example.com:8080/oidc/request-object.jwk'## Audience this client is allowed to request.# audience: []## Scopes this client is allowed to request.# scopes:# - 'openid'# - 'groups'# - 'email'# - 'profile'## Grant Types configures which grants this client can obtain.## It's not recommended to define this unless you know what you're doing.# grant_types:# - 'authorization_code'## Response Types configures which responses this client can be sent.## It's not recommended to define this unless you know what you're doing.# response_types:# - 'code'## Response Modes configures which response modes this client supports.# response_modes:# - 'form_post'# - 'query'## The policy to require for this client; one_factor or two_factor. Can also be the key names for the## authorization policies section.# authorization_policy: 'two_factor'## The custom lifespan name to use for this client. This must be configured independent of the client before## utilization. Custom lifespans are reusable similar to authorization policies.# lifespan: ''## The consent mode controls how consent is obtained.# consent_mode: 'auto'## This value controls the duration a consent on this client remains remembered when the consent mode is## configured as 'auto' or 'pre-configured' in the duration common syntax.# pre_configured_consent_duration: '1 week'## Requires the use of Pushed Authorization Requests for this client when set to true.# require_pushed_authorization_requests: false## Enforces the use of PKCE for this client when set to true.# require_pkce: false## Enforces the use of PKCE for this client when configured, and enforces the specified challenge method.## Options are 'plain' and 'S256'.# pkce_challenge_method: 'S256'## The signing algorithm used for signing the authorization responses.## Please read the documentation before adjusting this option.## See: https://www.authelia.com/c/oidc/registered-clients#authorization_signed_response_alg# authorization_signed_response_alg: 'none'## The signing key id used for signing the authorization responses.## Please read the documentation before adjusting this option.## See: https://www.authelia.com/c/oidc/registered-clients#authorization_signed_response_key_id# authorization_signed_response_key_id: ''## The content encryption algorithm used for encrypting the authorization responses.## Please read the documentation before adjusting this option.## See: https://www.authelia.com/c/oidc/registered-clients#authorization_encrypted_response_alg# authorization_encrypted_response_alg: 'none'## The encryption algorithm used for encrypting the authorization responses.## Please read the documentation before adjusting this option.## See: https://www.authelia.com/c/oidc/registered-clients#authorization_encrypted_response_enc# authorization_encrypted_response_enc: 'A128CBC-HS256'## The content encryption key id used for encrypting the authorization responses.## Please read the documentation before adjusting this option.## See: https://www.authelia.com/c/oidc/registered-clients#authorization_encrypted_response_key_id# authorization_encrypted_response_key_id: ''## The signing algorithm used for signing the ID Tokens in Access Request responses.## Please read the documentation before adjusting this option.## See: https://www.authelia.com/c/oidc/registered-clients#id_token_signed_response_alg# id_token_signed_response_alg: 'RS256'## The signing key id used for signing the ID Tokens in Access Request responses.## Please read the documentation before adjusting this option.## See: https://www.authelia.com/c/oidc/registered-clients#id_token_signed_response_key_id# id_token_signed_response_key_id: ''## The content encryption algorithm used for encrypting the ID Tokens in Access Request responses.## Please read the documentation before adjusting this option.## See: https://www.authelia.com/c/oidc/registered-clients#id_token_encrypted_response_alg# id_token_encrypted_response_alg: 'none'## The encryption algorithm used for encrypting the ID Tokens in Access Request responses.## Please read the documentation before adjusting this option.## See: https://www.authelia.com/c/oidc/registered-clients#id_token_encrypted_response_enc# id_token_encrypted_response_enc: 'A128CBC-HS256'## The content encryption key id used for encrypting the ID Tokens in Access Request responses.## Please read the documentation before adjusting this option.## See: https://www.authelia.com/c/oidc/registered-clients#authorization_encrypted_response_key_id# id_token_encrypted_response_key_id: ''## The signing algorithm used for signing the Access Tokens in Access Request responses.## Please read the documentation before adjusting this option.## See: https://www.authelia.com/c/oidc/registered-clients#access_token_signed_response_alg# access_token_signed_response_alg: 'none'## The signing key id used for signing the Access Tokens in Access Request responses.## Please read the documentation before adjusting this option.## See: https://www.authelia.com/c/oidc/registered-clients#access_token_signed_response_key_id# access_token_signed_response_key_id: ''## The content encryption algorithm used for encrypting the Access Tokens in Access Request responses.## Please read the documentation before adjusting this option.## See: https://www.authelia.com/c/oidc/registered-clients#access_token_encrypted_response_alg# access_token_encrypted_response_alg: 'none'## The encryption algorithm used for encrypting the Access Tokens in Access Request responses.## Please read the documentation before adjusting this option.## See: https://www.authelia.com/c/oidc/registered-clients#access_token_encrypted_response_enc# access_token_encrypted_response_enc: 'A128CBC-HS256'## The content encryption key id used for encrypting the Access Tokens in Access Request responses.## Please read the documentation before adjusting this option.## See: https://www.authelia.com/c/oidc/registered-clients#access_token_encrypted_response_key_id# access_token_encrypted_response_key_id: ''## The signing algorithm used for signing the User Info Request responses.## Please read the documentation before adjusting this option.## See: https://www.authelia.com/c/oidc/registered-clients#userinfo_signed_response_alg# userinfo_signed_response_alg: 'none'## The signing key id used for signing the User Info Request responses.## Please read the documentation before adjusting this option.## See: https://www.authelia.com/c/oidc/registered-clients#userinfo_signed_response_key_id# userinfo_signed_response_key_id: ''## The content encryption algorithm used for encrypting the User Info Request responses.## Please read the documentation before adjusting this option.## See: https://www.authelia.com/c/oidc/registered-clients#userinfo_encrypted_response_alg# userinfo_encrypted_response_alg: 'none'## The encryption algorithm used for encrypting the User Info Request responses.## Please read the documentation before adjusting this option.## See: https://www.authelia.com/c/oidc/registered-clients#userinfo_encrypted_response_enc# userinfo_encrypted_response_enc: 'A128CBC-HS256'## The content encryption key id used for encrypting the User Info Request responses.## Please read the documentation before adjusting this option.## See: https://www.authelia.com/c/oidc/registered-clients#userinfo_encrypted_response_key_id# userinfo_encrypted_response_key_id: ''## The signing algorithm used for signing the Introspection Request responses.## Please read the documentation before adjusting this option.## See: https://www.authelia.com/c/oidc/registered-clients#introspection_signed_response_alg# introspection_signed_response_alg: 'none'## The signing key id used for Introspection responses. An issuer JWK with a matching key id must be available## when configured.# introspection_signed_response_key_id: ''## The content encryption algorithm used for encrypting the Introspection Request responses.## Please read the documentation before adjusting this option.## See: https://www.authelia.com/c/oidc/registered-clients#introspection_encrypted_response_alg# introspection_encrypted_response_alg: 'none'## The encryption algorithm used for encrypting the Introspection Request responses.## Please read the documentation before adjusting this option.## See: https://www.authelia.com/c/oidc/registered-clients#introspection_encrypted_response_enc# introspection_encrypted_response_enc: 'A128CBC-HS256'## The content encryption key id used for encrypting the Introspection Request responses.## Please read the documentation before adjusting this option.## See: https://www.authelia.com/c/oidc/registered-clients#introspection_encrypted_response_key_id# introspection_encrypted_response_key_id: ''## The signature algorithm which must be used for request objects.## Please read the documentation before adjusting this option.## See: https://www.authelia.com/c/oidc/registered-clients#request_object_signing_alg# request_object_signing_alg: 'RS256'## The content encryption algorithm which must be used for request objects.## Please read the documentation before adjusting this option.## See: https://www.authelia.com/c/oidc/registered-clients#request_object_encryption_alg# request_object_encryption_alg: ''## The encryption algorithm which must be used for request objects.## Please read the documentation before adjusting this option.## See: https://www.authelia.com/c/oidc/registered-clients#request_object_encryption_enc# request_object_encryption_enc: ''## The permitted client authentication method for the Token Endpoint for this client.## For confidential client types this value defaults to 'client_secret_basic' and for the public client types it## defaults to 'none' per the specifications.# token_endpoint_auth_method: 'client_secret_basic'## The permitted client authentication signing algorithm for the Token Endpoint for this client when using## the 'client_secret_jwt' or 'private_key_jwt' token_endpoint_auth_method.# token_endpoint_auth_signing_alg: 'RS256'## The permitted client authentication method for the Revocation Endpoint for this client.## For confidential client types this value defaults to 'client_secret_basic' and for the public client types it## defaults to 'none' per the specifications.# revocation_endpoint_auth_method: 'client_secret_basic'## The permitted client authentication signing algorithm for the Revocation Endpoint for this client when using## the 'client_secret_jwt' or 'private_key_jwt' revocation_endpoint_auth_method.# revocation_endpoint_auth_signing_alg: 'RS256'## The permitted client authentication method for the Introspection Endpoint for this client.## For confidential client types this value defaults to 'client_secret_basic' and for the public client types it## defaults to 'none' per the specifications.# introspection_endpoint_auth_method: 'client_secret_basic'## The permitted client authentication signing algorithm for the Introspection Endpoint for this client when## using the 'client_secret_jwt' or 'private_key_jwt' introspection_endpoint_auth_method.# introspection_endpoint_auth_signing_alg: 'RS256'## The permitted client authentication method for the Pushed Authorization Request Endpoint for this client.## For confidential client types this value defaults to 'client_secret_basic' and for the public client types it## defaults to 'none' per the specifications.# pushed_authorization_request_endpoint_auth_method: 'client_secret_basic'## The permitted client authentication signing algorithm for the Pushed Authorization Request Endpoint for this## client when using the 'client_secret_jwt' or 'private_key_jwt'## pushed_authorization_request_endpoint_auth_method.# pushed_authorization_request_endpoint_auth_signing_alg: 'RS256'## Trusted public keys configuration for request object signing for things such as 'private_key_jwt'.## URL of the HTTPS endpoint which serves the keys. Please note the 'jwks_uri' and the 'jwks' option below## are mutually exclusive.# jwks_uri: 'https://app.example.com/jwks.json'## Trusted public keys configuration for request object signing for things such as 'private_key_jwt'.## List of JWKs known and registered with this client. It's recommended to use the 'jwks_uri' option if## available due to key rotation. Please note the 'jwks' and the 'jwks_uri' option above are mutually exclusive.# jwks:# -## Key ID used to match the JWT's to an individual identifier. This option is required if configured.# key_id: 'example'## The key algorithm expected with this key.# algorithm: 'RS256'## The key use expected with this key. Currently only 'sig' is supported.# use: 'sig'## Required Public Key in PEM DER form.# key: |# -----BEGIN RSA PUBLIC KEY-----# ...# -----END RSA PUBLIC KEY-----## The matching certificate chain in PEM DER form that matches the key if available.# certificate_chain: |# -----BEGIN CERTIFICATE-----# ...# -----END CERTIFICATE-----# -----BEGIN CERTIFICATE-----# ...# -----END CERTIFICATE-----...
Синтаксис
Ключи
policies:# словарь ключаarbitrary_name:# значение ключа для последующего использования в блоке usage_exampleenable:trueusage_example:- name:'example'policy:'arbitrary_name'# использование ключа policy
Время
Unit
Short Unit
Human Readable Long Unit
Years
y
year, years
Months
M
month, months
Weeks
w
week, weeks
Days
d
day, days
Hours
h
hour, hours
Minutes
m
minute, minutes
Seconds
s
second, seconds
Milliseconds
ms
millisecond, milliseconds
В настройках указываются значения в коротком или длинном формате
Desired Value
Configuration Examples (Short)
Configuration Examples (Long)
1 hour and 30 minutes
90m or 1h30m or 5400 or 5400s
1 hour and 30 minutes
1 day
1d or 24h or 86400 or 86400s
1 day
10 hours
10h or 600m or 9h60m or 36000
10 hours
Адрес
Строковая переменная
Параметры
Parameter
Listeners
Connectors
Purpose
umask
Да
Нет
Устанавливает umask перед созданием сокета и восстанавливает его после создания. Значение должно быть восьмеричным числом с 3 или 4 цифрами.
path
Да
Нет
Устанавливает переменную path для настройки подпути, специально для unix-сокета, но технически работает и для TCP. Обратите внимание, что это должна быть только буквенно-цифровая часть без префикса в виде прямой косой черты.
Следующий формат представляет собой формат имени хоста. В большинстве случаев он подходит как для слушателя, так и для коннектора. В этом формате, согласно обозначениям, схема и порт являются необязательными. Если они не указаны, то используются по умолчанию.
Вся схема не является обязательной, но если в строке присутствует разделитель узла схемы ://, то схема должна присутствовать.
Scheme
Listeners
Connectors
Default Port
Notes
tcp
Yes
Yes
N/A
Standard TCP Socket which allows IPv4 and/or IPv6 addresses
tcp4
Yes
Yes
N/A
Standard TCP Socket which allows only IPv4 addresses
tcp6
Yes
Yes
N/A
Standard TCP Socket which allows only IPv6 addresses
udp
Yes
Yes
N/A
Standard UDP Socket which allows IPv4 and/or IPv6 addresses
udp4
Yes
Yes
N/A
Standard UDP Socket which allows only IPv4 addresses
udp6
Yes
Yes
N/A
Standard UDP Socket which allows only IPv6 addresses
unix
Yes
Yes
N/A
Standard Unix Domain Socket which allows only absolute paths
ldap
No
Yes
389
Remote LDAP connection via a TCP socket using StartTLS if available
ldaps
No
Yes
636
Remote LDAP connection via a TLS socket
ldapi
No
Yes
N/A
LDAP connection via Unix Domain Socket
smtp
No
Yes
25
Remote SMTP connection via a TCP socket using StartTLS if available
submission
No
Yes
587
Remote SMTP Submission connection via a TCP socket using StartTLS if available
submissions
No
Yes
465
Remote SMTP Submission connection via a TLS socket
hostname
Имя хоста требуется, если схема является одной из схем tcp или udp и не указан порт. Это может быть любой локально адресуемый IP или имя хоста, которое разрешается в локально адресуемый IP.
При указании IPv6 он должен быть заключен в квадратные скобки. Например, для IPv6-адреса ::1 со схемой tcp и портом 80 правильным адресом будет tcp://[::1]:80.
Регулярные выражения
domain_regex:'^(admin|secure)\.example\.com$'
Network
Мы поддерживаем сетевой синтаксис, который разворачивает строки в сетевой диапазон. Формат строк использует стандартную нотацию CIDR и предполагает наличие одного хоста (адаптированного как /32 для IPv4 и /128 для IPv6), если суффикс CIDR отсутствует.
Ниже представлены общие структуры данных, используемые в конфигурации, к которым предъявляются особые требования, используемые в различных областях.
TLS
В различных разделах конфигурации используется единый раздел конфигурации под названием tls, в котором настраиваются параметры TLS-сокета и TLS-проверки. В этом разделе описаны общие части этой структуры. По умолчанию Authelia использует системный сертификат доверия для проверки сертификата TLS, но вы можете дополнить его с помощью глобальной опции certificates_directory, а также полностью отключить проверку сертификата TLS с помощью опции skip_verify.
Ключ server_name переопределяет имя, проверяемое по сертификату в процессе проверки. Полезно, если вам требуется IP-адрес узла внутренней службы, но вы хотите проверить конкретное имя сервера сертификатов.
skip_verify
Ключ skip_verify полностью исключает проверку сертификата внутреннего сервиса. Это не рекомендуется, вместо этого следует настроить параметр server_name и глобальный параметр certificates directory.
minimum_version - maximum_version
Устанавливает минимальную версию TLS, которую Authelia будет использовать при выполнении сопряжений TLS. Возможные значения: TLS1.3, TLS1.2, TLS1.1, TLS1.0, SSL3.0.
certificate_chain
Цепочка/набор сертификатов, которые будут использоваться вместе с private_key для выполнения взаимной TLS-аутентификации с сервером.
Значение должно представлять собой один или несколько сертификатов, закодированных в формате PEM с кодировкой DER base64 (RFC4648). Если предоставлено более одного сертификата, то каждый сертификат должен быть подписан следующим сертификатом, если он предоставлен, в порядке сверху вниз.
private_key
Закрытый ключ, который будет использоваться с цепочкой_сертификатов для взаимной аутентификации TLS. Материал открытого ключа, связанного с закрытым ключем, должен совпадать с закрытым ключом первого сертификата в цепочке_сертификатов.
Значение должно представлять собой один закрытый ключ, закодированный в формате PEM DER base64 (RFC4648), и должно быть закодировано в соответствии со спецификациями PKCS#8, PKCS#1 или SECG1.
Server Buffers
Различные разделы конфигурации используют единый раздел конфигурации под названием buffers, который настраивает буферы HTTP-сервера. В частности, секции сервера и телеметрии метрик. В этом разделе описаны общие части этой структуры.
buffers:read:4096write:4096
read
Настройка максимального размера запроса. Значение по умолчанию 4096 обычно достаточно для большинства случаев использования.
write
Настройка максимального размера ответа. Значение по умолчанию 4096 обычно достаточно для большинства случаев использования.
Server Timeouts
В различных разделах конфигурации используется единый раздел конфигурации под названием timeouts, в котором настраиваются таймауты HTTP-сервера. В частности, в секциях телеметрии сервера и метрик.
timeouts:read:'6s'write:'6s'idle:'30s'
read write
Настройка таймаута чтения и записи сервера.
idle
Настройка таймаута простоя сервера.
3.3.2 - Методы Authelia
Методы
Authelia имеет несколько способов настройки. Порядок приоритета следующий:
Секреты
Переменные окружения
Файлы (в порядке их указания)
3.3.2.1 - Секреты Authelia
Для настройки Authelia требуется несколько секретов и паролей.
Для настройки Authelia требуется несколько секретов и паролей. Даже если они могут быть заданы в конфигурационном файле или стандартных переменных окружения, рекомендуется использовать этот метод настройки, описанный ниже.
Filters
Помимо описанных ниже методов, файлы конфигурации можно передавать через фильтры шаблонов. Эти фильтры можно использовать для вставки или изменения содержимого файла. В частности, функция fileContent может быть использована для получения содержимого файла, а nindent - для добавления новой строки и отступа содержимого этого файла.
вставляем содержимое файла в ключ private_key с отступом 8 пробелов
Layers
Важно
Хотя этот метод является третьим уровнем многоуровневой модели конфигурации, как описано во введении, этот уровень особенный, так как Authelia не запустится, если вы определите секрет, как и любой другой метод конфигурации.
Security
Этот метод немного улучшает безопасность других методов, поскольку позволяет легко разделить конфигурацию логически безопасным способом.
Environment variables
Секретное значение может быть загружено Authelia, если ключ конфигурации заканчивается одним из следующих слов: key, secret, password, token или certificate_chain.
Если вы возьмете ожидаемую переменную окружения для конфигурационного параметра с суффиксом _FILE в конце. Значение этих переменных окружения должно быть путем к файлу, который может быть прочитан процессом Authelia, если это не так, Authelia не сможет загрузиться. Authelia автоматически удалит новые строки в конце содержимого файлов.
Например, пароль LDAP может быть определен в конфигурации по пути authentication_backend.ldap.password, поэтому в качестве альтернативы этот пароль может быть задан с помощью переменной окружения под названием
Если по каким-то причинам вы решили хранить секреты в конфигурационном файле, настоятельно рекомендуется убедиться, что права доступа к конфигурационному файлу установлены соответствующим образом, чтобы другие пользователи или процессы не могли получить доступ к этому файлу. Обычно для UNIX подходят следующие разрешения: 0600.
Секреты, открытые в переменной окружения
Во всех версиях 4.30.0+ вы можете задать секреты с помощью переменных окружения без суффикса _FILE, установив значение, которое вы хотите задать в конфигурации, однако мы настоятельно рекомендуем не использовать эту возможность и вместо этого использовать файловые секреты, описанные выше.
3.3.2.2 - Файлы конфигурации
Параметры конфигурации могут быть определены либо через аргумент, либо через переменную окружения, но не через оба параметра одновременно.
Поведение при загрузке и обнаружение
Существует несколько опций, которые влияют на загрузку файлов:
Name
Argument
Environment Variable
Описание и назначение переменных
Files/Directories
--config, -c
X_AUTHELIA_CONFIG
Список путей к файлам или каталогам (без рекурсии) для загрузки файлов конфигурации
Filters
--config.experimental.filters
X_AUTHELIA_CONFIG_FILTERS
Список фильтров, применяемых к каждому файлу из опций «Файлы» или «Каталоги».
Параметры конфигурации могут быть определены либо через аргумент, либо через переменную окружения, но не через оба параметра одновременно. Если указаны оба параметра, приоритет имеет аргумент, а переменная окружения игнорируется. Обычно рекомендуется использовать переменную окружения, если вы используете контейнер, так как это позволит вам легче выполнять другие команды из контекста контейнера.
Запуск контейнера с файлом конфигурации
docker run authelia/authelia:latest authelia --config configuration.yml
docker run -d authelia/authelia:latest authelia --config configuration.yml --config config-acl.yml --config config-other.yml
docker run -d authelia/authelia:latest authelia --config configuration.yml,config-acl.yml,config-other.yml
По умолчанию контейнер ищет файл конфигурации по адресу /config/configuration.yml
docker run -d --volume /path/to/config:/config authelia:authelia:latest authelia --config=/config/configuration.yml --config=/config/configuration.acl.yml
Существуют файловые фильтры, которые позволяют изменять все конфигурационные файлы после их чтения из файловой системы, но до разбора их содержимого. Если эти фильтры не указаны явно, они НЕ подпадают под действие нашей стандартной политики версионирования.
Наступит момент, когда:
Имя аргумента CLI изменится (мы рекомендуем использовать переменную окружения, которая этого не сделает)
Фильтры настраиваются как список имен фильтров с помощью аргумента CLI –config.experimental.filters и переменной окружения X_AUTHELIA_CONFIG_FILTERS. Мы рекомендуем использовать переменную окружения, так как это гарантирует, что команды, выполняемые из контейнера, используют одни и те же фильтры, и, скорее всего, это постоянное значение, в то время как аргумент может меняться. Если используется и аргумент CLI, и переменная окружения, то переменная окружения полностью игнорируется.
Фильтры могут использоваться самостоятельно, в комбинации или вообще не использоваться. Фильтры обрабатываются в порядке их определения. Вы можете просмотреть вывод YAML-файлов при обработке с помощью фильтров, используя команду authelia config template.
docker run -d authelia/authelia:latest authelia --config /config/configuration.yml --config.experimental.filters template
docker run -d -e X_AUTHELIA_CONFIG_FILTERS=template -e X_AUTHELIA_CONFIG=/config/configuration.yml authelia/authelia:latest authelia
Переменные окружения должны иметь префикс AUTHELIA_. Все переменные окружения, начинающиеся с этого префикса, должны быть предназначены для конфигурации. Любые переменные окружения, имеющие этот префикс и не предназначенные для конфигурации, скорее всего, приведут к ошибке или, что еще хуже, к неправильной конфигурации.
Синтаксис переменных
Переменные окружения должны иметь префикс AUTHELIA_. Все переменные окружения, начинающиеся с этого префикса, должны быть предназначены для конфигурации. Любые переменные окружения, имеющие этот префикс и не предназначенные для конфигурации, скорее всего, приведут к ошибке или, что еще хуже, к неправильной конфигурации.
Mapping
Параметры конфигурации сопоставляются по их имени. Уровни отступа / подклавиши заменяются символами подчеркивания.
Этот параметр управляет интервалом, через который обновляются данные из бэкэнда. В порядке важности обновляются такие данные, как группы, адрес электронной почты и отображаемое имя. Это особенно полезно для файлового провайдера, когда часы включены или вообще включены в LDAP-провайдере.
В дополнение к значениям длительности этот параметр принимает значения always и disable; при этом always будет всегда обновлять это значение, а disable - никогда не обновлять профиль.
password_reset
disable
Этот параметр определяет, могут ли пользователи сбрасывать свой пароль через веб-фронтенд или нет.
custom_url
Пользовательский URL-адрес сброса пароля. Он заменяет встроенную функцию сброса пароля и отключает конечные точки, если он настроен на что-либо, кроме “ничего” или пустой строки.
password_change
disable
Этот параметр определяет, могут ли пользователи изменять свой пароль через веб-фронтенд или нет.
file
Поставщик аутентификации файлов.
ldap
Поставщик аутентификации LDAP.
3.3.3.2 - LDAP
Этот раздел предназначен для примера конфигурации, чтобы помочь пользователям получить примерное представление о контекстном расположении этого раздела конфигурации.
URL-адрес LDAP, состоящий из схемы, имени хоста и порта. Формат - [<схема>://]<имя хоста>[:<порт>]. По умолчанию используется схема ldapi, если путь абсолютный, иначе - ldaps, а допустимыми схемами являются ldap, ldaps или ldapi (сокет домена unix).
Если схема ldapi, то за ней должен следовать абсолютный путь к существующему сокету домена unix, для доступа к которому у пользователя/группы, от имени которой запущен процесс Authelia, есть соответствующие разрешения. Например, если сокет расположен по адресу /var/run/slapd.sock, то адрес должен быть ldapi:///var/run/slapd.sock.
Тайм-аут для набора номера при подключении к LDAP.
start_tls
Включает использование процесса LDAP StartTLS, который не часто используется. Настраивать его следует только в том случае, если вы знаете, что он вам нужен. Первоначальное соединение будет осуществляться через обычный текст, и Authelia попытается обновить его с помощью LDAP-сервера. URL-адреса LDAPS немного более безопасны.
tls
Если эта опция определена, она управляет параметрами проверки TLS-соединений для LDAP-сервера.
По умолчанию Authelia использует системный сертификат доверия для проверки TLS-сертификатов TLS-соединений, а глобальная опция certificates_directory может быть использована для дополнения этого параметра.
pooling
enable
Включает функцию объединения соединений.
count
Количество открытых соединений, которые должны быть доступны в пуле в любой момент времени.
retries
Количество попыток получить свободное соединение, предпринятых в течение периода таймаута. Это эффективно разбивает таймаут на части.
timeout
Время, в течение которого мы ждем, пока соединение освободится в пуле, прежде чем сдаться и выдать ошибку.
base_dn
Устанавливает базовый контейнер отличительных имен для всех LDAP-запросов. Если ваш LDAP-домен rabrain.ru, то обычно это DC=rabrain,DC=ru, однако вы можете настроить его более точно, например, чтобы включить только объекты внутри OU authelia: OU=authelia,DC=rabrain,DC=ru. К этому приставке добавляется additional_users_dn для поиска пользователей и additional_groups_dn для поиска групп.
users_filter
Фильтр LDAP, позволяющий сузить круг пользователей. Это важно установить правильно, чтобы исключить пользователей с ограниченными возможностями.
additional_groups_dn
Аналогично additional_users_dn, но применяется к групповому поиску.
groups_filter
Аналогичен фильтру users_filter, но применяется к поиску по группам. Чтобы включить в поиск группы, в которых участник не является непосредственным членом, но является членом другой группы, которая является членом этих групп (т. е. рекурсивные группы)
Разрешает следовать за рефералами. Это полезно, если в вашей архитектуре есть серверы, доступные только для чтения, и поэтому требуется, чтобы при выполнении операций записи ссылки выполнялись.
user
Отличительное имя пользователя в паре с паролем для привязки к операциям поиска и смены пароля.
password
Пароль, связанный с пользователем, используемый для привязки к LDAP-серверу для операций поиска и смены пароля.
attributes
Следующие параметры настраивают сопоставление атрибутов сервера каталогов.
distinguished_name
Атрибут сервера каталогов, содержащий отличительное имя, в основном используется для выполнения фильтрованного поиска. Существует четкое различие между реальным отличительным именем и атрибутом отличительного имени, все каталоги имеют отличительные имена для объектов, но не все имеют атрибут, представляющий это имя, по которому можно осуществлять поиск.
Единственная известная поддержка на данный момент - это Active Directory.
user name
Атрибут сервера каталогов, который сопоставляется с именем пользователя в Authelia. Он должен содержать заполнитель {username_attribute}.
display_name
Атрибут сервера каталогов для извлечения, который отображается в веб-интерфейсе для пользователя при входе в систему.
Дополнительные атрибуты для загрузки с сервера каталогов. Эти дополнительные атрибуты могут использоваться в других областях Authelia, таких как OpenID Connect 1.0.
Ключ представляет собой имя атрибута бэкэнда и по умолчанию является именем атрибута в Authelia.
В приведенном ниже примере мы загружаем атрибут сервера каталогов exampleServerAttribute в атрибут Authelia example_authelia_attribute, рассматривая его как однозначный атрибут, имеющий базовый тип integer.
Рекомендуется использовать интервал обновления по умолчанию или настроить его на достаточно низкое значение, чтобы обновлять группы пользователей и их статус (удалены, отключены и т. д.) для адекватной защиты вашей среды.
3.3.3.3 - Файлы конфигурации
Этот раздел предназначен для примера конфигурации, чтобы помочь пользователям получить примерное представление о контекстном расположении этого раздела конфигурации, но не для объяснения опций.
Путь к файлу со списком сведений о пользователе. Поддерживаются типы файлов: YAML-файл
watch
Позволяет перезагрузить базу данных, наблюдая за ее изменениями.
search
Функциональные возможности поиска по имени пользователя.
email
Позволяет пользователям входить в систему, используя свой адрес электронной почты. Если эта функция включена, два пользователя не должны иметь одинаковые адреса электронной почты, а их имена пользователей не должны быть адресами электронной почты.
extra_attributes
Дополнительные атрибуты для загрузки с сервера каталогов.
Ключ представляет собой имя атрибута бэкэнда. База данных будет проверена с учетом конфигурации multi_valued и value_type.
В приведенном ниже примере мы загружаем атрибут сервера каталогов example_file_attribute в атрибут Authelia example_file_attribute, рассматривая его как однозначный атрибут, имеющий базовый тип integer.
Управляет алгоритмом хэширования, используемым для хэширования новых паролей. Значение должно быть одним из:
argon2 для алгоритма Argon2
scrypt для алгоритма Scrypt
pbkdf2 для алгоритма PBKDF2
sha2crypt для алгоритма SHA2Crypt
bcrypt для алгоритма Bcrypt.
argon2
Реализация алгоритма Argon2. Это один из единственных алгоритмов, который был разработан исключительно для хеширования паролей, и впоследствии является одним из лучших алгоритмов для обеспечения безопасности на сегодняшний день.
scrypt
Реализация алгоритма Scrypt.
pbkdf2
Реализация алгоритма PBKDF2.
sha2crypt
Реализация алгоритма SHA2 Crypt.
bcrypt
Реализация алгоритма Bcrypt.
3.3.4 - Двухфакторная аутентификация
Одноразовый пароль
Authelia поддерживает настройку одноразовых паролей, основанных на времени.
Ключ безопасности
Authelia поддерживает настройку ключей безопасности WebAuthn.
Mobile Push
Authelia поддерживает настройку Duo для предоставления мобильного push-сервиса.
3.3.4.1 - Мобильные устройства
Authelia поддерживает мобильные push-уведомления, основанные на Duo.
Отключает Duo. Если имена хостов, integration_key и secret_key являются пустыми строками или не определены, это значение автоматически становится истинным.
hostname
Имя хоста API Duo. Он указывается на панели управления Duo.
integration_key
Не секретный ключ интеграции Duo. Аналогичен идентификатору клиента. Он указывается на панели управления Duo.
secret_key
Секретный ключ Duo, используемый для проверки подлинности вашего приложения. Он предоставляется на панели управления Duo.
enable_self_enrollment
Позволяет самостоятельно регистрировать устройства Duo на портале Authelia.
3.3.4.2 - Time-based One-Time Password
Метод OTP, который использует Authelia, - это алгоритм одноразовых паролей на основе времени (TOTP) RFC6238, который является расширением алгоритма одноразовых паролей на основе HMAC (HOTP) RFC4226.
Это отключает одноразовый пароль (TOTP), если установлено значение true.
issuer
Приложения, генерирующие одноразовые пароли, основанные на времени, обычно отображают эмитента, чтобы отличить приложения, зарегистрированные пользователем.
Authelia позволяет настраивать эмитента, чтобы отличить запись, созданную Authelia, от других.
algorithm
Алгоритм, используемый для ключа TOTP.
Возможные значения:
sha1
sha256
sha512
Изменение этого значения влияет только на вновь зарегистрированные ключи TOTP.
digits
Количество цифр, которые пользователь должен ввести для аутентификации. Обычно не рекомендуется изменять этот параметр, поскольку многие TOTP-приложения не поддерживают ничего, кроме 6. Хуже того, некоторые TOTP-приложения позволяют добавить ключ, но не используют правильное количество цифр, указанное в ключе.
Правильные значения - 6 или 8.
period
Период времени в секундах между поворотами клавиш или временной элемент TOTP.
Рекомендуется держать это значение равным 30, минимальное значение - 15.
skew
Количество временных одноразовых паролей по обе стороны от текущего действующего временного одноразового пароля, которые также должны считаться действительными. Значение по умолчанию 1 приводит к 3 действительным одноразовым паролям на основе времени. При значении 2 их будет 5.
secret_size
Длина в байтах генерируемых общих секретов. Минимальное значение - 20 (или 160 бит), а по умолчанию - 32 (или 256 бит).
allowed_algorithms
Аналогичен алгоритму с теми же ограничениями, за исключением того, что эта опция позволяет пользователям выбирать из этого списка. Этот список всегда будет содержать значение, заданное в опции алгоритма.
disable_reuse_security_policy
Отключает политику, которая предотвращает повторное использование кодов одноразовых паролей, основанных на времени. Это дополнительная мера безопасности, которая предотвращает повторное воспроизведение кодов. Это касается только тех кодов, которые используются в течение срока действия более одного раза.
Регистрация
Когда пользователи впервые регистрируют свое устройство TOTP, текущий эмитент, алгоритм и период используются для генерации ссылки TOTP и QR-кода. Эти значения сохраняются в базе данных для последующих проверок.
Входная валидация
Параметры конфигурации периода и перекоса влияют друг на друга. По умолчанию период равен 30, а перекос - 1.
3.3.4.3 - WebAuthn
WebAuthn (Web Authentication) — это стандарт аутентификации, позволяющий входить на сайты без паролей, используя биометрию (отпечаток пальца, Face ID) или аппаратные ключи безопасности (YubiKey, Titan Key).
Это отключает WebAuthn, если установлено значение true.
enable_passkey_login
Позволяет входить в систему с помощью Passkey вместо имени пользователя и пароля. Такой вход считается только однофакторным. По умолчанию пользователю будет предложено ввести пароль, если запрос требует многофакторной аутентификации.
display_name
Устанавливает отображаемое имя, которое отправляется клиенту для отображения. Отдельные браузеры и, возможно, отдельные операционные системы сами решают, отображать ли эту информацию и каким образом.
Дополнительную информацию см. в документации W3C WebAuthn.
timeout
Это настраивает запрошенное время ожидания для взаимодействия с WebAuthn.
filtering
В этом разделе настраиваются различные параметры фильтрации при регистрации.
selection_criteria
Параметры критериев выбора задают предпочтения для выбора подходящего аутентификатора.
metadata
Настраивает службу метаданных, которая используется для проверки подлинности аутентификаторов.
3.3.5 - Security
Security в Authelia относится к механизмам защиты, которые обеспечивают безопасную аутентификацию и авторизацию пользователей. Authelia — это менеджер аутентификации и авторизации с открытым исходным кодом, который можно интегрировать с обратными прокси (Nginx, Traefik) для защиты веб-приложений
Политика по умолчанию определяет политику, применяемую, если к информации, известной о запросе, не применяется ни один раздел правил. По соображениям безопасности рекомендуется настраивать это значение на отказ. Сайты, которые вы не хотите защищать с помощью Authelia, не должны быть настроены в вашем обратном прокси на выполнение аутентификации с помощью Authelia по соображениям производительности.
rules
Правила имеют множество параметров настройки. Правило совпадает, если все критерии правила соответствуют запросу, за исключением политики, которая применяется к запросу.
Правило определяет две основные вещи:
политика, применяемая при совпадении всех критериев
domain: домен или список доменов, на которые направлен запрос.
domain_regex: regex-форма домена.
resources: шаблон или список шаблонов, которым должен соответствовать путь.
subject: пользователь или группа пользователей, для которых нужно определить политику.
networks: сетевые адреса, диапазоны (нотация CIDR) или группы, из которых исходит запрос.
methods: http-методы, используемые в запросе.
Правило выполняется, если все критерии правила совпадают. Правила оцениваются в последовательном порядке в соответствии с концепцией 1 сопоставления правил.
domain
Требуется: Этот критерий и/или критерий domain_regex являются обязательными.
Этот критерий соответствует имени домена и имеет два способа настройки: в виде одной строки или в виде списка строк. Если это список строк, правило будет соответствовать любому из доменов в списке, совпадающему с доменом запроса. При использовании в сочетании с domain_regex правило будет соответствовать критериям domain или domain_regex.
Требуется: Этот критерий и/или критерий домена являются обязательными.
Этот критерий соответствует имени домена и имеет два способа настройки: в виде одной строки или в виде списка строк. Если это список строк, правило будет соответствовать, когда любой из доменов в списке совпадает с доменом запроса. При использовании в сочетании с domain правило будет соответствовать либо критерию domain, либо критерию domain_regex.
Конкретная политика, которую следует применить к выбранному правилу. Это не критерии для совпадения, это действие, которое нужно предпринять при совпадении.
subject
Этот критерий соответствует идентифицирующим характеристикам субъекта. В настоящее время это либо пользователь, либо группы, к которым он принадлежит. Это позволяет эффективно контролировать, к чему именно имеет доступ каждый пользователь, или требовать двухфакторной аутентификации для определенных пользователей. Субъекты должны быть снабжены следующими префиксами, чтобы соответствовать определенной части субъекта.
Тип subject
Префикс
Описание
User
user:
Сопоставляет имя пользователя.
Group
group:
Определяет, есть ли у пользователя группа с таким именем.
OAuth 2.0 Client
oauth2:client:
Определяет, был ли запрос авторизован с помощью токена, выданного клиентом с указанным идентификатором, использующим тип гранта client_credentials.
Этот критерий соответствует методу запроса HTTP. В первую очередь это полезно при попытке обойти аутентификацию для определенных типов запросов, когда эти запросы могут помешать основной или публичной работе сайта. Например, если вам нужно сделать предварительный CORS-запрос, вы можете применить политику обхода к OPTIONS-запросам.
Важно отметить, что Authelia не может сохранять данные запроса при перенаправлении пользователя.
RFC
Methods
Additional Documentation
RFC7231
GET, HEAD, POST, PUT, DELETE, CONNECT, OPTIONS, TRACE
Эти критерии состоят из списка значений, которые могут быть IP-адресом, диапазоном сетевых адресов в нотации CIDR или именованным определением сети. Он сопоставляет первый адрес в заголовке X-Forwarded-For, или, если их нет, он возвращается к IP-адресу TCP-источника пакета. По этой причине важно правильно настроить прокси-сервер для точного соответствия запросов этим критериям. Примечание: вы можете комбинировать CIDR-сети с правилами псевдонимов по своему усмотрению.
Основное применение этого критерия - настройка требований безопасности ресурса в зависимости от местоположения пользователя. Теоретически вы можете рассматривать конкретную сеть как один из факторов, участвующих в аутентификации, можете запрещать конкретные сети и т. д.
Например, если у вас есть приложение, открытое как в локальных, так и во внешних сетях, вы можете различать эти запросы и применять к каждому из них разные политики. Либо отказывая в доступе, когда пользователь находится во внешних сетях, и разрешая доступ определенным внешним клиентам, а также внутренним клиентам, либо требуя меньших привилегий, когда пользователь находится в локальных сетях.
Этот критерий соответствует пути и запросу запроса с помощью регулярных выражений. Правило выражается в виде списка строк. Если любое из регулярных выражений в списке соответствует запросу, оно считается совпавшим. Полезный инструмент для отладки этих регулярных выражений называется Regex 101 (убедитесь, что вы выбрали опцию Golang).
Критерии запроса - это расширенный критерий, который позволяет настраивать правила, сопоставляющие определенные ключи аргументов запроса с различными правилами. Для базовых нужд рекомендуется использовать правила ресурсов.
Формат этого правила уникален тем, что представляет собой список списков. Логика, лежащая в основе этого формата, позволяет использовать логику ИЛИ и И. Первый уровень списка определяет логику ИЛИ, а второй уровень - логику И. Кроме того, каждый уровень этих списков не обязательно должен быть явно определен.
key
Ключ аргумента запроса для проверки.
value
Значение, по которому будет выполняться проверка. Оно необходимо, если оператор отсутствует или присутствует. Рекомендуется, чтобы это значение всегда заключалось в кавычки, как показано в примерах.
Политика первого подходящего правила в списке определяет политику, применяемую к запросу, если ни одно правило не соответствует запросу, применяется политика по умолчанию (default_policy).
deny
Это политика, применяемая по умолчанию, и именно ее мы рекомендуем использовать по умолчанию для всех установок. Ее действие заключается в том, чтобы буквально запретить пользователю доступ к ресурсу. Кроме того, вы можете использовать эту политику для условного запрета доступа в нужных ситуациях. В качестве примера можно привести запрет доступа к API, в который не встроен механизм аутентификации.
bypass
Эта политика пропускает все проверки подлинности и позволяет любому пользователю использовать ресурс. Эта политика недоступна с правилом, включающим ограничение по субъекту, поскольку минимальный уровень аутентификации, необходимый для получения информации о субъекте, - one_factor.
one_factor
Эта политика требует, чтобы пользователь как минимум успешно выполнил 1FA (имя пользователя и пароль). Это означает, что если пользователь выполнил 2FA, ему будет разрешен доступ к ресурсу.
two_factor
Эта политика требует от пользователя успешного выполнения 2FA. В настоящее время это самый высокий уровень политики аутентификации.
Сопоставление правил
Есть две важные концепции, которые необходимо понимать, когда речь идет о сопоставлении правил.
С помощью команды authelia access-control check-policy можно легко определить, соответствует ли раздел правил управления доступом заданному запросу и почему он не соответствует.
Концепция сопоставления правил 1: последовательный порядок
Правила сопоставляются в последовательном порядке. Первая запись в списке, в которой совпадают все критерии, является правилом, которое применяется. Некоторые критерии правил дополнительно допускают список критериев, когда один из этих критериев в списке соответствует запросу, этот критерий считается подходящим для данного конкретного правила.
Например, следующее правило будет считать запросы на rabrain.ru или любой поддомен rabrain.ru соответствующими, если они имеют путь /api или если они начинаются с /api/. Это означает, что второе правило для app.rabrain.ru не будет рассматриваться, если запрос будет направлен на https://app.rabrain.ru/api, потому что первое правило совпадает с этим запросом.
Концепция соответствия правил 2: Критерии субъекта требуют аутентификации
Правила, содержащие элементы, зависящие от субъекта, требуют аутентификации для определения их соответствия. Поэтому такие правила не должны использоваться с политикой обхода. Критериями, которые содержат элементы, зависящие от субъекта, являются:
Сам критерий субъекта
Критерий domain_regex, когда он содержит именованные группы Regex.
Кроме того, если в правиле есть критерий темы, но все остальные критерии совпадают, пользователь будет немедленно перенаправлен на аутентификацию, если ни одно из предыдущих правил не соответствует запросу в соответствии с концепцией 1 соответствия правил. Это означает, что если у вас есть два одинаковых правила, одно из которых имеет зависимый от темы критерий, а другое является правилом обхода, то правило обхода должно быть первым.
Именованные группы регексов
Некоторые критерии допускают совпадение с именованными группами regex. Эти группы мы принимаем: User и Group
Именованные группы regex представлены синтаксисом (?P\w+), где User - имя группы, а \w+ - шаблон для области шаблона, которая должна быть сравнена со значением совпадения.
Authelia может временно запретить учетные записи, когда происходит слишком много попыток аутентификации на конечной точке имени пользователя / пароля. Это помогает предотвратить атаки методом грубой силы.
Режимы для регулирования. В таблице ниже описан каждый вариант. Рекомендуемый режим - ip. Следует отметить, что независимо от настроенных в данный момент режимов запрета, если в базе данных существуют запреты, пользователю или IP будет отказано в доступе.
Режим
Описание
user
Учетная запись пользователя является объектом любых автоматических запретов
ip
Удаленный ip является объектом любых автоматических запретов
max_retries
Количество неудачных попыток входа в систему, после которых пользователь может быть забанен. Установка этого параметра в 0 полностью отключает регулирование.
find_time
Период времени, анализируемый на предмет неудачных попыток. Например, если вы установили max_retries в 3, а find_time в 2m, это означает, что у пользователя должно быть 3 неудачных входа в систему за 2 минуты.
ban_time
Период времени, на который пользователь будет заблокирован после выполнения настроек max_retries и find_time. По истечении этого срока пользователь сможет снова войти в систему.
В этом разделе можно включить стандартные политики безопасности.
enabled
Включает стандартную политику паролей.
min_length
Определяет минимально допустимую длину пароля.
max_length
Определяет максимально допустимую длину пароля.
require_uppercase
Указывает, что в пароле должна быть указана хотя бы одна буква UPPERCASE.
require_lowercase
Указывает, что в пароле должна быть указана хотя бы одна строчная буква.
require_number
Указывает, что в пароле должна быть указана хотя бы одна цифра.
require_special
Указывает, что в пароле должен быть указан хотя бы один специальный символ.
zxcvbn
Эта политика паролей включает расширенный учет надежности паролей с помощью zxcvbn.
Обратите внимание, что данная политика паролей не ограничивает вход пользователя, а лишь предоставляет ему информацию о том, насколько надежным является его пароль.
enabled
Включает политику паролей zxcvbn.
min_score
Настраивает минимальный балл zxcvbn, допустимый для новых паролей. В системе баллов zxcvbn существует 5 уровней (взято с github.com/dropbox/zxcvbn):
оценка 0: слишком угадываемый: рискованный пароль (угадываний < 10^3)
оценка 1: очень угадываемый: защита от дросселированных онлайн-атак (угадываний < 10^6)
оценка 2: несколько угадываемый: защита от недросселированных онлайн-атак. (угадываний < 10^8)
оценка 3: надежно не угадывается: умеренная защита от сценария медленного хэширования в автономном режиме. (угадываний < 10^10)
оценка 4: очень неугадываемо: сильная защита от сценария медленного хэширования в автономном режиме. (guesses >= 10^10)
Мы не допускаем оценку 0, если вы установите значение min_score равным 0, вместо него будет использоваться значение по умолчанию.
3.3.6 - Проверка входа
Как выполняется проверка личности при входе в систему
Elevated Session, которая не позволяет вошедшему в систему пользователю выполнять привилегированные действия без предварительного подтверждения своей личности.
Reset Password — Сброс пароля, который не позволяет анонимному пользователю выполнить сброс пароля для пользователя без предварительного подтверждения его личности.
3.3.6.1 - Elevated Session
Elevated Session (Повышенная сессия) — это механизм безопасности в Authelia, который требует дополнительной проверки личности пользователя при выполнении критически важных действий, связанных с безопасностью аккаунта.
Elevated Session (Повышенная сессия) — это механизм безопасности в Authelia, который требует дополнительной проверки личности пользователя при выполнении критически важных действий, связанных с безопасностью аккаунта. Это предотвращает несанкционированные изменения, даже если злоумышленник получил доступ к сессии пользователя.
Как это работает?
Пользователь пытается выполнить важное действие, например:
Смена пароля
Настройка 2FA (TOTP, WebAuthn)
Изменение email или других персональных данных
Доступ к критическим разделам
Authelia запрашивает повторную аутентификацию:
Ввод пароля
Подтверждение через 2FA (если включено)
Проверка биометрии (для WebAuthn)
Создается “повышенная сессия” на ограниченное время (по умолчанию — 5 минут), в течение которой пользователь может выполнять защищенные действия.
Срок действия случайно сгенерированного одноразового кода, после которого он считается недействительным
elevation_lifespan
Время жизни возвышения после первоначальной проверки одноразового кода до истечения срока его действия.
characters
Количество символов в случайном одноразовом коде. Максимальное значение на данный момент составляет 20, но мы рекомендуем держать его в диапазоне от 8 до 12. Уменьшать значение ниже 8 крайне не рекомендуется.
require_second_factor
Требуется аутентификация по второму фактору для всех защищенных действий в дополнение к повышенному сеансу, если пользователь настроил метод аутентификации по второму фактору.
skip_second_factor
Пропускает требование повышенной сессии, если пользователь выполнил аутентификацию по второму фактору. Можно комбинировать с параметром require_second_factor, чтобы всегда (и только) требовать аутентификацию по второму фактору.
3.3.6.2 - Reset password
Функция Reset Password в Authelia предназначена для безопасного восстановления доступа к аккаунту, если пользователь забыл пароль.
Основное назначение
Позволяет пользователям самостоятельно сбросить пароль без вмешательства администратора.
Альтернатива ручному сбросу через базу данных или LDAP.
Интегрируется с email-уведомлениями для подтверждения личности.
Как это работает?
Пользователь нажимает “Забыли пароль?” на странице входа.
Authelia отправляет письмо с уникальной ссылкой для сброса (JWT-токен с ограниченным сроком действия).
При переходе по ссылке открывается форма ввода нового пароля.
После подтверждения пароль изменяется в выбранном бэкенде (LDAP, MySQL, PostgreSQL и т.д.).
Секрет, используемый алгоритмом HMAC для подписи JWT. Это значение должно представлять собой произвольную случайную строку с печатаемыми символами ASCII.
Настоятельно рекомендуется, чтобы это была случайная буквенно-цифровая строка из 64 или более символов.
jwt_lifespan
Время жизни JSON Web Token после его первоначальной генерации, по истечении которого он считается недействительным.
jwt_algorithm
Алгоритм JSON Web Token, используемый для подписи JWT. Должен быть HS256, HS384 или HS512.
3.3.7 - Seccion
Режим Session в Authelia отвечает за управление сессионными куками, которые используются для авторизации пользователей на защищенных ресурсах.
Основная задача
Режим Session контролирует:
Создание и валидацию сессионных кук после успешной аутентификации.
Домены, для которых Authelia может выдавать авторизационные куки.
Параметры безопасности кук (время жизни, HTTPS-only, SameSite и др.).
В настоящее время существует два провайдера для хранения сессий (три, если считать Redis Sentinel отдельным провайдером):
Memory (по умолчанию, с состоянием, без дополнительной настройки)
Redis (без состояния).
Redis Sentinel (без статических данных, высокая доступность).
Kubernetes
Kubernetes или High Availability
Важно отметить, что при выборе провайдера не рекомендуется использовать провайдеров с функцией stateless в сценариях High Availability, таких как Kubernetes. Рядом с каждым провайдером есть примечание, указывающее, является ли он государственным или нестационарным, рекомендуется использовать нестационарные провайдеры.
Опции
name
Значение имени по умолчанию для всех конфигураций cookies.
same_site
Значение same_site по умолчанию для всех конфигураций cookies.
inactivity
Значение бездействия по умолчанию для всех конфигураций cookies.
expiration
Значение срока действия по умолчанию для всех конфигураций cookies.
remember_me
Значение remember_me по умолчанию для всех конфигураций cookies.
cookies
Список определенных доменов cookie, которые Authelia настроена обрабатывать. Домены, не настроенные должным образом, будут автоматически отклоняться Authelia. Список позволяет администраторам определить несколько конфигураций доменов cookie сеанса с индивидуальными настройками.
domain
Домен, для защиты которого назначается сессионный cookie. Он должен совпадать с доменом, на котором обслуживается Authelia, или корнем домена, и, следовательно, если настроен authelia_url, должен иметь возможность читать и записывать куки для этого домена.
Например, если Authelia доступна по URL https://auth.rabrain.ru, домен должен быть либо auth.rabrain.ru, либо rabrain.ru.
Значение не должно совпадать с доменом из списка публичных суффиксов, поскольку браузеры не разрешают веб-сайтам записывать файлы cookie для таких доменов. Это касается большинства служб динамического DNS, таких как duckdns.org. Вы должны использовать свой домен вместо duckdns.org для этого значения, например example.duckdns.org.
Следовательно, если у вас есть example.duckdns.org и example-auth.duckdns.org, вы не сможете обмениваться файлами cookie между этими доменами.
authelia_url
Это обязательный URL, который является корневым URL вашей установки Authelia для этого домена cookie, который может быть использован для создания соответствующего URL перенаправления, когда требуется аутентификация. Этот URL должен:
Уметь читать и записывать файлы cookie для настроенного домена.
Соответствующий параметр запроса или заголовок для соответствующего прокси может отменить это поведение.
default_redirection_url
Это совершенно необязательный URL, который используется в качестве места перенаправления при прямом посещении Authelia. Эта опция отменяет глобальную опцию default_redirection_url.
name
Значение по умолчанию: Этот параметр принимает значение по умолчанию из настройки имени, приведенной выше.
Имя куки сеанса. По умолчанию устанавливается значение имени в основном разделе конфигурации сеанса.
same_site
Значение по умолчанию: Этот параметр принимает значение по умолчанию из настройки same_site, указанной выше.
Устанавливает значение cookies SameSite. До появления этого параметра по умолчанию было установлено значение None. Новое значение по умолчанию - Lax. Эта опция задается в нижнем регистре. Поэтому, например, если вы хотите установить значение Strict, то в конфигурации оно должно быть строгим.
Подробно о куках SameSite можно прочитать в MDN. Короче говоря, установка SameSite в значение Lax является наиболее предпочтительным вариантом для Authelia. None не рекомендуется, если только вы не знаете, что делаете, и не доверяете всем защищенным приложениям. Strict не будет работать во многих случаях, и мы не тестировали его в этом состоянии, но в любом случае он доступен как опция.
inactivity
Значение по умолчанию: Этот параметр принимает значение по умолчанию из настройки бездействия, приведенной выше.
Период времени, в течение которого пользователь может быть неактивен, пока сессия не будет уничтожена. Пригодится, если вам нужны длительные таймеры сеансов, но вы не хотите, чтобы неиспользуемые устройства были уязвимы.
expiration
Значение по умолчанию: Этот параметр принимает значение по умолчанию из настройки истечения срока действия, указанной выше.
Период времени до истечения срока действия cookie и уничтожения сессии. Это значение переопределяется параметром remember_me, если установлен флажок remember me.
remember_me
Значение по умолчанию: Этот параметр принимает значение по умолчанию из настройки remember_me, указанной выше.
Период времени до истечения срока действия куки и уничтожения сессии, когда установлен флажок remember me. Установка значения -1 полностью отключает эту функцию для данного домена сессионных cookie.
3.3.7.2 - Redis
Redis в Authelia решает ключевую проблему — делает систему статус-независимой (stateless) и обеспечивает высокую доступность (HA).
Проблема стандартного режима (In-Memory)
По умолчанию Authelia хранит сессии в оперативной памяти (in-memory). Это приводит к:
Потере сессий при перезагрузке Authelia.
Невозможности масштабирования (если запущено несколько экземпляров Authelia, сессии не синхронизируются).
Риску отказа — при падении сервера все пользователи разлогиниваются.
Как Redis решает эти проблемы?
Проблема
Решение через Redis
Потеря сессий при перезагрузке
Сессии хранятся на внешнем сервере и сохраняются после рестарта
Несколько экземпляров Authelia
Все ноды читают/пишут сессии в единое хранилище
Высокая нагрузка
Redis оптимизирован для частых операций чтения/записи
Конфигурация
session:redis:host:'127.0.0.1'port:6379timeout:'5s'max_retries:0username:'authelia'password:'authelia'database_index:0maximum_active_connections:8minimum_idle_connections:0tls:server_name:'myredis.rabrain.ru'skip_verify:falseminimum_version:'TLS1.2'maximum_version:'TLS1.3'certificate_chain:| -----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----private_key:| -----BEGIN PRIVATE KEY-----
...
-----END PRIVATE KEY-----high_availability:sentinel_name:'mysentinel'# If `sentinel_username` is supplied, Authelia will connect using ACL-based# authentication. Otherwise, it will use traditional `requirepass` auth.sentinel_username:'sentinel_user'sentinel_password:'sentinel_specific_pass'nodes:- host:'sentinel-node1'port:26379- host:'sentinel-node2'port:26379route_by_latency:falseroute_randomly:false
Опции
host
Хост redis или путь к сокету unix. Если используется буквенный адрес IPv6, он должен быть заключен в квадратные скобки и взят в кавычки:
host:'[fd00:1111:2222:3333::1]'
timeout
Таймаут соединения с Redis.
max_retries
Максимальное количество повторных попыток при неудачной команде. Установка этого параметра в 0 полностью отключает повторные попытки.
port
Порт, на котором прослушивается Redis.
username
Имя пользователя для аутентификации в redis. Поддерживается только в redis 6.0+, и в настоящее время redis предлагает обратную совместимость с аутентификацией только по паролю. Вероятно, вам не нужно задавать это значение, если вы не проходили через процесс настройки ACL redis.
password
Пароль для аутентификации в Redis.
Настоятельно рекомендуется, чтобы это была случайная буквенно-цифровая строка из 64 или более символов, и пароль пользователя был изменен на это значение.
database_index
Номер индекса базы данных redis, то же значение, что и в команде redis SELECT.
maximum_active_connections
Максимальное количество соединений, открытых к redis в одно и то же время.
minimum_idle_connections
Минимальное количество соединений redis, которые следует держать открытыми, пока они не превышают максимальное количество активных соединений. Это полезно, если возникают большие задержки при установлении соединений.
tls
Если определено, включает соединение через TLS-сокет и дополнительно управляет параметрами проверки TLS-соединения для сервера redis.
По умолчанию Authelia использует системный сертификат доверия для проверки TLS-соединений, а глобальная опция certificates_directory может быть использована для дополнения этого параметра.
high_availability
При определении этой сессии включается соединение с redis sentinel. Возможно, в будущем мы добавим кластер redis.
sentinel_name
Имя ведущего сервера redis sentinel. Оно задается в конфигурации redis sentinel, это не имя хоста. Для конфигурации высокой доступности оно должно быть определено в данный момент.
sentinel_username
Имя пользователя для подключения к Redis Sentinel. Если оно указано, оно будет использоваться вместе с паролем sentinel_password для аутентификации на основе ACL для Redis Sentinel. Если указан только пароль, соединение с Redis Sentinel будет аутентифицировано с помощью традиционной аутентификации requirepass.
sentinel_password
Пароль для подключения к Redis Sentinel. Если указан с именем sentinel_username, Authelia настраивает аутентификацию на Redis Sentinel с помощью аутентификации на основе ACL. В противном случае используется аутентификация по requirepass.
Настоятельно рекомендуется, чтобы это была случайная буквенно-цифровая строка из 64 или более символов, и пароль пользователя был изменен на это значение.
nodes
Список узлов redis sentinel для балансировки нагрузки. Этот список добавляется к хосту в разделе redis выше. Необходимо определить либо хост redis, либо один сентинел-узел redis. Хост redis должен быть узлом redis sentinel, а не обычным узлом. Отдельные узлы redis определяются с помощью команд redis sentinel.
- host:redis-sentinel-0port:26379
host
Хост этого узла redis sentinel.
port
Порт этого узла redis sentinel.
route_by_latency
Приоритет отдается узлам redis sentinel с низкой задержкой, если установлено значение true.
route_randomly
Случайным образом выбирает узлы redis sentinel, если установлено значение true.
3.3.8 - Storage Хранилище данных
Storage (хранилище) в Authelia — это централизованное место для хранения критически важных данных, необходимых для работы системы.
Какие данные хранятся?
Тип данных
Примеры
Важность
Настройки пользователей
Выбранная тема, язык интерфейса
Низкая
2FA-данные
TOTP-секреты, ключи WebAuthn
Высокая
Журналы аутентификации
Входы, попытки сброса пароля
Средняя
OAuth2-данные
Токены, authorization codes
Высокая
Сессии (если не используется Redis)
Активные сеансы пользователей
Высокая
Поддерживаемые хранилища
Authelia работает с такими базами данных:
Хранилище
Когда выбирать
Особенности
PostgreSQL
Production-среда
Высокая производительность, поддержка сложных запросов
Ключ шифрования, используемый для шифрования данных в базе данных. Мы шифруем данные, создавая контрольную сумму sha256 из указанного значения, и используем ее для шифрования данных с помощью 256-битного алгоритма AES-GCM.
Минимальная длина этого ключа - 20 символов.
Настоятельно рекомендуется, чтобы это была случайная буквенно-цифровая строка из 64 или более символов.
3.3.8.1 - PostgreSQL
PostgreSQL в Authelia выполняет роль основного хранилища данных, обеспечивая безопасное сохранение критически важной информации.
-- Пример данных в PostgreSQL:
SELECT*FROMtotp_secretsWHEREusername='user@example.com';
Аудит безопасности
Логи входов (authentication_logs)
Попытки сброса пароля (identity_verification)
Масштабируемость
Поддержка репликации для отказоустойчивости
Возможность распределенной установки с несколькими нодами Authelia
Опции
encryption_key
Ключ шифрования, используемый для шифрования данных в базе данных. Мы шифруем данные, создавая контрольную сумму sha256 из указанного значения, и используем ее для шифрования данных с помощью 256-битного алгоритма AES-GCM.
Минимальная длина этого ключа - 20 символов.
Настоятельно рекомендуется, чтобы это была случайная буквенно-цифровая строка из 64 или более символов.
address
Настраивает адрес для сервера PostgreSQL. Сам адрес является коннектором, а схема должна быть либо схемой unix, либо одной из схем tcp.
Здесь указывается список дополнительных резервных экземпляров PostgreSQL, которые будут использоваться в случае возникновения проблем с основным экземпляром, настроенным с помощью опций address и tls.
У каждого экземпляра сервера есть опции address и tls, которые имеют одинаковые требования и влияние, а также одинаковый синтаксис конфигурации. Это означает, что все остальные настройки, включая базу данных, схему, имя пользователя и пароль, должны быть такими же, как у основного экземпляра, и полностью реплицироваться.
Имя базы данных на сервере баз данных, к которой назначенный пользователь имеет доступ для работы с Authelia.
schema
Имя схемы базы данных, используемой на сервере базы данных, к которому назначенный пользователь имеет доступ для Authelia. По умолчанию это публичная схема.
username
Имя пользователя в паре с паролем, используемые для подключения к базе данных.
password
Пароль, связанный с именем пользователя, используемым для подключения к базе данных.
Настоятельно рекомендуется, чтобы это была случайная буквенно-цифровая строка из 64 или более символов, и пароль пользователя был изменен на это значение.
timeout
Таймаут соединения SQL.
tls
Если этот параметр определен, он включает соединение через сокет TLS и дополнительно управляет параметрами проверки TLS-соединения для сервера PostgreSQL.
По умолчанию Authelia использует системный сертификат доверия для проверки TLS-соединений, а глобальная опция certificates_directory может быть использована для дополнения этого параметра.
3.3.8.2 - SQLite3
Если у вас нет SQL-сервера, вы можете использовать SQLite. Однако учтите, что при такой настройке вы не сможете запустить несколько экземпляров Authelia, поскольку база данных будет находиться в локальном файле.
Использование этого провайдера хранилища делает Authelia доступной для состояния. В сценариях высокой доступности важно использовать один из других провайдеров, и мы настоятельно рекомендуем использовать его в производственных средах, но это потребует от вас установки внешней базы данных, например PostgreSQL.
Ключ шифрования, используемый для шифрования данных в базе данных. Мы шифруем данные, создавая контрольную сумму sha256 из указанного значения, и используем ее для шифрования данных с помощью 256-битного алгоритма AES-GCM.
Минимальная длина этого ключа - 20 символов.
Настоятельно рекомендуется, чтобы это была случайная буквенно-цифровая строка из 64 или более символов.
path
Путь, по которому будет храниться файл базы данных SQLite3. Он будет создан, если файл не существует.
3.3.8.3 - MySQL
MySQL в Authelia выполняет роль основного хранилища данных, обеспечивая безопасное сохранение критически важной информации.
Ключ шифрования, используемый для шифрования данных в базе данных. Мы шифруем данные, создавая контрольную сумму sha256 из указанного значения, и используем ее для шифрования данных с помощью 256-битного алгоритма AES-GCM.
Минимальная длина этого ключа - 20 символов.
Настоятельно рекомендуется, чтобы это была случайная буквенно-цифровая строка из 64 или более символов.
address
Настраивает адрес для сервера PostgreSQL. Сам адрес является коннектором, а схема должна быть либо схемой unix, либо одной из схем tcp.
Имя базы данных на сервере баз данных, к которой назначенный пользователь имеет доступ для работы с Authelia.
username
Имя пользователя в паре с паролем, используемые для подключения к базе данных.
password
Пароль, связанный с именем пользователя, используемым для подключения к базе данных.
Настоятельно рекомендуется, чтобы это была случайная буквенно-цифровая строка из 64 или более символов, и пароль пользователя был изменен на это значение.
timeout
Таймаут соединения SQL.
tls
Если этот параметр определен, он включает соединение через сокет TLS и дополнительно управляет параметрами проверки TLS-соединения для сервера MySQL.
По умолчанию Authelia использует системный сертификат доверия для проверки TLS-соединений, а глобальная опция certificates_directory может быть использована для дополнения этого параметра.
3.3.9 - Notifications (Уведомления)
Функция Notifications (Уведомления) в Authelia отвечает за отправку сообщений пользователям для подтверждения их личности и критически важных действий. Это ключевой компонент безопасности, обеспечивающий защиту от несанкционированного доступа.
Основные цели
Верификация пользователя: Подтверждение email/телефона при регистрации или сбросе пароля.
Безопасность: Уведомления о подозрительных действиях (например, вход с нового устройства).
Восстановление доступа: Отправка временных кодов для сброса пароля или 2FA.
В уведомлении предусмотрена проверка запуска, которая проверяет правильность конфигурации указанного провайдера и возможность отправки писем. Эту проверку можно отключить с помощью опции disable_startup_check.
template_path
Этот параметр позволяет администратору указать путь к каталогу, в котором будут находиться пользовательские шаблоны уведомлений.
3.3.9.1 - SMTP
SMTP (Simple Mail Transfer Protocol) в Authelia используется для отправки email-уведомлений пользователям.
Назначение SMTP
Верификации пользователей
Отправка ссылок для сброса пароля
Подтверждение email при регистрации
Коды для двухфакторной аутентификации (2FA)
Безопасности
Уведомления о подозрительных действиях (например, вход с нового устройства)
Настройка адреса для SMTP-сервера. Сам адрес является коннектором, а схема должна быть smtp, submission или submissions. Единственное различие между этими схемами заключается в портах по умолчанию, а для отправки требуется транспорт TLS в соответствии с мерами безопасности портов SMTP, в то время как отправка и smtp используют стандартный транспорт TCP и обычно применяют StartTLS.
Имя пользователя, отправляемое для аутентификации на SMTP-сервере. В паре с паролем.
password
Пароль в паре с именем пользователя, отправляемый для аутентификации на SMTP-сервере.
sender
Адрес отправителя используется для создания SMTP-команды MAIL FROM и добавления заголовка FROM. Этот адрес должен быть в формате RFC5322. Это означает, что он должен иметь один из двух форматов:
Команда MAIL FROM, отправляемая SMTP-серверам, не будет включать часть имени, она задается только в FROM в соответствии со спецификациями.
identifier
Имя, которое нужно отправить SMTP-серверу в качестве идентификатора с помощью команды HELO/EHLO. Некоторые SMTP-провайдеры, такие как Google Mail, отклоняют сообщение, если это localhost.
subject
Это тема, которую Authelia будет использовать в электронном письме. В настоящее время она имеет единственный заполнитель {title}, который должен быть включен во все электронные письма, поскольку это внутренний дескриптор содержимого письма.
startup_check_address
При запуске Authelia проверяет действительность SMTP-сервера, одна из проверок требует, чтобы мы спросили SMTP-сервер, может ли он отправить письмо от нас на определенный адрес, и это тот самый адрес. На самом деле никаких писем при этом не отправляется. Можно оставить все как есть, но вы можете настроить это, если у вас возникнут проблемы или вы захотите.
disable_require_tls
В целях безопасности настройки по умолчанию для Authelia требуют, чтобы SMTP-соединение было зашифровано с помощью TLS. Дополнительные сведения см. в разделе Безопасность. Эта опция отключает данную меру (не рекомендуется).
disable_starttls
Некоторые SMTP-серверы игнорируют спецификации SMTP и утверждают, что поддерживают STARTTLS, хотя на самом деле это не так. По соображениям безопасности Authelia отказывается отправлять сообщения на такие серверы. Данная опция отключает эту меру и включается на ВАШ собственный страх и риск.
disable_html_emails
Эта настройка полностью отключает HTML-форматирование писем и отправляет только текстовые сообщения. По умолчанию Authelia отправляет смешанные письма, содержащие как HTML, так и текст, поэтому эта опция редко бывает необходима.
tls
Если эта опция определена, она управляет параметрами проверки TLS-соединения для SMTP-сервера.
По умолчанию Authelia использует системное доверие к сертификатам для проверки TLS-соединений, а глобальная опция certificates_directory может быть использована для дополнения этого параметра.
Using Gmail
notifier:smtp:address:'submission://smtp.gmail.com:587'username:'myaccount@gmail.com'# Password can also be set using a secret: https://www.authelia.com/configuration/methods/secrets/password:'yourapppassword'sender:'admin@rabrain.ru'
3.3.9.2 - File system
Режим File System (файловая система) в разделе уведомлений (notifications) Authelia — это тестовый метод, который записывает уведомления (например, письма для сброса пароля) в файлы вместо реальной отправки.
Для чего используется?
Тестирование шаблонов писем: Проверка внешнего вида email без настройки SMTP.
Отладка логики уведомлений: Анализ содержимого сообщений (токены, ссылки).
Локальная разработка: Когда нет доступа к SMTP-серверу.
Файл, в который нужно добавить текст письма. Если он не существует, он будет создан.
3.3.10 - Telemetry (телеметрия)
Telemetry (телеметрия) в Authelia — это система сбора метрик производительности и состояния системы для мониторинга работы сервера аутентификации. Она помогает администраторам выявлять проблемы и оптимизировать работу Authelia.
Определяет, включен ли Prometheus HTTP Metrics Exporter.
address
Настраивает адрес слушателя для HTTP-сервера Prometheus Metrics Exporter. Адрес сам по себе является слушателем, а схема должна быть либо схемой unix, либо одной из схем tcp.
buffers
Настройка буферов сервера.
timeouts
Настройка тайм-аутов сервера.
3.3.11 - Определения
Раздел определений управляет несколькими определениями, которые могут быть повторно использованы в других областях конфигурации вместо того, чтобы повторять значения в других местах.
3.3.11.1 - Network
Раздел Network в конфигурации Authelia отвечает за сетевые параметры сервера, определяя, как Authelia взаимодействует с клиентами, прокси-серверами и другими компонентами системы. Это критически важные настройки для безопасности и производительности.
Основные функции Network-настроек
Настройка
За что отвечает
Пример значения
Прослушивание интерфейсов
На каких IP и портах доступен сервер
0.0.0.0:9091
Ограничение доверенных прокси
Какие IP могут передавать заголовки аутентификации
Эти определения используются в качестве сетей управления доступом и сетей политики авторизации OpenID Connect 1.0.
Опции
key
Ключ - это имя политики. В приведенном выше примере ключом является network_name, и это значение должно использоваться в других областях конфигурации для ссылки на нее.
value
Значения, представляющие CIDR-нотацию IP-адресов, к которым применяется данное определение. В примере значение представляет собой список, содержащий 192.168.1.0/24, 192.168.2.20, 2001:db8::/32 и 2001:db8:1234:5678::1.
Нотация CIDR (например, 192.168.1.0/24) представляет собой диапазон IP-адресов. Число после косой черты указывает, сколько бит используется для сетевой части. Например, /24 означает, что первые 24 бита фиксированы, а последние 8 бит могут изменяться (что дает 256 возможных адресов). Один IP-адрес, например 192.168.2.20, может быть записан как есть или с /32.
3.3.11.2 - User Attributes
Раздел Атрибуты пользователя позволяет определить пользовательские атрибуты для пользователей с помощью языка Common Expression Language (CEL). Эти атрибуты могут быть использованы в текущий момент времени для Усовершенствования утверждений OpenID Connect 1.0 с динамическими значениями
Конфигурация
definitions:user_attributes:# Boolean attribute exampleis_admin:expression:'"admin" in groups'# String attribute exampledepartment:expression:'groups[0]'# Number attribute exampleaccess_level:expression:'"admin" in groups ? 10 : 5'
Опции
В этом разделе описаны отдельные параметры конфигурации. В настоящее время эти определения атрибутов используются в провайдере OpenID Connect 1.0.
Имя ключа - это имя результирующего атрибута. Важно отметить, что это имя атрибута не должно конфликтовать с дополнительными атрибутами, определенными в бэкенде аутентификации, или с общими атрибутами, которые мы определили.
В приведенном выше примере добавлены следующие атрибуты:
is_admin
department
access_level
expression
Выражение Common Expression Language для этого атрибута.
3.3.12 - Разное
Раздел в который вошло все остальное, которое не вошло в тематические разделы.
По умолчанию Authelia использует системное хранилище сертификатов для проверки сертификатов TLS, но вы можете расширить его с помощью этой опции, которая формирует основу для доверия к TLS-соединениям в Authelia. В большинстве случаев, если не во всех TLS-соединениях, TLS-сертификат сервера проверяется с помощью этого расширенного хранилища доверия сертификатов.
Эта опция задает путь к каталогу, который может содержать один или несколько сертификатов, закодированных в формате X.509 PEM. Сами сертификаты должны иметь расширение .pem, .crt или .cer.
Эти сертификаты могут быть либо открытым ключом ЦС, который доверяет данному сертификату и любому подписанному им сертификату, либо отдельным сертификатом листа.
default_redirection_url
URL перенаправления по умолчанию - это URL, на который перенаправляются пользователи, когда Authelia не может определить целевой URL, на который направлялся пользователь.
В обычном процессе аутентификации пользователь пытается зайти на веб-сайт, и его перенаправляют на портал для входа в систему, чтобы пройти аутентификацию. Поскольку пользователь изначально нацелился на веб-сайт, портал знает, куда он направлялся, и может перенаправить его после процесса аутентификации. Однако, когда пользователь посещает портал регистрации напрямую, портал считает, что целевой веб-сайт - это портал. В этом случае, если настроен URL-адрес перенаправления по умолчанию, пользователь будет перенаправлен на этот URL-адрес. Если он не задан, пользователь не будет перенаправлен после аутентификации.
default_2fa_method
Устанавливает метод второго фактора по умолчанию для пользователей. Это должно быть пустое значение или один из включенных методов. Для новых пользователей по умолчанию будет выбран этот метод. Кроме того, если для пользователя был выбран метод webauthn, а у него был выбран метод totp, и метод totp был отключен в конфигурации, метод пользователя будет автоматически обновлен до метода webauthn.
Варианты:
totp
webauthn
mobile_push
theme
В настоящее время для Authelia доступно 3 темы:
light (по умолчанию)
darck
gray
Чтобы включить автоматическое переключение между темами, вы можете установить для темы значение auto. Тема будет установлена на темную или светлую в зависимости от системных предпочтений пользователя, которые определяются с помощью медиа-запросов.
3.3.12.1 - Server в Authelia
Раздел Server в конфигурации Authelia определяет параметры работы сервера, включая сетевые настройки, безопасность и управление ресурсами. Это основа для развертывания Authelia в production-среде.
Ключевые функции настроек Server
Настройка
Описание
Важность
address
Интерфейс и порт прослушивания
🔥 Критично
tls
Настройки HTTPS (сертификаты)
🔥 Критично
headers
Безопасность HTTP-заголовков
🔐 Высокая
buffers
Оптимизация производительности
⚡ Средняя
timeouts
Защита от DDoS/подвешенных сессий
🛡️ Высокая
endpoints
Управление служебными API
🔧 Опционально
Конфигурация
server:address:'tcp://:9091/'disable_healthcheck:falsetls:key:''certificate:''client_certificates:[]headers:csp_template:''buffers:read:4096write:4096timeouts:read:'6s'write:'6s'idle:'30s'endpoints:enable_pprof:falseenable_expvars:falseauthz:{}## See the dedicated "Server Authz Endpoints" configuration guide.rate_limits:{}## See the dedicated "Server Endpoint Rate Limits" configuration guide.
Детальный разбор параметров
Базовые настройки (address, disable_healthcheck)
server:address:'tcp://0.0.0.0:9091'# Слушать все интерфейсы на порту 9091disable_healthcheck:false# Включить эндпоинт /healthcheck
Зачем:
address: Определяет, откуда можно подключиться к Authelia.
healthcheck: Нужен для мониторинга работы (Kubernetes, Docker Swarm).
buffers:read:4096# Размер буфера чтения (байт)write:4096# Размер буфера записиtimeouts:read:'6s'# Таймаут чтения запросаwrite:'6s'# Таймаут отправки ответаidle:'30s'# Таймаут неактивного соединения
####Зачем:
buffers: Баланс между потреблением RAM и производительностью.
timeouts: Защита от Slowloris-атак и “подвешенных” сессий.
Служебные эндпоинты (endpoints)
endpoints:enable_pprof:false# Отключить debug-эндпоинты (/debug/pprof)enable_expvars:false# Отключить метрики runtime (/debug/vars)authz:{}# Настройки авторизации для APIrate_limits:{}# Лимиты запросов к API
Зачем:
pprof/expvars: Полезны для отладки, но опасны в production.
rate_limits: Защита API от брутфорса.
Пример production-конфигурации
server:address:'tcp://127.0.0.1:9091'# Только локальный доступ + Nginx/Traefiktls:certificate:/etc/letsencrypt/live/example.com/fullchain.pemkey:/etc/letsencrypt/live/example.com/privkey.pemheaders:csp_template:"default-src 'self'; script-src 'none'"timeouts:read:'10s'write:'15s'idle:'1m'
Частые ошибки и решения
Проблема
Решение
Authelia не запускается на порту
Проверьте address и отсутствие конфликта портов (netstat -tulpn)
Ошибки HTTPS (ERR_SSL_PROTOCOL_ERROR)
Убедитесь, что сертификаты не повреждены и имеют права 400
В Authelia параметр Server Authz Endpoints (или server.authz.endpoints) в конфигурации отвечает за настройку авторизационных (authorization) эндпоинтов, которые определяют, какие HTTP-запросы могут быть обработаны и какие политики применяются к ним.
Назначение Server Authz Endpoints
Этот раздел конфигурации позволяет контролировать:
Какие HTTP-методы разрешены (GET, POST, PUT, DELETE и т. д.).
Какие URL-пути защищены (например, /api, /admin).
Какие политики применяются (например, one_factor, two_factor, bypass, deny).
Первый уровень под директивой authz - это имя конечной точки. В примере это имена forward-auth, ext-authz, auth-request и legacy.
Имя коррелирует с путем к конечной точке. Все конечные точки начинаются с /api/authz/ и заканчиваются именем. В примере конечная точка forward-auth имеет полный путь /api/authz/forward-auth.
Допустимыми символами для имени являются буквенно-цифровые символы, а также -, _ и /. Они ДОЛЖНЫ начинаться и заканчиваться буквенно-цифровым символом.
implementation
Базовая реализация для конечной точки. Допустимые значения с учетом регистра: ForwardAuth, ExtAuthz, AuthRequest и Legacy.
authn_strategies
Список стратегий аутентификации и параметров их конфигурации. Эти стратегии расположены по порядку, и используется первая из них, оказавшаяся успешной. В случае отказа, кроме отсутствия в запросе информации, достаточной для выполнения стратегии, аутентификация немедленно прекращается, в противном случае выполняется попытка использования следующей стратегии из списка.
name
Имя стратегии. Допустимые значения с учетом регистра: CookieSession, HeaderAuthorization, HeaderProxyAuthorization, HeaderAuthRequestProxyAuthorization и HeaderLegacy.
schemes
Список схем, разрешенных для этой конечной точки. Варианты: Basic и Bearer. Эта опция применима только к стратегиям HeaderAuthorization, HeaderProxyAuthorization и HeaderAuthRequestProxyAuthorization и недоступна для устаревшей конечной точки, которая использует только Basic.
scheme_basic_cache_lifespan
Время жизни для кэширования комбинаций имени пользователя и пароля при использовании схемы Basic. Эта опция позволяет использовать кэширование, которое по умолчанию полностью отключено. Эта опция должна использоваться только при настройке схемы Basic, и, как и все новые опции, не может использоваться при реализации Legacy.
3.3.12.3 - Server Endpoint Rate Limits
Authelia накладывает ограничения скорости по умолчанию на определенные конечные точки, что позволяет предотвратить потребление клиентами или злоумышленниками слишком большого количества ресурсов или использование брутфорса для потенциального нарушения безопасности.
Включает заданную конфигурацию ограничения скорости. По умолчанию они включены.
buckets
Список отдельных buckets, которые необходимо рассмотреть для каждого запроса.
period
Настраивает период времени, на который распространяется действие токенизированного bucket.
requests
Настраивает количество запросов, к которым применяется токенизированный бакет.
reset_password_start
Настраивает ограничитель скорости, который применяется к конечной точке, инициализирующей поток сброса пароля.
reset_password_finish
Настраивает ограничитель скорости, который применяется к конечным точкам, потребляющим токены для потока сброса пароля.
second_factor_totp
Настраивает ограничитель скорости, который применяется к представлениям кода конечной точки TOTP для потока второго фактора.
second_factor_duo
Настраивает ограничитель скорости, применяемый к конечной точке Duo / Mobile Push, которая инициализирует поток авторизации приложения для потока второго фактора.
session_elevation_start
Настраивает ограничитель скорости, применяемый к конечной точке Elevated Session, которая инициализирует генерацию кода и уведомление для потока elevated session.
session_elevation_finish
Настраивает ограничитель скорости, применяемый к конечной точке Elevated Session, которая потребляет код для потока повышенной сессии.
<divclass="bg-success p-2 text-white">This is default success background</div><divclass="bg-success p-2 text-white bg-opacity-75">This is 75% opacity success background</div><divclass="bg-success p-2 text-dark bg-opacity-50">This is 50% opacity success background</div><divclass="bg-success p-2 text-dark bg-opacity-25">This is 25% opacity success background</div><divclass="bg-success p-2 text-dark bg-opacity-10">This is 10% opacity success background</div>
3.4.2 - Mixins
Mixins в Bootstrap что это и как использовать
Mixins в Bootstrap: что это и как использовать
Mixins (примеси) — это функции в Sass (SCSS), которые позволяют повторно использовать куски кода в CSS. В Bootstrap они используются для генерации готовых стилей (например, сетки, кнопок, утилит) без дублирования кода.
1. Зачем нужны Mixins?
Уменьшают повторение кода — один миксин может генерировать множество вариантов стилей.
Делают код модульным — можно кастомизировать Bootstrap, не правя исходные файлы.
Упрощают создание адаптивных стилей — например, для сетки или отступов.
2. Примеры миксинов в Bootstrap
Bootstrap предоставляет десятки миксинов. Вот основные категории:
① Grid Mixins (Сетка)
// Пример: Создание кастомной колонки
@include make-col(6);// Колонка на 50% ширины (6/12)
② Flexbox Mixins
// Пример: Flex-контейнер с центрированием
.my-component{@include d-flex();@include justify-content(center);}
Mixins в Bootstrap — это мощный инструмент для тех, кто работает с Sass. Они позволяют:
✅ Гибко настраивать компоненты.
✅ Создавать адаптивные стили.
✅ Держать код чистым и модульным.
Bootstrap 5: Горизонтальные и вертикальные отступы (Gutters) — Полная таблица
Bootstrap 5 предоставляет удобные классы для управления отступами между блоками (margin и padding).
Вот полная таблица с примерами для горизонтальных и вертикальных отступов.
1. Классы для отступов (Spacing Utilities)
Bootstrap использует систему {property}{sides}-{size}, где:
property:
m — margin (внешний отступ).
p — padding (внутренний отступ).
sides:
t — top (верх).
b — bottom (низ).
s — start (лево для LTR, право для RTL).
e — end (право для LTR, лево для RTL).
x — горизонтальные (левый + правый).
y — вертикальные (верхний + нижний).
(пусто) — все стороны.
size:
0 — 0px.
1 — 0.25rem (4px).
2 — 0.5rem (8px).
3 — 1rem (16px).
4 — 1.5rem (24px).
5 — 3rem (48px).
auto — автоматический отступ.
2. Горизонтальные отступы (между колонками и блоками)
Класс
Описание
Пример
.gap-1 – .gap-5
Отступ между flex-элементами (margin)
<div class="d-flex gap-3">
.gx-1 – .gx-5
Горизонтальный padding (левый + правый)
<div class="row gx-3">
.mx-1 – .mx-5
Горизонтальный margin (левый + правый)
<div class="mx-auto">
.ms-1 – .ms-5
Отступ слева (margin-start)
<div class="ms-3">
.me-1 – .me-5
Отступ справа (margin-end)
<div class="me-2">
.px-1 – .px-5
Горизонтальный padding (левый + правый)
<div class="px-4">
Пример:
<divclass="d-flex gap-3"><!-- Отступы между flex-элементами --><div>Блок 1</div><div>Блок 2</div></div><divclass="row gx-4"><!-- Горизонтальные отступы в гриде --><divclass="col">Колонка 1</div><divclass="col">Колонка 2</div></div>
3. Вертикальные отступы (между строками и блоками)
Класс
Описание
Пример
.gy-1 – .gy-5
Вертикальный padding (верх + низ)
<div class="row gy-3">
.my-1 – .my-5
Вертикальный margin (верх + низ)
<div class="my-4">
.mt-1 – .mt-5
Отступ сверху (margin-top)
<div class="mt-2">
.mb-1 – .mb-5
Отступ снизу (margin-bottom)
<div class="mb-3">
.py-1 – .py-5
Вертикальный padding (верх + низ)
<div class="py-5">
Пример:
<divclass="row gy-4"><!-- Вертикальные отступы в гриде --><divclass="col-12">Строка 1</div><divclass="col-12">Строка 2</div></div><divclass="my-5"><!-- Большой вертикальный margin --><p>Контент с отступами сверху и снизу</p></div>
4. Автоматические и специальные отступы
Класс
Описание
Пример
.m-auto
Автоматический margin (центрирование)
<div class="mx-auto">
.p-auto
Автоматический padding (редко используется)
<div class="p-auto">
.m-n1 – m-n5
Отрицательный margin
<div class="m-n3">
Пример:
<divclass="mx-auto"style="width: 200px;"><!-- Центрирование --> Этот блок будет по центру
</div>
5. Адаптивные отступы
Все классы поддерживают адаптивность через breakpoints:
sm (≥576px), md (≥768px), lg (≥992px), xl (≥1200px), xxl (≥1400px).
Пример:
<divclass="mx-3 mx-md-5"><!-- На мобильных mx-3, на десктопе mx-5 --> Адаптивный отступ
</div>
Используйте многоступенчатую сборку для оптимизации.
Минимизируйте количество слоев (объединяйте RUN).
Применяйте .dockerignore, чтобы ускорить сборку.
Для продакшена указывайте конкретные версии (python:3.9, а не python:latest).
3.5.3 - Очистка кеша при использовании Docker
Для очистки кэша Docker можно использовать несколько команд, в зависимости от того, что именно нужно удалить
Очистка кэша Docker на сервере
Для очистки кэша Docker можно использовать несколько команд, в зависимости от того, что именно нужно удалить:
1. Очистка неиспользуемых (висячих) образов, контейнеров, сетей и volumes
docker system prune
Удалит:
Остановленные контейнеры
Сети, не используемые ни одним контейнером
Висячие (dangling) образы (те, у которых нет тегов)
Висячие билд-кэш
2. Агрессивная очистка (включая неиспользуемые образы)
docker system prune -a
Удалит все неиспользуемые образы, а не только dangling.
3. Удаление всех остановленных контейнеров
docker container prune
4. Удаление всех неиспользуемых образам
docker image prune -a
5. Удаление кэша сборки (build cache)
docker builder prune
6. Удаление всех volumes, не привязанных к контейнерам
docker volume prune
7. Полная очистка (осторожно!)
Если нужно полностью очистить Docker (все контейнеры, образы, volumes, сети):
docker system prune -a --volumes
⚠️ Будьте осторожны! Эта команда удалит всё, что не используется в данный момент.
Дополнительные полезные команды:
Просмотр занимаемого места:
docker system df
Удаление конкретного образа:
docker rmi <image_id>
Удаление всех образов (очень опасно!):
docker rmi $(docker images -q)
Вывод
Лучший вариант для периодической очистки — docker system prune.
Если нужно освободить максимум места — docker system prune -a --volumes.
🚀 После очистки можно проверить свободное место:
df -h
3.6 - Микроразметка для СЕО поиска
Подборка материалов и переводов статей для объяснения механизмов, как выполняют поиск данных поисковые машины Google, Yandex и другие.
Микроразметка для поисковых систем: Google, Яндекс и другие
В современном цифровом мире важно не только создавать качественный контент, но и помогать поисковым системам правильно его интерпретировать. Микроразметка (Schema.org) — это мощный инструмент, который позволяет структурировать данные на сайте, улучшая их отображение в поисковой выдаче. С помощью микроразметки можно выделять рейтинги, цены, события, товары и многое другое, делая сниппеты более информативными и привлекательными для пользователей.
В этом разделе собраны подробные руководства по работе с микроразметкой для разных поисковых систем, включая Google, Яндекс и другие. Вы узнаете, какие форматы поддерживаются, как проверять разметку и какие ошибки стоит избегать.
3.6.1 - JSON-LD - микроразметка материалов для выдачи сниппетов в поиске Google
Перевод статьи с ресурса moz.com для начинающих и знакомящихся с микроразметкой JSON-LD
JSON-LD расшифровывается как JavaScript Object Notation for Linked Data, что представляет собой многомерные массивы (представьте себе: список пар атрибут-значение).
Это формат реализации для структурирования данных, аналогичный Microdata и RDFa. Обычно, в контексте SEO, JSON-LD реализуется с использованием словаря Schema.org, совместной инициативы Google, Bing, Yahoo! и Yandex, созданной в 2011 году для создания единого словаря структурированных данных для веба. (Тем не менее, Bing и другие поисковые системы официально не заявили о своей поддержке реализаций JSON-LD для Schema.org.)
JSON-LD считается более простым в реализации, благодаря возможности просто вставить разметку в HTML-документ, в отличие от необходимости оборачивать разметку вокруг HTML-элементов (как это делается с Microdata).
Что делает JSON-LD?
JSON-LD аннотирует элементы на веб-странице, придавая данным структуру. Это позволяет поисковым системам лучше понимать содержимое, устранять неоднозначности и устанавливать связи между сущностями. В результате формируется более упорядоченная и понятная структура данных, что способствует созданию лучше организованного интернета в целом.
JSON-LD преобразует неструктурированные данные в структурированные
Рисунок 1 — Концептуальная визуализация работы JSON-LD: обработка неструктурированного контента в интернете, его аннотирование и структурирование для получения организованного результата.
Таким образом, JSON-LD помогает поисковым системам, таким как Google и Яндекс, точнее интерпретировать информацию на сайте, что может улучшить отображение страницы в результатах поиска (например, с помощью расширенных сниппетов).
Где в HTML-коде страницы должен располагаться JSON-LD?
Google рекомендует размещать JSON-LD в разделе <head> HTML-документа. Однако допустимо также добавлять его и внутри <body>. Кроме того, Google способен обрабатывать динамически сгенерированные JSON-LD теги в DOM (объектной модели документа).
Коротко:
Лучше:<head>
Но можно:<body>
Динамические теги (например, загружаемые через JavaScript) тоже работают.
Это означает, что поисковые системы смогут распознать разметку независимо от её расположения в HTML, если она корректно сформирована.
Разбираем JSON-LD
Неизменяемые теги(Не нужно запоминать — просто копируйте и вставляйте)
<scripttype="application/ld+json">{...}</script>
Когда вы видите JSON-LD, первое, что должно бросаться в глаза — это тег <script>. Атрибут type="application/ld+json" сообщает браузеру: «Эй, здесь JavaScript, содержащий JSON-LD».
💡 Профессиональный совет
Всегда закрывайте теги сразу после открытия. Как соль и перец идут вместе, так и открывающие фигурные скобки { требуют закрывающих }.
Важно: Если ваш JSON-LD не заключён в фигурные скобки {}, он не будет обработан. (Держите его «завёрнутым» в скобки!)
Таким образом, правильная структура JSON-LD гарантирует, что поисковые системы смогут корректно прочитать и использовать вашу разметку.
Второй обязательный элемент в JSON-LD разметке — это @context со значением http://schema.org.
Этот параметр сообщает браузеру: «Эй, вот словарь, на который я ссылаюсь — ты можешь найти его по адресу http://schema.org».
Преимущество для SEO-специалиста:
Мы получаем доступ ко всем типам элементов (item types) и их свойствам (item properties), которые определены в Schema.org.
Пропущенная запятая = невалидная разметка. Даже опытные разработчики часто ошибаются в этом месте.
JSON-LD строго требует правильного синтаксиса, поэтому всегда проверяйте свою разметку перед публикацией!
"@type": “…”
Третий ключевой элемент JSON-LD разметки — это указание @type. После двоеточия здесь начинается аннотация данных. Параметр @type определяет тип размеченной сущности. Полный список всех доступных типов можно найти в официальной документации: https://schema.org/docs/full.html.
Ошибка → Пропущенный @type или его неверное указание сделает разметку бесполезной для поисковых систем!
Пары “атрибут-значение”
Следующий шаг — аннотирование информации о выбранном типе сущности (@type). Допустимые свойства для каждого типа можно найти на соответствующей странице Schema.org.
Синтаксис JSON-LD для свойств
Каждое свойство в разметке состоит из двух элементов:
Свойство (Item Property)
Должно быть взято из словаря Schema.org.
Обязательно заключайте в двойные прямые кавычки (" "). 🔹 Важно: Использование фигурных (“ ”) или одинарных (' ') кавычек приведёт к ошибке валидации!
Должно принадлежать к разрешённым свойствам для выбранного @type (указаны в документации Schema.org).
Значение (Value)
Сюда вписывается конкретное значение свойства.
Правила форматирования:
Текстовые строки и URL: всегда в двойных кавычках ("пример").
Числа (целые, дробные): можно без кавычек (42), но допустимо и с ними ("42" — тогда тип данных будет строковым).
Несколько значений: используйте квадратные скобки (["значение1", "значение2"]).
Примеры
✅ Корректно:
{"@type":"Book","name":"Война и мир","isbn":"978-5-699-12014-7",// Строка в кавычках
"price":599.99,// Число без кавычек
"author":["Лев Толстой","Иван Тургенев"]// Массив значений
}
❌ Ошибки:
Фигурные кавычки: “Война и мир” → невалидно.
Пропущенные кавычки: name: Война и мир → синтаксическая ошибка.
Неразрешённое свойство: "pageCount": 1225 (если @type не поддерживает это свойство).
"sameAs":["https://facebook.com/jasonderulo",// запятая
"https://twitter.com/jasonderulo"// НЕТ запятой в конце
]
Отсутствие запятой означает конец списка.
Не путать с фигурными скобками {}
Квадратные скобки — только для перечисления однотипных значений, а фигурные — для вложенных объектов (например, адреса или организации).
💡 Профессиональный совет:
Используйте квадратные скобки для:
Списков (например, авторов книги).
Альтернативных URL (например, sameAs для соцсетей).
Любых свойств, допускающих множественные значения по Schema.org.
Всегда проверяйте, поддерживает ли выбранный @type множественные значения для конкретного свойства.
Ошибка → Лишняя запятая после последнего элемента вызовет ошибку валидации!
Пример корректной и некорректной разметки:
✅ Правильно:
Вложенность означает организацию данных слоями, где одни объекты содержат другие объекты. Это можно сравнить с матрешкой, где большая кукла содержит внутри меньшую — так же и данные могут быть структурированы иерархически.
Зачем нужна вложенность?
Некоторые свойства относятся только к определенным типам сущностей. Например, в разметке события (Event):
name может означать название события,
но внутри могут быть вложены свойства performer (исполнитель) и venue (место проведения), у которых тоже есть свои name.
Без вложенности поисковые системы не поймут, к чему относится каждое свойство.
Как правильно вкладывать данные в JSON-LD
Начните с основного типа (@type)
Например, Event.
Укажите свойство, требующее вложенности
Например, performer или offers.
Откройте фигурные скобки { } для нового объекта
Внутри укажите:
@type (тип вложенной сущности, например Person или Offer),
его свойства и значения.
Закройте вложенный объект
Не ставьте запятую перед закрывающей скобкой }.
Запятая после } нужна, только если дальше идут другие свойства.
Пример вложенности
Разметка музыкального события:
{"@context":"http://schema.org","@type":"MusicEvent","name":"Концерт Jason Aldean","performer":{// ← Начало вложенного объекта
"@type":"MusicGroup","name":"Jason Aldean","sameAs":"https://www.jasonaldean.com"},// ← Запятая, потому что дальше есть еще свойства
"location":{"@type":"Place","name":"Мэдисон-Сквер-Гарден","address":"Нью-Йорк, США"}// ← Нет запятой, это последнее свойство
}
Чек-лист по вложенности
✅ Используйте свойства, допустимые для родительского @type (см. Schema.org).
✅ Значение вложенного объекта заключайте в { }.
✅ Указывайте @type для вложенной сущности.
✅ Добавляйте обязательные свойства для вложенного типа (например, price для Offer).
❌ Не ставьте запятую перед } (это вызовет ошибку).
✅ Запятая после }, если дальше идут другие свойства.
Где чаще всего встречается вложенность?
Товары (Product):
Цена и условия предложения вкладываются в offers (@type: Offer).
Отзывы — в review (@type: Review).
Организации (Organization):
Адрес (@type: PostalAddress),
контакты, учредители.
Рецепты (Recipe):
Ингредиенты, инструкции, питательная ценность.
💡 Профессиональный совет:
Делайте отступы для вложенных объектов — так код легче читать.
Проверяйте обязательные свойства для вложенных типов на Schema.org.
💡 Совет: Для сложных типов (например, Product с Review) используйте пошаговую проверку — сначала базовые свойства, затем вложенные объекты.
Ошибка → Даже одна пропущенная кавычка или запятая может привести к тому, что Google проигнорирует всю разметку!
Процесс добавления JSON-LD на сайт
Создание JSON-LD разметки зависит от вашего уровня знакомства с синтаксисом JSON-LD и словарем Schema.org. Ниже приведен пошаговый процесс для новичков, который поможет вам разобраться в основах и создать эффективную разметку.
1. Определите цель разметки
📌 Вопросы, которые нужно задать себе:
Что вы хотите разметить?
Убедитесь, что выбранный вами контент можно аннотировать с помощью Schema.org. Некоторые вещи могут казаться логичными, но не иметь подходящего типа в словаре.
Зачем вам это нужно?
Определите, есть ли практическая польза (например, улучшение сниппетов в поиске) или вы просто экспериментируете. Разметка должна помогать поисковым системам лучше понимать ключевую информацию на странице.
Современный Интернет в основном состоит из огромного количества документов, созданных с использованием HTML. Эти документы содержат значительный объём структурированных данных, которые в большинстве случаев недоступны для инструментов и приложений. Если издатели смогут выражать эти данные более полно, а инструменты — считывать их, откроются новые возможности для пользователей: структурированные данные можно будет передавать между приложениями и веб-сайтами, а браузеры смогут улучшить пользовательский опыт. Например:
событие на веб-странице можно будет напрямую импортировать в настольный календарь;
лицензию на документ можно будет автоматически определить, чтобы информировать пользователей об их правах;
информацию о создателе фотографии, настройках камеры, разрешении, местоположении и теме можно будет публиковать так же легко, как и саму фотографию, что позволит осуществлять структурированный поиск и обмен.
RDFa Core — это спецификация атрибутов для выражения структурированных данных в любом языке разметки. Встроенные данные, уже доступные в языке разметки (например, HTML), часто можно повторно использовать в RDFa, что избавляет издателей от необходимости дублировать информацию в содержимом документа.
Абстрактное представление данных основано на RDF (RDF11-PRIMER), что позволяет издателям создавать собственные словари, расширять чужие и развивать свою терминологию с максимальной совместимостью. Выраженная структура тесно связана с данными, поэтому визуализированную информацию можно копировать вместе с её структурой.
Правила интерпретации данных универсальны и не требуют отдельных инструкций для разных форматов. Это позволяет авторам и издателям данных определять собственные форматы без необходимости обновлять ПО, регистрировать их в централизованном органе или опасаться конфликтов между разными форматами.
RDFa разделяет некоторые цели с микроформатами (MICROFORMATS). Однако если микроформаты задают и синтаксис для встраивания структурированных данных в HTML, и конкретный словарь терминов для каждого микроформата, то RDFa определяет только синтаксис, полагаясь на независимые спецификации терминов (часто называемых словарями или таксономиями). RDFa позволяет свободно комбинировать термины из разных словарей и разработан так, что язык можно анализировать без знания конкретного используемого словаря.
Этот документ представляет собой детальное описание синтаксиса RDFa, предназначенное для:
Разработчиков процессоров RDFa, которым необходимо точное описание правил разбора.
Тех, кто хочет интегрировать RDFa в новый язык разметки.
Организаций, желающих рекомендовать использование RDFa и создать руководства для пользователей.
Всем, кто знаком с RDF и хочет понять, как работает процессор RDFa «под капотом».
Для тех, кто ищет введение в RDFa и практические примеры, рекомендуется ознакомиться с RDFA-PRIMER.
Как читать этот документ
Если вы не знакомы ни с RDFa, ни с RDF и просто хотите добавить RDFa в свои документы, то вам может быть полезнее ознакомиться с RDFa Primer, который даёт более простое введение.
Если вы уже знакомы с RDFa и хотите изучить правила обработки (например, для создания собственного процессора RDFa), то наиболее интересным для вас будет раздел «Модель обработки». В нём содержится обзор каждого этапа обработки, а затем более детальные подразделы с описанием отдельных правил.
Если вы не знакомы с RDFa, но знаете RDF, то перед изучением модели обработки полезно прочитать раздел «Обзор синтаксиса», где приведены примеры разметки с использованием RDFa. Примеры помогут легче понять правила обработки.
Если вы не знакомы с RDF, то перед активной работой с RDFa рекомендуется ознакомиться с разделом «Терминология RDF». Хотя RDFa разработан так, чтобы быть простым для авторов (и для его использования не обязательно глубоко разбираться в RDF), разработчикам приложений, обрабатывающих RDFa, понимание RDF необходимо. В интернете есть множество материалов по RDF, а также растущее число инструментов, поддерживающих RDFa. В этом документе содержится лишь минимальный необходимый контекст по RDF, чтобы прояснить цели RDFa.
Примечание
RDFa — это способ выражения отношений в стиле RDF с помощью простых атрибутов в существующих языках разметки, таких как HTML.
RDF полностью интернационализирован и допускает использование Internationalized Resource Identifiers (IRI). В этой спецификации повсеместно используется термин IRI.
Даже если вы не знакомы с термином IRI, вы, вероятно, встречали URI или URL. IRI — это расширение URI, позволяющее использовать символы за пределами ASCII.
RDF поддерживает такие символы, как и RDFa. В этой спецификации сознательно используется термин IRI, чтобы подчеркнуть эту возможность.
Важное уточнение
Хотя в данной спецификации упоминаются исключительно IRI, язык-хост (Host Language) может ограничивать синтаксис своих атрибутов подмножеством IRI (например, атрибут @href в HTML5).
Однако, независимо от ограничений валидации в языке-хозяине, процессор RDFa способен обрабатывать полный диапазон IRI.
Статус данного документа
Данный раздел описывает статус документа на момент его публикации. Другие документы могут заменять текущую версию. Актуальный список публикаций W3C и последнюю редакцию данного технического отчёта можно найти в индексе технических отчётов W3C по адресу: http://www.w3.org/TR/.
Редакционные изменения
Настоящая версия представляет собой редакционную правку Рекомендации, опубликованной 22 августа 2013 года. Указанный документ являлся пересмотренной версией спецификации RDFa Syntax 1.0 [RDFA-SYNTAX]. Между текущей версией и версией 1.0 существует ряд существенных различий, включая:
Удаление специальных правил для XHTML - теперь они определены в отдельном документе XHTML+RDFa [XHTML-RDFA].
Расширение типов данных некоторых атрибутов RDFa для поддержки Terms (терминов), CURIES и Absolute IRIs.
Разрешение языкам-хостам определять коллекции терминов по умолчанию, префиксные отображения и словарь по умолчанию.
Возможность определения словаря по умолчанию для использования с неопределёнными терминами.
Требование к регистронезависимому сравнению терминов.
Расширенное поведение атрибута @property, которое во многих случаях может заменять атрибут @rel.
Изменённая обработка @typeof для лучшего соответствия практическому использованию.
Более подробный список изменений доступен в разделе Changes (Изменения).
Тестирование
Доступен тестовый набор, который не является исчерпывающим, но может быть полезен как пример использования RDFa.
Участие и отзывы
Документ опубликован Рабочей группой RDFa в качестве Рекомендации. Все замечания и предложения можно направлять по адресу: public-rdfa@w3.org (подписка, архивы). Отзывы приветствуются.
С отчётом о внедрении рабочей группы можно ознакомиться здесь.
Статус рекомендации
Документ был рассмотрен членами W3C, разработчиками программного обеспечения, другими группами W3C и заинтересованными сторонами. Директор W3C утвердил его в качестве официальной Рекомендации. Это стабильный документ, который может использоваться в качестве справочного материала или цитироваться в других документах. Роль W3C заключается в привлечении внимания к спецификации и содействии её широкому внедрению, что способствует улучшению функциональности и совместимости веба.
Патентная политика
Документ разработан группой, действующей в соответствии с Патентной политикой W3C от 5 февраля 2004 года. W3C ведёт публичный список патентных заявлений, связанных с результатами работы группы. На этой странице также содержатся инструкции по подаче патентных заявлений. Лица, располагающие информацией о патентах, которые могут содержать существенные пункты (Essential Claims), обязаны раскрыть эту информацию в соответствии с разделом 6 Патентной политики W3C.
Процесс W3C
Документ регулируется Процессом W3C от 14 октября 2005 года.
1. Мотивация
(Данный раздел не является нормативным)
Проблемы RDF/XML
Спецификация RDF/XML [RDF-SYNTAX-GRAMMAR] обеспечивает достаточную гибкость для представления всех абстрактных концепций RDF. Однако у неё есть ряд недостатков:
Сложность валидации
Документы, содержащие RDF/XML, крайне сложно (или невозможно) проверять с помощью XML-схем (XML Schemas) или DTD.
Это затрудняет интеграцию RDF/XML в другие языки разметки.
Новые языки схем, такие как RELAX NG [RELAXNG-SCHEMA], поддерживают валидацию произвольного RDF/XML, но их широкое внедрение займёт время.
Дублирование данных
Даже если добавить RDF/XML напрямую в XML-диалект (например, XHTML), возникнет дублирование между визуальным содержимым и структурированными данными RDF.
Идеальным решением было бы дополнять документ RDF-разметкой без повторения существующих данных.
Пример: если имя автора указано в тексте (например, в подписи к новости), его не нужно дублировать в RDF — разметка должна позволять интерпретировать существующие данные как часть RDF-структуры.
Преимущества интеграции структуры и содержимого
Контекстная структуризация
Совмещение визуальных и структурированных данных упрощает передачу информации между приложениями (включая не-веб-системы).
Пример: пользователи могут получать дополнительную информацию о данных (например, через контекстное меню по клику).
Удобство для издателей
Организациям, публикующим много контента (например, СМИ), проще встраивать семантические данные напрямую в разметку, чем поддерживать их отдельно.
Ограничения «жёстко заданных» атрибутов
В традиционных языках разметки (например, XHTML 1.1 [XHTML11] или HTML [HTML401]) используются атрибуты с фиксированной семантикой, такие как @cite для указания источника цитаты.
Однако такие атрибуты:
Требуют от процессоров RDFa знания каждого специфичного атрибута.
Усложняют создание универсальных инструментов извлечения метаданных.
Решение через RDFa
Гибкость вместо «жёсткой» разметки
RDFa предлагает универсальный набор атрибутов и правил разбора, позволяющий использовать свойства из любых RDF-словарей.
В большинстве случаев значения этих свойств уже присутствуют в документе.
Снижение нагрузки на разработчиков языков
RDFa устраняет необходимость предугадывать все возможные требования пользователей к структуре.
Дизайнеры языков могут легко интегрировать RDFa, обеспечивая извлечение семантических данных любыми совместимыми процессорами.
Ключевые тезисы
RDFa избегает дублирования данных, используя существующую разметку.
Позволяет добавлять произвольные семантические свойства без привязки к конкретному словарю.
Упрощает создание единого стандарта для извлечения метаданных из любых документов.
3.6.2.1 - Обзор синтаксиса
Следующие примеры помогут новичкам быстро понять принципы работы RDFa.
Для более глубокого изучения рекомендуется ознакомиться с RDFa Primer.
Сокращённые IRIs (CURIEs)
В RDF принято сокращать термины словарей с помощью префиксов и ссылок. Этот механизм подробно описан в разделе Compact URI Expressions. В примерах ниже используются следующие предопределённые префиксы словарей:
В некоторых примерах используются IRI с фрагментными идентификаторами (например, about="#me"), которые ссылаются на сущности внутри текущего документа. Этот подход:
Широко применяется в RDF/XML [RDF-SYNTAX-GRAMMAR] и других сериализациях RDF.
Позволяет легко создавать новые IRIs для объектов, описываемых через RDFa, значительно расширяя выразительные возможности.
Для корректной интерпретации фрагментных идентификаторов регистрации MIME-типов языков разметки, поддерживающих RDFa, должны ссылаться на эту спецификацию (прямо или косвенно).
2.1 Атрибуты RDFa
RDFa использует ряд распространённых атрибутов, а также вводит несколько новых. Атрибуты, уже существующие в популярных языках разметки (например, HTML), сохраняют своё исходное значение, хотя в некоторых случаях их синтаксис был немного модифицирован. Например, в (X)HTML нет чёткого способа добавлять новые значения для атрибута @rel; RDFa явно решает эту проблему, разрешая использовать IRI в качестве значений. Также вводятся понятия терминов и “компактных выражений URI” (CURIEs), которые позволяют кратко выражать полные значения IRI. Полный список атрибутов RDFa и их синтаксис приведён в разделе “Атрибуты и синтаксис”.
2.2 Примеры
В (X)HTML авторы могут включать метаданные и отношения, касающиеся текущего документа, используя элементы meta и link (в этих примерах используется XHTML+RDFa [XHTML-RDFA]). Например, автор страницы вместе со ссылками на предыдущую и следующую страницы могут быть выражены следующим образом:
Поскольку использование полных IRI, как в примере выше, может быть громоздким, RDFa также разрешает использовать компактные выражения URI (CURIEs), позволяя авторам применять сокращения для ссылок на термины из различных словарей:
RDFa поддерживает использование @rel и @rev на любых элементах. Это становится ещё полезнее с добавлением поддержки различных словарей:
Пример 4
Этот документ распространяется по лицензии
<aprefix="cc: http://creativecommons.org/ns#"rel="cc:license"href="http://creativecommons.org/licenses/by-nc-nd/3.0/">Creative Commons By-NC-ND License</a>.
RDFa позволяет повторно использовать не только IRI в документе для предоставления метаданных, но и встроенный текст при использовании с @property:
Пример 5
<htmlxmlns="http://www.w3.org/1999/xhtml"prefix="dc: http://purl.org/dc/terms/"><head><title>Моя домашняя страница</title></head><body><h1property="dc:title">Моя домашняя страница</h1><p>Последнее изменение: 16 сентября 2015</p></body></html>
Когда отображаемый текст отличается от фактического значения, можно указать точное значение с помощью атрибута @content. Также можно явно указать тип данных через @datatype:
RDFa позволяет описывать метаданные не только для текущего документа, но и для других ресурсов:
Пример 7
<htmlxmlns="http://www.w3.org/1999/xhtml"prefix="bibo: http://purl.org/ontology/bibo/
dc: http://purl.org/dc/terms/"><head><title>Книги Марко Пьера Уайта</title></head><body> Я считаю, что книга Уайта
«<spanabout="urn:ISBN:0091808189"property="dc:title">Кухня столовой</span>»
стоит того, чтобы её приобрести: хотя рецепты сложные,
автор объясняет их очень доступно. Вам также может понравиться
<spanabout="urn:ISBN:1596913614"property="dc:description">автобиография Уайта</span>.
</body></html>
Для группировки свойств, относящихся к одному объекту, используется атрибут @typeof:
Пример 8
<htmlxmlns="http://www.w3.org/1999/xhtml"prefix="bibo: http://purl.org/ontology/bibo/
dc: http://purl.org/dc/terms/"><head><title>Книги Марко Пьера Уайта</title></head><body> Я считаю, что книга Уайта
«<spanabout="urn:ISBN:0091808189"typeof="bibo:Book"property="dc:title">Кухня столовой</span>»
стоит того, чтобы её приобрести. Также рекомендую
<spanabout="urn:ISBN:1596913614"typeof="bibo:Book"property="dc:description">автобиографию Уайта</span>.
</body></html>
Для небольших фрагментов разметки иногда удобнее использовать полные IRI:
Пример 9
<htmlxmlns="http://www.w3.org/1999/xhtml"><head><title>Книги Марко Пьера Уайта</title></head><body> Книга Уайта
«<spanabout="urn:ISBN:0091808189"typeof="http://purl.org/ontology/bibo/Book"property="http://purl.org/dc/terms/title">Кухня столовой</span>»
написана очень доступно. Также обратите внимание на
<spanabout="urn:ISBN:1596913614"typeof="http://purl.org/ontology/bibo/Book"property="http://purl.org/dc/terms/description">его автобиографию</span>.
</body></html>
Атрибут @vocab позволяет определить словарь по умолчанию для элементов:
Пример 10
<divvocab="http://xmlns.com/foaf/0.1/"about="#me"> Меня зовут <spanproperty="name">Иван Иванов</span>, а мой блог —
<arel="homepage"href="http://example.org/blog/">«Понимая семантику»</a>.
</div>
Приведённый выше пример (Пример 10) сгенерирует следующие триплеты в формате Turtle:
В простых случаях атрибут @property может использоваться вместо @rel. Фактически, когда элемент не содержит атрибутов @rel, @datatype или @content, но имеет, например, атрибут @href, эффект от @property аналогичен @rel.
Тот же пример можно переписать следующим образом:
Пример 12
<divvocab="http://xmlns.com/foaf/0.1/"about="#me"> Меня зовут <spanproperty="name">Иван Иванов</span>, а мой блог —
<aproperty="homepage"href="http://example.org/blog/">«Понимая семантику»</a>.
</div>
Особенности обработки:
Когда используется только @property с элементом, содержащим @href, система интерпретирует это как отношение (аналогично @rel)
Такой подход упрощает разметку в случаях, когда не требуется явное указание типа связи
Это демонстрирует гибкость RDFa в интерпретации различных вариантов разметки как семантически эквивалентных структур.
3.6.2.2 - Терминология RDF
Обзор терминологии RDF в различных примерах
3. Терминология RDF
Введение
Предыдущий раздел иллюстрировал типичную разметку RDFa. Хотя для создания RDFa-разметки глубокое понимание RDF не обязательно, разработчикам систем, обрабатывающих RDF-вывод, необходимо разбираться в концепциях RDF. Далее представлены базовые понятия. Для углублённого изучения обратитесь к:
Структурированные данные в RDFa представляют собой коллекцию утверждений — минимальных единиц информации, оформленных по определённым правилам для упрощения обработки. Даже сложные метаданные можно обрабатывать, разбивая их на такие утверждения.
Пример неструктурированных данных:
Альберт родился 14 марта 1879 года в Германской империи. Его фото доступно
по адресу http://en.wikipedia.org/wiki/Image:Albert_Einstein_Head.jpg.
Для машины этот текст неинтерпретируем. В формате утверждений та же информация выглядит так:
Альберт родился 14 марта 1879 года
Альберт родился в Германской империи
Альберт имеет фото http://en.wikipedia.org/...
3.2 Триплеты (Triples)
RDF формализует утверждения как триплеты — структуры из трёх компонентов:
RDFa поддерживает интернационализированные символы (Unicode) во всех компонентах триплета.
Субъекты и предикаты обычно выражаются IRI, объекты — IRI или литералы (строки/числа).
3.3 Ссылки на IRI
Разбиение сложной информации на управляемые части помогает уточнить данные, но не исключает неоднозначности. Например, о каком именно “Альберте” идёт речь? Если другая система содержит дополнительные факты об “Альберте”, как определить, что они относятся к тому же человеку? Как сопоставить предикаты “родился в” и “место рождения” из разных систем? RDF решает эти проблемы, заменяя расплывчатые термины на ссылки IRI.
Уникальные идентификаторы
Хотя IRI чаще всего используются для идентификации веб-страниц, в RDF они служат уникальными идентификаторами концепций. Например, вместо неоднозначной строки “Альберт” можно использовать IRI из DBPedia:
Пример 15
<http://dbpedia.org/resource/Albert_Einstein>имеетимя"Альберт Эйнштейн".<http://dbpedia.org/resource/Albert_Einstein>родился"14 марта 1879".<http://dbpedia.org/resource/Albert_Einstein>родилсяв<http://dbpedia.org/resource/German_Empire>.<http://dbpedia.org/resource/Albert_Einstein>имеетфотографию<http://.../Albert_Einstein_Head.jpg>.
Идентификация объектов
IRI также используются для однозначного определения объектов (третья часть триплета). Фотография уже имеет IRI, но можно аналогично идентифицировать и “Германскую империю”. Строковые значения (литералы) выделяются кавычками:
Пример 16
<http://dbpedia.org/resource/Albert_Einstein><http://xmlns.com/foaf/0.1/name>"Альберт Эйнштейн".<http://dbpedia.org/resource/Albert_Einstein><http://dbpedia.org/property/dateOfBirth>"14 марта 1879".
Унификация предикатов
IRI устраняют неоднозначность предикатов, объединяя синонимы (“место рождения”, “birthplace”, “Lieu de naissance”) под одним идентификатором:
Устранение неоднозначностей — IRI точно идентифицируют сущности
Межсистемная совместимость — разные источники могут ссылаться на одни и те же концепции
Поддержка многоязычия — один IRI может представлять понятие на любом языке
Особенности реализации:
Литералы (строки, числа) всегда заключаются в кавычки
Веб-адреса (URL) и другие IRI обрамляются угловыми скобками
Использование общепринятых словарей (FOAF, DBpedia) улучшает связанность данных
3.4 Простые литералы (Plain Literals)
Хотя для субъектов и предикатов всегда используются IRI-идентификаторы, объект в триплете может быть как IRI, так и литералом. В примерах имя Эйнштейна представлено простым литералом — строкой без указания типа или языка:
Для специальных значений (даты, числа и т.д.) в RDF предусмотрен механизм указания типа литерала. Типизированный литерал формируется путём добавления IRI типа данных после литерала с использованием символов ^^. Обычно используются типы данных из спецификации XML Schema:
Простые текстовые значения без дополнительной информации
Могут включать указание языка (@"ru")
Типизированные значения
Числа: "42"^^xsd:integer
Даты: "2023-05-15"^^xsd:date
Логические значения: "true"^^xsd:boolean
Стандартные типы данных
Используются XSD-типы (xsd:string, xsd:dateTime и др.)
Позволяют однозначно интерпретировать значения
Практическое применение:
# Числовое значение<http://example.org/product/123>ex:weight"2.5"^^xsd:decimal.# Дата и времяex:eventex:startTime"2023-05-15T19:00:00"^^xsd:dateTime.# Булево значениеex:userex:isActive"true"^^xsd:boolean.
3.6 Turtle (Синтаксис Turtle)
RDF не имеет единого обязательного формата представления триплетов, поскольку ключевыми концепциями являются сами триплеты и использование IRI, а не конкретный синтаксис. Однако существует несколько способов выражения триплетов, включая RDF/XML, Turtle и, конечно, RDFa. В документации часто используется синтаксис Turtle благодаря его компактности.
Префиксы используются только для удобства записи, в итоговых триплетах всегда полные IRI
3.7 Графы
Совокупность триплетов называется графом. Все триплеты, генерируемые согласно этой спецификации, содержатся в выходном графе, создаваемом процессором RDFa.
3.8 Компактные выражения URI (CURIEs)
Для сокращённой записи IRI в разметке RDFa использует механизм CURIEs. Подробное описание - в разделе “Обработка CURIE и IRI”.
Важно: CURIEs используются только в разметке и примерах, в итоговых триплетах всегда присутствуют полные IRI.
3.9 Фрагменты разметки и RDFa
При переносе фрагментов разметки между документами (например, через копирование или инструменты) следует учитывать:
Обработка изолированных фрагментов вне контекста полного документа не определена
Разработчикам инструментов следует предусматривать передачу необходимого контекста
Авторам фрагментов нужно учитывать их поведение в составе полного документа
Помимо разделов, помеченных как ненормативные, все рекомендации по разработке, диаграммы, примеры и примечания в этой спецификации не являются нормативными. Все остальное в этой спецификации является нормативным.
Ключевые слова MAY (может), MUST (должен), MUST NOT (не должен), RECOMMENDED (рекомендуется), SHOULD (следует) и SHOULD NOT (не следует) должны интерпретироваться в соответствии с [RFC2119].
4.1 Соответствие процессора RDFa
В данной спецификации термин выходной граф означает все триплеты, утвержденные документом в соответствии с разделом Модель обработки. Соответствующий требованиям процессор RDFa ДОЛЖЕН предоставить потребляющему приложению единый RDF-граф, содержащий все возможные триплеты, сгенерированные с использованием правил из раздела Модель обработки. Термин граф процессора используется для обозначения всех информационных, предупреждающих и ошибочных триплетов, которые МОГУТ быть сгенерированы процессором RDFa для отчета о своем состоянии. Выходной граф и граф процессора являются отдельными графами, и процессор RDFa НЕ ДОЛЖЕН хранить их в одном графе. Однако процессоры могут разрешать одновременное получение обоих графов; подробности см. в разделе 7.6.1.
Соответствующий требованиям процессор RDFa МОЖЕТ предоставлять дополнительные триплеты, сгенерированные с использованием правил, не описанных здесь, но эти триплеты НЕ ДОЛЖНЫ включаться в выходной граф. (Будут ли эти дополнительные триплеты доступны в одном или нескольких дополнительных RDF-графах, зависит от реализации и здесь не определяется.)
Соответствующий требованиям процессор RDFa ДОЛЖЕН сохранять пробельные символы как в простых литералах, так и в XML-литералах. Однако может случиться так, что архитектура, в которой работает процессор, изменила пробельные символы в документе до того, как он попал в процессор RDFa (например, процессоры [XMLSCHEMA11-1] могут «нормализовать» пробелы в значениях атрибутов — см. раздел 3.1.4). Чтобы обеспечить максимальную согласованность между средами обработки, авторам СЛЕДУЕТ удалять все избыточные пробелы в своих простых и XML-литералах.
Соответствующий требованиям процессор RDFa ДОЛЖЕН анализировать медиатип документа, который он обрабатывает, чтобы определить его язык-хост. Если процессор RDFa не может определить медиатип или не поддерживает его, он ДОЛЖЕН обрабатывать документ так, как если бы его медиатип был application/xml. См. Соответствие документов XML+RDFa. Язык-хост МОЖЕТ определять дополнительные механизмы объявления.
Примечание
Соответствующий требованиям процессор RDFa МОЖЕТ использовать дополнительные механизмы (например, DOCTYPE, расширение файла, корневой элемент, переопределяемый пользовательский параметр) для определения языка-хоста, если медиатип недоступен. Эти механизмы не регламентируются.
4.2 Соответствие языка-хоста RDFa
Языки-хосты, включающие RDFa, должны соответствовать следующим требованиям:
Все функции, требуемые в данной спецификации, ДОЛЖНЫ быть включены в язык-хост.
Обязательные атрибуты, определенные в данной спецификации, ДОЛЖНЫ быть включены в модель содержимого языка-хоста.
Примечание
Во избежание сомнений, нет требования, чтобы атрибуты, такие как @href и @src, использовались в соответствующем языке-хостe. Также нет требования, чтобы все обязательные атрибуты были включены в модель содержимого всех элементов. Рабочая группа рекомендует разработчикам языков-хостов обеспечивать включение обязательных атрибутов в модель содержимого элементов, которые часто используются в языке.
Если язык-хост использует пространства имен XML [XML-NAMES], атрибуты из этой спецификации СЛЕДУЕТ определять «без пространства имен» (например, когда атрибуты используются на элементах в пространстве имен языка-хоста, они могут применяться без префикса: <myml:myElement property="license">). Если язык-хост не использует атрибуты «без пространства имен», они ДОЛЖНЫ ссылаться на пространство имен XHTML (http://www.w3.org/1999/xhtml).
Если язык-хост имеет собственное определение для любого атрибута, описанного в данной спецификации, это определение ДОЛЖНО обеспечивать возможность обработки, требуемой данной спецификацией, когда атрибут используется в соответствии с ее требованиями.
Язык-хост МОЖЕТ определять начальный контекст (например, IRI-отображения и/или определение терминов или IRI словаря по умолчанию). Такой начальный контекст СЛЕДУЕТ определять с использованием соглашений, описанных в Начальные контексты RDFa.
4.3 Соответствие документов XML+RDFa
Данная спецификация не определяет самостоятельный тип документа. Атрибуты здесь предназначены для интеграции в другие языки-хосты (например, HTML+RDFa или XHTML+RDFa). Однако данная спецификация определяет правила обработки для общих XML-документов — то есть документов, доставляемых с медиатипами text/xml или application/xml. Такие документы должны соответствовать всем следующим критериям:
Документ ДОЛЖЕН быть корректно сформированным, как определено в [XML10-4e].
Документ СЛЕДУЕТ использовать атрибуты, определенные в данной спецификации, «без пространства имен» (например, <myml:myElement property="license">).
Примечание
Возможно, что XML-грамматика будет иметь собственные атрибуты, конфликтующие с атрибутами из этой спецификации. Это может привести к тому, что процессор RDFa сгенерирует неожиданные триплеты.
При обработке документа XML+RDFa процессор RDFa использует следующий начальный контекст:
Существуют термины по умолчанию (например, describedby, license, role), определенные в http://www.w3.org/2011/rdfa-context/rdfa-1.1.
Существуют префиксные отображения по умолчанию (например, dc), определенные в http://www.w3.org/2011/rdfa-context/rdfa-1.1.
Нет IRI словаря по умолчанию.
База может быть установлена с помощью атрибута @xml:base, как определено в [XML10-4e].
Текущий язык может быть установлен с помощью атрибута @xml:lang.
3.6.2.4 - Аттрибуты и синтаксис в RDF
Данная спецификация определяет ряд атрибутов и способ интерпретации их значений при генерации RDF-триплетов. В этом разделе описываются атрибуты и синтаксис их значений.
Атрибуты:
about SafeCURIEorCURIEorIRI — указывает, о чем именно представлены данные («субъект» в терминологии RDF).
content CDATA-строка — предоставляет машиночитаемое содержимое для литерала («литеральный объект» в терминологии RDF).
datatype TERMorCURIEorAbsIRI — определяет тип данных литерала.
href (опциональный)
Традиционно навигационный IRI — выражает связанный ресурс отношения («ресурсный объект» в терминологии RDF).
inlist
Атрибут, указывающий, что объект, связанный с атрибутами rel или property на том же элементе, должен быть добавлен в список для данного предиката. Значение этого атрибута ДОЛЖНО игнорироваться. Наличие атрибута приводит к созданию списка, если он ещё не существует.
prefix
Список пар «префикс : IRI», разделенных пробелами, в формате:
NCName ':' ' '+ xsd:anyURI
property
Список TERMorCURIEorAbsIRI, разделенных пробелами, — выражает отношения между субъектом и либо ресурсным объектом (если указан), либо текстовым литералом («предикат»).
rel
Список TERMorCURIEorAbsIRI, разделенных пробелами, — выражает отношения между двумя ресурсами («предикаты» в терминологии RDF).
resource SafeCURIEorCURIEorIRI — выражает связанный ресурс отношения, не предназначенный для навигации (например, не «кликабельная» ссылка) («объект»).
rev
Список TERMorCURIEorAbsIRI, разделенных пробелами, — выражает обратные отношения между двумя ресурсами («предикаты»).
src (опциональный)
IRI — выражает связанный ресурс отношения, когда ресурс встроен («ресурсный объект»).
typeof
Список TERMorCURIEorAbsIRI, разделенных пробелами, — указывает RDF-тип(ы), связываемые с субъектом.
vocab
IRI — определяет отображение, используемое при ссылке на термин в значении атрибута. См. Общее использование терминов в атрибутах и раздел Расширение словаря.
Примечание
Во всех случаях возможно использование этих атрибутов без значения (например, @datatype="") или со значением, которое после обработки по правилам CURIE и IRI становится пустым (например, @datatype="[noprefix:foobar]").
5.1 Роли атрибутов
Атрибуты RDFa выполняют разные роли в семантически насыщенном документе. Вкратце:
Синтаксические атрибуты: @prefix, @vocab.
Атрибуты субъекта: @about.
Атрибуты предиката: @property, @rel, @rev.
Атрибуты ресурса: @resource, @href, @src.
Атрибуты литерала: @datatype, @content, @xml:lang или @lang.
Макроатрибуты: @typeof, @inlist.
5.2 Пробелы в значениях атрибутов
Многие атрибуты принимают список токенов, разделенных пробелами. В данной спецификации пробел определяется как:
whitespace ::= (#x20 | #x9 | #xD | #xA)+
Если атрибут принимает список токенов, разделенных пробелами, процессор RDFa ДОЛЖЕН игнорировать любые ведущие или завершающие пробелы.
Примечание
Это определение согласуется с определением из [XML10].
3.6.2.5 - Определение синтаксиса CURIE в RDF
Ключевым компонентом RDF является IRI, но такие идентификаторы обычно длинные и неудобные. Поэтому RDFa поддерживает механизм сокращения IRI, называемый компактными URI-выражениями (CURIE).
6. Определение синтаксиса CURIE
Примечание
Рабочая группа в настоящее время анализирует приведённые ниже правила формирования CURIE с учётом недавних замечаний от RDF Working Group и участников RDFa Working Group. Возможны незначительные изменения в правилах в ближайшем будущем, которые могут оказаться обратно несовместимыми. Однако любые такие несовместимости будут ограничены крайними случаями.
Основные положения
Ключевым компонентом RDF является IRI, но такие идентификаторы обычно длинные и неудобные. Поэтому RDFa поддерживает механизм сокращения IRI, называемый компактными URI-выражениями (CURIE).
При раскрытии CURIE ДОЛЖЕН получаться синтаксически корректный IRI ([RFC3987]). Подробнее см. Обработка CURIE и IRI. Лексическое пространство CURIE определяется правилом curie, приведённым ниже. Пространство значений — это множество IRI.
CURIE состоит из двух компонентов: префикса и ссылки. Префикс отделяется от ссылки двоеточием (:). В общем случае префикс можно опустить, создав CURIE, использующий отображение префикса по умолчанию. В RDFa отображение префикса по умолчанию — http://www.w3.org/1999/xhtml/vocab#. Также можно опустить и префикс, и двоеточие, создав CURIE, содержащий только ссылку, использующую отображение без префикса. Данная спецификация НЕ определяет отображение без префикса. Языки-хосты RDFa НЕ ДОЛЖНЫ определять отображение без префикса.
Примечание Префикс по умолчанию в RDFa не следует путать с пространством имён по умолчанию, определённым в [XML-NAMES]. Процессор RDFa НЕ ДОЛЖЕН обрабатывать объявление пространства имён по умолчанию в XML-NAMES так, как если бы оно устанавливало префикс по умолчанию.
Правило safe_curie не является обязательным, даже в ситуациях, когда значение атрибута может быть CURIE или IRI: IRI, использующий схему, не соответствующую текущим отображениям, нельзя спутать с CURIE. Концепция safe_curie сохранена для обратной совместимости.
Примечание
Можно определить отображение префикса CURIE таким образом, что оно «перекроет» определённую схему IRI. Например, документ может сопоставить префикс mailto с http://www.example.com/addresses/. Тогда атрибут @resource со значением mailto:user@example.com может создать триплет с объектом http://www.example.com/addresses/user@example.com. Более того, возможно (хотя и маловероятно), что в будущем появятся схемы, конфликтующие с отображениями префиксов в документе (например, предлагаемая схема widget [WIDGETS-URI]). В обоих случаях такое «перекрытие» не изменит способ обработки IRI другими потребителями, но может привести к неверной интерпретации CURIE автора документа. Рабочая группа считает этот риск минимальным.
Контекст обработки CURIE
При обычной обработке CURIE требуется следующая контекстная информация:
Набор отображений префиксов в IRI.
Отображение для префикса по умолчанию (например, :p).
Отображение для случая без префикса (например, p).
Отображение для префикса _, который используется для генерации уникальных идентификаторов (например, _:p).
В RDFa эти значения определяются следующим образом:
Набор отображений префиксов в IRI предоставляется текущими активными объявлениями префиксов элемента во время разбора.
Отображение для префикса по умолчанию — текущее отображение префикса по умолчанию.
Отображение для случая без префиксаНЕ определено.
Отображение для префикса _ не указано явно, но, поскольку он используется для генерации blank nodes, его реализация должна быть совместима с определением RDF и правилами из Ссылки на Blank Nodes. Документ НЕ ДОЛЖЕН определять отображение для префикса _. Соответствующий требованиям процессор RDFa ДОЛЖЕН игнорировать любые определения отображений для префикса _.
Правила преобразования CURIE в IRI
CURIE представляет собой полный IRI. Правила его определения:
Если CURIE состоит из пустого префикса и ссылки, IRI получается путём конкатенации текущего отображения префикса по умолчанию и ссылки. Если отображение префикса по умолчанию отсутствует, CURIE считается невалидным и ДОЛЖЕН игнорироваться.
Если CURIE состоит из непустого префикса и ссылки, и для префикса существует активное отображение (сравнение без учёта регистра), то IRI создаётся путём конкатенации этого отображения и ссылки.
Если для префикса нет активного отображения, значение не является валидным CURIE.
Примечание
См. Общее использование терминов в атрибутах для случаев, когда элементы без двоеточия могут интерпретироваться процессорами RDFa в некоторых типах данных.
6.1 Почему CURIE, а не QNames?
(Этот раздел является не нормативным.)
Во многих случаях разработчики языков пытались использовать QNames в качестве механизма расширения [XMLSCHEMA11-2]. QNames действительно позволяют управлять коллекцией имён независимо и могут сопоставлять имена с ресурсами. Однако QNames в большинстве случаев не подходят, потому что:
Использование QName в качестве идентификаторов в значениях атрибутов и содержимом элементов проблематично, как обсуждается в [QNAMES].
Синтаксис QNames избыточно строг и не позволяет выразить все возможные IRI.
Пример проблемы: попытка определить коллекцию имён для книг. В QName часть после двоеточия должна быть валидным именем элемента, что делает следующий пример недопустимым:
isbn:0321154991
Это невалидный QName, потому что 0321154991 не является допустимым именем элемента. Однако в данном случае нам и не нужно определять валидное имя элемента — цель использования QName заключалась в ссылке на элемент в частной области видимости (ISBN). Более того, мы хотим, чтобы имена в этой области видимости сопоставлялись с IRI, раскрывающим смысл ISBN. Как видно, определение QNames противоречит этому (довольно распространённому) сценарию.
Данная спецификация решает проблему, вводя CURIE. Синтаксически CURIE являются надмножеством QNames.
Важно
Эта спецификация предназначена для разработчиков языков, а не авторов документов. Любой разработчик языка, рассматривающий использование QNames для представления IRI или уникальных токенов, должен вместо этого рассмотреть CURIE:
CURIE изначально разработаны для использования в значениях атрибутов. QNames предназначены для однозначного именования элементов и атрибутов.
CURIE раскрываются в IRI, и любой IRI может быть представлен таким образом. QNames обрабатываются как пары значений, но даже если их объединить в строку, можно представить только подмножество IRI.
CURIE можно использовать в не-XML грамматиках и даже в XML-языках, не поддерживающих XML Namespaces. QNames ограничены XML-приложениями с поддержкой XML Namespaces.
3.7 - Latex
«TeX» — это созданная американским математиком и программистом Дональдом Кнутом (Donald E. Knuth) система для верстки текстов с формулами.
«TeX» — это созданная американским математиком и программистом Дональдом Кнутом (Donald E. Knuth) система для верстки текстов с формулами.
Сам по себе TEX представляет собой специализированный язык программирования (Кнут не только придумал язык, но и написал для него транслятор, причем таким образом, что он работает совершенно одинаково на самых разных компьютерах), на котором пишутся издательские системы, используемые на практике.
Точнее говоря, каждая издательская система на базе TEX’а представляет собой пакет макроопределений (макропакет) этого языка.
«LaTeX») — это созданная Лесли Лэмпортом (Leslie Lamport) издательская система на базе TEX’а.
3.7.1 - Библиотека цветных блоков и рамок tcolorbox для Latex
Этот пакет предоставляет окружение для цветных и обрамленных текстовых блоков с заголовком.
tcolorbox – Цветные рамки для примеров и теорем в LaTeX и т. д.
Этот пакет предоставляет среду для цветных текстовых рамок с заголовком. По желанию, такая рамка может быть разделена на верхнюю и нижнюю части; таким образом, пакет может быть использован для настройки примеров LaTeX, где одна часть рамки отображает исходный код, а другая часть показывает результат. Другой распространенный случай использования – настройка теорем. Пакет поддерживает сохранение и повторное использование исходного кода и частей текста.
Пакет зависит от пакетов pgf, verbatim, environ и etoolbox.
Пакет принимает ключи опций в синтаксисе “ключ-значение”. В качестве альтернативы вы можете использовать эти ключи позже в преамбуле с помощью команды \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. По умолчанию это не применяется к вложенным коробкам.
Например, цвета коробок могут быть определены для всего документа следующим образом:
После этого все последующие tcolorbox будут использовать указанные цвета фона и рамки.
\tcbsetforeverylayer{⟨options⟩}
Устанавливает параметры для всех последующих tcolorbox внутри текущей группы TEX. В отличие от \tcbset, это также применяется к вложенным коробкам. Технически, параметры ⟨options⟩ добавляются к значениям по умолчанию для каждой tcolorbox, которые применяются с помощью /tcb/reset
Не следует использовать этот макрос, если вы не уверены, что хотите применять ⟨options⟩ также для коробок в коробках (в коробках в коробках и т.д.).
В этом примере все последующие tcolorbox будут иметь зеленый фон и красную рамку, включая вложенные коробки.
\tcbox[⟨options⟩]{⟨box content⟩}
Создает цветную коробку, которая подгоняется по ширине к заданному содержимому ⟨box content⟩. В принципе, большинство ⟨options⟩ для tcolorbox могут быть использованы для \tcbox с некоторыми ограничениями. \tcbox не может иметь нижнюю часть и не может быть разбита.
В этом примере создается цветная коробка с заданным фоном и рамкой, подгоняющаяся по ширине к тексту внутри.
\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-формате.}}
В этом примере создается цветная коробка с заданным фоном и рамкой, подгоняющаяся по ширине к тексту, который интерпретируется без форматирования.
Создает новое окружение ⟨name⟩ на основе tcolorbox. В принципе, \newtcolorbox работает как \newenvironment. Это означает, что новое окружение ⟨name⟩ может принимать ⟨number⟩ аргументов, где ⟨default⟩ — это значение по умолчанию для необязательного первого аргумента. Параметры ⟨options⟩ передаются основной tcolorbox. Обратите внимание, что /tcb/savedelimiter автоматически устанавливается на заданное ⟨name⟩. Параметры ⟨init options⟩ позволяют настроить автоматическую нумерацию.
В этом примере создается новое окружение 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}
В этом примере существующее окружение mybox переопределяется с новыми параметрами, включая цвет фона, цвет рамки и заголовок. Теперь это окружение будет использовать новые настройки при каждом вызове.
Создает новое окружение ⟨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 уже существует, будет выдана ошибка.
Работает аналогично \NewTColorBox, но основан на \ProvideDocumentEnvironment вместо \NewDocumentEnvironment. Окружение ⟨name⟩ создается только в том случае, если оно еще не определено.
Работает аналогично \NewTColorBox, но основан на \DeclareDocumentEnvironment вместо \NewDocumentEnvironment. Новое окружение всегда создается, независимо от того, существует ли уже окружение с тем же именем.
Создает новую команду \⟨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 уже существует, будет выдана ошибка.
Работает аналогично \NewTotalTColorBox, но основан на \ProvideDocumentCommand вместо \NewDocumentCommand. Команда \⟨name⟩ создается только в том случае, если она еще не определена.
Работает аналогично \NewTotalTColorBox, но основан на \DeclareDocumentCommand вместо \NewDocumentCommand. Новая команда всегда создается, независимо от того, существует ли уже команда с тем же именем.
Создает новый макрос \⟨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}.\parThe \xmybox[green]{quick} brown \xmybox{fox}\xmybox[blue]{jumps} over the \xmybox[green]{lazy}\xmybox{dog}.
В этом примере создается новый макрос mytcbox, который может принимать два аргумента, где первый аргумент имеет значение по умолчанию “default value”. Параметры для tcbox задают цвет фона и цвет рамки.
Создает новую команду \⟨name⟩ на основе \tcbox. В принципе, \NewTCBox работает как \NewDocumentCommand. Это означает, что новая команда \⟨name⟩ создается с заданным аргументом LATEX3 ⟨specification⟩. В дополнение к аргументу ⟨specification⟩ есть автоматический последний (обязательный) аргумент \⟨name⟩, который принимает содержимое коробки. Таким образом, \⟨name⟩ может иметь до 10 аргументов в сумме. Если \⟨name⟩ уже было определено, будет выдана ошибка. Параметры ⟨options⟩ передаются основной \tcbox. Обратите внимание, что /tcb/savedelimiter автоматически устанавливается на заданное \⟨name⟩. Параметры ⟨init options⟩ позволяют настроить автоматическую нумерацию.
В этом примере создается новая команда mynewtcbox, которая принимает спецификацию и параметры, включая цвет фона и цвет рамки. Если команда с именем mynewtcbox уже существует, будет выдана ошибка.
Работает аналогично \NewTCBox, но основан на \ProvideDocumentCommand вместо \NewDocumentCommand. Команда \⟨name⟩ создается только в том случае, если она еще не определена.
Работает аналогично \NewTCBox, но основан на \DeclareDocumentCommand вместо \NewDocumentCommand. Новая команда всегда создается, независимо от того, существует ли уже команда с тем же именем.
Создает новую команду \⟨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}.
В этом примере существующая команда mytotaltcbox переопределяется с новыми параметрами и содержимым.
\ProvideTotalTCBox[⟨init options⟩]{\⟨name⟩}{⟨specification⟩}{⟨options⟩}{⟨content⟩}
Работает аналогично \NewTotalTCBox, но основан на \ProvideDocumentCommand вместо \NewDocumentCommand. Команда \⟨name⟩ создается только в том случае, если она еще не определена.
В этом примере команда mytotaltcbox будет создана только если она еще не существует.
\DeclareTotalTCBox[⟨init options⟩]{\⟨name⟩}{⟨specification⟩}{⟨options⟩}{⟨content⟩}
Работает аналогично \NewTotalTCBox, но основан на \DeclareDocumentCommand вместо \NewDocumentCommand. Новая команда всегда создается, независимо от того, существует ли уже команда с тем же именем.
Отделяет заголовок от стандартной позиции, сохраняя его в \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}}
3.7.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}
3.7.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.
Важные нюансы:
Разделение частей:
Верхняя часть обязательна, нижняя — опциональна (активируется \tcblower).
Без \tcblower весь контент считается верхней частью.
Совместимость:
saveto нельзя использовать с savelowerto или redirectlowerto.
Применение:
invisible полезен для скрытия контента (например, при сохранении в файл без отображения).
savelowerto удобен для извлечения доп. материалов (решений задач, примечаний).
3.7.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: сохранена нижняя часть.
Ключевые особенности:
Гибкость:
lowerbox=ignored полностью исключает нижнюю часть из обработки, что полезно для оптимизации.
redirectlowerto позволяет сохранять контент без побочных эффектов (например, изменения счётчиков).
Совместимость:
savelowerto и redirectlowerto нельзя использовать вместе с saveto.
Дизайн:
Разделение частей (lower separated) можно настроить для разных стилей (например, beamer или raster).
3.7.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}
Особенности:
Все цветовые параметры поддерживают стандартные цветовые модели LaTeX (например, red!50!white).
Для шрифтов можно использовать любые стандартные команды изменения шрифта (\bfseries, \itshape и т.д.).
Параметр title filled автоматически активируется при установке colbacktitle или других связанных с заголовком параметров.
coltext удобен для установки единого цвета текста во всем боксе, тогда как colupper и collower позволяют дифференцировать части.
3.7.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}
Для большинства случаев достаточно sharp corners или rounded corners
Используйте sharpish corners, если нужен компромисс между внешним видом и поведением теней
Можно точечно менять отдельные углы для создания уникальных дизайнов
Настройки углов влияют на:
Основную рамку бокса
Границы (borderline)
Тени (shadow)
3.7.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}
\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}
Особенности работы с прозрачностью:
Визуальные эффекты:
Значение 0.0 делает элемент полностью невидимым
Значение 1.0 - полностью непрозрачным
Промежуточные значения создают эффект просвечивания
Рекомендации:
Для лучшего визуального восприятия используйте значения в диапазоне 0.3-0.8
Прозрачность особенно эффектна при наложении элементов или использовании фоновых изображений
В сочетании с jigsaw-скинами можно создавать интересные дизайнерские решения
Технические ограничения:
Прозрачность может по-разному отображаться в различных PDF-ридерах
При печати эффекты прозрачности могут не сохраняться в зависимости от принтера
Комбинации:
Можно комбинировать несколько параметров прозрачности для одного бокса
Эффекты прозрачности суммируются при наложении элементов
Эти параметры позволяют создавать сложные визуальные эффекты и гибко управлять внешним видом элементов tcolorbox.
3.7.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}
\begin{tcolorbox}[height=5cm]
\begin{tcolorbox}[inherit height=0.5]
Бокс с половиной высоты родителя
\end{tcolorbox}\end{tcolorbox}
Особенности работы с высотой:
Для работы некоторых параметров (height fill) требуется библиотека breakable
Параметры групп высот требуют двойной компиляции
natural height - это высота по умолчанию, рассчитываемая автоматически
При использовании equal height group все боксы в группе получают высоту самого высокого бокса
height plus позволяет задать максимально возможное увеличение высоты при необходимости
3.7.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}
Особенности работы:
Параметры с * (например, before upper*) не добавляют автоматические пробелы (\ignorespaces/\unskip)
Для работы tabulars/tabularx требуются соответствующие пакеты
text fill полезен для вертикального выравнивания с \vfill
TikZ-окружения позволяют легко встраивать графику
Окружения environment не работают с другими tcolorbox-окружениями
3.7.1.13 - Команды для упрвления слоями в боксах
Управляет слоями в боксах, наложение друг на друга и т.д.
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}
Особенности работы с наложениями:
Для сложных наложений рекомендуется использовать enhanced режим из библиотеки skins
Наложения применяются после рисования рамки и фона, но перед отображением текста
Для позиционирования элементов можно использовать узлы геометрии (frame.north west, title.south и т.д.)
При работе с разорванными боксами (breakable) можно задавать разные наложения для разных частей
Наложения могут содержать любые допустимые TikZ-команды
Советы:
Используйте overlay для элементов, которые должны отображаться всегда
Для разорванных боксов применяйте overlay first/middle/last для разных частей
Комбинированные параметры (unbroken and first и т.д.) помогают избежать дублирования кода
Для сложных графических элементов создавайте стили с наложениями и переиспользуйте их
3.7.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}
Особенности работы с плавающими объектами:
Параметры размещения (для float и float*):
h - здесь (если возможно)
t - вверху страницы
b - внизу страницы
p - на отдельной странице
! - принудительное размещение
Различия между float и float*:
float работает как стандартное плавающее окружение
float* предназначен для:
Двухколоночных документов
Использования с пакетами multicol/paracol
Широких боксов (требует width=\textwidth)
Отключение плавающего поведения:
Используйте nofloat для возврата к обычному поведению
Особые случаи:
Для разрываемых боксов (breakable) every float выполняется перед каждой частью
before float и after float позволяют вставить код до/после float-окружения
Советы по использованию:
Для изображений и широких таблиц лучше использовать float*
Комбинация every float=\centering полезна для центрирования содержимого
При использовании в двухколоночном режиме не забывайте указывать width=\textwidth
Для точного контроля размещения используйте комбинации параметров (например, float=!b для принудительного размещения внизу)
3.7.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} продолжение текста.
Особенности работы:
Параметры *balanced учитывают базовую линию текста для более точного выравнивания
nobeforeafter полностью убирает бокс из отдельного абзаца
Для точного контроля вертикального положения используйте комбинацию baseline и box align
Параметры с skip изменяют bounding box, что может влиять на общий макет
Советы:
Для встраивания в текст используйте nobeforeafter + box align=base
Для сложных макетов предпочтительнее *balanced версии отступов
При работе с разрываемыми боксами учитывайте поведение ignore nobreak
Для восстановления стандартного поведения \parfillskip используйте parfillskip restore
3.7.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}
Текст \tcbox[shrink tight, extrude right by=5mm]{с выступающим} элементом
Особенности работы:
Параметры с * не создают новую страницу
Для визуализации bounding box используйте show bounding box
Комбинированные параметры (spread и др.) экономят время настройки
Выступающие элементы (extrude) не изменяют bounding box
3.7.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{...}.
3.7.1.18 - Управление Capture mode в пакете tcolorbox
Capture Mode определяет, как содержимое tcolorbox обрабатывается и отображается.
Capture Mode в tcolorbox
Capture Mode определяет, как содержимое 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) имеет фиксированный размер.
3.7.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=true — решает проблемы с переносом длинных слов.
Если нужно что-то уточнить или добавить, дайте знать!
3.7.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. Важные замечания
Имя файла по умолчанию
Если не указать tempfile, будет использоваться <имя_документа>.tcbtemp (например, document.tcbtemp).
Автоматическое управление
\tcbwritetemp автоматически записывает содержимое в указанный временный файл.
\tcbusetemp автоматически вставляет его в документ.
Очистка временных файлов
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, чтобы избежать неожиданных перезаписей.
3.7.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), текст по центру (может выходить за границы).
Обычный текст \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. Важные замечания
tcbox raise работает только с \tcbox и \tcboxmath.
verbatim стиль уменьшает отступы — используйте для коротких команд.
forced режимы могут обрезать текст — применяйте осторожно.
Вывод
Для встроенных в текст рамок используйте on line или tcbox raise base.
Для управления шириной выбирайте подходящий tcbox width режим.
Для оформления команд удобен verbatim стиль.
Эти настройки дают полный контроль над встроенными цветными рамками в LaTeX!
3.7.1.22 - Counters, Labels, and References - Счётчики, метки и ссылки в tcolorbox
В этом разделе рассматриваются механизмы работы с нумерацией, перекрёстными ссылками и гиперссылками в рамках tcolorbox.
Counters, Labels, and References - Счётчики, метки и ссылки в tcolorbox
В этом разделе рассматриваются механизмы работы с нумерацией, перекрёстными ссылками и гиперссылками в рамках tcolorbox.
1. Основные команды и параметры
1.1. Основные опции для работы с метками
Опция
Синтаксис
Описание
phantom
phantom={\refstepcounter{mycounter}}
Выполняет код без видимого вывода (для счётчиков и меток)
\usepackage{hyperref}\begin{tcolorbox}[
hypertarget=target1,
title=Кликабельный блок
]
\hyperlink{target2}{Перейти к другому блоку}.
\end{tcolorbox}\begin{tcolorbox}[
hypertarget=target2,
title=Целевой блок
]
Этот блок будет целью ссылки.
\end{tcolorbox}
\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. Важные замечания
Для работы zlabel требуется пакет zref
phantom код выполняется в группе - используйте \global для глобальных изменений
Опции bookmark и index требуют соответствующих пакетов
Вывод
Используйте label и phantom для перекрёстных ссылок
label type улучшает работу с cleveref
hypertarget и bookmark добавляют интерактивности PDF
index интегрирует боксы в предметный указатель
3.7.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. Важные особенности
Точность проверки:
Для точного определения чётности страницы требуется:
Установить check odd page=true
Двойная компиляция документа
Без этой опции проверка может работать некорректно для первого блока на странице
Разрываемые боксы:
Для breakable-боксов используйте if odd page* вместо if odd page
Для документов с 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. Вывод
Для разного оформления на чётных/нечётных страницах:
Используйте if odd page для обычных боксов
Используйте if odd page* для breakable-боксов
Для точности добавьте check odd page=true
Специальные команды:
\tcbifoddpage - условный оператор в коде
\thetcolorboxnumber - уникальный номер бокса
\thetcolorboxpage - точный номер страницы
Для односторонней печати используйте варианты с or oneside.
3.7.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. Важные особенности
Автоматическое отключение в TikZ-окружении:
Внутри tikzpicture опция shield externalize автоматически отключается
Не используйте \tikzexternaldisable перед tcolorbox в этом случае
Рекомендуемые паттерны использования:
\tikzexternalenable% Рисунки для экспорта
\tikzexternaldisable% Обычные tcolorbox
Требования:
Для работы необходимо подключить библиотеку TikZ:
\usetikzlibrary{external}\tikzexternalize
Ограничения:
Рисунки, созданные через 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. Вывод
Защита боксов:
Используйте shield externalize для предотвращения экспорта tcolorbox
Устанавливайте глобально через \tcbset, если не нужен экспорт
Управление экспортом:
Для экспорта отдельных рисунков используйте external=имя_файла
Для принудительного обновления - remake=true
Лучшие практики:
Чётко разделяйте код, требующий экспорта и не требующий
Используйте \tikzexternalenable/disable для группировки экспортируемых элементов
Эти механизмы позволяют эффективно комбинировать tcolorbox с системой внешних файлов TikZ, оптимизируя процесс сборки сложных документов.
3.7.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. Важные особенности
reset:
Не сбрасывает capture, shield externalize и настройки raster
Автоматически применяется для вложенных боксов (начиная с v2.40)
Условные операторы:
Основаны на функциях expl3 и xparse
Полезны для создания гибких шаблонов боксов
void vs nirvana:
void полностью удаляет бокс (как если бы его закомментировали)
nirvana обрабатывает содержимое (счётчики и пр.), но не отображает
Ограничения:
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. Вывод
Для сброса настроек используйте reset
Для условного форматирования применяйте:
IfBlankTF/IfEmptyTF - проверка на пустоту
IfNoValueTF/IfValueTF - работа с аргументами
IfBooleanTF - для булевых флагов
Для скрытия блоков:
void - полное удаление
nirvana - скрытие с обработкой содержимого
3.7.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 – расстояние до верхнего колонтитула. Пример:
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 “Создание команд и окружений документа”:
Эта группа команд используется для создания команды ⟨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, который также дает пример, в котором это необходимо.
Эти команды работают так же, как \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, \IfNoValueT и \IfNoValueF. Поскольку тесты \IfNoValue(TF) являются расширяемыми, возможно проверять эти значения позже, например, в момент верстки или в контексте расширения.
Важно отметить, что -NoValue- сконструирован таким образом, что он не будет соответствовать простому текстовому вводу -NoValue-, т.е.
\IfNoValueTF{-NoValue-}
будет логически ложным. Когда два необязательных аргумента следуют друг за другом (синтаксис, который мы обычно не рекомендуем), может иметь смысл позволить пользователям команды указывать только второй аргумент, предоставив пустой первый аргумент. Вместо того чтобы отдельно проверять на пустоту и на -NoValue-, лучше использовать тип аргумента O с пустым значением по умолчанию, а затем проверять на пустоту, используя условие \IfBlankTF (описанное ниже).
Обратная форма тестов \IfNoValue(TF) также доступна как \IfValue(TF). Контекст определит, какая логическая форма имеет наибольший смысл для данного сценария кода.
Команда \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⟩), имеют имена, которые доступны вне блоков кода.
Этот код проверяет наличие звезды в качестве первого аргумента, а затем выбирает действие на основе этой информации.
2.9 Автоматическое преобразование в формат ключ-значение
Некоторые команды документа имеют долгую историю принятия необязательного аргумента в виде «свободного текста», например, \caption и команды секционирования \section и т.д. Введение более сложных (keyval) опций для этих команд требует метода интерпретации необязательного аргумента как свободного текста или как серии ключевых значений. Это должно происходить во время захвата аргумента, так как необходимо аккуратно обрабатывать фигурные скобки для получения правильного результата.
Модификатор = доступен для того, чтобы позволить ltcmd правильно реализовать этот процесс. Модификатор гарантирует, что аргумент будет передан в дальнейший код как серия ключевых значений. Для этого = должен быть за ним, за которым следует аргумент, содержащий имя ключа по умолчанию. Это используется как ключ в паре ключ-значение, если «сырой» аргумент не имеет правильной формы для интерпретации как набора ключевых значений.
Пример с \caption
Рассмотрим \caption в качестве примера с демонстрационной реализацией:
Имя ключа по умолчанию — short-text. Когда команда \caption используется, если необязательный аргумент является свободным текстом, например:
\caption[Некоторый короткий текст]{Длинный и более детализированный текст для демонстрационных целей}
то вывод будет:
Grabbed arguments: (short-text={Некоторый короткий текст}) and (Длинный и более детализированный текст для демонстрационных целей)
С другой стороны, если заголовок задан с аргументом в формате ключ-значение:
\caption[label = cap:demo]{Длинный и более детализированный текст для демонстрационных целей}
то это будет учтено:
Grabbed arguments: (label = cap:demo) and (Длинный и более детализированный текст для демонстрационных целей)
Интерпретация в формате ключ-значение
Интерпретация как ключ-значение определяется наличием символов = в аргументе. Символы в режиме встроенной математики (включенные в $...$ или \(...\)) игнорируются. Аргумент можно заставить быть прочитанным как ключ-значение, включив пустую запись в начале:
\caption[=,Это теперь ключ-значение]%
\caption[Это не $=$ ключ-значение]%
Эта пустая запись не передается в основной код, поэтому не приведет к проблемам с парсерами ключ-значение, которые не допускают пустое имя ключа. Любые знаки = в текстовом режиме необходимо обрамлять фигурными скобками, чтобы избежать неправильной интерпретации: это, вероятно, наиболее удобно обрабатывать, обрамляя весь аргумент:
Процессоры аргументов применяются к аргументу после его захвата основной системой, но перед передачей в ⟨код⟩. Таким образом, процессор аргументов может использоваться для нормализации ввода на ранней стадии, позволяя внутренним функциям быть полностью независимыми от формы ввода. Процессоры применяются к пользовательскому вводу и к значениям по умолчанию для необязательных аргументов, но не к специальному маркеру -NoValue-.
Каждый процессор аргументов указывается синтаксисом >{⟨процессор⟩} в спецификации аргумента. Процессоры применяются справа налево, так что >{\ProcessorB} >{\ProcessorA} m применит \ProcessorA, а затем \ProcessorB к токенам, захваченным аргументом m.
\SplitArgument {⟨number⟩} {⟨token(s)⟩}
Этот процессор разделяет аргумент, заданный при каждом вхождении ⟨tokens⟩, до максимума ⟨number⟩ токенов (тем самым деля ввод на ⟨number⟩ + 1 частей). Ошибка будет выдана, если в вводе присутствует слишком много ⟨токенов⟩. Обработанный ввод помещается внутри ⟨number⟩ + 1 наборов фигурных скобок для дальнейшего использования. Если в аргументе меньше, чем ⟨number⟩, то в конце обработанного аргумента добавляются маркеры -NoValue-.
Если для разделения используется только один символ ⟨токен⟩, любой символ с кодом категории 13 (активный) совпадающий с ⟨токеном⟩ будет заменен до того, как произойдет разделение. Пробелы обрезаются в начале и в конце каждого элемента, который разбирается.
Тип аргумента E несколько особенный, потому что с одним E в объявлении команды вы можете получить несколько аргументов в команде (по одному формальному аргументу на каждый токен украшения). Поэтому, когда процессор аргументов применяется к аргументу типа e/E, все аргументы проходят через этот процессор перед тем, как быть переданными в ⟨код⟩. Например, эта команда:
Этот процессор разделяет аргумент, заданный при каждом вхождении ⟨токенов⟩, где количество элементов не фиксировано. Каждый элемент затем оборачивается в фигурные скобки внутри #1. Результат заключается в том, что обработанный аргумент может быть дополнительно обработан с использованием функции отображения (см. ниже).
Если для разделения используется только один символ ⟨токен⟩, он учтет возможность того, что ⟨токен⟩ был активирован (код категории 13) и будет разделять по таким токенам. Пробелы обрезаются в начале и в конце каждого элемента, который разбирается. Точно один набор фигурных скобок будет удален, если весь элемент окружен ими, т.е. следующие вводы и выводы приводят к результату (каждый отдельный элемент как группа фигурных скобок):
Чтобы поддержать \SplitList, доступна функция \ProcessList, которая применяет ⟨токены⟩ ко всем элементам в ⟨списке⟩. ⟨Токены⟩ могут содержать произвольные данные, которые ожидают один аргумент после них: элемент списка. Например:
Этот процессор изменяет логику \BooleanTrue и \BooleanFalse, так что пример из предыдущего раздела будет выглядеть следующим образом:
\NewDocumentCommand\foo{>{\ReverseBoolean} s m}{%
\IfBooleanTF#1%
{\DoSomethingWithoutStar{#2}}%
{\DoSomethingWithStar{#2}}%
}
\TrimSpaces
Удаляет любые ведущие и завершающие пробелы (токены с кодом символа 32 и кодом категории 10) на концах аргумента. Таким образом, например, объявление функции:
покажет «hello␣world» в терминале, при этом пробелы в начале и в конце будут удалены. \TrimSpaces удалит множественные пробелы с концов ввода в случаях, когда они были включены так, что стандартное преобразование TEX, которое сводит множественные пробелы к одному, не применяется.
2.11 Тело окружения
Хотя окружения \begin{⟨окружение⟩} ... \end{⟨окружение⟩} обычно используются в случаях, когда код, реализующий ⟨окружение⟩, не нуждается в доступе к содержимому окружения (его «телу»), иногда полезно иметь тело в качестве стандартного аргумента. Это достигается путем завершения спецификации аргумента с помощью b, который является специальным типом аргумента для этой ситуации. Например:
Префикс + используется для разрешения нескольких абзацев в теле окружения. Процессоры аргументов также могут применяться к аргументам типа b. По умолчанию пробелы обрезаются в начале и в конце тела: в приведенном примере в противном случае будут пробелы, исходящие из концов строк после [\itshape] и world!. Добавление префикса ! перед b подавляет обрезку пробелов.
Когда b используется в спецификации аргумента, последний аргумент объявления окружения (например, \NewDocumentEnvironment), который состоит из ⟨кода завершения⟩ для вставки в \end{⟨окружение⟩}, является избыточным, так как можно просто поместить этот код в конец ⟨кода начала⟩. Тем не менее, этот (пустой) ⟨код завершения⟩ должен быть предоставлен.
Окружения, использующие эту функцию, могут быть вложенными.
2.12 Полностью расширяемые команды документа
Команды документа, созданные с помощью \NewDocumentCommand и т.д., обычно создаются так, чтобы они не расширялись неожиданно. Это достигается с использованием возможностей движка, поэтому это более мощно, чем механизм \protect в LATEX 2ε. Существуют очень редкие случаи, когда может быть полезно создать функции с использованием захватчика, который работает только на расширении. Это накладывает ряд ограничений на природу аргументов, принимаемых функцией, и на код, который она реализует. Эта возможность должна использоваться только в случае необходимости.
Эта группа команд используется для создания команды документа уровня ⟨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). Когда команда определяется, значение символьного токена фиксируется в определении команды и не может изменяться. Команда правильно увидит разделитель аргумента, если открывающий разделитель имеет те же коды символа и категории, что и в момент определения. Например:
так как открывающий разделитель < изменил свое значение между двумя вызовами \foobar, поэтому второй вызов не видит < как допустимый разделитель. Команды предполагают, что если был найден допустимый открывающий разделитель, то также будет соответствующий закрывающий разделитель. Если его нет (либо из-за пропуска, либо из-за изменения значения), возникает ошибка низкого уровня TEX, и вызов команды прерывается.
2.18.2 Токены управляющих последовательностей
Токен управляющей последовательности (или управляющего символа) характеризуется своим именем, а его значение — это его определение. Токен не может иметь два разных значения одновременно. Когда управляющая последовательность определяется как разделитель в команде, она будет обнаружена как разделитель всякий раз, когда имя управляющей последовательности встречается в документе, независимо от ее текущего определения. Например:
Процессоры аргументов позволяют манипулировать захваченным аргументом перед его передачей в основной код. Новые реализации процессоров могут быть созданы в виде функций, которые принимают один завершающий аргумент и оставляют свой результат в переменной \ProcessedArgument.
Например, \ReverseBoolean определяется следующим образом:
Примечание: Код написан на языке expl3, поэтому нам не нужно беспокоиться о том, что пробелы могут попасть в определение.
3 Копирование и отображение (робустных) команд и окружений
Если вы хотите (слегка) изменить существующую команду, вам может понадобиться сохранить текущее определение под новым именем, а затем использовать его в новом определении. Если существующая команда является робустной, то старый трюк с использованием низкоуровневой команды \let не сработает, потому что он копирует только верхнее определение, но не ту часть, которая фактически выполняет работу. Поскольку большинство команд LATEX в настоящее время являются робустными, LATEX предлагает некоторые высокоуровневые объявления для этого.
Однако, пожалуйста, обратите внимание, что обычно лучше использовать доступные хуки (например, хуки для общих команд или окружений), вместо того чтобы копировать текущее определение и тем самым замораживать его; смотрите документацию по управлению хуками lthooks-doc.pdf для получения подробной информации.
Эти команды копируют определение ⟨existing-cmd⟩ в ⟨cmd⟩. После этого ⟨existing-cmd⟩ может быть переопределен, и ⟨cmd⟩ все еще будет работать! Это позволяет вам предоставить новое определение для ⟨existing-cmd⟩, которое использует ⟨cmd⟩ (т.е. его старое определение). Например, после
все логотипы LATEX, сгенерированные с помощью \LaTeX, будут отображаться синим цветом (при условии, что у вас загружен пакет цвета).
Различия между \New... и \Renew... такие же, как и в других случаях: вы получите ошибку в зависимости от того, существует ли уже ⟨cmd⟩, или в случае \Declare... оно будет скопировано независимо от этого. Обратите внимание, что нет объявления \Provide..., потому что это было бы ограниченной ценностью.
Если ⟨cmd⟩ или ⟨existing-cmd⟩ не могут быть предоставлены как единый токен, а требуют “конструирования”, вы можете использовать \ExpandArgs, как объясняется в разделе 4.
\ShowCommand {⟨cmd⟩}
Эта команда отображает значение ⟨cmd⟩ в терминале и затем останавливается (так же, как и примитивная \show). Разница в том, что она правильно показывает значение более сложных команд, например, в случае робустных команд она отображает не только верхнее определение, но и фактический код нагрузки, а в случае команд, объявленных с помощью \NewDocumentCommand и т.д., она также предоставляет подробную информацию о сигнатуре аргументов.
Эти команды копируют определение окружения ⟨existing-env⟩ в ⟨env⟩ (как начальный, так и конечный код), т.е. это просто применение \NewCommandCopy дважды к внутренним командам, которые определяют окружение, т.е. \⟨env⟩ и \end⟨env⟩. Различия между \New..., \Renew... и \Declare... являются обычными.
\ShowEnvironment {⟨env⟩}
Эта команда отображает значение начального и конечного кода для окружения ⟨env⟩.
4 Предварительное построение имен команд (или иное расширение аргументов)
При объявлении новых команд с помощью \NewDocumentCommand, \NewCommandCopy или аналогичных команд иногда необходимо “построить” имя команды. В качестве общего механизма L3 программный уровень предлагает \exp_args:N... для этой цели, но нет механизма для этого, если \ExplSyntaxOn не активен (и смешивание команд программного и пользовательского уровней не является хорошим подходом). Поэтому мы предлагаем механизм для доступа к этой возможности с использованием именования в стиле CamelCase.
\UseName преобразует ⟨string⟩ непосредственно в имя команды и затем выполняет его: это эквивалентно давно существующей внутренней команде LATEX 2ε \@nameuse или эквиваленту L3 программирования \use:c. \ExpandArgs принимает ⟨spec⟩, который описывает, как расширять ⟨arguments⟩, выполняет эти операции, а затем выполняет ⟨cmd⟩. ⟨spec⟩ использует описания, предлагаемые L3 программным уровнем, и соответствующая функция \exp_args:N... должна существовать. Общие случаи будут иметь ⟨spec⟩ в виде c, cc или Nc: см. ниже.
В качестве примера, следующее объявление предоставляет метод для генерации команд редактирования:
В ⟨spec⟩ каждая c обозначает один аргумент, который преобразуется в команду. n представляет собой “нормальный” аргумент, который не изменяется, а N обозначает “нормальный” аргумент, который также остается неизменным, но состоит только из одного токена (и обычно не заключен в фигурные скобки). Таким образом, чтобы построить команду из строки только для второго аргумента \NewCommandCopy, вы бы написали:
Существует несколько других одиночных букв, поддерживаемых в 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, дающие результат в градусах.
Функции округления, управляемые двумя необязательными значениями, 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\cdot10^{-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.
Эти команды аналогичны \inteval, но вычисляют длину (dimen) или значение резинки (skip). Обе команды являются тонкими оболочками вокруг соответствующих примитивов движка, что делает их быстрыми, но, следовательно, они имеют те же синтаксические особенности, как обсуждалось выше. Тем не менее, на практике они обычно достаточно эффективны. Например:
Эта команда устанавливает \textheight на соответствующее значение, если страница должна содержать определенное количество строк текста. Таким образом, после вызова \calculateheight{40} значение будет установлено на 478.0pt, учитывая значения \topskip (10.0pt) и \baselineskip (12.0pt) в текущем документе.
6 Расширяемый эквивалент \input
\expandableinput {⟨filename⟩}
Определение \input в LATEX не может быть использовано в местах, где TEX выполняет расширение: классический пример — в начале ячейки таблицы. Существует несколько причин для этого: ключевыми являются то, что \input фиксирует, какие файлы были прочитаны, и предоставляет хуки до и после чтения файла.
Чтобы поддержать необходимость выполнения ввода файла в контекстах расширения, доступна команда \expandableinput: она пропускает запись имени файла и не применяет никакие хуки для файлов, но в остальном ведет себя как \input. В частности, она по-прежнему использует \input@path при выполнении поиска файла.
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 предоставляет способ заменить команду альтернативной версией, когда она встречается внутри ситуации изменения регистра. Существуют три команды для настройки изменения регистра кодовых точек:
Все три принимают ⟨codepoint⟩ (в виде целочисленного выражения) и приводят к тому, что
8 Поддержка решения проблем
\listfiles [⟨options⟩]
Если эта команда помещена в преамбулу, то в конце выполнения документа на терминале (и в лог-файле) будет отображен список прочитанных файлов (в результате обработки документа). При возможности также будет предоставлено краткое описание. Эти описания, надеемся, будут включать описания, даты и номера версий для файлов пакетов и классов.
Иногда может случиться так, что в файл пакета или класса (или, скорее, в его копию) были внесены локальные изменения. Чтобы позволить идентифицировать такие случаи, \listfiles принимает необязательный аргумент, который позволяет настроить выводимую информацию с использованием подхода ключ-значение:
hashes — добавляет MD5-хеш для каждого файла в выводимую информацию.
sizes — добавляет размер файла для каждого файла в выводимую информацию.
Обратите внимание, что так как Windows и Unix используют разные окончания строк (LF против LF CR), хеши и размеры файлов из двух систем не будут одинаковыми. Поэтому следует сравнивать эти значения между операционными системами одного типа.
Предупреждение: эта команда будет перечислять только файлы, которые были прочитаны с использованием команд LATEX, таких как \input{⟨file⟩} или \include{⟨file⟩}. Если файл был прочитан с использованием примитивного синтаксиса TEX \input file (без фигурных скобок вокруг имени файла), то он не будет перечислен; несоблюдение формата LATEX с фигурными скобками может вызвать более серьезные проблемы, возможно, приведя к перезаписи важных файлов, поэтому всегда используйте фигурные скобки.
3.7.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). |
| **>** | Модификатор: применяет "процессор аргументов" для преобразования ввода. |
Эта группа команд используется для создания команды ⟨cmd⟩. Спецификация аргумента для функции задается с помощью ⟨arg spec⟩, а команда использует ⟨code⟩, где #1, #2 и т. д. заменяются на аргументы, найденные парсером.
Пример:
\NewDocumentCommand\chapter{s o m}{\IfBooleanTF{#1}{\typesetstarchapter{#3}}{\typesetnormalchapter{#2}{#3}}}
Эти команды работают так же, как \NewDocumentCommand и т. д., но создают окружения (\begin{⟨env⟩} … \end{⟨env⟩}). Как ⟨beg-code⟩, так и ⟨end-code⟩ могут получать доступ к аргументам, как определено в ⟨arg spec⟩. Аргументы будут переданы после \begin{⟨env⟩}. Все пробелы в начале и в конце {⟨env⟩} удаляются перед определением, таким образом:
Обратная форма тестов \IfNoValue(TF) также доступна как \IfValue(TF). Контекст определит, какая логическая форма имеет наибольший смысл для данного сценария кода.
Таблица описывающая команды проверки специальных значений:
| Команда | Краткое описание |
|-----------------------------|----------------------------------------------------------------------------------|
| `\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` → сначала разделит запятыми, затем обрежет пробелы. |
\NewDocumentCommand\process{>{\TrimSpaces} >{\SplitList{;}} m}{\ProcessList{#1}{\SomeCommand}}\process{ a; b; c }% → обработает как `{a}{b}{c}`
3.7.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}
Пояснение ключевых команд:
Настройка внешнего вида таблицы:
\tabcolsep - расстояние между колонками
\arraystretch - коэффициент растяжения строк по вертикали
\rowcolors - чередование цветов строк
\arrayrulecolor - цвет линий таблицы
Структура таблицы:
\begin{longtable}{формат_колонок} - начало длинной таблицы
Формат колонок: B{2}|L{8}|L{5} - три колонки с заданной шириной и выравниванием
Заголовки:
\caption - название таблицы (в квадратных скобках - для списка таблиц)
\endfirsthead - заголовок только для первой страницы
\endhead - заголовок для последующих страниц
Форматирование содержимого:
\rowcolor - цвет фона строки
\multicolumn - объединение ячеек по горизонтали
\color - цвет текста
Специальные символы:
\diameter - символ диаметра (из пакета wasysym)
Этот пример создает профессионально оформленную таблицу с:
\begin{tabular}{|>{\ifnum\value{rownum}=1 \bfseries\fi}l|l|}\hlineСтрока 1 & Данные 1 \\Строка 2 & Данные 2 \\\hline\end{tabular}
Использование пользовательских колонок:
\newcolumntype{M}[1]{>{\centering\arraybackslash}m{#1}}\begin{tabular}{|M{2cm}|M{3cm}|}Центрированная & колонка \\ячейка & с заданной шириной \\\end{tabular}
Полезные команды
\extrarowheight - добавление дополнительного пространства в строках
\newcolumntype - определение новых типов колонок
\multicolumn - объединение колонок (также доступно без array)
Эти пакеты предоставляют мощные инструменты для создания профессионально оформленных таблиц в LaTeX, от простых до самых сложных.
3.7.5 - Описание пакетов fancyhdr и fancybox
подробное описание пакетов fancyhdr и fancybox, включая ваши настройки и дополнительные примеры.
Пакеты fancyhdr и fancybox
Назначение: Оформление колонтитулов (fancyhdr) и декоративных рамок (fancybox).
1. fancyhdr
Основные возможности
Настройка верхних (head) и нижних (foot) колонтитулов.
Разные стили для чётных/нечётных страниц (twoside).
Автоматическая подстановка номеров страниц, названий разделов.
Команды и параметры
Инициализация
\usepackage[twoside,headings]{fancyhdr}% twoside — разные колонтитулы для чётных/нечётных страниц
\pagestyle{fancy}% Активирует стиль fancy
\fancyhf{}% Очистка текущих настроек
\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!".\parI'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
Это магия TEX для абзацев
Эта команда определяет форму первых 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 хранит словарь исключений из своих правил расстановки переносов. В каждой словарной статье указано, как следует писать через дефис то или иное слово.
\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 в виде строчных римских цифр.
Header и Footer
\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.
\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 производят бесконечно растягиваемый негативный клей.
Эти команды создают 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〉, и оставляют содержимое регистра нетронутым.
\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
Если последний элемент в текущем списке имеет тип керн, клей или пенальти соответственно, эти команды удаляют его из этого списка. Если элемент не того типа, эти команды не имеют никакого эффекта.
Команда \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 — задает шаблон с образцом
Эта команда создает горизонтальное выравнивание, состоящее из последовательности строк, где каждая строка, в свою очередь, содержит последовательность записей столбцов. TEX регулирует ширину записей столбца, чтобы разместить самую широкую запись в каждом столбце.
\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.
Это заставляет TEX загружать файл метрик шрифта (файл .tfm) для 〈fontname〉.
Если ни масштабированный 〈number〉, ни 〈dimen〉 отсутствуют, шрифт используется в его дизайнерском размере — размере, в котором он обычно выглядит лучше всего. В противном случае загружается увеличенная версия шрифта.
Scaled — 〈number〉, шрифт увеличивается в 〈number〉/1000.
Если присутствует 〈dimen〉, шрифт масштабируется до 〈dimen〉
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 использует для расширения замещающего текста.
\long — Эта команда используется как префикс к определению макроса. Он сообщает TEX, что аргументы макроса могут включать токены \par
\long\def\aa#1{\par\hrule\smallskip#1\par\smallskip\hrule}\aa{This is the first line.\parThis 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〉 — определит синоним команды
\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 для завершения теста.
\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%резервирует набор шаблонов расстановки переносов.
Эти команды определяют 〈последовательность управления〉 для ссылки на регистр указанной категории, номер которого равен 〈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 не может повлиять на текущий запуск (к тому времени, когда вы выполните назначение, будет уже слишком поздно), оно полезно только для людей, которые подготавливают файлы форматирования.
3.7.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 ставим знак и дальше нужную букву.
`\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
Символ нужно определить в \catcode назначить ему категорию 13 (\active)
Определить действия через \def \let \chardef
Если символ не будет \active до определения, назначить ему команду не удастся
Текс расширяет макросы слева направо, но команда \expandafter может изменить порядокраскрытия макросов
Блоки в TEX
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 — вставить текс в выходной файл
при смене языка поместит информацию
3.7.6.3 - TEX
Документация TEX, в объеме,которуюя использую для своих задач
TEX это база, на которой строятся все прекрасные вещи из Latex и Tikz
Введение
% 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
Изучаю книгу A Gentle Introduction to TEX
Первый шаг Создать файл.
Я это делаю в своем любимом 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$
{
открывает группу
${$
}
закрывает группу
$}$
%
комментарии
%
&
разграничение колонок в таблице
&
~
неразрываемый пробел
~{}
$
начало и окончание математической моды
$
^
надстрочник
^{}
_
подстрочник
_{}
#
определение заменяемого символа
#
Набор текста с акцентом
Акцент — это надстрочники и подстрочники над и под буквами
используем команду \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.
Команды \hsize и \vsize нужно давать в начале абзаца
Команды \hoffset \voffset действуют на всю страницу где они находятся и последняя переустановит всех предыдущих на этой странице
Для \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 \noindentAnswer 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
Для смещений между абзацами. Действует только на текущий абзац.
в первой части {} могут быть знаки \dag, \ddag, \S, \P или номер ссылки в формате Tex {${}^{21}$} но сейчас работает {$^{21}$}
в Latex немного измененный формат \footnote{}
header и footer
определяется командами
\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 \crb & a & c+d & c-d \cr0 & 0 & a+b & a-b \cr0 & 0 & ab & cd \cr}.$$
создаст матрицу с круглыми скобками
\hfill — выравнивают значения в матрице
\matrix
удаляет разделители круглые скобки и их можно задать явно с помощью команд: \left и \right
$$\left |
\matrix{
a & b & c & d \crb & a & c+d & c-d \cr0 & 0 & a+b & a-b \cr0 & 0 & ab & cd \cr}
\right | $$
типы скобок: (){}[]||
еще можно значения замещать многоточием: \cdots, \vdots, \ddots
Выравнивание по знаку =
$$\eqalign{
a+b &= c+d \crx &= w + y + z \crm + n + o + p &= q \cr}$$
Можно нумеровать уравнения тоже через знак &
$$\eqalignno{
a+b &= c+d & (1)\crx &= w + y + z \crm + 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 — это более жизненный пример таблицы с установленными значениями ширины столбцов
финальный вариант. \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 — оно будет с отступами
\hbox to 5 in{Getting Started\hrulefill 1} и еще есть \dotfill — полезно для оглавления
3.7.6.4 -
3.7.7 - Графический пакет TIKZ для Latex
Дружелюбный функционал для полной графики в Latex. Картинки, иконки, графики и пр.
Дружелюбный функционал для полной графики в Latex. Картинки, иконки, графики и пр. Очень мощный пакет в котором можно нарисовать все.
Обзор пакета Tikz для рисования графики в 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}
3.7.7.1 - Дисплей для руководства пользователя
Практическая задача в LATEX по созданию настраиваемого дисплея при описании руководства пользователя
Примеры использования поисковых запросов POSIX
Практический пример построения средствами LATEX TIKZ графических элементов в документации
Постановка задачи
Для описания инструкции по эксплуатации прибора необходимо описывать интерфейс внутренней программы с меню и другими изображениями на 7-ми строчном дисплее.
Дисплей имеет 22 знака в ширину и 7 строк.
Необходимо создать однострочную команду в Latex для удобного заполнения параметров дисплея и вывода графического изображения в любое место на странице документации.
Команда должна обеспечивать сохранение размеров и цветовой гаммы дисплея на всех страницах документации однообразными.
Дисплей должен отражать текстовые строки заглавными и строчными буквами латинского алфавита.
На дисплее должны отображаться арабские цифры
Графические элементы применяемые на дисплее:
аккумулятор
антенна
уровень сигнала
замок
линия под статусной строкой
линия середины экрана
Типы строк дисплея:
строка с текстом выровненным по левому краю до 22 символов
строка подсвеченная прямоугольником с инвертированным цветом символов
строка с текстом выровненным по середине экрана
строка с текстом в две колонки
строка без текста
Типы строк статусной строки
режим 1 с аккумулятором и антенной
режим 2 с аккумулятором
режим 3 текст
Отдельный режим отображения средней линии на дисплее
Режим вывода картинки в правой части дисплея
Обозначение подсвеченных информационных кнопок в нижней части дисплея
Информационный режим дисплея
Решение задачи
Использование издательской системы Latex
Загрузка специального графического пакета TIKZ
Настройка графических примитивов с помощью библиотеки TIKZ для использования в строках
Программирование Tex для создания простых команд для указания в строках дисплея выводимой информации
Создание библиотеки с возможностью многократного использования дисплея в различных документах
Описание решения
\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}}
Описанные ниже ключи можно использовать в аргументе 〈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.
3.7.7.3 - Key Management
Key Management из пакета pgfkeys, может использоваться самостоятельно или в составе пакета TIKZ, управляет ключами пользователя
Ключи пользователя для управления различными состояниями в LATEX
Введение
В основном этот раздел описываю, так как его активно используют библиотеки 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/
проверяет, если ключ был определен, то выведет значение 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 символу
Если в командной строке \pgfkeys встретится строка, обернутая в этот символ, то она будет передана в макрос этого символа как параметр
Наверно это удобно.
Так работают во всех 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
Обработчики ключей
Обработчики — это дополнительная возможность выполнять некие действия над ключами сверх того, что предоставляется стандартной библиотекой.
Путь ключа, хранится в макросе \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〉.
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〉/.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.
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〉/.is choice — Этот обработчик настраивает ситуацию так, что запись 〈key〉=〈value〉 приведет к выполнению подраздела 〈key〉/〈value〉. Таким образом, каждый из возможных вариантов должен быть задан подразделом 〈key〉.
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〉 сначала будет выполнен ее обычный код. Затем значение (дополнительно) передается «другому ключу».
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
3.7.7.4 - Примеры PIC в библиотеке TIKZ
Живой пример использования мощи TIKZ на примерах с маленькими картинками PIC
Примеры использования поисковых запросов POSIX
Живой пример для создания настраиваемых картинок при описании документации
Постановка задачи
Необходимо разработать динамичную картинку,которой на вход подается массив адресов и они размещаются в структурированной матрице с цифровым обозначением выходов на устройстве.
Немного запутанно, но суть в том, что у устройства есть адреса на каждом выходе, и эти адреса изменяются, а картинок несколько.
Было принято решение не рисовать в редакторе картинки, а запрограммировать в LATEX и на вход просто подавать массив с адресами и номерами выходов.
рисуем матрицу с адресами
адрес состоит из двух частей, разделенных :
первая часть 4 разряда
вторая часть 5 разрядов
матрица может располагаться горизонтально и вертикально
в вертикальном положении над каждым адресом необходимо указать номер порта в черном кружке и схематичное изображение в виде скобки с кружком
в горизонтальном положении слева от адреса расположить номер порта в черном кружке
Решение
Создать стили для вертикальных и горизонтальных адресов
Создать шаблон для номера выходного порта (цифра в черном кружке)
Создать шаблон для имитации скрепки с красной точкой
Создать шаблон для формирования горизонтального адреса
Создать шаблон для формирования вертикального адреса
Создать матрицу из 5-ти горизонтальных адресов в одной строке с номерами выходных портов в черных кружках
Создать матрицу из 5-ти вертикальных адресов в одной колонке с номерами выходных портов в черных кружках и скрепкой с красной точкой
Код с описанием
\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}
3.7.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⟩
расстояние между колонками
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} [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}
внутренние стили назначаются в определенной очередности.
Очередность задается параметром:
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}
в опциях matrix дали команду [matrix anchor=inner node.south, ... at (1,1), т.е. сказали, что точку юга этой ноды поместить в координату (1,1)
anchor=base — колонки выравнивать по центру
Замена & как разделителя колонок
ampersand replacement=⟨macro name or empty⟩
для некоторых процедур это нужно,чтобы не было конфликта с другими библиотеками. Если матрицу закручивать по контуру, то придется поменять разделитель на другое.
Опции для node отличаются от назначений path, поэтому для node нужно давать свои назначения в опциях.
Для рисования вокруг node используем библиотеку \usetikzlibrary {shapes.geometric}https://tikz.dev/library-shapes
в ней много разных shapes, которые можно указывать в options
По умолчанию без библиотек в node можно применять 3 вида shapes:
rectangle
circle
coordinate
Анимации в пакете TIKZ работают только для экспорта в svg. Если вы занимаетесь документами в PDF. Можно расслабиться и не заниматься этой темой.
foreach
в node можно вставлять несколько foreach
\tikz\node foreach \x in {1,...,4} foreach \y in {1,2,3} [draw] at (\x,\y) {\x,\y};
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
ее брат 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}
для ее использования нужно применить circle split и в \nodeparts указать аргументы {text,lower}.
для нее же можно настроить стиль:
every ⟨part name⟩ node part
библиотека fit и опция fit позволяет охватить место,чтобы в него могли войти нужные данные
Transformations
transform shape
\tikz[scale=3] \node[transform shape] {X};
т.е. я сначала сказал, что нужно сделать scale=3, а потом команда transform shape выполнит это действие и я получу гигантскую X.
причем сказать можно в path или draw, а команда выполнится в node
Разбираю документацию TIKZ и некоторые свои добавления по PATH
PATH — это ключевой инструмент для рисования в TIKZ
Вступление с моими открытиями
\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}
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}
Path
Это путь от одной точки к другой и т.д. На пути могут быть draw, fill, clip, node сколько угодно раз.
Мощная примудрость, позволит на многое открыть глаза в 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}
[rounded corners] [sharp corners]
круглые и угловатые соединения линий
rounded corners=4pt — по умолчанию, или можно поменять
\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}
insert 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}
Этот вариант я припас для вертикального написания шрифта
оказалась полезная штука для смещения 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, т.е. линия будет нужной длины и без разрывов
сразу не понял, но если внутри рисунок против шерсти,то вырезает пустоту. Смотрим на стрелочки внутреннего квадрата.
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);
bilinear interpolation
это красивые градиентные заливки объектов по 4-м углам
\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= %радиальная заливка
use as bounding box
графически привязывает блоки слева и справа
Наверно будет удобно для создания различных перекрестных указателей или еще чего-нибудь, где важно, чтобы блоки склеились в единое целое
У них есть подпараметры:
trim left=⟨dimension or coordinate or default⟩
trim right=⟨dimension or coordinate or default⟩
trim lowlevel=true|false
clip
вырезает все на скорую руку
лучше использовать внутри рисунков с применением группировки scope
Я раньше использовал подобное для рисование стрелок с подложкой белого фона.
Оказалось, что все уже придумано до нас))
\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}
Целая библиотека различных декораций и линий для рисования объектов.
3.7.7.9 - Вводные понятия в TIKZ
Базовые понятия TIKZ и описание системы координат. Без этого урока разбираться в TIKZ бессмысленно
Уроки TIKZ чтобы научиться делать все в одном стиле
Подключение TIKZ в документ.
Лично для себя установка! Много раз пробовал сделать, что нибудь в графическом редакторе и потом перенести в latex, но каждый раз нарывался на многочисленные переделки графики. Вывод! Все что больше 1-2х страниц, делай в LATEX и графику в TIKZ. В итоге сэкономишь.
Для подключения TIKZ нужно в преамбуле добавить:
\usepackage{tikz}%подключить пакет
\usetikzlibrary{angles,calc,quotes}%подключить нужные библиотеки
Библиотеки по ходу буду тоже описывать, те, которые мне точно понравились и нужны. Но их очень много.
Чтобы вставить в текст объект TIKZ нужно использовать окружение
\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}
Для указания координат и смещений NODE указываем ключевые слова : left, right, below, above и их комбинации.
Барицентрические системы координат
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, каждая координата тянет к себе с определенной силой. Если я поставлю с одинаковой силой, то будет ровно посередине, относительно всех точек.
\node at (barycentric cs:content=1,structure=1 ,form=1) {PostScript}; как на рисунке ниже
А эта штука соединяет между собой две ноды по бордюру самым коротким путем: (node cs:name=a) -- (node cs:name=b), т.е. все, что в круглых скобках — это координаты.
Для те, кто в танке, чтобы не забыть: +(координаты) — не изменяет точку отсчета и указывает относительную координату; ++(координаты) — изменяет точку отсчета и указывает относительные координаты; (координаты) — изменяет точку отсчета и указывает абсолютные координаты.
/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}
Ключи 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]}}]
Относительные и инкрементальные координаты
Это мои любимые + и ++
Дают одинаковый вариант:
++ изменяет текущую координату и премещается относительно
+ не изменяет текущую координату и перемещается относительно
[delta angle=-180, radius=1cm] — параметры дуги: ее угол и радиус, минус говорит, что рисуем по часовой стрелке
[start angle=-180] — собственно стартовый угол дуги, относительно системы координат — здесь -180 и +180 роли не играет, но -90 и +90 развернут дугу в разные стороны.
– ([turn]60:1cm) — эта штука нарисует отрезок из последней точки но в системе координат именно последней точки. Т.е. 60 градусов она развернет относительно мысленного продолжения arc по касательной.
[current point is local]
Укажет, что внутри фигурных скобок была относительная координата и после выхода из скобок, система координат будет как была до нее.
($(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}
\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}
Модифаеры могут быть по нескольку штук дляг за другом
\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}
т.е. эта штука вычислит все в миллиметрах и расставит метки по прямой
\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}
Нарисуем треугольник и опустим перпендикуляры от вершин на противоположные стороны
между !()! укажем вершину в скобках
\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}
Перпендикуляры
Основные команды это:
/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)
\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.
3.7.7.10 - Диаграммы в Latex библиотека TIKZ
Возможности библиотеки TIKZ для рисования графиков в Latex
Возможности библиотеки TIKZ для рисования графиков в Latex. Обзор учебника из документации.
Рисование графиков в 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 и все готово
Стиль терминалов с круглыми углами
\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
Односимвольный терминал станет кругом, а многосимвольный — прямоугольником с закругленными углами.
Использование библиотеки 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]
На маленьких node при работе с библиотекой позиционирования, может не хватать смещения, добавим в ручную: xshift=5mm
Или использовать матрицы. Но это позже.
Перенесем настройки стилей в преамбулу документа
\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}}
т.е. от середины между метками (digit.east)!.5!(E.west) до середины между метками (digit.west)!.5!(dot.east) рисуем кривулину типа skip loop
Пока все довольны.
Но разобрать по частям стиль skip loop очень хочется: skip loop/.style={to path={-- ++(0,#1) -| (\tikztotarget)}}
первая часть понятна: от текущей точке рисуем линию вертикально на заданный параметр #1, а потом
-| — рисует горизонтально, а потом вертикально к цели, это один из родственников -- — рисует прямую; |-— рисует вертикально и горизонтально и .. — рисует кривую
возвращаемся к поставленной цели (\tikztotarget) вообще таких макросов три (\tikztostart, \tikztotarget, and \tikztonodes;)
Библиотека arrows.meta: и вариант работы p7 ->[vh path] { plus, minus } -> [hv path] p8; библиотеки graphs по раздвоению стрелок. Просто перечисляем узлы в фигурных скобках.
использовании групп, при делении веток, группы заключаем в {}
анонимные координаты обозначаются /
simpe — свойство graph — которое определяем, что между 2-мя узлами может быть только 1 edge.
graphs/every graph/.style = {edges=rounded corners} — закругленные уголки у стрелок
>={Stealth[round]}, black!50, text=black, thick, — стиль стрелок
3.7.7.11 - Примеры по Эвклиду
Продолжаем осваивать библиотеку TIKZ и изучаем новые команды
Вторая часть учебного курса по TIKZ. Сеть PETRI.
Установка необходимых библиотек для работы
\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}
Уже много полезного из первого примера, команда \coordinate
Мощь библиотеки 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}
\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
Библиотека 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}
Библиотека INTERSECTION
Библиотека 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}
\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 в виде точки
если бы я написал \node [fill=red,circle, inner sep=2pt,label=-45:$F$] at (F) {}; то получилось бы:
Разукрашки и определение макросов
\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);
Но, выяснилось, что вариант выше не очень умен по своей сути. \path задает координату откуда начинается какое-то действие, в нашем случае размещаем node, а можно draw, но node с параметром draw обернет текст рамкой.
Синтаксис at т.е. поместить в…
\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}
Получаем тотже эффект, но говорят умнее.
Дальше больше:
Говорят библиотеки TIKZ shape понимают по умолчанию, если они стандартные. Опускаем их.
\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}
Причем [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.
И еще одно нововведение: команда \path node - тоже самое, что \node
Размеры SHAPE
Можно задать переменную inner sep=2mm в блоке — и это сделает отступ вокруг текста 2mm. Или:
т.е. \draw [в какую сторону стрелу] (координата откуда) -- (координата куда);
Краткий комментарий к .. CONTROLS ..
Это вставка вместо оператора рисования - -, которая позволяет поставить несколько контрольных точек относительно некоторого центра вращения и сказать куда они сдвигаются и насколько:
\draw[->](waiting.west) ..controls +(left:15mm) and +(up:15mm) .. (enter critical.north);
Умность библиотеки tirz
Можно не указывать стороны света в метках, от сделает это автоматически
вот такая штука позволит дальше в коде писать просто:
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}
NODE — нарисовали метки в узлах через оператор at, т.е. поместить в … конкретную точку
DRAW — рисует через оператор to, т.е. от одной точки к другой, а на пути его рисования мы размещаем другие NODE и говорим с какой стороны их рисовать относительно линии.
SWAP — это нарисовать зеркально
на пути DRAW, NODEs может быть сколько угодно, главное их всех разместить правильно, а то все в одну точку вляпаются.
Декоративные линии (\usetikzlibrary {decorations.pathmorphing})
Собственно любую линию можно нарисовать, просто отдельно нужно изучить особенности этой библиотеки.
Чтобы мне небыло страшно, классы pre и post для стрелок уже определены в стандартной библиотеке.
И продолжая тему кривулины или любой другой линии, если мне нужно разместить текст, то делаю в разрыве 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 все возвращается в исходные установки.
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}]
т.е. там уже все определено, поэтому нарисуем все, что уже пытались с использованием библиотеки:
Дружелюбный функционал для полной графики в Latex. Картинки, иконки, графики и пр.
Дружелюбный функционал для полной графики в Latex. Картинки, иконки, графики и пр. Очень мощный пакет в котором можно нарисовать все.
Обзор пакета Tikz для рисования графики в Latex.
Установка пакета
\usepackage{tikz}
Использование пакета
Окружение {tikzpicture} или команды \tikzpicture и \endtikzpicture
\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}
Нарисует точки в координатах и проведет через них кривую
\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];
\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 поднимаемся, 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;
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) до точки пересечения
Самое интересное во всем этом процессе, что когда ты пишешь эти строки и видишь, как все это происходит по настоящему в твоем Latex документе — приходишь в восторг!
xshift и yshift смещают по осям, shift={(1,0)} смещает в точку shift={+(0,0)} или относительную точку.
rotate или rotate around вращают объект относительно точки
\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}
Полностью пример
\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 создает макрос для последующего использования кода.
3.7.8 - Пакет Xcolor и colortbl
Обзор документации пакетов Xcolor и colortbl
Пакет xcolor и colortbl - управление цветами в LaTeX
Установка и базовое использование
\usepackage{xcolor}% Основной пакет для работы с цветами
\usepackage[table]{xcolor}% Альтернативный вариант с загрузкой colortbl
% или
\usepackage{colortbl}% Пакет для цветных таблиц
Для документов, которые будут печататься, используйте CMYK цвета
Для веб-документов лучше подходят RGB/HTML цвета
Используйте мягкие цвета (!20-!40) для фонов
Сохраняйте контраст между текстом и фоном
Для сложных таблиц используйте \rowcolors из xcolor
\rowcolors{1}{blue!10}{white}% Чередование цветов строк
\begin{tabular}{cc}A & B \\C & D \\E & F \\\end{tabular}
Этот пакет предоставляет полный контроль над цветами в вашем LaTeX документе, от простого окрашивания текста до сложного оформления таблиц и математических формул.
3.7.9 - Пакет longtable
Применение longtable с тонкими настройками в Latex
\usepackage{longtable}%собственно сам пакет для работы с таблицами
\usepackage{xcolor}%чтобы работать с цветами
\usepackage{colortbl}%чтобы работать с цветными таблицами
Особенности
Полная приемственность от tabular и tabularx, поэтому можно только им и пользоваться.
Очень понадобятся первоначальные настройки для формата таблицы
\newcolumntype похожа на \newcommand но только для настройки таблиц. Работает со всеми пакетами расширяющие стандартый пакет таблиц: xtab, xtabular, tabularx и longtable.
\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 раза больше.
Дальше 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}
Команды для высоты строк и отступов между колонками
[!INFO]
Собственно мне всего перечисленного хватало практически на 90% всех таблиц.
Длина таблицы на странице
По умолчанию длина таблицы 20 строк, но можно изменить с помощью команты
\setcounter{LTchunksize}{10}
и будет 10!
Изменить нумерацию таблиц
\renewcommand\LTcaptype{⟨counter ⟩}
Header & Footer
У таблицы могут быть первый Header и после его описания нужно поставить \endfirsthead
После определения заголовков на 2-й и следующих таблицах поставить \endhead.
Если таблица на одной странице, то пункт 2 не нужен.
\endfoot также заканчивает описание последней строки таблицы на странице
\endlastfoot описывает последнюю строку таблицы
\сaption
\caption{...} команда эквивалентна \multicolumn{n}{c}{\parbox{\LTcapwidth}{…}}
она просто объединяет все колонки и пишется как полноценная строка таблицы.
\caption[Опциональное имя, используется в списке таблиц]{Полноценное имя таблицы\label{long}}.
Собственно текст в этой ячейке с применением всех возможных комманд и боксов, а также \multirow для объединения строк. Но для нее нужно подключить пакет \usepackage{multirow}
\kill
делаем строку для определения ширины столбцов и вместо \\ ставим \kill. Строка не будет отображаться в таблице, но ширину настроит.
vpos — tcb выравнивает текст в общей ячейке по [t] [c] [b] (необязательный параметр)
nrows — количество строк
bigstruts — это распорки или больше похоже на заполнение текста (я не использовал)
width — ширина ячейки с текстом. Обычно (*), но если используем \multirow то не все колонки могут быть заполнены текстом
vmove — это как \raisebox — поднимает текст вверх или вниз. Удобная штука. Можно отрицательные и положительные значения.
text — собственно сам текст
\multicolumn{2}{c}{\multirow{3}{*}{Multi-multi}} — с multirow использовать только в таком порядке, а не наоборот.
[!NOTE]
В этом пакете еще есть утилиты для работы с большими скобками на объединенные строки.
3.7.10 - Newfont
Моя история подключения различных шрифтов в Latex
Удивительное путешествие в мир создания интегрированных шрифтов в Latex
История началась с французской компании, которая попросила меня написать несколько документаций на свои изделия.
Так как я сначала подумал,что отделаюсь легким испугом, то первую работу сделал в XARA. Замечательный редактор, но когда в моем документе перевалило за 50 страниц, я понял, что ошибся с выбором инструмента.
Потом было несколько документов по 4-8 страниц. Что не составило проблем сделать в XARA.
Но когда дело дошло до очередного 80-ти страничного документа, я решил просто сделать в Latex.
Эта компания использовала свои фирменные шрифты, поэтому шрифты скачал в интернет, подключил модуль \usepackage{fontspec} и вуаля!!!
%%%%%%%%% 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
Дальше рутина по созданию стиля страницы. Очень приятный XELATEX с которым мы достаточно быстро справились с поставленной задачей (убрал только привычный мне %\usepackage{hyperref}), потому-что на него странно ругался компилятор. (вычислил эксперементально).
Но все мои познания подключения шрифтов начались тогда, когда заказчик попросил сделать оглавление кликабельное с возможностью переходить по ссылкам на страницы.
И ВОТ ЗДЕСЬ НАЧАЛОСЬ!
Оказывается не XELATEX не LUALATEX при всей своей красоте поддержки TrueType шрифтов напрямую, отказываются работать с \usepackage[xetex]{hyperref} даже в таком варианте.
Копирую шрифты в папку проекта
Есть варианты создать свою структуру и прописать настройки к ней, но в этом варианте я ограничиваюсь настройкой в рабочей директории.
Нахожу в 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 виртуальные шрифты.
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...
или назначаем по умолчанию, как описывал раньше.
Но, получаем:
Для постоянного использования шрифта
Создаем файл .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
Устанавливает, какие команды ...title должны быть определены и когда выдаются метки; допускается любое количество уровней (1, 2, 3…). Например, \settitlemarks{chapter,section}
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
Все что угодно из латекса. Ставится перед заголовком и действует на метку и заголовок. Цвет, шрифт, размер и пр.
метка раздела. Чтобы все работало корректно лучше ставить, если предусмотрено стилем. Т.к., когда будет применяться команда заголовка со *, то номер подавится автоматически.
\thesection\thesubsection\thesubsubsection...
sep
отступ от метки. Тоже нельзя оставлять пустым. 0pt но поставь.
before-code
самая звездная штука. В нее можно поставить вообще все и в качестве аргумента вляпать #1 как текст заголовка.
Нужная команда для настроек пространства заголовка
Версия со звездочкой убирает отступ абзаца, следующего за заголовком, за исключением случаев удаления, переноса и запуска, где эта возможность не имеет смысла.
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
в принципе благодаря им очень хорошо настроил и решил свою задачу выше.
Они заполняют пространство перед или после заголовкаа, в зависимости от названия.
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 ⟩}
Можно добавить прямо в текст и получить результат для одного заголовка:
эта утилита настраивает автоматический разрыв страниц при достижения заданных параметров в разделах.
\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 Бесполезный ключ. В этом нет необходимости, если вы не хотите установить разные нумерованные (без этого ключа) и ненумерованные (с безномерными) варианты.
3.7.14 - Пакет fontenc - Управление кодировками шрифтов в LaTeX
Загрузка шрифтов в Latex.
Package titlesec
Пакет fontenc - Управление кодировками шрифтов в LaTeX
Введение
Пакет fontenc является критически важным для правильного отображения текста в LaTeX-документах, особенно при работе с не-ASCII символами (кириллицей, диакритическими знаками и др.).
{\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}\selectfontThis text uses T1 encoding for proper hyphenation of words like "naïve".}{\fontencoding{T2A}\selectfontЭтот текст использует кодировку T2A для корректного отображения кириллицы.}
При использовании XeLaTeX/LuaLaTeX вместо fontenc используйте fontspec
Заключение
Пакет fontenc обеспечивает критически важную функциональность для правильного отображения текста в различных языках. Правильная настройка кодировок шрифтов предотвращает множество проблем с отображением символов и переносом слов.
3.7.15 - Пакет fontspec - Управление кодировками шрифтов в XeLaTeX
Полное руководство по пакету fontspec для XeLaTeX и LuaLaTeX
Введение в fontspec
Пакет fontspec предоставляет мощную систему выбора и настройки шрифтов для движков XeTeX и LuaTeX. Он заменяет традиционный подход с использованием fontenc и inputenc, предлагая прямую работу со шрифтами системы через Unicode.
\usepackage{unicode-math}% Должен загружаться после fontspec
\setmathfont{TeX Gyre Termes Math}\setmathfont{XITS Math}[range={\mathcal,\mathbfcal}]
\setmathfont{STIX Two Math}[range={\mathscr}]
Интеграцию с математическими шрифтами через unicode-math
Для максимальной эффективности используйте fontspec в сочетании с:
polyglossia для языковой поддержки
unicode-math для математических шрифтов
microtype для улучшенной типографики
3.8 - opensearch
OpenSearch — это распределённая поисковая и аналитическая система, основанная на Apache Lucene. После добавления данных в OpenSearch вы можете выполнять полнотекстовый поиск с полным набором ожидаемых функций: поиск по полям, поиск по нескольким индексам, усиление полей, ранжирование результатов по релевантности, сортировка по полям и агрегация результатов.
Неудивительно, что разработчики часто используют поисковые системы, такие как OpenSearch, в качестве бэкенда для поисковых приложений — например, для Википедии или интернет-магазинов. Он обеспечивает отличную производительность и может масштабироваться в зависимости от потребностей приложения.
Ещё один популярный, но менее очевидный сценарий использования — анализ логов. В этом случае логи приложения загружаются в OpenSearch, а мощные функции поиска и визуализации помогают выявлять проблемы. Например, неисправный веб-сервер может выдавать ошибку 500 в 0,5% случаев, что сложно заметить без графика в реальном времени, отображающего все HTTP-статусы за последние четыре часа. С помощью OpenSearch Dashboards можно создавать такие визуализации на основе данных из OpenSearch.
Компоненты
OpenSearch — это не только поисковый движок. В его состав также входят:
OpenSearch Dashboards — интерфейс для визуализации данных OpenSearch.
Data Prepper — серверный сборщик данных, способный фильтровать, обогащать, преобразовывать, нормализовать и агрегировать данные для последующего анализа и визуализации.
Клиенты — языковые API, позволяющие взаимодействовать с OpenSearch на популярных языках программирования.
Сценарии использования
OpenSearch поддерживает множество сценариев, например:
Наблюдаемость (Observability) — визуализация событий на основе данных с помощью Piped Processing Language (PPL) для исследования, обнаружения и запросов к данным в OpenSearch.
Поиск — выбор оптимального метода поиска для вашего приложения: от стандартного лексического поиска до диалогового поиска на базе машинного обучения (ML).
Машинное обучение — интеграция ML-моделей в приложения на OpenSearch.
Анализ безопасности — расследование, обнаружение, анализ и реагирование на угрозы, которые могут повлиять на успех организации и её онлайн-операции.
Следующие шаги
Ознакомьтесь с [Введением в OpenSearch](Introduction to OpenSearch), чтобы изучить основные концепции OpenSearch.
3.8.1 - Введение в Opensearch
OpenSearch — это распределённая поисковая и аналитическая система, которая поддерживает различные сценарии использования: от реализации поисковой строки на веб-сайте до анализа данных безопасности для выявления угроз.
Введение в OpenSearch
Термин распределённая означает, что OpenSearch можно запускать на нескольких компьютерах. Поиск и аналитика подразумевают, что после загрузки данных в OpenSearch их можно искать и анализировать. Независимо от типа данных, их можно хранить и исследовать с помощью OpenSearch.
Документ
Документ — это единица хранения информации (текстовой или структурированной). В OpenSearch документы хранятся в формате JSON.
Документ можно представить несколькими способами:
В базе данных студентов документ может представлять одного учащегося.
При поиске информации OpenSearch возвращает документы, соответствующие запросу.
Документ аналогичен строке в традиционной реляционной базе данных.
Например, в школьной базе данных документ может представлять студента и содержать следующие данные:
ID
Имя
GPA
Год выпуска
1
John Doe
3.89
2022
Вот как этот документ выглядит в формате JSON:
{"name":"John Doe","gpa":3.89,"grad_year":2022}
Вы узнаете, как назначаются идентификаторы документов, в разделе Индексация документов.
Индекс
Индекс — это коллекция документов.
Индекс можно рассматривать несколькими способами:
В базе данных студентов индекс представляет всех учащихся в базе.
При поиске информации запрос выполняется к данным внутри индекса.
Индекс соответствует таблице в традиционной реляционной базе данных.
Например, в школьной базе данных индекс может содержать всех студентов школы:
ID
Имя
GPA
Год выпуска
1
John Doe
3.89
2022
2
Jonathan Powers
3.85
2025
3
Jane Doe
3.52
2024
…
…
…
…
Кластеры и узлы
OpenSearch разработан как распределённая поисковая система, что означает возможность работы на одном или нескольких узлах — серверах, хранящих данные и обрабатывающих поисковые запросы. Кластер OpenSearch — это совокупность таких узлов.
Вы можете запустить OpenSearch локально на ноутбуке (системные требования минимальны), но также можно масштабировать кластер до сотен мощных серверов в дата-центре.
В одноузловом кластере (например, развёрнутом на ноутбуке) одна машина выполняет все задачи:
управляет состоянием кластера,
индексирует данные и обрабатывает поисковые запросы,
выполняет предварительную обработку данных перед индексацией.
Однако по мере роста кластера обязанности можно распределить:
Узлы с быстрыми дисками и большим объёмом ОЗУ подходят для индексации и поиска.
Узлы с мощными CPU, но малым дисковым пространством, могут управлять состоянием кластера.
В каждом кластере выбирается главный узел (cluster manager node), который координирует операции на уровне кластера (например, создание индекса). Узлы взаимодействуют между собой: если запрос направлен к одному узлу, он может запрашивать данные у других узлов, агрегировать их ответы и возвращать итоговый результат.
Для быстрого запуска OpenSearch и OpenSearch Dashboards используйте контейнеры Docker.
Для быстрого запуска OpenSearch и OpenSearch Dashboards используйте контейнеры Docker. Полное руководство по установке доступно в разделе Установка и обновление OpenSearch.
Предварительные требования:
Установите Docker и Docker Compose на локальную машину
Запуск кластера
Настройка системы
Перед запуском рекомендуется:
Отключить подкачку памяти для повышения производительности:
Доступ к Dashboards
Откройте в браузере: http://localhost:5601/
Логин: admin
Пароль: указан в OPENSEARCH_INITIAL_ADMIN_PASSWORD файла docker-compose.yml
Примечания:
Для безопасности отключается проверка хоста (-k) при использовании демо-сертификатов
Все команды предполагают работу в Linux-окружении
Пароль администратора задаётся при первом запуске
Распространённые проблемы
Рассмотрите эти типичные проблемы и способы их решения, если контейнеры не запускаются или завершаются неожиданно.
Необходимость прав sudo для Docker команд
Проблема:
Требуется использовать sudo для выполнения Docker команд.
{"took":18,"timed_out":false,"_shards":{"total":1,"successful":1,"skipped":0,"failed":0},"hits":{"total":{"value":1,"relation":"eq"},"max_score":0.9808291,"hits":[{"_index":"students","_id":"1","_score":0.9808291,"_source":{"name":"John Doe","grade":12,"gpa":3.89,"grad_year":2022,"future_plans":"John plans to be a computer science major"}}]}}
3.8.1.5 - Начало работы с безопасностью в OpenSearch
Демонстрационная конфигурация безопасности и настройка демонстрационной конфигурации
Демонстрационная конфигурация безопасности
Наиболее простой способ начать работу с безопасностью OpenSearch - использовать демонстрационную конфигурацию. OpenSearch включает полезные скрипты, в том числе:
install_demo_configuration.sh (для Linux/macOS)
install_demo_configuration.bat (для Windows)
Расположение скрипта: plugins/opensearch-security/tools/
Действия скрипта:
Создает демонстрационные сертификаты для TLS-шифрования на транспортном и REST-уровнях
Настраивает тестовых пользователей, роли и привязки ролей
Конфигурирует плагин безопасности для использования внутренней базы данных аутентификации
Обновляет opensearch.yml базовой конфигурацией для запуска кластера
Важно! Демонстрационные сертификаты и пароли по умолчанию не должны использоваться в production. Перед развертыванием в продакшене их необходимо заменить на собственные.
Настройка демонстрационной конфигурации
Перед запуском скрипта:
Установите переменную окружения с надежным паролем администратора:
Все команды предполагают выполнение из корневой директории OpenSearch
Для production-окружений обязательно замените демонстрационные сертификаты
Регулярно обновляйте пароли администраторов
3.8.1.6 - Основные концепции OpenSearch
Полное руководство по OpenSearch: документы, индексы, шарды, узлы кластера, текстовый анализ и жизненный цикл данных. Узнайте, как работают индексация, поиск и агрегация в распределенной поисковой системе.
Базовые понятия
Документ
Базовая единица информации в OpenSearch, хранимая в формате JSON. Представляет собой структурированные данные в виде пар “ключ-значение”.
Индекс
Коллекция логически связанных документов. Аналог таблицы в реляционных БД.
JSON (JavaScript Object Notation)
Текстовый формат для хранения данных, использующий структуру ключ-значение. Основной формат представления данных в OpenSearch.
Маппинг
Схема индекса, определяющая:
Типы полей документов
Способы индексации и хранения
Параметры анализа текста
Архитектура кластера
Узел (Node)
Отдельный сервер, являющийся частью кластера OpenSearch.
Кластер
Совокупность узлов, работающих как единая система.
Управляющий узел (Cluster Manager)
Специальный узел, координирующий кластерные операции:
Создание/удаление индексов
Балансировка нагрузки
Мониторинг состояния узлов
Шард (Shard)
Часть индекса, содержащая подмножество его данных. Индексы разделяются на шарды для:
Горизонтального масштабирования
Распределения нагрузки
Типы шардов:
Первичный (Primary) - основной шард с данными
Реплика (Replica) - копия первичного шарда для:
Отказоустойчивости
Повышения производительности поиска
Структуры данных и хранение
Doc Values
Оптимизированная on-disk структура для:
Сортировки
Агрегации
Доступа к значениям полей
Инвертированный индекс
Структура данных, отображающая термины на документы, которые их содержат. Основа полнотекстового поиска.
Lucene
Библиотека поиска, лежащая в основе OpenSearch. Отвечает за:
Индексацию
Хранение
Поиск данных
Сегмент (Segment)
Неизменяемая единица хранения данных внутри шарда. Особенности:
Создается при операции refresh
Объединяется в процессе merge
Оптимизирован для быстрого поиска
Операции с данными
Ингestion
Процесс добавления данных в OpenSearch. Включает:
Прием данных
Парсинг
Подготовку к индексации
Индексация
Процесс организации данных для эффективного поиска:
Анализ текста
Построение инвертированного индекса
Хранение документов
Пакетная индексация
Массовая загрузка документов через Bulk API:
Высокая производительность
Минимизация сетевых издержек
Атомарность операций
Анализ текста
Текстовый анализ
Процесс преобразования неструктурированного текста в последовательность терминов для индексации.
Компоненты анализатора:
Character Filter
Обрабатывает сырой текст:
Удаление/замена символов
HTML-разметка
Tokenizer
Разбивает текст на токены (слова) с метаданными:
Позиция
Длина
Смещение
Token Filter
Модифицирует токены:
Приведение к нижнему регистру
Удаление стоп-слов
Добавление синонимов
Стемминг
Типы анализаторов:
Analyzer
Полный конвейер обработки (character filter → tokenizer → token filter)
Normalizer
Только character filter (без токенизации)
Стемминг
Приведение слов к базовой форме (например: “running” → “run”)
Поиск и запросы
Типы запросов:
Query DSL - основной язык сложных запросов
Query String - упрощенный синтаксис для URL
DQL - язык фильтрации в Dashboards
PPL - язык для observability с pipe-синтаксисом
Контексты выполнения:
Query Context
Оценивает релевантность (как хорошо документ соответствует запросу)
Filter Context
Проверяет точное соответствие (да/нет) без расчета релевантности
Типы поиска:
Полнотекстовый
С учетом морфологии и вариаций слов
По ключевым словам
Точное совпадение (без анализа)
Агрегации
Механизм анализа и суммирования данных:
Метрики (avg, sum)
Бакетизация (histogram, date_histogram)
Вложенные агрегации
Жизненный цикл обновлений
Транзакционный лог (translog)
Операция записывается в translog
Гарантия durability через fsync
Подтверждение клиенту
In-memory буфер
Данные добавляются в буфер Lucene
Еще не видны для поиска
Refresh
Сброс буфера в сегменты
Данные становятся видимыми для поиска
Без гарантии durability
Flush
Запись сегментов на диск (fsync)
Очистка translog
Гарантия сохранности данных
Merge
Объединение мелких сегментов
Оптимизация:
Уменьшение количества файлов
Освобождение места
Улучшение производительности
Критические операции
Translog
Журнал операций для гарантии сохранности данных. Особенности:
Записывается синхронно перед подтверждением
Ограничен по размеру
Очищается после flush
Refresh
Периодическая операция (по умолчанию каждые 1с):
Делает данные доступными для поиска
Создает новые сегменты
Не гарантирует сохранность при сбое
Flush
Операция записи на диск:
Обеспечивает durability
Выполняется автоматически при:
Достижении лимита translog
Плановом обслуживании
Merge
Фоновая оптимизация:
Управляется политикой слияния
Регулирует:
Частоту слияний
Максимальный размер сегментов
Параллелизм операций
3.8.2 - Install and upgrade OpenSearch
OpenSearch и OpenSearch Dashboards доступны на любом совместимом хосте, который поддерживает Docker
OpenSearch и OpenSearch Dashboards доступны на любом совместимом хосте, который поддерживает Docker (таких как Linux, MacOS или Windows). Кроме того, вы можете установить оба продукта на различных дистрибутивах Linux и на Windows.
Скачайте OpenSearch для вашей предпочтительной платформы, а затем выберите один из следующих руководств по установке.
OpenSearch
OpenSearch Dashboards
Docker
Docker
Helm
Helm
Tarball
Tarball
RPM
RPM
Debian
Debian
Ansible playbook
Windows
Windows
После установки OpenSearch ознакомьтесь с его настройкой для вашего развертывания.
Для получения дополнительной информации об обновлении вашего кластера OpenSearch смотрите руководство по обновлению.
Для информации об инструментах обновления смотрите инструменты обновления, миграции и сравнения OpenSearch.
Для установки плагинов смотрите раздел Установка плагинов.
3.8.2.1 - Установка OpenSearch
В этом разделе представлена информация о том, как установить OpenSearch на вашем хосте, включая порты, которые необходимо открыть, и важные настройки, которые нужно сконфигурировать на вашем хосте.
Рекомендации по файловой системе
Избегайте использования сетевой файловой системы для хранения узлов в рабочем процессе в производственной среде. Использование сетевой файловой системы для хранения узлов может вызвать проблемы с производительностью в вашем кластере из-за таких факторов, как условия сети (например, задержка или ограниченная пропускная способность) или скорости чтения/записи. Вам следует использовать твердотельные накопители (SSD), установленные на хосте, для хранения узлов, где это возможно.
Совместимость с Java
Распределение OpenSearch для Linux поставляется с совместимой версией JDK Adoptium Java в каталоге jdk. Чтобы узнать версию JDK, выполните команду ./jdk/bin/java -version. Например, архив OpenSearch 1.0.0 поставляется с Java 15.0.1+9 (не LTS), OpenSearch 1.3.0 поставляется с Java 11.0.14.1+1 (LTS), а OpenSearch 2.0.0 поставляется с Java 17.0.2+8 (LTS). OpenSearch тестируется со всеми совместимыми версиями Java.
Версия OpenSearch
Совместимые версии Java
Встроенная версия Java
1.0–1.2.x
11, 15
15.0.1+9
1.3.x
8, 11, 14
11.0.25+9
2.0.0–2.11.x
11, 17
17.0.2+8
2.12.0+
11, 17, 21
21.0.5+11
Чтобы использовать другую установку Java, установите переменную окружения OPENSEARCH_JAVA_HOME или JAVA_HOME на расположение установки Java. Например:
Следующие порты необходимо открыть для компонентов OpenSearch.
Номер порта
Компонент OpenSearch
443
OpenSearch Dashboards в AWS OpenSearch Service с шифрованием в пути (TLS)
5601
OpenSearch Dashboards
9200
OpenSearch REST API
9300
Внутреннее взаимодействие узлов и транспорт, поиск по кластерам
9600
Анализатор производительности
Важные настройки
Для рабочих нагрузок в производственной среде убедитесь, что настройка Linux vm.max_map_count установлена как минимум на 262144. Даже если вы используете образ Docker, установите это значение на хост-машине. Чтобы проверить текущее значение, выполните следующую команду:
cat /proc/sys/vm/max_map_count
Чтобы увеличить значение, добавьте следующую строку в файл /etc/sysctl.conf:
vm.max_map_count=262144
Затем выполните команду sudo sysctl -p, чтобы перезагрузить настройки.
Для рабочих нагрузок Windows вы можете установить vm.max_map_count, выполнив следующие команды:
Файл docker-compose.yml также содержит несколько ключевых настроек:
bootstrap.memory_lock:true
Эта настройка отключает свопинг (вместе с memlock). Свопинг может значительно снизить производительность и стабильность, поэтому вы должны убедиться, что он отключен на производственных кластерах.
Включение настройки bootstrap.memory_lock заставит JVM зарезервировать всю необходимую память. Руководство по настройке сборки мусора Java SE Hotspot VM документирует резервирование 1 гигабайта (ГБ) нативной памяти для метаданных классов по умолчанию. В сочетании с кучей Java это может привести к ошибке из-за нехватки нативной памяти на ВМ с меньшим объемом памяти, чем эти требования. Чтобы предотвратить ошибки, ограничьте размер резервируемой памяти с помощью -XX:CompressedClassSpaceSize или -XX:MaxMetaspaceSize и установите размер кучи Java, чтобы убедиться, что у вас достаточно системной памяти.
OPENSEARCH_JAVA_OPTS:-Xms512m -Xmx512m
Эта настройка устанавливает размер кучи Java (рекомендуем использовать половину системной ОЗУ).
OpenSearch по умолчанию использует -Xms1g -Xmx1g для выделения памяти кучи, что имеет приоритет над конфигурациями, указанными с использованием процентной нотации (-XX:MinRAMPercentage, -XX:MaxRAMPercentage). Например, если вы установите OPENSEARCH_JAVA_OPTS=-XX:MinRAMPercentage=30 -XX:MaxRAMPercentage=70, предустановленные значения -Xms1g -Xmx1g переопределят эти настройки. При использовании OPENSEARCH_JAVA_OPTS для определения выделения памяти убедитесь, что вы используете нотацию -Xms и -Xmx.
nofile:65536
Эта настройка устанавливает лимит в 65536 открытых файлов для пользователя OpenSearch.
port:9600
Эта настройка позволяет вам получить доступ к Анализатору производительности на порту 9600.
Не объявляйте одни и те же параметры JVM в нескольких местах, так как это может привести к непредсказуемому поведению или сбою запуска службы OpenSearch. Если вы объявляете параметры JVM с помощью переменной окружения, такой как OPENSEARCH_JAVA_OPTS=-Xms3g -Xmx3g, то вам следует закомментировать любые ссылки на этот параметр JVM в config/jvm.options. Напротив, если вы определяете параметры JVM в config/jvm.options, то не следует определять эти параметры JVM с помощью переменных окружения.
Важные системные свойства
OpenSearch имеет ряд системных свойств, перечисленных в следующей таблице, которые вы можете указать в файле config/jvm.options или в переменной OPENSEARCH_JAVA_OPTS, используя нотацию аргументов командной строки -D.
Свойство
Описание
opensearch.xcontent.string.length.max=<value>
По умолчанию OpenSearch не накладывает ограничений на максимальную длину строковых полей JSON/YAML/CBOR/Smile. Чтобы защитить ваш кластер от потенциальных атак типа “отказ в обслуживании” (DDoS) или проблем с памятью, вы можете установить это свойство на разумный предел (максимум 2,147,483,647), например, -Dopensearch.xcontent.string.length.max=5000000.
`opensearch.xcontent.fast_double_writer=[true
false]`
opensearch.xcontent.name.length.max=<value>
По умолчанию OpenSearch не накладывает ограничений на максимальную длину имен полей JSON/YAML/CBOR/Smile. Чтобы защитить ваш кластер от потенциальных DDoS или проблем с памятью, вы можете установить это свойство на разумный предел (максимум 2,147,483,647), например, -Dopensearch.xcontent.name.length.max=50000.
opensearch.xcontent.depth.max=<value>
По умолчанию OpenSearch не накладывает ограничений на максимальную глубину вложенности для документов JSON/YAML/CBOR/Smile. Чтобы защитить ваш кластер от потенциальных DDoS или проблем с памятью, вы можете установить это свойство на разумный предел (максимум 2,147,483,647), например, -Dopensearch.xcontent.depth.max=1000.
opensearch.xcontent.codepoint.max=<value>
По умолчанию OpenSearch накладывает ограничение в 52428800 на максимальный размер YAML-документов (в кодовых точках). Чтобы защитить ваш кластер от потенциальных DDoS или проблем с памятью, вы можете изменить это свойство на разумный предел (максимум 2,147,483,647). Например, -Dopensearch.xcontent.codepoint.max=5000000.
3.8.2.1.1 - Docker
Docker значительно упрощает процесс настройки и управления вашими кластерами OpenSearch.
Docker значительно упрощает процесс настройки и управления вашими кластерами OpenSearch. Вы можете загружать официальные образы из Docker Hub или Amazon Elastic Container Registry (Amazon ECR) и быстро развернуть кластер, используя Docker Compose и любой из примеров файлов Docker Compose, включенных в этот гид. Опытные пользователи OpenSearch могут дополнительно настроить свое развертывание, создав собственный файл Docker Compose.
Контейнеры Docker являются портативными и будут работать на любом совместимом хосте, который поддерживает Docker (таких как Linux, MacOS или Windows). Портативность контейнера Docker предлагает гибкость по сравнению с другими методами установки, такими как RPM или ручная установка из Tarball, которые требуют дополнительной конфигурации после загрузки и распаковки.
Этот гид предполагает, что вы уверенно работаете с интерфейсом командной строки (CLI) Linux. Вы должны понимать, как вводить команды, перемещаться между директориями и редактировать текстовые файлы. Для получения помощи по Docker или Docker Compose обратитесь к официальной документации на их веб-сайтах.
Установка Docker и Docker Compose
Посетите страницу Get Docker для получения рекомендаций по установке и настройке Docker для вашей среды. Если вы устанавливаете Docker Engine с помощью CLI, то по умолчанию Docker не будет иметь никаких ограничений на доступные ресурсы хоста. В зависимости от вашей среды вы можете настроить ограничения ресурсов в Docker. См. раздел Runtime options with Memory, CPUs, and GPUs для получения информации.
Пользователи Docker Desktop должны установить использование памяти хоста на минимум 4 ГБ, открыв Docker Desktop и выбрав Settings → Resources.
Docker Compose — это утилита, которая позволяет пользователям запускать несколько контейнеров с одной командой. Вы передаете файл Docker Compose при его вызове. Docker Compose читает эти настройки и запускает запрашиваемые контейнеры. Docker Compose устанавливается автоматически с Docker Desktop, но пользователи, работающие в командной строке, должны установить Docker Compose вручную. Вы можете найти информацию о установке Docker Compose на официальной странице Docker Compose GitHub.
Если вам нужно установить Docker Compose вручную и ваш хост поддерживает Python, вы можете использовать pip для автоматической установки пакета Docker Compose.
Настройка важных параметров хоста
Перед установкой OpenSearch с использованием Docker настройте следующие параметры. Это самые важные настройки, которые могут повлиять на производительность ваших сервисов, но для дополнительной информации смотрите раздел о важных системных настройках.
Настройки для Linux
Для среды Linux выполните следующие команды:
Отключите производительность памяти с помощью свопинга для улучшения производительности:
sudo swapoff -a
Увеличьте количество доступных для OpenSearch карт памяти:
# Отредактируйте файл конфигурации sysctlsudo vi /etc/sysctl.conf
# Добавьте строку для определения желаемого значения# или измените значение, если ключ существует,# а затем сохраните изменения.vm.max_map_count=262144# Перезагрузите параметры ядра с помощью sysctlsudo sysctl -p
# Проверьте, что изменение было применено, проверив значениеcat /proc/sys/vm/max_map_count
Настройки для Windows
Для рабочих нагрузок Windows, использующих WSL через Docker Desktop, выполните следующие команды в терминале, чтобы установить vm.max_map_count:
Официальные образы OpenSearch размещены на Docker Hub и Amazon ECR. Если вы хотите просмотреть образы, вы можете загружать их по отдельности, используя команду docker pull, как в следующих примерах.
Чтобы загрузить конкретную версию OpenSearch или OpenSearch Dashboards, отличную от последней доступной версии, измените тег образа, где он упоминается (либо в командной строке, либо в файле Docker Compose). Например, opensearchproject/opensearch:3.1.0 загрузит версию OpenSearch 3.1.0. Чтобы загрузить последнюю версию, используйте opensearchproject/opensearch:latest. Обратитесь к официальным репозиториям образов для доступных версий.
Перед тем как продолжить, вы должны убедиться, что Docker работает корректно, развернув OpenSearch в одном контейнере.
Запуск OpenSearch в контейнере Docker
Выполните следующую команду:
# Эта команда сопоставляет порты 9200 и 9600, устанавливает тип обнаружения на "single-node" и запрашивает самый новый образ OpenSearchdocker run -d -p 9200:9200 -p 9600:9600 -e "discovery.type=single-node" opensearchproject/opensearch:latest
Для OpenSearch версии 2.12 или выше установите новый пользовательский пароль администратора перед установкой, используя следующую команду:
Перед остановкой работающего контейнера отобразите список всех работающих контейнеров и скопируйте идентификатор контейнера для узла OpenSearch, который вы тестируете. В следующем примере идентификатор контейнера — a937e018cee5:
$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a937e018cee5 opensearchproject/opensearch:latest "./opensearch-docker…"19 minutes ago Up 19 minutes 0.0.0.0:9200->9200/tcp, 9300/tcp, 0.0.0.0:9600->9600/tcp, 9650/tcp wonderful_boyd
Остановите работающий контейнер, передав идентификатор контейнера в команду docker stop.
docker stop <containerId>
Помните, что команда docker container ls не отображает остановленные контейнеры. Если вы хотите просмотреть остановленные контейнеры, используйте команду docker container ls -a. Вы можете удалить ненужные контейнеры вручную с помощью команды docker container rm <containerId_1> <containerId_2> <containerId_3> [...] (укажите все идентификаторы контейнеров, которые вы хотите остановить, разделенные пробелами), или, если вы хотите удалить все остановленные контейнеры, вы можете использовать более короткую команду docker container prune.
Развертывание кластера OpenSearch с использованием Docker Compose
Хотя технически возможно создать кластер OpenSearch, создавая контейнеры по одной команде за раз, гораздо проще определить вашу среду в YAML-файле и позволить Docker Compose управлять кластером. В следующем разделе содержатся примеры YAML-файлов, которые вы можете использовать для запуска предопределенного кластера с OpenSearch и OpenSearch Dashboards. Эти примеры полезны для тестирования и разработки, но не подходят для производственной среды. Если у вас нет опыта работы с Docker Compose, вам может быть полезно ознакомиться со спецификацией Docker Compose для получения рекомендаций по синтаксису и форматированию перед внесением изменений в структуры словарей в примерах.
Файл YAML, который определяет среду, называется файлом Docker Compose. По умолчанию команды docker-compose сначала проверяют вашу текущую директорию на наличие файла, который соответствует любому из следующих имен:
docker-compose.yml
docker-compose.yaml
compose.yml
compose.yaml
Если ни один из этих файлов не существует в вашей текущей директории, команда docker-compose завершится с ошибкой.
Вы можете указать пользовательское местоположение и имя файла при вызове docker-compose с помощью флага -f:
# Используйте относительный или абсолютный путь к файлу.docker compose -f /path/to/your-file.yml up
Если вы впервые запускаете кластер OpenSearch с использованием Docker Compose, используйте следующий пример файла docker-compose.yml. Сохраните его в домашнем каталоге вашего хоста и назовите его docker-compose.yml. Этот файл создает кластер, который содержит три контейнера: два контейнера, работающих с сервисом OpenSearch, и один контейнер, работающий с OpenSearch Dashboards. Эти контейнеры общаются через мостовую сеть под названием opensearch-net и используют два тома, по одному для каждого узла OpenSearch. Поскольку этот файл явно не отключает демонстрационную конфигурацию безопасности, устанавливаются самоподписанные TLS-сертификаты, и создаются внутренние пользователи с именами и паролями по умолчанию.
Установка пользовательского пароля администратора
Начиная с OpenSearch 2.12, для настройки демонстрационной конфигурации безопасности требуется пользовательский пароль администратора. Выполните одно из следующих действий:
Перед запуском docker-compose.yml установите новый пользовательский пароль администратора, используя следующую команду:
Создайте файл .env в той же папке, что и ваш файл docker-compose.yml, с переменной OPENSEARCH_INITIAL_ADMIN_PASSWORD и значением надежного пароля.
Требования к паролям
OpenSearch по умолчанию обеспечивает высокую безопасность паролей, используя библиотеку оценки прочности паролей zxcvbn, разработанную компанией Dropbox.
Эта библиотека оценивает пароли на основе энтропии, а не жестких правил сложности, используя следующие рекомендации:
Сосредоточьтесь на энтропии, а не только на правилах: Вместо того чтобы просто добавлять цифры или специальные символы, придавайте приоритет общей непредсказуемости. Длинные пароли, состоящие из случайных слов или символов, обеспечивают более высокую энтропию, что делает их более безопасными, чем короткие пароли, соответствующие традиционным правилам сложности.
Избегайте общих шаблонов и слов из словаря: Библиотека zxcvbn обнаруживает распространенные шаблоны и слова из словаря, что помогает предотвратить использование легко угадываемых паролей.
Следуя этим рекомендациям, вы сможете создать более надежные пароли, которые обеспечат лучшую защиту ваших учетных записей и данных в OpenSearch.
Sample docker-compose.yml
services:opensearch-node1:# This is also the hostname of the container within the Docker network (i.e. https://opensearch-node1/)image:opensearchproject/opensearch:latest# Specifying the latest available image - modify if you want a specific versioncontainer_name:opensearch-node1environment:- cluster.name=opensearch-cluster# Name the cluster- node.name=opensearch-node1# Name the node that will run in this container- discovery.seed_hosts=opensearch-node1,opensearch-node2# Nodes to look for when discovering the cluster- cluster.initial_cluster_manager_nodes=opensearch-node1,opensearch-node2# Nodes eligible to serve as cluster manager- bootstrap.memory_lock=true# Disable JVM heap memory swapping- "OPENSEARCH_JAVA_OPTS=-Xms512m -Xmx512m"# Set min and max JVM heap sizes to at least 50% of system RAM- OPENSEARCH_INITIAL_ADMIN_PASSWORD=${OPENSEARCH_INITIAL_ADMIN_PASSWORD} # Sets the demo admin user password when using demo configuration, required for OpenSearch 2.12 and laterulimits:memlock:soft:-1# Set memlock to unlimited (no soft or hard limit)hard:-1nofile:soft:65536# Maximum number of open files for the opensearch user - set to at least 65536hard:65536volumes:- opensearch-data1:/usr/share/opensearch/data# Creates volume called opensearch-data1 and mounts it to the containerports:- 9200:9200# REST API- 9600:9600# Performance Analyzernetworks:- opensearch-net# All of the containers will join the same Docker bridge networkopensearch-node2:image:opensearchproject/opensearch:latest# This should be the same image used for opensearch-node1 to avoid issuescontainer_name:opensearch-node2environment:- cluster.name=opensearch-cluster- node.name=opensearch-node2- discovery.seed_hosts=opensearch-node1,opensearch-node2- cluster.initial_cluster_manager_nodes=opensearch-node1,opensearch-node2- bootstrap.memory_lock=true- "OPENSEARCH_JAVA_OPTS=-Xms512m -Xmx512m"- OPENSEARCH_INITIAL_ADMIN_PASSWORD=${OPENSEARCH_INITIAL_ADMIN_PASSWORD}ulimits:memlock:soft:-1hard:-1nofile:soft:65536hard:65536volumes:- opensearch-data2:/usr/share/opensearch/datanetworks:- opensearch-netopensearch-dashboards:image:opensearchproject/opensearch-dashboards:latest# Make sure the version of opensearch-dashboards matches the version of opensearch installed on other nodescontainer_name:opensearch-dashboardsports:- 5601:5601# Map host port 5601 to container port 5601expose:- "5601"# Expose port 5601 for web access to OpenSearch Dashboardsenvironment:OPENSEARCH_HOSTS:'["https://opensearch-node1:9200","https://opensearch-node2:9200"]'# Define the OpenSearch nodes that OpenSearch Dashboards will querynetworks:- opensearch-netvolumes:opensearch-data1:opensearch-data2:networks:opensearch-net:
Если вы переопределяете настройки opensearch_dashboards.yml, используя переменные окружения в вашем файле Compose, используйте все заглавные буквы и заменяйте точки на подчеркивания. Например, для opensearch.hosts используйте OPENSEARCH_HOSTS.
Это поведение отличается от переопределения настроек opensearch.yml, где преобразование заключается только в изменении оператора присваивания. Например, discovery.type: single-node в opensearch.yml определяется как discovery.type=single-node в docker-compose.yml.
Запуск и управление контейнерами OpenSearch с использованием Docker Compose
Создайте и запустите контейнеры в фоновом режиме из домашнего каталога вашего хоста (содержащего docker-compose.yml):
docker compose up -d
Проверьте, что сервисные контейнеры запустились корректно:
docker compose ps
Если контейнер не удалось запустить, вы можете просмотреть логи сервиса:
# Если вы не укажете имя сервиса, docker compose покажет логи всех узловdocker compose logs <serviceName>
Проверьте доступ к OpenSearch Dashboards, подключившись к http://localhost:5601 из браузера. Для OpenSearch версии 2.12 и выше вы должны использовать ваш настроенный логин и пароль. Для более ранних версий логин и пароль по умолчанию — admin. Мы не рекомендуем использовать эту конфигурацию на хостах, доступных из публичного интернета, пока вы не настроите конфигурацию безопасности вашего развертывания.
Помните, что localhost не может быть доступен удаленно. Если вы развертываете эти контейнеры на удаленном хосте, вам нужно установить сетевое соединение и заменить localhost на IP-адрес или DNS-запись, соответствующую хосту.
Остановите работающие контейнеры в вашем кластере:
docker compose down
Команда docker compose down остановит работающие контейнеры, но не удалит Docker-тома, которые существуют на хосте. Если вам не важны содержимое этих томов, используйте опцию -v, чтобы удалить все тома, например:
docker compose down -v
Настройка OpenSearch
В отличие от RPM-распределения OpenSearch, которое требует значительного объема конфигурации после установки, запуск кластеров OpenSearch с помощью Docker позволяет вам определить среду еще до создания контейнеров. Это возможно как при использовании Docker, так и при использовании Docker Compose.
Сопоставляет порты 9200 и 9600 (HOST_PORT:CONTAINER_PORT).
Устанавливает discovery.type в single-node, чтобы проверки загрузки не завершились неудачей для этого развертывания с одним узлом.
Использует флаг -v, чтобы передать локальный файл с именем custom-opensearch.yml в контейнер, заменяя файл opensearch.yml, включенный в образ.
Запрашивает образ opensearchproject/opensearch:latest из Docker Hub.
Запускает контейнер.
Если вы сравните эту команду с примером файла docker-compose.yml, вы можете заметить некоторые общие настройки, такие как сопоставление портов и ссылка на образ. Однако эта команда только развертывает один контейнер, работающий с OpenSearch, и не создает контейнер для OpenSearch Dashboards. Более того, если вы хотите использовать пользовательские TLS-сертификаты, пользователей или роли, или определить дополнительные тома и сети, то эта “однострочная” команда быстро становится непрактичной. Вот где полезность Docker Compose становится очевидной.
Использование Docker Compose
Когда вы строите свой кластер OpenSearch с помощью Docker Compose, вам может быть проще передавать пользовательские файлы конфигурации с вашего хоста в контейнер, вместо того чтобы перечислять каждую отдельную настройку в docker-compose.yml. Аналогично тому, как в примере команды docker run был смонтирован том с хоста в контейнер с помощью флага -v, файлы Compose могут указывать тома для монтирования как подопцию для соответствующей службы. Следующий сокращенный YAML-файл демонстрирует, как смонтировать файл или директорию в контейнер:
Обратите внимание, что в этом примере каждый узел OpenSearch использует один и тот же файл конфигурации, что упрощает управление настройками. Для получения более подробной информации о использовании томов и синтаксисе обратитесь к официальной документации Docker по томам.
Пример файла Docker Compose для разработки
Если вы хотите создать свой собственный файл compose на основе примера, ознакомьтесь с следующим образцом файла docker-compose.yml. Этот образец создает два узла OpenSearch и один узел OpenSearch Dashboards с отключенным плагином безопасности. Вы можете использовать этот образец в качестве отправной точки, просматривая Настройка основных параметров безопасности.
services:opensearch-node1:image:opensearchproject/opensearch:latestcontainer_name:opensearch-node1environment:- cluster.name=opensearch-cluster# Название кластера- node.name=opensearch-node1# Название узла, который будет работать в этом контейнере- discovery.seed_hosts=opensearch-node1,opensearch-node2# Узлы, которые будут использоваться для обнаружения кластера- cluster.initial_cluster_manager_nodes=opensearch-node1,opensearch-node2# Узлы, которые могут служить менеджерами кластера- bootstrap.memory_lock=true# Отключить свопинг памяти кучи JVM- "OPENSEARCH_JAVA_OPTS=-Xms512m -Xmx512m"# Установить минимальный и максимальный размеры кучи JVM не менее 50% от системной оперативной памяти- "DISABLE_INSTALL_DEMO_CONFIG=true"# Предотвращает выполнение встроенного демо-скрипта, который устанавливает демо-сертификаты и конфигурации безопасности в OpenSearch- "DISABLE_SECURITY_PLUGIN=true"# Отключает плагин безопасностиulimits:memlock:soft:-1# Установить memlock на неограниченное (без мягкого или жесткого ограничения)hard:-1nofile:soft:65536# Максимальное количество открытых файлов для пользователя opensearch - установить не менее 65536hard:65536volumes:- opensearch-data1:/usr/share/opensearch/data# Создает том с именем opensearch-data1 и монтирует его в контейнерports:- 9200:9200# REST API- 9600:9600# Анализатор производительностиnetworks:- opensearch-net# Все контейнеры будут присоединены к одной и той же сети Docker bridgeopensearch-node2:image:opensearchproject/opensearch:latestcontainer_name:opensearch-node2environment:- cluster.name=opensearch-cluster# Название кластера- node.name=opensearch-node2# Название узла, который будет работать в этом контейнере- discovery.seed_hosts=opensearch-node1,opensearch-node2# Узлы, которые будут использоваться для обнаружения кластера- cluster.initial_cluster_manager_nodes=opensearch-node1,opensearch-node2# Узлы, которые могут служить менеджерами кластера- bootstrap.memory_lock=true# Отключить свопинг памяти кучи JVM- "OPENSEARCH_JAVA_OPTS=-Xms512m -Xmx512m"# Установить минимальный и максимальный размеры кучи JVM не менее 50% от системной оперативной памяти- "DISABLE_INSTALL_DEMO_CONFIG=true"# Предотвращает выполнение встроенного демо-скрипта, который устанавливает демо-сертификаты и конфигурации безопасности в OpenSearch- "DISABLE_SECURITY_PLUGIN=true"# Отключает плагин безопасностиulimits:memlock:soft:-1# Установить memlock на неограниченное (без мягкого или жесткого ограничения)hard:-1nofile:soft:65536# Максимальное количество открытых файлов для пользователя opensearch - установить не менее 65536hard:65536volumes:- opensearch-data2:/usr/share/opensearch/data# Создает том с именем opensearch-data2 и монтирует его в контейнерnetworks:- opensearch-net# Все контейнеры будут присоединены к одной и той же сети Docker bridgeopensearch-dashboards:image:opensearchproject/opensearch-dashboards:latestcontainer_name:opensearch-dashboardsports:- 5601:5601# Привязка порта хоста 5601 к порту контейнера 5601expose:- "5601"# Открыть порт 5601 для веб-доступа к OpenSearch Dashboardsenvironment:- 'OPENSEARCH_HOSTS=["http://opensearch-node1:9200","http://opensearch-node2:9200"]'# Указать узлы OpenSearch для Dashboards- "DISABLE_SECURITY_DASHBOARDS_PLUGIN=true"# Отключает плагин безопасности в OpenSearch Dashboardsnetworks:- opensearch-netvolumes:opensearch-data1:{}# Создает том opensearch-data1opensearch-data2:{}# Создает том opensearch-data2networks:opensearch-net:{}# Создает сеть opensearch-net
Настройка основных параметров безопасности
Перед тем как сделать ваш кластер OpenSearch доступным для внешних хостов, рекомендуется ознакомиться с конфигурацией безопасности развертывания. Вы можете вспомнить из первого примера файла docker-compose.yml, что, если не отключить плагин безопасности, установив DISABLE_SECURITY_PLUGIN=true, встроенный скрипт применит стандартную демо-конфигурацию безопасности к узлам в кластере. Поскольку эта конфигурация используется для демонстрационных целей, стандартные имена пользователей и пароли известны. Поэтому мы рекомендуем создать собственные файлы конфигурации безопасности и использовать тома для передачи этих файлов в контейнеры. Для получения конкретных рекомендаций по настройке безопасности OpenSearch смотрите Конфигурация безопасности.
Чтобы использовать свои собственные сертификаты в конфигурации, добавьте все необходимые сертификаты в раздел томов файла compose:
Когда вы добавляете сертификаты TLS к узлам OpenSearch с помощью томов Docker Compose, вы также должны включить пользовательский файл opensearch.yml, который определяет эти сертификаты. Например:
Помните, что сертификаты, которые вы указываете в файле compose, должны совпадать с сертификатами, определенными в вашем пользовательском файле opensearch.yml. Вам следует заменить корневые, администраторские и узловые сертификаты на свои собственные. Для получения дополнительной информации смотрите Настройка сертификатов TLS.
Пример конфигурации в вашем пользовательском файле opensearch.yml может выглядеть следующим образом, добавляя сертификаты TLS и отличительное имя (DN) сертификата администратора, определяя несколько разрешений и включая подробное аудиторское логирование:
Для получения полного списка настроек смотрите Безопасность.
Используйте тот же процесс для указания конфигурации Backend в файле /usr/share/opensearch/config/opensearch-security/config.yml, а также для создания новых внутренних пользователей, ролей, сопоставлений, групп действий и арендаторов в соответствующих YAML-файлах.
После замены сертификатов и создания собственных внутренних пользователей, ролей, сопоставлений, групп действий и арендаторов, используйте Docker Compose для запуска кластера:
docker compose up -d
Работа с плагинами
Чтобы использовать образ OpenSearch с пользовательским плагином, вам сначала нужно создать Dockerfile. Ознакомьтесь с официальной документацией Docker для получения информации о создании Dockerfile.
Установка OpenSearch с использованием менеджера пакетов Advanced Packaging Tool (APT)
Установка OpenSearch с использованием менеджера пакетов Advanced Packaging Tool (APT) значительно упрощает процесс по сравнению с методом Tarball. Несколько технических аспектов, таких как путь установки, расположение конфигурационных файлов и создание службы, управляемой systemd, обрабатываются автоматически менеджером пакетов.
В общем, установка OpenSearch из дистрибутива Debian может быть разбита на несколько шагов:
Скачать и установить OpenSearch.
Установить вручную из Debian-пакета или из APT-репозитория.
(Необязательно) Протестировать OpenSearch.
Подтвердите, что OpenSearch может работать, прежде чем применять какую-либо пользовательскую конфигурацию.
Это можно сделать без какой-либо безопасности (без пароля, без сертификатов) или с демо-конфигурацией безопасности, которая может быть применена с помощью упакованного скрипта.
Настроить OpenSearch для вашей среды.
Примените основные настройки к OpenSearch и начните использовать его в вашей среде.
Дистрибутив Debian предоставляет все необходимое для запуска OpenSearch внутри дистрибутивов Linux на базе Debian, таких как Ubuntu.
Этот гид предполагает, что вы уверенно работаете с интерфейсом командной строки (CLI) Linux. Вы должны понимать, как вводить команды, перемещаться между директориями и редактировать текстовые файлы. Некоторые примеры команд ссылаются на текстовый редактор vi, но вы можете использовать любой доступный текстовый редактор.
Шаг 1: Скачивание и установка OpenSearch
Установка OpenSearch из пакета
Скачайте Debian-пакет для желаемой версии непосредственно с страницы загрузок OpenSearch. Debian-пакет можно скачать как для архитектуры x64, так и для arm64.
Из командной строки установите пакет с помощью dpkg:
Для новых установок OpenSearch 2.12 и более поздних версий необходимо определить пользовательский пароль администратора для настройки демо-конфигурации безопасности. Используйте одну из следующих команд для определения пользовательского пароля администратора:
После успешной установки включите OpenSearch как службу:
sudo systemctl enable opensearch
Запустите службу OpenSearch:
sudo systemctl start opensearch
Проверьте, что OpenSearch запустился корректно:
sudo systemctl status opensearch
Проверка отпечатка
Debian-пакет не подписан. Если вы хотите проверить отпечаток, проект OpenSearch предоставляет файл .sig, а также пакет .deb для использования с GNU Privacy Guard (GPG).
APT, основной инструмент управления пакетами для операционных систем на базе Debian, позволяет загружать и устанавливать Debian-пакет из APT-репозитория.
echo"deb [signed-by=/usr/share/keyrings/opensearch-release-keyring] https://artifacts.opensearch.org/releases/bundle/opensearch/3.x/apt stable main"| sudo tee /etc/apt/sources.list.d/opensearch-3.x.list
Проверьте, что репозиторий был успешно создан:
sudo apt-get update
С добавленной информацией о репозитории перечислите все доступные версии OpenSearch:
sudo apt list -a opensearch
Выбор версии OpenSearch для установки
Если не указано иное, будет установлена последняя доступная версия OpenSearch.
# Для новых установок OpenSearch 2.12 и более поздних версий необходимо определить пользовательский пароль администратора для настройки демо-конфигурации безопасности. # Используйте одну из следующих команд для определения пользовательского пароля:sudo env OPENSEARCH_INITIAL_ADMIN_PASSWORD=<custom-admin-password> apt-get install opensearch
# Для версий OpenSearch 2.11 и более ранних используйте следующую команду:sudo apt-get install opensearch
Установка конкретной версии OpenSearch
# Чтобы установить конкретную версию OpenSearch, укажите версию вручную, используя `opensearch=<version>`:# Для новых установок OpenSearch 2.12 и более поздних версий:sudo env OPENSEARCH_INITIAL_ADMIN_PASSWORD=<custom-admin-password> apt-get install opensearch=3.1.0
# Для версий OpenSearch 2.11 и более ранних:sudo apt-get install opensearch=3.1.0
Во время установки установщик предоставит вам отпечаток GPG-ключа. Убедитесь, что информация совпадает с указанной ниже:
Проверьте, что отпечаток ключа соответствует ожидаемому значению, чтобы гарантировать целостность и подлинность пакета.
sudo systemctl enable opensearch
Запуск OpenSearch
Чтобы запустить OpenSearch, выполните следующую команду:
sudo systemctl start opensearch
Проверка статуса OpenSearch
После запуска проверьте, что OpenSearch запустился корректно, с помощью следующей команды:
sudo systemctl status opensearch
Шаг 2: (Необязательно) Тестирование OpenSearch
Перед тем как продолжить с любой конфигурацией, рекомендуется протестировать вашу установку OpenSearch. В противном случае может быть сложно определить, связаны ли будущие проблемы с установочными ошибками или с пользовательскими настройками, которые вы применили после установки.
Когда OpenSearch установлен с использованием Debian-пакета, некоторые демо-настройки безопасности автоматически применяются. Это включает в себя самоподписанные TLS-сертификаты и несколько пользователей и ролей. Если вы хотите настроить их самостоятельно, смотрите раздел Настройка OpenSearch в вашей среде.
Узел OpenSearch в своей стандартной конфигурации (с демо-сертификатами и пользователями с стандартными паролями) не подходит для производственной среды. Если вы планируете использовать узел в производственной среде, вам следует, как минимум, заменить демо TLS-сертификаты на ваши собственные и обновить список внутренних пользователей и паролей. Смотрите Конфигурация безопасности для получения дополнительной информации, чтобы убедиться, что ваши узлы настроены в соответствии с вашими требованиями безопасности.
Отправка запросов на сервер
Отправьте запросы на сервер, чтобы проверить, что OpenSearch работает. Обратите внимание на использование флага --insecure, который необходим, поскольку TLS-сертификаты самоподписаны.
Отправьте запрос на порт 9200:
curl -X GET https://localhost:9200 -u 'admin:<custom-admin-password>' --insecure
Ожидаемый ответ
Вы должны получить ответ, который выглядит примерно так:
curl -X GET https://localhost:9200/_cat/plugins?v -u 'admin:<custom-admin-password>' --insecure
Этот запрос вернет список установленных плагинов, что также подтвердит, что OpenSearch работает корректно.
Ожидаемый ответ для запроса к конечной точке плагинов
Name
Component
Version
hostname
opensearch-alerting
3.1.0
hostname
opensearch-anomaly-detection
3.1.0
hostname
opensearch-asynchronous-search
3.1.0
hostname
opensearch-cross-cluster-replication
3.1.0
hostname
opensearch-geospatial
3.1.0
hostname
opensearch-index-management
3.1.0
hostname
opensearch-job-scheduler
3.1.0
hostname
opensearch-knn
3.1.0
hostname
opensearch-ml
3.1.0
hostname
opensearch-neural-search
3.1.0
hostname
opensearch-notifications
3.1.0
hostname
opensearch-notifications-core
3.1.0
hostname
opensearch-observability
3.1.0
hostname
opensearch-performance-analyzer
3.1.0
hostname
opensearch-reports-scheduler
3.1.0
hostname
opensearch-security
3.1.0
hostname
opensearch-security-analytics
3.1.0
hostname
opensearch-sql
3.1.0
Шаг 3: Настройка OpenSearch в вашей среде
Пользователи, не имеющие предварительного опыта работы с OpenSearch, могут захотеть получить список рекомендуемых настроек для начала работы с сервисом. По умолчанию OpenSearch не привязан к сетевому интерфейсу и не может быть доступен внешними хостами. Кроме того, настройки безопасности заполняются стандартными именами пользователей и паролями. Следующие рекомендации позволят пользователю привязать OpenSearch к сетевому интерфейсу, создать и подписать TLS-сертификаты, а также настроить базовую аутентификацию.
Рекомендуемые настройки
Следующие настройки позволят вам:
Привязать OpenSearch к IP-адресу или сетевому интерфейсу на хосте.
Установить начальные и максимальные размеры кучи JVM.
Определить переменную окружения, указывающую на встроенный JDK.
Настроить собственные TLS-сертификаты — сторонний центр сертификации (CA) не требуется.
Создать администратора с пользовательским паролем.
Если вы запускали демо-скрипт безопасности, вам нужно будет вручную перенастроить настройки, которые были изменены. Обратитесь к Конфигурации безопасности для получения рекомендаций перед продолжением.
Перед внесением каких-либо изменений в конфигурационные файлы всегда полезно сохранить резервную копию. Резервный файл можно использовать для устранения любых проблем, вызванных неправильной конфигурацией.
Открытие файла opensearch.yml
Откройте файл opensearch.yml:
sudo vi /etc/opensearch/opensearch.yml
Добавление следующих строк
Добавьте следующие строки в файл:
# Привязать OpenSearch к правильному сетевому интерфейсу. Используйте 0.0.0.0# для включения всех доступных интерфейсов или укажите IP-адрес,# назначенный конкретному интерфейсу.network.host:0.0.0.0# Если вы еще не настроили кластер, установите# discovery.type в single-node, иначе проверки загрузки# не пройдут, когда вы попытаетесь запустить службу.discovery.type:single-node# Если вы ранее отключили плагин безопасности в opensearch.yml,# обязательно включите его снова. В противном случае вы можете пропустить эту настройку.plugins.security.disabled:false
Сохраните изменения и закройте файл
Укажите начальные и максимальные размеры кучи JVM
Откройте файл jvm.options:
vi /etc/opensearch/jvm.options
Измените значения для начального и максимального размеров кучи. В качестве отправной точки вы должны установить эти значения на половину доступной системной памяти. Для выделенных хостов это значение можно увеличить в зависимости от ваших рабочих требований.
Например, если у хост-машины 8 ГБ памяти, вы можете установить начальные и максимальные размеры кучи на 4 ГБ:
-Xms4g
-Xmx4g
Сохраните изменения и закройте файл.
Настройка TLS
Сертификаты TLS обеспечивают дополнительную безопасность для вашего кластера, позволяя клиентам подтверждать личность хостов и шифровать трафик между клиентом и хостом. Для получения дополнительной информации обратитесь к разделам “Настройка сертификатов TLS” и “Генерация сертификатов”, которые включены в документацию по плагину безопасности. Для работы в среде разработки обычно достаточно самоподписанных сертификатов. Этот раздел проведет вас через основные шаги, необходимые для генерации собственных сертификатов TLS и их применения к вашему хосту OpenSearch.
Перейдите в директорию, где будут храниться сертификаты
cd /etc/opensearch
Удалите демонстрационные сертификаты
sudo rm -f *pem
Сгенерируйте корневой сертификат
Это то, что вы будете использовать для подписания других сертификатов.
# Создайте закрытый ключ для корневого сертификатаsudo openssl genrsa -out root-ca-key.pem 2048# Используйте закрытый ключ для создания самоподписанного корневого сертификата. Обязательно# замените аргументы, переданные в -subj, чтобы они отражали ваш конкретный хост.sudo openssl req -new -x509 -sha256 -key root-ca-key.pem -subj "/C=CA/ST=ONTARIO/L=TORONTO/O=ORG/OU=UNIT/CN=ROOT" -out root-ca.pem -days 730
Создайте сертификат администратора
Этот сертификат используется для получения повышенных прав для выполнения административных задач, связанных с плагином безопасности.
# Создайте закрытый ключ для сертификата администратораsudo openssl genrsa -out admin-key-temp.pem 2048# Преобразуйте закрытый ключ в PKCS#8sudo openssl pkcs8 -inform PEM -outform PEM -in admin-key-temp.pem -topk8 -nocrypt -v1 PBE-SHA1-3DES -out admin-key.pem
# Создайте запрос на подпись сертификата (CSR). Общим именем (CN) "A" можно пользоваться, так как этот сертификат# используется для аутентификации повышенного доступа и не привязан к хосту.sudo openssl req -new -key admin-key.pem -subj "/C=CA/ST=ONTARIO/L=TORONTO/O=ORG/OU=UNIT/CN=A" -out admin.csr
# Подпишите сертификат администратора с помощью корневого сертификата и закрытого ключа, которые вы создали ранее.sudo openssl x509 -req -in admin.csr -CA root-ca.pem -CAkey root-ca-key.pem -CAcreateserial -sha256 -out admin.pem -days 730
Создайте закрытый ключ для сертификата узла
sudo openssl genrsa -out node1-key-temp.pem 2048# Преобразуйте закрытый ключ в PKCS#8sudo openssl pkcs8 -inform PEM -outform PEM -in node1-key-temp.pem -topk8 -nocrypt -v1 PBE-SHA1-3DES -out node1-key.pem
# Создайте CSR и замените аргументы, переданные в -subj, чтобы они отражали ваш конкретный хост# Обратите внимание, что CN должен соответствовать DNS A записи для хоста — не используйте имя хоста.sudo openssl req -new -key node1-key.pem -subj "/C=CA/ST=ONTARIO/L=TORONTO/O=ORG/OU=UNIT/CN=node1.dns.a-record" -out node1.csr
# Создайте файл расширений, который определяет SAN DNS имя для хоста# Этот файл должен соответствовать DNS A записи хоста.sudo sh -c 'echo subjectAltName=DNS:node1.dns.a-record > node1.ext'# Подпишите сертификат узла с помощью корневого сертификата и закрытого ключа, которые вы создали ранееsudo openssl x509 -req -in node1.csr -CA root-ca.pem -CAkey root-ca-key.pem -CAcreateserial -sha256 -out node1.pem -days 730 -extfile node1.ext
Удалите временные файлы, которые больше не нужны
sudo rm -f *temp.pem *csr *ext
Убедитесь, что оставшиеся сертификаты принадлежат пользователю opensearch
Как описано в разделе “Генерация сертификатов”. Продвинутые пользователи также могут выбрать добавление настроек с помощью скрипта.
#! /bin/bash
# Before running this script, make sure to replace the CN in the # node's distinguished name with a real DNS A record.echo"plugins.security.ssl.transport.pemcert_filepath: /etc/opensearch/node1.pem"| sudo tee -a /etc/opensearch/opensearch.yml
echo"plugins.security.ssl.transport.pemkey_filepath: /etc/opensearch/node1-key.pem"| sudo tee -a /etc/opensearch/opensearch.yml
echo"plugins.security.ssl.transport.pemtrustedcas_filepath: /etc/opensearch/root-ca.pem"| sudo tee -a /etc/opensearch/opensearch.yml
echo"plugins.security.ssl.http.enabled: true"| sudo tee -a /etc/opensearch/opensearch.yml
echo"plugins.security.ssl.http.pemcert_filepath: /etc/opensearch/node1.pem"| sudo tee -a /etc/opensearch/opensearch.yml
echo"plugins.security.ssl.http.pemkey_filepath: /etc/opensearch/node1-key.pem"| sudo tee -a /etc/opensearch/opensearch.yml
echo"plugins.security.ssl.http.pemtrustedcas_filepath: /etc/opensearch/root-ca.pem"| sudo tee -a /etc/opensearch/opensearch.yml
echo"plugins.security.allow_default_init_securityindex: true"| sudo tee -a /etc/opensearch/opensearch.yml
echo"plugins.security.authcz.admin_dn:"| sudo tee -a /etc/opensearch/opensearch.yml
echo" - 'CN=A,OU=UNIT,O=ORG,L=TORONTO,ST=ONTARIO,C=CA'"| sudo tee -a /etc/opensearch/opensearch.yml
echo"plugins.security.nodes_dn:"| sudo tee -a /etc/opensearch/opensearch.yml
echo" - 'CN=node1.dns.a-record,OU=UNIT,O=ORG,L=TORONTO,ST=ONTARIO,C=CA'"| sudo tee -a /etc/opensearch/opensearch.yml
echo"plugins.security.audit.type: internal_opensearch"| sudo tee -a /etc/opensearch/opensearch.yml
echo"plugins.security.enable_snapshot_restore_privilege: true"| sudo tee -a /etc/opensearch/opensearch.yml
echo"plugins.security.check_snapshot_restore_write_privileges: true"| sudo tee -a /etc/opensearch/opensearch.yml
echo"plugins.security.restapi.roles_enabled: [\"all_access\", \"security_rest_api_access\"]"| sudo tee -a /etc/opensearch/opensearch.yml
(Необязательно) Добавление доверия к самоподписанному корневому сертификату
Пользователи определяются и аутентифицируются OpenSearch различными способами. Один из методов, который не требует дополнительной инфраструктуры на стороне сервера, — это ручная настройка пользователей в файле internal_users.yml. В следующих шагах объясняется, как добавить нового внутреннего пользователя и как заменить пароль по умолчанию для администратора с помощью скрипта.
Перейдите в директорию инструментов плагина безопасности
cd /usr/share/opensearch/plugins/opensearch-security/tools
Запустите hash.sh для генерации нового пароля
Этот скрипт завершится с ошибкой, если путь к JDK не был определен.
# Пример вывода, если JDK не найден...$ ./hash.sh
**************************************************************************
** Этот инструмент будет устаревшим в следующем крупном релизе OpenSearch **
** https://github.com/opensearch-project/security/issues/1755 **
**************************************************************************
which: no java in (/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/user/.local/bin:/home/user/bin)WARNING: nor OPENSEARCH_JAVA_HOME nor JAVA_HOME is set, will use
./hash.sh: line 35: java: command not found
Объявите переменную окружения при вызове скрипта, чтобы избежать проблем
Введите желаемый пароль на запросе и запомните хэш, который будет выведен
Откройте файл internal_users.yml
sudo vi /etc/opensearch/opensearch-security/internal_users.yml
Добавьте нового внутреннего пользователя и замените хэш внутри internal_users.yml на вывод, предоставленный hash.sh на шаге 2
Файл должен выглядеть примерно так:
---# This is the internal user database# The hash value is a bcrypt hash and can be generated with plugin/tools/hash.sh_meta:type:"internalusers"config_version:2# Define your internal users hereadmin:hash:"$2y$1EXAMPLEQqwS8TUcoEXAMPLEeZ3lEHvkEXAMPLERqjyh1icEXAMPLE."reserved:truebackend_roles:- "admin"description:"Admin user"user1:hash:"$2y$12$zoHpvTCRjjQr6h0PEaabueCaGam3/LDvT6rZZGDGMusD7oehQjw/O"reserved:falsebackend_roles:[]description:"New internal user"# Other users ...
Применение изменений
Теперь, когда сертификаты TLS установлены, а демонстрационные пользователи были удалены или им были назначены новые пароли, последний шаг — применить изменения конфигурации. Этот последний шаг конфигурации требует вызова securityadmin.sh, пока OpenSearch работает на хосте.
Убедитесь, что OpenSearch запущен
OpenSearch должен быть запущен, чтобы securityadmin.sh мог применить изменения. Если вы внесли изменения в opensearch.yml, перезапустите OpenSearch:
sudo systemctl restart opensearch
Откройте отдельную сессию терминала на хосте и перейдите в директорию, содержащую securityadmin.sh
# Перейдите в правильную директориюcd /usr/share/opensearch/plugins/opensearch-security/tools
Вызовите скрипт
Смотрите раздел “Применение изменений с помощью securityadmin.sh” для определения аргументов, которые вы должны передать.
# Вы можете опустить переменную окружения, если вы объявили ее в вашем $PATH.OPENSEARCH_JAVA_HOME=/usr/share/opensearch/jdk ./securityadmin.sh -cd /etc/opensearch/opensearch-security/ -cacert /etc/opensearch/root-ca.pem -cert /etc/opensearch/admin.pem -key /etc/opensearch/admin-key.pem -icl -nhnv
Параметры скрипта:
-cd: указывает директорию конфигурации.
-cacert: указывает путь к корневому сертификату.
-cert: указывает путь к сертификату администратора.
-key: указывает путь к закрытому ключу администратора.
-icl: включает режим конфигурации.
-nhnv: отключает проверку хоста и не выводит информацию о версии.
Проверка работы сервиса
OpenSearch теперь работает на вашем хосте с пользовательскими сертификатами TLS и безопасным пользователем для базовой аутентификации. Вы можете проверить внешнюю доступность, отправив API-запрос к вашему узлу OpenSearch с другого хоста.
Во время предыдущего теста вы направляли запросы на localhost. Теперь, когда сертификаты TLS были применены и новые сертификаты ссылаются на фактическую DNS-запись вашего хоста, запросы к localhost не пройдут проверку CN, и сертификат будет считаться недействительным. Вместо этого запросы должны быть отправлены на адрес, который вы указали при генерации сертификата.
Перед отправкой запросов вы должны добавить доверие к корневому сертификату на вашем клиенте. Если вы не добавите доверие, вам нужно будет использовать опцию -k, чтобы cURL игнорировал проверку CN и корневого сертификата.
Экземпляры OpenSearch, установленные с помощью dpkg или apt-get, можно легко обновить до более новой версии.
Ручное обновление с помощью DPKG
Скачайте Debian-пакет для желаемой версии обновления непосредственно со страницы загрузок OpenSearch Project.
Перейдите в директорию, содержащую дистрибутив, и выполните следующую команду:
sudo dpkg -i opensearch-3.1.0-linux-x64.deb
Обновление с помощью APT-GET
Чтобы обновить до последней версии OpenSearch с помощью apt-get, выполните:
sudo apt-get upgrade opensearch
Вы также можете обновить до конкретной версии OpenSearch:
sudo apt-get upgrade opensearch=<version>
Автоматическая перезагрузка сервиса после обновления пакета (2.13.0+)
Чтобы автоматически перезапустить OpenSearch после обновления пакета, включите opensearch.service через systemd:
sudo systemctl enable opensearch.service
3.8.2.2 - Установка OpenSearch Dashboards
OpenSearch Dashboards предоставляет полностью интегрированное решение для визуального изучения, обнаружения и запроса ваших данных наблюдаемости.
OpenSearch Dashboards предоставляет полностью интегрированное решение для визуального изучения, обнаружения и запроса ваших данных наблюдаемости. Вы можете установить OpenSearch Dashboards с помощью одного из следующих вариантов:
Docker
Tarball
RPM
Debian
Helm
Windows
Совместимость с браузерами
OpenSearch Dashboards поддерживает следующие веб-браузеры:
Chrome
Firefox
Safari
Edge (Chromium)
Другие браузеры на основе Chromium также могут работать. Internet Explorer и Microsoft Edge Legacy не поддерживаются.
Совместимость с Node.js
OpenSearch Dashboards требует бинарный файл среды выполнения Node.js для работы. Один из них включен в дистрибутивные пакеты, доступные на странице загрузок OpenSearch.
OpenSearch Dashboards версии 2.8.0 и новее могут использовать версии Node.js 14, 16 и 18. Дистрибутивные пакеты для OpenSearch Dashboards версии 2.10.0 и новее включают Node.js 18 и 14 (для обратной совместимости).
Чтобы использовать бинарный файл среды выполнения Node.js, отличный от включенных в дистрибутивные пакеты, выполните следующие шаги:
Скачайте и установите Node.js; совместимые версии: >=14.20.1 <19.
Установите путь установки в переменные окружения NODE_HOME или NODE_OSD_HOME.
На UNIX, если Node.js установлен в /usr/local/nodejs, а бинарный файл среды выполнения находится по пути /usr/local/nodejs/bin/node:
exportNODE_HOME=/usr/local/nodejs
Если Node.js установлен с помощью NVM, а бинарный файл среды выполнения находится по пути /Users/user/.nvm/versions/node/v18.19.0/bin/node:
exportNODE_HOME=/Users/user/.nvm/versions/node/v18.19.0
# или, если NODE_HOME используется для чего-то другого:exportNODE_OSD_HOME=/Users/user/.nvm/versions/node/v18.19.0
На Windows, если Node.js установлен в C:\Program Files\nodejs, а бинарный файл среды выполнения находится по пути C:\Program Files\nodejs\node.exe:
set"NODE_HOME=C:\Program Files\nodejs"# или с использованием PowerShell:
$Env:NODE_HOME = 'C:\Program Files\nodejs'
Ознакомьтесь с документацией вашей операционной системы, чтобы внести постоянные изменения в переменные окружения.
Скрипт запуска OpenSearch Dashboards, bin/opensearch-dashboards, ищет бинарный файл среды выполнения Node.js, используя NODE_OSD_HOME, затем NODE_HOME, прежде чем использовать бинарные файлы, включенные в дистрибутивные пакеты. Если подходящий бинарный файл среды выполнения Node.js не найден, скрипт запуска попытается найти его в системном PATH, прежде чем завершить работу с ошибкой.
Конфигурация
Чтобы узнать, как настроить TLS для OpenSearch Dashboards, смотрите раздел Настройка TLS.
3.8.2.2.1 - Запуск OpenSearch Dashboards с использованием Docker
“Вы можете запустить OpenSearch Dashboards с помощью команды docker run после создания сети Docker и запуска OpenSearch, но процесс подключения OpenSearch Dashboards к OpenSearch значительно проще с использованием файла Docker Compose.”
Выполните команду для загрузки образа OpenSearch Dashboards:
Создайте файл docker-compose.yml, соответствующий вашей среде. Пример файла, который включает OpenSearch Dashboards, доступен на странице установки OpenSearch Docker.
Так же, как и для opensearch.yml, вы можете передать пользовательский файл opensearch_dashboards.yml в контейнер в файле Docker Compose.
Запустите команду:
docker compose up
Подождите, пока контейнеры запустятся. Затем ознакомьтесь с документацией OpenSearch Dashboards.
Когда закончите, выполните команду:
docker compose down
3.8.2.2.2 - Установка OpenSearch Dashboards (Debian)
Установка OpenSearch Dashboards с использованием менеджера пакетов Advanced Packaging Tool (APT)
Установка OpenSearch Dashboards с использованием менеджера пакетов Advanced Packaging Tool (APT) значительно упрощает процесс по сравнению с методом Tarball. Например, менеджер пакетов обрабатывает несколько технических аспектов, таких как путь установки, расположение конфигурационных файлов и создание службы, управляемой systemd.
Перед установкой OpenSearch Dashboards необходимо настроить кластер OpenSearch. Обратитесь к руководству по установке OpenSearch для Debian для получения инструкций.
Данное руководство предполагает, что вы уверенно работаете с интерфейсом командной строки (CLI) Linux. Вы должны понимать, как вводить команды, перемещаться между директориями и редактировать текстовые файлы. Некоторые примеры команд ссылаются на текстовый редактор vi, но вы можете использовать любой доступный текстовый редактор.
Установка OpenSearch Dashboards из пакета
Скачайте пакет Debian для нужной версии непосредственно с страницы загрузок OpenSearch. Пакет Debian доступен для архитектур x64 и arm64.
Установите пакет с помощью dpkg из командной строки:
После завершения установки перезагрузите конфигурацию менеджера systemd:
sudo systemctl daemon-reload
Включите OpenSearch как службу:
sudo systemctl enable opensearch-dashboards
Запустите службу OpenSearch:
sudo systemctl start opensearch-dashboards
Проверьте, что OpenSearch запустился корректно:
sudo systemctl status opensearch-dashboards
Проверка подписи
Пакет Debian не подписан. Если вы хотите проверить подпись, проект OpenSearch предоставляет файл .sig, а также .deb пакет для использования с GNU Privacy Guard (GPG).
Установка OpenSearch Dashboards из репозитория APT
APT, основной инструмент управления пакетами для операционных систем на базе Debian, позволяет загружать и устанавливать пакет Debian из репозитория APT.
echo"deb [signed-by=/usr/share/keyrings/opensearch-release-keyring] https://artifacts.opensearch.org/releases/bundle/opensearch-dashboards/3.x/apt stable main"| sudo tee /etc/apt/sources.list.d/opensearch-dashboards-3.x.list
Проверьте, что репозиторий был успешно создан:
sudo apt-get update
С добавленной информацией о репозитории, перечислите все доступные версии OpenSearch:
sudo apt list -a opensearch-dashboards
Выберите версию OpenSearch, которую хотите установить:
Если не указано иное, будет установлена последняя доступная версия OpenSearch:
sudo apt-get install opensearch-dashboards
Чтобы установить конкретную версию OpenSearch Dashboards, укажите номер версии после имени пакета:
# Укажите версию вручную с помощью opensearch=<version>sudo apt-get install opensearch-dashboards=3.1.0
После завершения установки включите OpenSearch:
sudo systemctl enable opensearch-dashboards
Запустите OpenSearch:
sudo systemctl start opensearch-dashboards
Проверьте, что OpenSearch запустился корректно:
sudo systemctl status opensearch-dashboards
Изучение OpenSearch Dashboards
По умолчанию OpenSearch Dashboards, как и OpenSearch, связывается с localhost при первоначальной установке. В результате OpenSearch Dashboards недоступен с удаленного хоста, если конфигурация не обновлена.
Откройте файл opensearch_dashboards.yml:
sudo vi /etc/opensearch-dashboards/opensearch_dashboards.yml
Укажите сетевой интерфейс, к которому должен связываться OpenSearch Dashboards:
# Используйте 0.0.0.0, чтобы связаться с любым доступным интерфейсом.server.host:0.0.0.0
Сохраните изменения и выйдите из редактора.
Перезапустите OpenSearch Dashboards, чтобы применить изменения конфигурации:
sudo systemctl restart opensearch-dashboards
В веб-браузере перейдите к OpenSearch Dashboards. Порт по умолчанию — 5601.
Войдите с использованием имени пользователя admin и пароля admin. (Для OpenSearch 2.12 и новее пароль должен быть пользовательским паролем администратора.)
Посетите раздел “Начало работы с OpenSearch Dashboards”, чтобы узнать больше.
Обновление до новой версии
Экземпляры OpenSearch Dashboards, установленные с помощью dpkg или apt-get, можно легко обновить до новой версии.
Ручное обновление с помощью DPKG
Скачайте пакет Debian для желаемой версии обновления непосредственно со страницы загрузок проекта OpenSearch.
Перейдите в директорию, содержащую дистрибутив, и выполните следующую команду:
3.8.2.2.3 - Настройка TLS для OpenSearch Dashboards
По умолчанию, для упрощения тестирования и начала работы, OpenSearch Dashboards работает по протоколу HTTP. Чтобы включить TLS для HTTPS, обновите следующие настройки в файле opensearch_dashboards.yml.
Настройка
Описание
server.ssl.enabled
Включает SSL-соединение между сервером OpenSearch Dashboards и веб-браузером пользователя. Установите значение true для HTTPS или false для HTTP.
server.ssl.supportedProtocols
Указывает массив поддерживаемых протоколов TLS. Возможные значения: TLSv1, TLSv1.1, TLSv1.2, TLSv1.3. По умолчанию: ['TLSv1.1', 'TLSv1.2', 'TLSv1.3'].
server.ssl.cipherSuites
Указывает массив шифров TLS. Необязательная настройка.
server.ssl.certificate
Если server.ssl.enabled установлено в true, указывает полный путь к действительному сертификату сервера Privacy Enhanced Mail (PEM) для OpenSearch Dashboards. Вы можете сгенерировать свой сертификат или получить его у центра сертификации (CA).
server.ssl.key
Если server.ssl.enabled установлено в true, указывает полный путь к ключу для вашего серверного сертификата, например, /usr/share/opensearch-dashboards-1.0.0/config/my-client-cert-key.pem. Вы можете сгенерировать свой сертификат или получить его у CA.
server.ssl.keyPassphrase
Устанавливает пароль для ключа. Удалите эту настройку, если у ключа нет пароля. Необязательная настройка.
server.ssl.keystore.path
Использует файл JKS (Java KeyStore) или PKCS12/PFX (Public-Key Cryptography Standards) вместо сертификата и ключа PEM.
server.ssl.keystore.password
Устанавливает пароль для хранилища ключей. Обязательная настройка.
server.ssl.clientAuthentication
Указывает режим аутентификации клиента TLS. Может быть одним из следующих: none, optional или required. Если установлено в required, ваш веб-браузер должен отправить действительный клиентский сертификат, подписанный CA, настроенным в server.ssl.certificateAuthorities. По умолчанию: none.
server.ssl.certificateAuthorities
Указывает полный путь к одному или нескольким сертификатам CA в массиве, которые выдают сертификат, используемый для аутентификации клиента. Обязательная настройка, если server.ssl.clientAuthentication установлено в optional или required.
server.ssl.truststore.path
Использует файл JKS или PKCS12/PFX trust store вместо сертификатов CA PEM.
server.ssl.truststore.password
Устанавливает пароль для trust store. Обязательная настройка.
opensearch.ssl.verificationMode
Устанавливает связь между OpenSearch и OpenSearch Dashboards. Допустимые значения: full, certificate или none. Рекомендуется использовать full, если TLS включен, что включает проверку имени хоста. certificate проверяет сертификат, но не имя хоста. none не выполняет никаких проверок (подходит для HTTP). По умолчанию: full.
opensearch.ssl.certificateAuthorities
Если opensearch.ssl.verificationMode установлено в full или certificate, указывает полный путь к одному или нескольким сертификатам CA в массиве, которые составляют доверенную цепочку для кластера OpenSearch. Например, вам может потребоваться включить корневой CA и промежуточный CA, если вы использовали промежуточный CA для выдачи ваших сертификатов администратора, клиента и узла.
opensearch.ssl.truststore.path
Использует файл trust store JKS или PKCS12/PFX вместо сертификатов CA PEM.
opensearch.ssl.truststore.password
Устанавливает пароль для trust store. Обязательная настройка.
opensearch.ssl.alwaysPresentCertificate
Отправляет клиентский сертификат в кластер OpenSearch, если установлено значение true, что необходимо, когда mTLS включен в OpenSearch. По умолчанию: false.
opensearch.ssl.certificate
Если opensearch.ssl.alwaysPresentCertificate установлено в true, указывает полный путь к действительному клиентскому сертификату для кластера OpenSearch. Вы можете сгенерировать свой сертификат или получить его у CA.
opensearch.ssl.key
Если opensearch.ssl.alwaysPresentCertificate установлено в true, указывает полный путь к ключу для клиентского сертификата. Вы можете сгенерировать свой сертификат или получить его у CA.
opensearch.ssl.keyPassphrase
Устанавливает пароль для ключа. Удалите эту настройку, если у ключа нет пароля. Необязательная настройка.
opensearch.ssl.keystore.path
Использует файл хранилища ключей JKS или PKCS12/PFX вместо сертификата и ключа PEM.
opensearch.ssl.keystore.password
Устанавливает пароль для хранилища ключей. Обязательная настройка.
opensearch_security.cookie.secure
Если TLS включен для OpenSearch Dashboards, измените эту настройку на true. Для HTTP установите значение false.
Пример конфигурации opensearch_dashboards.yml
Следующая конфигурация opensearch_dashboards.yml показывает, как OpenSearch и OpenSearch Dashboards могут работать на одной машине с демонстрационной конфигурацией:
Если вы используете опцию установки через Docker, вы можете передать пользовательский файл opensearch_dashboards.yml в контейнер. Чтобы узнать больше, посетите страницу установки Docker.
После включения этих настроек и запуска приложения вы можете подключиться к OpenSearch Dashboards по адресу https://localhost:5601. Возможно, вам потребуется подтвердить предупреждение браузера, если ваши сертификаты самоподписанные. Чтобы избежать такого предупреждения (или полной несовместимости с браузером), рекомендуется использовать сертификаты от доверенного центра сертификации (CA).
3.8.2.3 - configuring opensearch
Существует два типа настроек OpenSearch: динамические и статические.
Динамические настройки
Динамические настройки индекса — это настройки, которые вы можете обновлять в любое время. Вы можете настраивать динамические параметры OpenSearch через API настроек кластера. Для получения подробной информации смотрите раздел Обновление настроек кластера с помощью API.
При возможности используйте API настроек кластера; файл opensearch.yml локален для каждого узла, в то время как API применяет настройки ко всем узлам в кластере.
Статические настройки
Некоторые операции являются статическими и требуют изменения конфигурационного файла opensearch.yml и перезапуска кластера. В общем, эти настройки относятся к сетевым параметрам, формированию кластера и локальной файловой системе. Чтобы узнать больше, смотрите раздел Формирование кластера.
Указание настроек в виде переменных окружения
Вы можете указывать переменные окружения следующими способами:
Аргументы при запуске
Вы можете указать переменные окружения в качестве аргументов, используя -E при запуске OpenSearch:
При запуске OpenSearch в Docker вы можете указать переменные окружения, используя опцию -e с командой docker run, как показано в следующей команде:
docker run -e "OPENSEARCH_JAVA_OPTS=-Xms2g -Xmx2g" -e "OPENSEARCH_PATH_CONF=/usr/share/opensearch/config" opensearchproject/opensearch:latest
Обновление настроек кластера с помощью API
Первый шаг в изменении настройки — это просмотр текущих настроек, отправив следующий запрос:
GET _cluster/settings?include_defaults=true
Для более краткого резюме нестандартных настроек отправьте следующий запрос:
GET _cluster/settings
В API настроек кластера существуют три категории настроек: постоянные, временные и стандартные. Постоянные настройки сохраняются после перезапуска кластера. После перезапуска OpenSearch очищает временные настройки.
Если вы указываете одну и ту же настройку в нескольких местах, OpenSearch использует следующий порядок приоритета:
Временные настройки
Постоянные настройки
Настройки из opensearch.yml
Стандартные настройки
Чтобы изменить настройку, используйте API настроек кластера и укажите новое значение как постоянное или временное. Этот пример показывает форму плоских настроек:
Вы можете найти файл opensearch.yml по следующему пути:
Для Docker: /usr/share/opensearch/config/opensearch.yml
Для большинства дистрибутивов Linux: /etc/opensearch/opensearch.yml
Вы можете отредактировать переменную OPENSEARCH_PATH_CONF=/etc/opensearch, чтобы изменить расположение каталога конфигурации. Эта переменная берется из /etc/default/opensearch (для Debian-пакета) и /etc/sysconfig/opensearch (для RPM-пакета).
Если вы установите свою пользовательскую переменную OPENSEARCH_PATH_CONF, имейте в виду, что другие стандартные переменные окружения не будут загружены.
В файле opensearch.yml вы не помечаете настройки как постоянные или временные, и настройки используют плоскую форму:
Демонстрационная конфигурация включает в себя ряд настроек для плагина безопасности, которые вы должны изменить перед использованием OpenSearch для производственной нагрузки. Чтобы узнать больше, смотрите раздел Безопасность.
(Необязательно) Конфигурация заголовков CORS
Если вы работаете над клиентским приложением, которое взаимодействует с кластером OpenSearch на другом домене, вы можете настроить заголовки в opensearch.yml, чтобы разрешить разработку локального приложения на той же машине. Используйте механизм Cross Origin Resource Sharing (CORS), чтобы ваше приложение могло делать вызовы к API OpenSearch, работающему локально. Добавьте следующие строки в ваш файл custom-opensearch.yml (обратите внимание, что символ “-” должен быть первым символом в каждой строке):
OpenSearch поддерживает следующие настройки хранения с удаленной поддержкой на уровне кластера:
cluster.remote_store.translog.buffer_interval (Динамическое, единица времени): Значение по умолчанию для интервала буфера транзакционного лога, используемого при выполнении периодических обновлений транзакционного лога. Эта настройка эффективна только в том случае, если настройка индекса index.remote_store.translog.buffer_interval отсутствует.
remote_store.moving_average_window_size (Динамическое, целое число): Размер окна скользящего среднего, используемый для расчета значений скользящей статистики, доступных через API статистики удаленного хранилища. По умолчанию 20. Минимально допустимое значение - 5.
Обратное давление при поиске - это механизм, используемый для выявления ресурсоемких запросов на поиск и их отмены, когда узел испытывает нагрузку. Для получения дополнительной информации см. Настройки обратного давления при поиске.
Настройки обратного давления при индексации шардов
Обратное давление при индексации шардов - это механизм умного отклонения на уровне шардов, который динамически отклоняет запросы на индексацию, когда ваш кластер испытывает нагрузку. Для получения дополнительной информации см. Настройки обратного давления при индексации шардов.
Настройки репликации сегментов
Для получения информации о настройках репликации сегментов см. Репликация сегментов.
Для получения информации о настройках репликации между кластерами см. Настройки репликации.
3.8.2.3.2 - Конфигурация и системные настройки
Обзор настрек Opensearch
Для получения обзора создания кластера OpenSearch и примеров настроек конфигурации см. раздел Создание кластера. Чтобы узнать больше о статических и динамических настройках, см. раздел Настройка OpenSearch.
OpenSearch поддерживает следующие системные настройки:
cluster.name (Статическая, строка): Имя кластера.
node.name (Статическая, строка): Описательное имя для узла.
node.roles (Статическая, список): Определяет одну или несколько ролей для узла OpenSearch. Допустимые значения: cluster_manager, data, ingest, search, ml, remote_cluster_client и coordinating_only.
path.data (Статическая, строка): Путь к директории, где хранятся ваши данные. Разделяйте несколько местоположений запятыми.
path.logs (Статическая, строка): Путь к файлам журналов.
bootstrap.memory_lock (Статическая, логическое): Блокирует память при запуске. Рекомендуется установить размер кучи примерно на половину доступной памяти в системе и убедиться, что владелец процесса имеет право использовать этот лимит. OpenSearch работает неэффективно, когда система использует свопинг памяти.
3.8.2.3.3 - Сетевые настройки
OpenSearch использует настройки HTTP для конфигурации связи с внешними клиентами через REST API и транспортные настройки для внутренней связи между узлами в OpenSearch.
Чтобы узнать больше о статических и динамических настройках, см. раздел Настройка OpenSearch.
OpenSearch поддерживает следующие общие сетевые настройки:
network.host (Статическая, список): Привязывает узел OpenSearch к адресу. Используйте 0.0.0.0, чтобы включить все доступные сетевые интерфейсы, или укажите IP-адрес, назначенный конкретному интерфейсу. Настройка network.host является комбинацией network.bind_host и network.publish_host, если они имеют одинаковое значение. Альтернативой network.host является отдельная настройка network.bind_host и network.publish_host по мере необходимости. См. раздел Расширенные сетевые настройки.
http.port (Статическая, одно значение или диапазон): Привязывает узел OpenSearch к пользовательскому порту или диапазону портов для HTTP-связи. Вы можете указать адрес или диапазон адресов. По умолчанию — 9200-9300.
transport.port (Статическая, одно значение или диапазон): Привязывает узел OpenSearch к пользовательскому порту для связи между узлами. Вы можете указать адрес или диапазон адресов. По умолчанию — 9300-9400.
Расширенные сетевые настройки
OpenSearch поддерживает следующие расширенные сетевые настройки:
network.bind_host (Статическая, список): Привязывает узел OpenSearch к адресу или адресам для входящих соединений. По умолчанию — значение из network.host.
network.publish_host (Статическая, список): Указывает адрес или адреса, которые узел OpenSearch публикует для других узлов в кластере, чтобы они могли подключиться к нему.
Расширенные HTTP-настройки
OpenSearch поддерживает следующие расширенные сетевые настройки для HTTP-связи:
http.host (Статическая, список): Устанавливает адрес узла OpenSearch для HTTP-связи. Настройка http.host является комбинацией http.bind_host и http.publish_host, если они имеют одинаковое значение. Альтернативой http.host является отдельная настройка http.bind_host и http.publish_host по мере необходимости.
http.bind_host (Статическая, список): Указывает адрес или адреса, к которым узел OpenSearch привязывается для прослушивания входящих HTTP-соединений.
http.publish_host (Статическая, список): Указывает адрес или адреса, которые узел OpenSearch публикует для других узлов для HTTP-связи.
http.compression (Статическая, логическое): Включает поддержку сжатия с использованием Accept-Encoding, когда это применимо. Когда включен HTTPS, по умолчанию — false, в противном случае — true. Отключение сжатия для HTTPS помогает снизить потенциальные риски безопасности, такие как атаки BREACH. Чтобы включить сжатие для HTTPS-трафика, явно установите http.compression в true.
http.max_header_size (Статическая, строка): Максимальный общий размер всех HTTP-заголовков, разрешенный в запросе. По умолчанию — 16KB.
Расширенные транспортные настройки
OpenSearch поддерживает следующие расширенные сетевые настройки для транспортной связи:
transport.host (Статическая, список): Устанавливает адрес узла OpenSearch для транспортной связи. Настройка transport.host является комбинацией transport.bind_host и transport.publish_host, если они имеют одинаковое значение. Альтернативой transport.host является отдельная настройка transport.bind_host и transport.publish_host по мере необходимости.
transport.bind_host (Статическая, список): Указывает адрес или адреса, к которым узел OpenSearch привязывается для прослушивания входящих транспортных соединений.
transport.publish_host (Статическая, список): Указывает адрес или адреса, которые узел OpenSearch публикует для других узлов для транспортной связи.OpenSearch использует настройки HTTP для конфигурации связи с внешними клиентами через REST API и транспортные настройки для внутренней связи между узлами в OpenSearch.
Выбор транспорта
По умолчанию OpenSearch использует транспорт, предоставляемый модулем transport-netty4, который использует движок Netty 4 как для внутренней TCP-связи между узлами в кластере, так и для внешней HTTP-связи с клиентами. Эта связь полностью асинхронна и неблокирующая. В следующей таблице перечислены другие доступные плагины транспорта, которые могут использоваться взаимозаменяемо.
Плагин
Описание
transport-reactor-netty4
HTTP-транспорт OpenSearch на основе Project Reactor и Netty 4 (экспериментальный)
Следующие настройки относятся к процессу обнаружения и локальному шлюзу.
Чтобы узнать больше о статических и динамических настройках, см. раздел Настройка OpenSearch.
Настройки обнаружения
Процесс обнаружения используется при формировании кластера. Он включает в себя обнаружение узлов и выбор узла-менеджера кластера. OpenSearch поддерживает следующие настройки обнаружения:
discovery.seed_hosts (Статическая, список): Список хостов, которые выполняют обнаружение при запуске узла. По умолчанию список хостов: ["127.0.0.1", "[::1]"].
discovery.seed_providers (Статическая, список): Указывает типы провайдеров начальных хостов, которые будут использоваться для получения адресов начальных узлов с целью запуска процесса обнаружения.
discovery.type (Статическая, строка): По умолчанию OpenSearch формирует кластер с несколькими узлами. Установите discovery.type в single-node, чтобы сформировать кластер с одним узлом.
cluster.initial_cluster_manager_nodes (Статическая, список): Список узлов, имеющих право быть узлами-менеджерами кластера, используемых для начальной загрузки кластера.
Настройки шлюза
Локальный шлюз хранит состояние кластера и данные шардов, которые используются при перезапуске кластера. OpenSearch поддерживает следующие настройки локального шлюза:
gateway.recover_after_nodes (Статическая, целое число): После полного перезапуска кластера количество узлов, которые должны присоединиться к кластеру, прежде чем может начаться восстановление.
gateway.recover_after_data_nodes (Статическая, целое число): После полного перезапуска кластера количество узлов данных, которые должны присоединиться к кластеру, прежде чем может начаться восстановление.
gateway.expected_data_nodes (Статическая, целое число): Ожидаемое количество узлов данных, которые должны существовать в кластере. После того как ожидаемое количество узлов присоединится к кластеру, может начаться восстановление локальных шардов.
gateway.recover_after_time (Статическая, значение времени): Количество времени, которое нужно подождать перед началом восстановления, если количество узлов данных меньше ожидаемого количества узлов данных.
3.8.2.3.5 - Настройки безопасности
Плагин безопасности предоставляет ряд файлов конфигурации YAML, которые используются для хранения необходимых настроек, определяющих, как плагин безопасности управляет пользователями, ролями и активностью внутри кластера.
Для полного списка файлов конфигурации плагина безопасности см. раздел Изменение файлов YAML.
Следующие разделы описывают настройки, связанные с безопасностью, в файле opensearch.yml. Вы можете найти opensearch.yml в <OPENSEARCH_HOME>/config/opensearch.yml. Чтобы узнать больше о статических и динамических настройках, см. раздел Настройка OpenSearch.
Общие настройки
Плагин безопасности поддерживает следующие общие настройки:
plugins.security.nodes_dn (Статическая): Указывает список отличительных имен (DN), обозначающих другие узлы в кластере. Эта настройка поддерживает подстановочные знаки и регулярные выражения. Список DN также считывается из индекса безопасности, помимо конфигурации YAML, когда plugins.security.nodes_dn_dynamic_config_enabled установлено в true. Если эта настройка не настроена правильно, кластер не сможет сформироваться, так как узлы не смогут доверять друг другу, что приведет к следующей ошибке: “Аутентификация транспортного клиента больше не поддерживается”.
plugins.security.nodes_dn_dynamic_config_enabled (Статическая): Актуально для сценариев использования кросс-кластера, где необходимо управлять разрешенными узлами DN без необходимости перезапускать узлы каждый раз, когда настраивается новый удаленный кросс-кластер. Установка nodes_dn_dynamic_config_enabled в true включает доступные для супер-администратора API для отличительных имен, которые предоставляют средства для динамического обновления или получения узлов DN. Эта настройка имеет эффект только если plugins.security.cert.intercluster_request_evaluator_class не установлено. По умолчанию — false.
plugins.security.authcz.admin_dn (Статическая): Определяет DN сертификатов, к которым должны быть назначены административные привилегии. Обязательно.
plugins.security.roles_mapping_resolution (Статическая): Определяет, как бэкенд-ролям сопоставляются роли безопасности. Поддерживаются следующие значения:
MAPPING_ONLY (По умолчанию): Сопоставления должны быть явно настроены в roles_mapping.yml.
BACKENDROLES_ONLY: Бэкенд-роли сопоставляются с ролями безопасности напрямую. Настройки в roles_mapping.yml не имеют эффекта.
BOTH: Бэкенд-роли сопоставляются с ролями безопасности как напрямую, так и через roles_mapping.yml.
plugins.security.dls.mode (Статическая): Устанавливает режим оценки безопасности на уровне документа (DLS). По умолчанию — адаптивный. См. раздел Как установить режим оценки DLS.
plugins.security.compliance.salt (Статическая): Соль, используемая при генерации хеш-значения для маскирования полей. Должна содержать не менее 32 символов. Разрешены только ASCII-символы. Необязательно.
plugins.security.compliance.immutable_indices (Статическая): Документы в индексах, помеченных как неизменяемые, следуют парадигме “запись один раз, чтение много раз”. Документы, созданные в этих индексах, не могут быть изменены и, следовательно, являются неизменяемыми.
config.dynamic.http.anonymous_auth_enabled (Статическая): Включает анонимную аутентификацию. Это приведет к тому, что все HTTP-аутентификаторы не будут вызывать запросы на аутентификацию. По умолчанию — false.
http.detailed_errors.enabled (Статическая): Включает подробное сообщение об ошибке для REST-вызовов, выполненных против кластера OpenSearch. Если установлено в true, предоставляет root_cause вместе с кодом ошибки. По умолчанию — true.
Настройки API управления REST
Плагин безопасности поддерживает следующие настройки API управления REST:
plugins.security.restapi.roles_enabled (Статическая): Включает доступ к API управления REST на основе ролей для указанных ролей. Роли разделяются запятой. По умолчанию — пустой список (ни одна роль не имеет доступа к API управления REST). См. раздел Контроль доступа для API.
plugins.security.restapi.endpoints_disabled.. (Статическая): Отключает конкретные конечные точки и их HTTP-методы для ролей. Значения для этой настройки составляют массив HTTP-методов. Например: plugins.security.restapi.endpoints_disabled.all_access.ACTIONGROUPS: ["PUT","POST","DELETE"]. По умолчанию все конечные точки и методы разрешены. Существующие конечные точки включают ACTIONGROUPS, CACHE, CONFIG, ROLES, ROLESMAPPING, INTERNALUSERS, SYSTEMINFO, PERMISSIONSINFO и LICENSE. См. раздел Контроль доступа для API.
plugins.security.restapi.password_validation_regex (Статическая): Указывает регулярное выражение для задания критериев для пароля при входе. Для получения дополнительной информации см. раздел Настройки пароля.
plugins.security.restapi.password_validation_error_message (Статическая): Указывает сообщение об ошибке, которое отображается, когда пароль не проходит проверку. Эта настройка используется вместе с plugins.security.restapi.password_validation_regex.
plugins.security.restapi.password_min_length (Статическая): Устанавливает минимальное количество символов для длины пароля при использовании оценщика силы пароля на основе баллов. По умолчанию — 8. Это также является минимальным значением. Для получения дополнительной информации см. раздел Настройки пароля.
plugins.security.restapi.password_score_based_validation_strength (Статическая): Устанавливает порог для определения, является ли пароль сильным или слабым. Допустимые значения: fair, good, strong и very_strong. Эта настройка используется вместе с plugins.security.restapi.password_min_length.
plugins.security.unsupported.restapi.allow_securityconfig_modification (Статическая): Включает использование методов PUT и PATCH для API конфигурации.
Расширенные настройки
Плагин безопасности поддерживает следующие расширенные настройки:
plugins.security.authcz.impersonation_dn (Статическая): Включает подмену на уровне транспортного слоя. Это позволяет DN выдавать себя за других пользователей. См. раздел Подмена пользователей.
plugins.security.authcz.rest_impersonation_user (Статическая): Включает подмену на уровне REST. Это позволяет пользователям выдавать себя за других пользователей. См. раздел Подмена пользователей.
plugins.security.allow_default_init_securityindex (Статическая): При установке в true OpenSearch Security автоматически инициализирует индекс конфигурации с файлами из директории /config, если индекс не существует.
Это будет использовать известные стандартные пароли. Используйте только в частной сети/окружении.
plugins.security.allow_unsafe_democertificates (Статическая): При установке в true OpenSearch запускается с демонстрационными сертификатами. Эти сертификаты выданы только для демонстрационных целей.
Эти сертификаты хорошо известны и, следовательно, небезопасны для использования в производственной среде. Используйте только в частной сети/окружении.
plugins.security.system_indices.permission.enabled (Статическая): Включает функцию разрешений для системных индексов. При установке в true функция включена, и пользователи с разрешением на изменение ролей могут создавать роли, которые включают разрешения, предоставляющие доступ к системным индексам. При установке в false разрешение отключено, и только администраторы с административным сертификатом могут вносить изменения в системные индексы. По умолчанию разрешение установлено в false в новом кластере.
Настройки уровня эксперта
Настройки уровня эксперта должны настраиваться и развертываться только администратором, который полностью понимает данную функцию. Неправильное понимание функции может привести к рискам безопасности, неправильной работе плагина безопасности или потере данных.
Плагин безопасности поддерживает следующие настройки уровня эксперта:
plugins.security.config_index_name (Статическая): Имя индекса, в котором .opendistro_security хранит свою конфигурацию.
plugins.security.cert.oid (Статическая): Определяет идентификатор объекта (OID) сертификатов узлов сервера.
plugins.security.cert.intercluster_request_evaluator_class (Статическая): Указывает реализацию org.opensearch.security.transport.InterClusterRequestEvaluator, которая используется для оценки межкластерных запросов. Экземпляры org.opensearch.security.transport.InterClusterRequestEvaluator должны реализовывать конструктор с одним аргументом, принимающим объект org.opensearch.common.settings.Settings.
plugins.security.enable_snapshot_restore_privilege (Статическая): При установке в false эта настройка отключает восстановление снимков для обычных пользователей. В этом случае принимаются только запросы на восстановление снимков, подписанные административным TLS-сертификатом. При установке в true (по умолчанию) обычные пользователи могут восстанавливать снимки, если у них есть привилегии cluster:admin/snapshot/restore, indices:admin/create и indices:data/write/index.
Снимок можно восстановить только в том случае, если он не содержит глобального состояния и не восстанавливает индекс .opendistro_security.
plugins.security.check_snapshot_restore_write_privileges (Статическая): При установке в false дополнительные проверки индекса пропускаются. При установке по умолчанию в true попытки восстановить снимки оцениваются на наличие привилегий indices:admin/create и indices:data/write/index.
plugins.security.cache.ttl_minutes (Статическая): Определяет, как долго кэш аутентификации будет действителен. Кэш аутентификации помогает ускорить аутентификацию, временно храня объекты пользователей, возвращаемые из бэкенда, чтобы плагин безопасности не требовал повторных запросов к ним. Установите значение в минутах. По умолчанию — 60. Отключите кэширование, установив значение в 0.
Отключение этого плагина может подвергнуть вашу конфигурацию (включая пароли) публичному доступу.
plugins.security.protected_indices.enabled (Статическая): Если установлено в true, включает защищенные индексы. Защищенные индексы более безопасны, чем обычные индексы. Эти индексы требуют роли для доступа, как и любой другой традиционный индекс, и требуют дополнительной роли для видимости. Эта настройка используется вместе с настройками plugins.security.protected_indices.roles и plugins.security.protected_indices.indices.
plugins.security.protected_indices.roles (Статическая): Указывает список ролей, к которым пользователь должен быть сопоставлен для доступа к защищенным индексам.
plugins.security.protected_indices.indices (Статическая): Указывает список индексов, которые следует пометить как защищенные. Эти индексы будут видны только пользователям, сопоставленным с ролями, указанными в plugins.security.protected_indices.roles. После выполнения этого требования пользователю все равно потребуется быть сопоставленным с традиционной ролью, используемой для предоставления разрешения на доступ к индексу.
plugins.security.system_indices.enabled (Статическая): Если установлено в true, включает системные индексы. Системные индексы аналогичны индексу безопасности, за исключением того, что их содержимое не зашифровано. Индексы, настроенные как системные индексы, могут быть доступны либо супер-администратором, либо пользователем с ролью, включающей разрешение на системный индекс. Для получения дополнительной информации о системных индексах см. раздел Системные индексы.
plugins.security.system_indices.indices (Статическая): Список индексов, которые будут использоваться как системные индексы. Эта настройка контролируется настройкой plugins.security.system_indices.enabled.
plugins.security.allow_default_init_securityindex (Статическая): При установке в true устанавливает плагин безопасности в его стандартные настройки безопасности, если попытка создать индекс безопасности завершается неудачей при запуске OpenSearch. Стандартные настройки безопасности хранятся в YAML-файлах, находящихся в директории opensearch-project/security/config. По умолчанию — false.
plugins.security.cert.intercluster_request_evaluator_class (Статическая): Класс, который будет использоваться для оценки межкластерной связи.
plugins.security.enable_snapshot_restore_privilege (Статическая): Включает предоставление привилегии восстановления снимков. Необязательно. По умолчанию — true.
plugins.security.check_snapshot_restore_write_privileges (Статическая): Обеспечивает оценку привилегий записи при создании снимков. По умолчанию — true.
Если вы измените любое из следующих свойств хеширования паролей, вам необходимо повторно хешировать все внутренние пароли для обеспечения совместимости и безопасности.
plugins.security.password.hashing.algorithm (Статическая): Указывает алгоритм хеширования паролей, который следует использовать. Поддерживаются следующие значения:
BCrypt (По умолчанию)
PBKDF2
Argon2
plugins.security.password.hashing.bcrypt.rounds (Статическая): Указывает количество раундов, используемых для хеширования паролей с помощью BCrypt. Допустимые значения находятся в диапазоне от 4 до 31, включая. По умолчанию — 12.
plugins.security.password.hashing.bcrypt.minor (Статическая): Указывает минорную версию алгоритма BCrypt, используемую для хеширования паролей. Поддерживаются следующие значения:
A
B
Y (По умолчанию)
plugins.security.password.hashing.pbkdf2.function (Статическая): Указывает псевдослучайную функцию, применяемую к паролю. Поддерживаются следующие значения:
SHA1
SHA224
SHA256 (По умолчанию)
SHA384
SHA512
plugins.security.password.hashing.pbkdf2.iterations (Статическая): Указывает количество раз, которое псевдослучайная функция применяется к паролю. По умолчанию — 600,000.
plugins.security.password.hashing.pbkdf2.length (Статическая): Указывает желаемую длину окончательного производного ключа. По умолчанию — 256.
plugins.security.password.hashing.argon2.iterations (Статическая): Указывает количество проходов по памяти, которые выполняет алгоритм. Увеличение этого значения увеличивает время вычислений на ЦП и улучшает устойчивость к атакам грубой силы. По умолчанию — 3.
plugins.security.password.hashing.argon2.memory (Статическая): Указывает количество памяти (в кибибайтах), используемой во время хеширования. По умолчанию — 65536 (64 МиБ).
plugins.security.password.hashing.argon2.parallelism (Статическая): Указывает количество параллельных потоков, используемых для вычислений. По умолчанию — 1.
plugins.security.password.hashing.argon2.length (Статическая): Указывает длину (в байтах) результирующего хеш-выхода. По умолчанию — 32.
plugins.security.password.hashing.argon2.type (Статическая): Указывает, какой вариант Argon2 использовать. Поддерживаются следующие значения:
Argon2i
Argon2d
Argon2id (по умолчанию)
plugins.security.password.hashing.argon2.version (Статическая): Указывает, какую версию Argon2 использовать. Поддерживаются следующие значения:
16
19 (по умолчанию)
Настройки журнала аудита
Плагин безопасности поддерживает следующие настройки журнала аудита:
plugins.security.audit.enable_rest (Динамическая): Включает или отключает ведение журнала REST-запросов. По умолчанию установлено в true (включено).
plugins.security.audit.enable_transport (Динамическая): Включает или отключает ведение журнала запросов на уровне транспорта. По умолчанию установлено в false (выключено).
plugins.security.audit.resolve_bulk_requests (Динамическая): Включает или отключает ведение журнала пакетных запросов. При включении все подзапросы в пакетных запросах также записываются в журнал. По умолчанию установлено в false (выключено).
plugins.security.audit.config.disabled_categories (Динамическая): Отключает указанные категории событий.
plugins.security.audit.ignore_requests (Динамическая): Исключает указанные запросы из ведения журнала. Поддерживает подстановочные знаки и регулярные выражения, содержащие действия или пути REST-запросов.
plugins.security.audit.threadpool.size (Статическая): Определяет количество потоков в пуле потоков, используемом для ведения журнала событий. По умолчанию установлено в 10. Установка этого значения в 0 отключает пул потоков, что означает, что плагин ведет журнал событий синхронно.
plugins.security.audit.threadpool.max_queue_len (Статическая): Устанавливает максимальную длину очереди на поток. По умолчанию установлено в 100000.
plugins.security.audit.ignore_users (Динамическая): Массив пользователей. Запросы аудита от пользователей в списке не будут записываться в журнал.
plugins.security.audit.type (Статическая): Назначение событий журнала аудита. Допустимые значения: internal_opensearch, external_opensearch, debug и webhook.
plugins.security.audit.config.http_endpoints (Статическая): Список конечных точек для localhost.
plugins.security.audit.config.index (Статическая): Индекс журнала аудита. По умолчанию установлен auditlog6. Индекс может быть статическим или индексом, который включает дату, чтобы он вращался ежедневно, например, “‘auditlog6-‘YYYY.MM.dd”. В любом случае убедитесь, что индекс защищен должным образом.
plugins.security.audit.config.type (Статическая): Укажите тип журнала аудита как auditlog.
plugins.security.audit.config.username (Статическая): Имя пользователя для конфигурации журнала аудита.
plugins.security.audit.config.password (Статическая): Пароль для конфигурации журнала аудита.
plugins.security.audit.config.enable_ssl (Статическая): Включает или отключает SSL для ведения журнала аудита.
plugins.security.audit.config.verify_hostnames (Статическая): Включает или отключает проверку имени хоста для SSL/TLS сертификатов. По умолчанию установлено в true (включено).
plugins.security.audit.config.enable_ssl_client_auth (Статическая): Включает или отключает аутентификацию клиента SSL/TLS. По умолчанию установлено в false (выключено).
plugins.security.audit.config.cert_alias (Статическая): Псевдоним для сертификата, используемого для доступа к журналу аудита.
plugins.security.audit.config.pemkey_filepath (Статическая): Относительный путь к файлу ключа Privacy Enhanced Mail (PEM), используемого для ведения журнала аудита.
plugins.security.audit.config.pemkey_content (Статическая): Содержимое PEM-ключа, закодированное в base64, используемого для ведения журнала аудита. Это альтернатива …config.pemkey_filepath.
plugins.security.audit.config.pemkey_password (Статическая): Пароль для частного ключа в формате PEM, используемого клиентом.
plugins.security.audit.config.pemcert_filepath (Статическая): Относительный путь к файлу PEM-сертификата, используемого для ведения журнала аудита.
plugins.security.audit.config.pemcert_content (Статическая): Содержимое PEM-сертификата, закодированное в base64, используемого для ведения журнала аудита. Это альтернатива указанию пути к файлу с помощью …config.pemcert_filepath.
plugins.security.audit.config.pemtrustedcas_filepath (Статическая): Относительный путь к файлу доверенного корневого центра сертификации.
plugins.security.audit.config.pemtrustedcas_content (Статическая): Содержимое корневого центра сертификации, закодированное в base64. Это альтернатива …config.pemtrustedcas_filepath.
plugins.security.audit.config.webhook.format (Статическая): Формат, используемый для вебхука. Допустимые значения: URL_PARAMETER_GET, URL_PARAMETER_POST, TEXT, JSON и SLACK.
plugins.security.audit.config.webhook.ssl.verify (Статическая): Включает или отключает проверку любых SSL/TLS сертификатов, отправленных с любым запросом вебхука. По умолчанию установлено в true (включено).
plugins.security.audit.config.webhook.ssl.pemtrustedcas_filepath (Статическая): Относительный путь к файлу доверенного центра сертификации, против которого проверяются запросы вебхука.
plugins.security.audit.config.webhook.ssl.pemtrustedcas_content (Статическая): Содержимое центра сертификации, используемого для проверки запросов вебхука, закодированное в base64. Это альтернатива …config.pemtrustedcas_filepath.
plugins.security.audit.config.log4j.logger_name (Статическая): Пользовательское имя для логгера Log4j.
plugins.security.audit.config.log4j.level (Статическая): Устанавливает уровень журнала по умолчанию для логгера Log4j. Допустимые значения: OFF, FATAL, ERROR, WARN, INFO, DEBUG, TRACE и ALL. По умолчанию установлено в INFO.
opendistro_security.audit.config.disabled_rest_categories (Динамическая): Список категорий REST, которые будут игнорироваться логгером. Допустимые значения: AUTHENTICATED и GRANTED_PRIVILEGES.
opendistro_security.audit.config.disabled_transport_categories (Динамическая): Список категорий на транспортном уровне, которые будут игнорироваться логгером. Допустимые значения: AUTHENTICATED и GRANTED_PRIVILEGES.
Настройки проверки имени хоста и DNS
Плагин безопасности поддерживает следующие настройки проверки имени хоста и DNS:
plugins.security.ssl.transport.enforce_hostname_verification (Статическая): Указывает, следует ли проверять имена хостов на транспортном уровне. Необязательно. По умолчанию установлено в true.
plugins.security.ssl.transport.resolve_hostname (Статическая): Указывает, следует ли разрешать имена хостов через DNS на транспортном уровне. Необязательно. По умолчанию установлено в true. Работает только если включена проверка имени хоста.
Для получения дополнительной информации см. раздел Проверка имени хоста и разрешение DNS.
Настройки аутентификации клиента
Плагин безопасности поддерживает следующую настройку аутентификации клиента:
plugins.security.ssl.http.clientauth_mode (Статическая): Режим аутентификации клиента TLS, который следует использовать. Допустимые значения: OPTIONAL (по умолчанию), REQUIRE и NONE. Необязательно.
Для получения дополнительной информации см. раздел Аутентификация клиента.
Настройки включенных шифров и протоколов
Плагин безопасности поддерживает следующие настройки включенных шифров и протоколов. Каждая настройка должна быть выражена в массиве:
plugins.security.ssl.http.enabled_ciphers (Статическая): Включенные шифры TLS для REST-уровня. Поддерживается только формат Java.
plugins.security.ssl.http.enabled_protocols (Статическая): Включенные протоколы TLS для REST-уровня. Поддерживается только формат Java.
plugins.security.ssl.transport.enabled_ciphers (Статическая): Включенные шифры TLS для транспортного уровня. Поддерживается только формат Java.
plugins.security.ssl.transport.enabled_protocols (Статическая): Включенные протоколы TLS для транспортного уровня. Поддерживается только формат Java.
Для получения дополнительной информации см. раздел Включенные шифры и протоколы.
Файлы хранилища ключей и доверенных сертификатов — настройки TLS на транспортном уровне
Плагин безопасности поддерживает следующие настройки хранилища ключей и доверенных сертификатов для транспортного уровня TLS:
plugins.security.ssl.transport.keystore_type (Статическая): Тип файла хранилища ключей. Необязательно. Допустимые значения: JKS или PKCS12/PFX. По умолчанию установлено в JKS.
plugins.security.ssl.transport.keystore_filepath (Статическая): Путь к файлу хранилища ключей, который должен находиться в каталоге конфигурации и указываться с использованием относительного пути. Обязательно.
plugins.security.ssl.transport.keystore_alias (Статическая): Имя псевдонима хранилища ключей. Необязательно. По умолчанию используется первый псевдоним.
plugins.security.ssl.transport.keystore_password (Статическая): Пароль для хранилища ключей. По умолчанию установлено в changeit.
plugins.security.ssl.transport.truststore_type (Статическая): Тип файла доверенного хранилища. Необязательно. Допустимые значения: JKS или PKCS12/PFX. По умолчанию установлено в JKS.
plugins.security.ssl.transport.truststore_filepath (Статическая): Путь к файлу доверенного хранилища, который должен находиться в каталоге конфигурации и указываться с использованием относительного пути. Обязательно.
plugins.security.ssl.transport.truststore_alias (Статическая): Имя псевдонима доверенного хранилища. Необязательно. По умолчанию используются все сертификаты.
plugins.security.ssl.transport.truststore_password (Статическая): Пароль для доверенного хранилища. По умолчанию установлено в changeit.
Для получения дополнительной информации о файлах хранилища ключей и доверенных сертификатов см. раздел TLS на транспортном уровне.
Файлы хранилища ключей и доверенных сертификатов — настройки TLS на уровне REST
Плагин безопасности поддерживает следующие настройки хранилища ключей и доверенных сертификатов для уровня REST TLS:
plugins.security.ssl.http.enabled (Статическая): Указывает, следует ли включить TLS на уровне REST. Если включено, разрешен только HTTPS. Необязательно. По умолчанию установлено в false.
plugins.security.ssl.http.keystore_type (Статическая): Тип файла хранилища ключей. Необязательно. Допустимые значения: JKS или PKCS12/PFX. По умолчанию установлено в JKS.
plugins.security.ssl.http.keystore_filepath (Статическая): Путь к файлу хранилища ключей, который должен находиться в каталоге конфигурации и указываться с использованием относительного пути. Обязательно.
plugins.security.ssl.http.keystore_alias (Статическая): Имя псевдонима хранилища ключей. Необязательно. По умолчанию используется первый псевдоним.
plugins.security.ssl.http.keystore_password (Статическая): Пароль для хранилища ключей. По умолчанию установлено в changeit.
plugins.security.ssl.http.truststore_type (Статическая): Тип файла доверенного хранилища. Необязательно. Допустимые значения: JKS или PKCS12/PFX. По умолчанию установлено в JKS.
plugins.security.ssl.http.truststore_filepath (Статическая): Путь к файлу доверенного хранилища, который должен находиться в каталоге конфигурации и указываться с использованием относительного пути. Обязательно.
plugins.security.ssl.http.truststore_alias (Статическая): Имя псевдонима доверенного хранилища. Необязательно. По умолчанию используются все сертификаты.
plugins.security.ssl.http.truststore_password (Статическая): Пароль для доверенного хранилища. По умолчанию установлено в changeit.
Для получения дополнительной информации см. раздел TLS на уровне REST.
X.509 PEM-сертификаты и ключи PKCS #8 — настройки TLS на транспортном уровне
Плагин безопасности поддерживает следующие настройки TLS на транспортном уровне, связанные с X.509 PEM-сертификатами и ключами PKCS #8:
plugins.security.ssl.transport.pemkey_filepath (Статическая): Путь к файлу ключа сертификата (PKCS #8), который должен находиться в каталоге конфигурации и указываться с использованием относительного пути. Обязательно.
plugins.security.ssl.transport.pemkey_password (Статическая): Пароль для ключа. Укажите эту настройку, если у ключа есть пароль. Необязательно.
plugins.security.ssl.transport.pemcert_filepath (Статическая): Путь к цепочке сертификатов узла X.509 (формат PEM), который должен находиться в каталоге конфигурации и указываться с использованием относительного пути. Обязательно.
plugins.security.ssl.transport.pemtrustedcas_filepath (Статическая): Путь к корневым центрам сертификации (формат PEM), который должен находиться в каталоге конфигурации и указываться с использованием относительного пути. Обязательно.
Для получения дополнительной информации см. раздел TLS на транспортном уровне.
X.509 PEM-сертификаты и ключи PKCS #8 — настройки TLS на уровне REST
Плагин безопасности поддерживает следующие настройки TLS на уровне REST, связанные с X.509 PEM-сертификатами и ключами PKCS #8:
plugins.security.ssl.http.enabled (Статическая): Указывает, следует ли включить TLS на уровне REST. Если включено, разрешен только HTTPS. Необязательно. По умолчанию установлено в false.
plugins.security.ssl.http.pemkey_filepath (Статическая): Путь к файлу ключа сертификата (PKCS #8), который должен находиться в каталоге конфигурации и указываться с использованием относительного пути. Обязательно.
plugins.security.ssl.http.pemkey_password (Статическая): Пароль для ключа. Укажите эту настройку, если у ключа есть пароль. Необязательно.
plugins.security.ssl.http.pemcert_filepath (Статическая): Путь к цепочке сертификатов узла X.509 (формат PEM), который должен находиться в каталоге конфигурации и указываться с использованием относительного пути. Обязательно.
plugins.security.ssl.http.pemtrustedcas_filepath (Статическая): Путь к корневым центрам сертификации (формат PEM), который должен находиться в каталоге конфигурации и указываться с использованием относительного пути. Обязательно.
Для получения дополнительной информации см. раздел TLS на уровне REST.
Настройки безопасности на транспортном уровне
Плагин безопасности поддерживает следующие настройки безопасности на транспортном уровне:
plugins.security.ssl.transport.enabled (Статическая): Указывает, следует ли включить TLS на уровне REST.
plugins.security.ssl.transport.client.pemkey_password (Статическая): Пароль для частного ключа в формате PEM, используемого клиентом на транспортном уровне.
plugins.security.ssl.transport.keystore_keypassword (Статическая): Пароль для ключа внутри хранилища ключей.
plugins.security.ssl.transport.server.keystore_keypassword (Статическая): Пароль для ключа внутри хранилища ключей сервера.
plugins.security.ssl.transport.server.keystore_alias (Статическая): Имя псевдонима для хранилища ключей сервера.
plugins.security.ssl.transport.client.keystore_alias (Статическая): Имя псевдонима для хранилища ключей клиента.
plugins.security.ssl.transport.server.truststore_alias (Статическая): Имя псевдонима для доверенного хранилища сервера.
plugins.security.ssl.transport.client.truststore_alias (Статическая): Имя псевдонима для доверенного хранилища клиента.
plugins.security.ssl.client.external_context_id (Статическая): Предоставляет клиенту на транспортном уровне идентификатор для использования внешнего SSL-контекста.
plugins.security.ssl.transport.principal_extractor_class (Статическая): Указывает класс, реализующий извлечение, чтобы использовать пользовательскую часть сертификата в качестве основного.
plugins.security.ssl.http.crl.file_path (Статическая): Путь к файлу списка отозванных сертификатов (CRL).
plugins.security.ssl.http.crl.validate (Статическая): Включает проверку списка отозванных сертификатов (CRL). По умолчанию установлено в false (выключено).
plugins.security.ssl.http.crl.prefer_crlfile_over_ocsp (Статическая): Указывает, следует ли предпочитать запись сертификата CRL перед записью протокола статуса сертификата в режиме онлайн (OCSP), если сертификат содержит обе записи. Необязательно. По умолчанию установлено в false.
plugins.security.ssl.http.crl.check_only_end_entities (Статическая): Если установлено в true, проверяются только конечные сертификаты. По умолчанию установлено в true.
plugins.security.ssl.http.crl.disable_ocsp (Статическая): Отключает OCSP. По умолчанию установлено в false (OCSP включен).
plugins.security.ssl.http.crl.disable_crldp (Статическая): Отключает конечные точки CRL в сертификатах. По умолчанию установлено в false (конечные точки CRL включены).
plugins.security.ssl.allow_client_initiated_renegotiation (Статическая): Включает или отключает повторнуюNegotiation, инициированную клиентом. По умолчанию установлено в false (повторнаяNegotiation, инициированная клиентом, не разрешена).
Примеры настроек плагина безопасности
# Common configuration settingsplugins.security.nodes_dn:- "CN=*.example.com, OU=SSL, O=Test, L=Test, C=DE"- "CN=node.other.com, OU=SSL, O=Test, L=Test, C=DE"- "CN=node.example.com, OU=SSL\\, Inc., L=Test, C=DE"# escape additional comma with `\\`plugins.security.authcz.admin_dn:- CN=kirk,OU=client,O=client,L=test, C=deplugins.security.roles_mapping_resolution:MAPPING_ONLYplugins.security.ssl.transport.pemcert_filepath:esnode.pemplugins.security.ssl.transport.pemkey_filepath:esnode-key.pemplugins.security.ssl.transport.pemtrustedcas_filepath:root-ca.pemplugins.security.ssl.transport.enforce_hostname_verification:falseplugins.security.ssl.http.enabled:trueplugins.security.ssl.http.pemcert_filepath:esnode.pemplugins.security.ssl.http.pemkey_filepath:esnode-key.pemplugins.security.ssl.http.pemtrustedcas_filepath:root-ca.pemplugins.security.allow_unsafe_democertificates:trueplugins.security.allow_default_init_securityindex:trueplugins.security.nodes_dn_dynamic_config_enabled:falseplugins.security.cert.intercluster_request_evaluator_class:# need example value for this.plugins.security.audit.type:internal_opensearchplugins.security.enable_snapshot_restore_privilege:trueplugins.security.check_snapshot_restore_write_privileges:trueplugins.security.cache.ttl_minutes:60plugins.security.restapi.roles_enabled:["all_access","security_rest_api_access"]plugins.security.system_indices.enabled:trueplugins.security.system_indices.indices:[".opendistro-alerting-config",".opendistro-alerting-alert*",".opendistro-anomaly-results*",".opendistro-anomaly-detector*",".opendistro-anomaly-checkpoints",".opendistro-anomaly-detection-state",".opendistro-reports-*",".opendistro-notifications-*",".opendistro-notebooks",".opendistro-asynchronous-search-response*"]node.max_local_storage_nodes:3plugins.security.restapi.password_validation_regex:'(?=.*[A-Z])(?=.*[^a-zA-Z\d])(?=.*[0-9])(?=.*[a-z]).{8,}'plugins.security.restapi.password_validation_error_message:"Password must be minimum 8 characters long and must contain at least one uppercase letter, one lowercase letter, one digit, and one special character."plugins.security.allow_default_init_securityindex:trueplugins.security.cache.ttl_minutes:60## REST Management API configuration settingsplugins.security.restapi.roles_enabled:["all_access","xyz_role"]plugins.security.restapi.endpoints_disabled.all_access.ACTIONGROUPS:["PUT","POST","DELETE"] # Alternative example: plugins.security.restapi.endpoints_disabled.xyz_role.LICENSE:["DELETE"]## Audit log configuration settingsplugins.security.audit.enable_rest:trueplugins.security.audit.enable_transport:falseplugins.security.audit.resolve_bulk_requests:falseplugins.security.audit.config.disabled_categories:["AUTHENTICATED","GRANTED_PRIVILEGES"]plugins.security.audit.ignore_requests:["indices:data/read/*","*_bulk"]plugins.security.audit.threadpool.size:10plugins.security.audit.threadpool.max_queue_len:100000plugins.security.audit.ignore_users:['kibanaserver','some*user','/also.*regex possible/']plugins.security.audit.type:internal_opensearch## external_opensearch settingsplugins.security.audit.config.http_endpoints:['localhost:9200','localhost:9201','localhost:9202']plugins.security.audit.config.index:"'auditlog6-'2023.06.15"plugins.security.audit.config.type:auditlogplugins.security.audit.config.username:auditloguserplugins.security.audit.config.password:auditlogpasswordplugins.security.audit.config.enable_ssl:falseplugins.security.audit.config.verify_hostnames:falseplugins.security.audit.config.enable_ssl_client_auth:falseplugins.security.audit.config.cert_alias:mycertplugins.security.audit.config.pemkey_filepath:key.pemplugins.security.audit.config.pemkey_content:<...pem base 64 content>plugins.security.audit.config.pemkey_password:secretplugins.security.audit.config.pemcert_filepath:cert.pemplugins.security.audit.config.pemcert_content:<...pem base 64 content>plugins.security.audit.config.pemtrustedcas_filepath:ca.pemplugins.security.audit.config.pemtrustedcas_content:<...pem base 64 content>## Webhook settingsplugins.security.audit.config.webhook.url:"http://mywebhook/endpoint"plugins.security.audit.config.webhook.format:JSONplugins.security.audit.config.webhook.ssl.verify:falseplugins.security.audit.config.webhook.ssl.pemtrustedcas_filepath:ca.pemplugins.security.audit.config.webhook.ssl.pemtrustedcas_content:<...pem base 64 content>## log4j settingsplugins.security.audit.config.log4j.logger_name:auditloggerplugins.security.audit.config.log4j.level:INFO## Advanced configuration settingsplugins.security.authcz.impersonation_dn:"CN=spock,OU=client,O=client,L=Test,C=DE":- worf"cn=webuser,ou=IT,ou=IT,dc=company,dc=com":- user2- user1plugins.security.authcz.rest_impersonation_user:"picard":- worf"john":- steve- martinplugins.security.allow_default_init_securityindex:falseplugins.security.allow_unsafe_democertificates:falseplugins.security.cache.ttl_minutes:60plugins.security.restapi.password_validation_regex:'(?=.*[A-Z])(?=.*[^a-zA-Z\d])(?=.*[0-9])(?=.*[a-z]).{8,}'plugins.security.restapi.password_validation_error_message:"A password must be at least 8 characters long and contain at least one uppercase letter, one lowercase letter, one digit, and one special character."plugins.security.restapi.password_min_length:8plugins.security.restapi.password_score_based_validation_strength:very_strong## Advanced SSL settings - use only if you understand SSL ins and outsplugins.security.ssl.transport.client.pemkey_password:superSecurePassword1plugins.security.ssl.transport.keystore_keypassword:superSecurePassword2plugins.security.ssl.transport.server.keystore_keypassword:superSecurePassword3plugins.security.ssl.http.keystore_keypassword:superSecurePassword4plugins.security.ssl.http.clientauth_mode:REQUIREplugins.security.ssl.transport.enabled:trueplugins.security.ssl.transport.server.keystore_alias:my_aliasplugins.security.ssl.transport.client.keystore_alias:my_other_aliasplugins.security.ssl.transport.server.truststore_alias:trustore_alias_1plugins.security.ssl.transport.client.truststore_alias:trustore_alias_2plugins.security.ssl.client.external_context_id:my_context_idplugins.security.ssl.transport.principal_extractor_class:org.opensearch.security.ssl.ExampleExtractorplugins.security.ssl.http.crl.file_path:ssl/crl/revoked.crlplugins.security.ssl.http.crl.validate:trueplugins.security.ssl.http.crl.prefer_crlfile_over_ocsp:trueplugins.security.ssl.http.crl.check_only_end_entitites:falseplugins.security.ssl.http.crl.disable_ocsp:trueplugins.security.ssl.http.crl.disable_crldp:trueplugins.security.ssl.allow_client_initiated_renegotiation:true## Expert settings - use only if you understand their use completely: accidental values can potentially cause security risks or failures to OpenSearch Security.plugins.security.config_index_name:.opendistro_securityplugins.security.cert.oid:'1.2.3.4.5.5'plugins.security.cert.intercluster_request_evaluator_class:org.opensearch.security.transport.DefaultInterClusterRequestEvaluatorplugins.security.enable_snapshot_restore_privilege:trueplugins.security.check_snapshot_restore_write_privileges:trueplugins.security.cache.ttl_minutes:60plugins.security.disabled:falseplugins.security.protected_indices.enabled:trueplugins.security.protected_indices.roles:['all_access']plugins.security.protected_indices.indices:[]plugins.security.system_indices.enabled:trueplugins.security.system_indices.indices:['.opendistro-alerting-config','.opendistro-ism-*','.opendistro-reports-*','.opensearch-notifications-*','.opensearch-notebooks','.opensearch-observability','.opendistro-asynchronous-search-response*','.replication-metadata-store']
3.8.2.3.6 - Настройки предохранителей
Предохранители предотвращают возникновение ошибки Java OutOfMemoryError в OpenSearch.
Родительский предохранитель указывает общее доступное количество памяти для всех дочерних предохранителей. Дочерние предохранители указывают общее доступное количество памяти для себя.
Для получения дополнительной информации о статических и динамических настройках см. раздел Конфигурация OpenSearch.
Настройки родительского предохранителя
OpenSearch поддерживает следующие настройки родительского предохранителя:
indices.breaker.total.use_real_memory (Статическая, логическая): Если установлено в true, родительский предохранитель учитывает фактическое использование памяти. В противном случае родительский предохранитель учитывает количество памяти, зарезервированной дочерними предохранителями. По умолчанию установлено в true.
indices.breaker.total.limit (Динамическая, процент): Указывает начальный лимит памяти для родительского предохранителя. Если indices.breaker.total.use_real_memory установлено в true, по умолчанию составляет 95% кучи JVM. Если indices.breaker.total.use_real_memory установлено в false, по умолчанию составляет 70% кучи JVM.
Настройки предохранителя данных полей
Предохранитель данных полей ограничивает объем памяти кучи, необходимый для загрузки поля в кэш данных полей. OpenSearch поддерживает следующие настройки предохранителя данных полей:
indices.breaker.fielddata.limit (Динамическая, процент): Указывает лимит памяти для предохранителя данных полей. По умолчанию составляет 40% кучи JVM.
indices.breaker.fielddata.overhead (Динамическая, дробное число): Константа, на которую умножаются оценки данных полей для определения окончательной оценки. По умолчанию составляет 1.03.
Настройки предохранителя запросов
Предохранитель запросов ограничивает объем памяти, необходимый для построения структур данных, необходимых для запроса (например, при вычислении агрегатов). OpenSearch поддерживает следующие настройки предохранителя запросов:
indices.breaker.request.limit (Динамическая, процент): Указывает лимит памяти для предохранителя запросов. По умолчанию составляет 60% кучи JVM.
indices.breaker.request.overhead (Динамическая, дробное число): Константа, на которую умножаются оценки запросов для определения окончательной оценки. По умолчанию составляет 1.
Настройки предохранителя текущих запросов
Предохранитель текущих запросов ограничивает использование памяти для всех текущих входящих запросов на транспортном и HTTP-уровне. Использование памяти для запроса основано на длине содержимого запроса и включает память, необходимую для необработанного запроса и структурированного объекта, представляющего запрос. OpenSearch поддерживает следующие настройки предохранителя текущих запросов:
network.breaker.inflight_requests.limit (Динамическая, процент): Указывает лимит памяти для предохранителя текущих запросов. По умолчанию составляет 100% кучи JVM (таким образом, лимит использования памяти для текущего запроса определяется лимитом памяти родительского предохранителя).
network.breaker.inflight_requests.overhead (Динамическая, дробное число): Константа, на которую умножаются оценки текущих запросов для определения окончательной оценки. По умолчанию составляет 2.
Настройки предохранителя компиляции скриптов
Предохранитель компиляции скриптов ограничивает количество компиляций встроенных скриптов в течение временного интервала. OpenSearch поддерживает следующую настройку предохранителя компиляции скриптов:
script.max_compilations_rate (Динамическая, ставка): Максимальное количество уникальных динамических скриптов, скомпилированных в течение временного интервала для данного контекста. По умолчанию составляет 150 каждые 5 минут (150/5m).
Настройки предохранителя регулярных выражений
Предохранитель регулярных выражений включает или отключает регулярные выражения и ограничивает их сложность. OpenSearch поддерживает следующие настройки предохранителя регулярных выражений:
script.painless.regex.enabled (Статическая, строка): Включает регулярные выражения в скриптах Painless. Допустимые значения:
limited: Включает регулярные выражения и ограничивает их сложность с помощью настройки script.painless.regex.limit-factor.
true: Включает регулярные выражения. Отключает предохранитель регулярных выражений и не ограничивает сложность регулярных выражений.
false: Отключает регулярные выражения. Если скрипт Painless содержит регулярное выражение, возвращает ошибку.
По умолчанию установлено в limited.
script.painless.regex.limit-factor (Статическая, целое число): Применяется только если script.painless.regex.enabled установлено в limited. Ограничивает количество символов, которые может содержать регулярное выражение в скрипте Painless. Лимит символов рассчитывается путем умножения количества символов во входных данных скрипта на script.painless.regex.limit-factor. По умолчанию составляет 6 (таким образом, если входные данные содержат 5 символов, максимальное количество символов в регулярном выражении составляет 5 · 6 = 30).
3.8.2.3.7 - Настройка кластера
Следующие настройки относятся к кластеру OpenSearch.
Чтобы узнать больше о статических и динамических настройках, смотрите раздел Настройка OpenSearch.
Настройки маршрутизации и распределения на уровне кластера
OpenSearch поддерживает следующие настройки маршрутизации на уровне кластера и распределения шардов:
Используется для установки значений cluster.routing.allocation.node_concurrent_incoming_recoveries и cluster.routing.allocation.node_concurrent_outgoing_recoveries на одно и то же значение.
При установке в true OpenSearch пытается равномерно распределить первичные шары между узлами кластера. Включение этой настройки не всегда гарантирует равное количество первичных шардов на каждом узле, особенно в случае сбоя. Изменение этой настройки на false после установки в true не вызывает перераспределение первичных шардов. По умолчанию установлено значение false.
При установке в true OpenSearch пытается перераспределить первичные шары между узлами кластера. При включении кластер пытается поддерживать количество первичных шардов на каждом узле, с максимальным буфером, определенным настройкой cluster.routing.allocation.rebalance.primary.buffer. Изменение этой настройки на false после установки в true не вызывает перераспределение первичных шардов. По умолчанию установлено значение false.
cluster.routing.allocation.rebalance.primary.buffer (Динамическая, число с плавающей точкой)
Определяет максимальный допустимый буфер первичных шардов между узлами, когда включена настройка cluster.routing.allocation.rebalance.primary.enable. По умолчанию установлено значение 0.1.
При установке в false отключает решение о распределении по диску. Это также удалит любые существующие блокировки индекса index.blocks.read_only_allow_delete, когда отключено. По умолчанию установлено значение true.
Контролирует низкий водяной знак для использования дискового пространства. При установке в процентном соотношении OpenSearch не будет распределять шары на узлы с указанным процентом использования диска. Это также можно указать в виде дробного значения, например, 0.85. Наконец, это можно установить в байтовом значении, например, 400mb. Эта настройка не влияет на первичные шары новых индексов, но предотвратит распределение их реплик. По умолчанию установлено значение 85%.
Контролирует высокий водяной знак. OpenSearch попытается переместить шары с узла, использование диска на котором превышает установленный процент. Это также можно указать в виде дробного значения, например, 0.85. Наконец, это можно установить в байтовом значении, например, 400mb. Эта настройка влияет на распределение всех шардов. По умолчанию установлено значение 90%.
Контролирует водяной знак на уровне затопления. Это последний шаг для предотвращения исчерпания дискового пространства на узлах. OpenSearch применяет блокировку индекса только для чтения (index.blocks.read_only_allow_delete) ко всем индексам, на которых есть один или несколько шардов, распределенных на узле, и хотя бы один диск превышает уровень затопления. Блокировка индекса снимается, как только использование диска падает ниже высокого водяного знака. Это также можно указать в виде дробного значения, например, 0.85. Наконец, это можно установить в байтовом значении, например, 400mb. По умолчанию установлено значение 95%.
cluster.info.update.interval (Динамическая, единица времени)
Устанавливает, как часто OpenSearch должен проверять использование диска для каждого узла в кластере. По умолчанию установлено значение 30s.
Не распределяет шары на узел, атрибут которого содержит любое из включенных значений, разделенных запятыми. Настройки распределения кластера поддерживают следующие встроенные атрибуты.
Допустимые значения:
_name – Совпадение узлов по имени узла.
_host_ip – Совпадение узлов по IP-адресу хоста.
_publish_ip – Совпадение узлов по публикуемому IP-адресу.
Определяет порядок, в котором шары перемещаются с исходящих узлов на входящие.
Эта настройка поддерживает следующие стратегии:
PRIMARY_FIRST – Первичные шары перемещаются первыми, перед репликами. Эта приоритизация может помочь предотвратить переход состояния здоровья кластера в красный, если узлы, на которые перемещаются шары, выйдут из строя в процессе.
REPLICA_FIRST – Репликационные шары перемещаются первыми, перед первичными. Эта приоритизация может помочь предотвратить переход состояния здоровья кластера в красный при выполнении перемещения шардов в кластере OpenSearch с смешанными версиями и включенной репликацией сегментов. В этой ситуации первичные шары, перемещенные на узлы OpenSearch более новой версии, могут попытаться скопировать файлы сегментов на репликационные шары более старой версии OpenSearch, что приведет к сбою шардов. Перемещение репликационных шардов первыми может помочь избежать этого в кластерах с несколькими версиями.
NO_PREFERENCE – Поведение по умолчанию, при котором порядок перемещения шардов не имеет значения.
Контролирует, как маршрутизируются поисковые запросы, когда для индекса существуют репликационные шары, например, когда index.number_of_search_replicas больше 0. Эта настройка применяется только в случае, если для индекса настроены поисковые реплики. При установке в true все поисковые запросы для таких индексов маршрутизируются только на репликационные шары. Если репликационные шары не назначены, запросы завершаются неудачей. При установке в false, если репликационные шары не назначены, запросы возвращаются к любому доступному шару. По умолчанию установлено значение true.
Ограничивает количество шардов, отправляемых на узлы данных в одной партии для получения метаданных любых нераспределенных шардов. По умолчанию установлено значение 2000.
Включает пакетное распределение нераспределенных шардов, которые уже существуют на диске, вместо распределения одного шара за раз. Это снижает нагрузку на память и транспорт, получая метаданные любых нераспределенных шардов в пакетном вызове. По умолчанию установлено значение false.
Максимальное общее количество первичных и репликационных шардов, которые могут быть распределены на один узел. По умолчанию установлено значение -1 (без ограничений). Помогает равномерно распределять шары по узлам, ограничивая общее количество шардов на узел. Используйте с осторожностью, так как шары могут оставаться нераспределенными, если узлы достигнут своих настроенных лимитов.
Максимальное количество первичных шардов, которые могут быть распределены на один узел. Эта настройка применима только для кластеров с удаленной поддержкой. По умолчанию установлено значение -1 (без ограничений). Помогает равномерно распределять первичные шары по узлам, ограничивая количество первичных шардов на узел. Используйте с осторожностью, так как первичные шары могут оставаться нераспределенными, если узлы достигнут своих настроенных лимитов.
Настройки шардов, блокировок и задач на уровне кластера
OpenSearch поддерживает следующие настройки шардов, блокировок и задач на уровне кластера:
action.search.shard_count.limit (Целое число)
Ограничивает максимальное количество шардов, которые могут быть задействованы во время поиска. Запросы, превышающие этот лимит, будут отклонены.
cluster.blocks.read_only (Логическое)
Устанавливает весь кластер в режим только для чтения. По умолчанию установлено значение false.
Похоже на cluster.blocks.read_only, но позволяет удалять индексы.
cluster.max_shards_per_node (Целое число)
Ограничивает общее количество первичных и репликационных шардов для кластера. Лимит рассчитывается следующим образом: cluster.max_shards_per_node умножается на количество не замороженных узлов данных. Шары для закрытых индексов не учитываются в этом лимите. По умолчанию установлено значение 1000.
Менеджер кластера автоматически проверяет, нужно ли назначать постоянные задачи, когда состояние кластера изменяется значительным образом. Существуют и другие факторы, такие как использование памяти, которые повлияют на то, будут ли постоянные задачи назначены на узлы, но не вызывают изменения состояния кластера. Эта настройка определяет, как часто выполняются проверки назначения в ответ на эти факторы. По умолчанию установлено значение 30 секунд, при этом минимальное значение составляет 10 секунд.
Количество времени, в течение которого узел ждет ответа от избранного менеджера кластера во время проверки лидера, прежде чем считать проверку неудачной. Допустимые значения от 1ms до 60s, включая. По умолчанию установлено значение 10s. Изменение этой настройки на значение, отличное от значения по умолчанию, может привести к нестабильности кластера.
Количество времени, в течение которого избранный менеджер кластера ждет ответа во время проверки последователя, прежде чем считать проверку неудачной. Допустимые значения от 1ms до 60s, включая. По умолчанию установлено значение 10s. Изменение этой настройки на значение, отличное от значения по умолчанию, может привести к нестабильности кластера.
Количество времени, в течение которого избранный менеджер кластера ждет между отправкой проверок последователей другим узлам в кластере. Допустимые значения 100ms и выше. По умолчанию установлено значение 1000ms. Изменение этой настройки на значение, отличное от значения по умолчанию, может привести к нестабильности кластера.
cluster.follower_lag.timeout (Единица времени)
Количество времени, в течение которого избранный менеджер кластера ждет получения подтверждений обновлений состояния кластера от отстающих узлов. По умолчанию установлено значение 90s. Если узел не успешно применяет обновление состояния кластера в течение этого времени, он считается неудавшимся и удаляется из кластера.
cluster.publish.timeout (Единица времени)
Количество времени, в течение которого менеджер кластера ждет, пока каждое обновление состояния кластера будет полностью опубликовано на всех узлах, если только discovery.type не установлен на single-node. По умолчанию установлено значение 30s.
Настройки пределов ответов CAT на уровне кластера
OpenSearch поддерживает следующие настройки пределов ответов CAT API на уровне кластера, все из которых являются динамическими:
Устанавливает предел на количество индексов, возвращаемых API CAT Indices. Значение по умолчанию -1 (без ограничений). Если количество индексов в ответе превышает этот предел, API возвращает ошибку 429. Чтобы избежать этого, вы можете указать фильтр по шаблону индекса в вашем запросе (например, _cat/indices/<index-pattern>).
Устанавливает предел на количество шардов, возвращаемых API CAT Shards. Значение по умолчанию -1 (без ограничений). Если количество шардов в ответе превышает этот предел, API возвращает ошибку 429. Чтобы избежать этого, вы можете указать фильтр по шаблону индекса в вашем запросе (например, _cat/shards/<index-pattern>).
Устанавливает предел на количество индексов, возвращаемых API CAT Segments. Значение по умолчанию -1 (без ограничений). Если количество индексов в ответе превышает этот предел, API возвращает ошибку 429. Чтобы избежать этого, вы можете указать фильтр по шаблону индекса в вашем запросе (например, _cat/segments/<index-pattern>).
3.8.2.3.8 - Настройка индекса
Настройки индекса могут быть двух типов: настройки уровня кластера, которые влияют на все индексы в кластере, и настройки уровня индекса, которые влияют на отдельные индексы.
Статические настройки индекса уровня кластера — это настройки, которые нельзя обновить, пока кластер работает. Чтобы обновить статическую настройку, необходимо остановить кластер, обновить настройку, а затем перезапустить кластер.
Динамические настройки индекса уровня кластера — это настройки, которые можно обновлять в любое время.
Статические настройки индекса уровня кластера
OpenSearch поддерживает следующие статические настройки индекса уровня кластера:
indices.cache.cleanup_interval (Единица времени): Запланирует периодическую фоновую задачу, которая очищает истекшие записи из кэша с указанным интервалом. По умолчанию 1m (1 минута). Для получения дополнительной информации смотрите Кэш запросов индекса.
indices.requests.cache.size (Строка): Размер кэша в процентах от размера кучи (например, чтобы использовать 1% кучи, укажите 1%). По умолчанию 1%. Для получения дополнительной информации смотрите Кэш запросов индекса.
Динамические настройки индекса уровня кластера
OpenSearch поддерживает следующие динамические настройки индекса уровня кластера:
action.auto_create_index (Булевый): Автоматически создает индекс, если индекс еще не существует. Также применяет любые конфигурации шаблонов индексов. По умолчанию true.
indices.recovery.max_concurrent_file_chunks (Целое число): Количество частей файлов, отправляемых параллельно для каждой операции восстановления. По умолчанию 2.
indices.recovery.max_concurrent_operations (Целое число): Количество операций, отправляемых параллельно для каждого восстановления. По умолчанию 1.
indices.recovery.max_concurrent_remote_store_streams (Целое число): Количество потоков к удаленному репозиторию, которые могут быть открыты параллельно при восстановлении индекса из удаленного хранилища. По умолчанию 20.
indices.replication.max_bytes_per_sec (Строка): Ограничивает общий входящий и исходящий трафик репликации для каждого узла. Если значение не указано в конфигурации, используется настройка indices.recovery.max_bytes_per_sec, по умолчанию равная 40 МБ. Если вы установите значение трафика репликации меньше или равным 0 МБ, ограничение скорости будет отключено, что приведет к передаче данных репликации с максимальной возможной скоростью.
indices.fielddata.cache.size (Строка): Максимальный размер кэша данных полей. Может быть указан как абсолютное значение (например, 8 ГБ) или процент от кучи узла (например, 50%). Это значение статическое, поэтому его необходимо указать в файле opensearch.yml. Если вы не укажете эту настройку, максимальный размер будет неограниченным. Это значение должно быть меньше, чем indices.breaker.fielddata.limit. Для получения дополнительной информации смотрите Систему защиты от переполнения кэша данных полей.
indices.query.bool.max_clause_count (Целое число): Определяет максимальное произведение полей и терминов, которые могут быть запрошены одновременно. До версии OpenSearch 2.16 для применения этой статической настройки требовалась перезагрузка кластера. Теперь она динамическая, существующие пулы потоков поиска могут использовать старое статическое значение, что может привести к исключениям TooManyClauses. Новые пулы потоков используют обновленное значение. По умолчанию 1024.
cluster.remote_store.index.path.type (Строка): Стратегия пути для данных, хранящихся в удаленном хранилище. Эта настройка эффективна только для кластеров с включенным удаленным хранилищем. Эта настройка поддерживает следующие значения:
fixed: Хранит данные в структуре пути <repository_base_path>/<index_uuid>/<shard_id>/.
hashed_prefix: Хранит данные в структуре пути hash(<shard-data-identifier>)/<repository_base_path>/<index_uuid>/<shard_id>/.
hashed_infix: Хранит данные в структуре пути <repository_base_path>/hash(<shard-data-identifier>)/<index_uuid>/<shard_id>/. shard-data-identifier характеризуется index_uuid, shard_id, типом данных (translog, segments) и типом данных (data, metadata, lock_files). По умолчанию fixed.
cluster.remote_store.index.path.hash_algorithm (Строка): Хеш-функция, используемая для получения хеш-значения, когда cluster.remote_store.index.path.type установлено на hashed_prefix или hashed_infix. Эта настройка эффективна только для кластеров с включенным удаленным хранилищем. Эта настройка поддерживает следующие значения:
fnv_1a_base64: Использует хеш-функцию FNV1a и генерирует безопасное для URL 20-битное хеш-значение в формате base64.
fnv_1a_composite_1: Использует хеш-функцию FNV1a и генерирует пользовательское закодированное хеш-значение, которое хорошо масштабируется с большинством опций удаленного хранилища. Функция FNV1a генерирует 64-битное значение. Пользовательское кодирование использует 6 старших бит для создания безопасного для URL символа base64 и следующие 14 бит для создания двоичной строки. По умолчанию fnv_1a_composite_1.
cluster.remote_store.translog.transfer_timeout (Единица времени): Управляет значением таймаута при загрузке файлов translog и контрольных точек во время синхронизации с удаленным хранилищем. Эта настройка применяется только для кластеров с включенным удаленным хранилищем. По умолчанию 30 секунд.
cluster.remote_store.index.segment_metadata.retention.max_count (Целое число): Управляет минимальным количеством файлов метаданных, которые необходимо сохранить в репозитории сегментов на удаленном хранилище. Значение ниже 1 отключает удаление устаревших файлов метаданных сегментов. По умолчанию 10.
cluster.remote_store.segment.transfer_timeout (Единица времени): Управляет максимальным временем ожидания обновления всех новых сегментов после обновления в удаленное хранилище. Если загрузка не завершится в течение указанного времени, будет выброшено исключение SegmentUploadFailedException. По умолчанию 30 минут. Минимальное ограничение составляет 10 минут.
cluster.remote_store.translog.path.prefix (Строка): Управляет фиксированным префиксом пути для данных translog на кластере с включенным удаленным хранилищем. Эта настройка применяется только в том случае, если настройка cluster.remote_store.index.path.type установлена на HASHED_PREFIX или HASHED_INFIX. По умолчанию пустая строка, “”.
cluster.remote_store.segments.path.prefix (Строка): Управляет фиксированным префиксом пути для данных сегментов на кластере с включенным удаленным хранилищем. Эта настройка применяется только в том случае, если настройка cluster.remote_store.index.path.type установлена на HASHED_PREFIX или HASHED_INFIX. По умолчанию пустая строка, “”.
cluster.snapshot.shard.path.prefix (Строка): Управляет фиксированным префиксом пути для блобов уровня сегмента снимка. Эта настройка применяется только в том случае, если настройка repository.shard_path_type установлена на HASHED_PREFIX или HASHED_INFIX. По умолчанию пустая строка, “”.
cluster.default_number_of_replicas (Целое число): Управляет значением по умолчанию для количества реплик индексов в кластере. Настройка уровня индекса index.number_of_replicas по умолчанию принимает это значение, если не настроена. По умолчанию 1.
cluster.thread_pool.<fixed-threadpool>.size (Целое число): Управляет размерами как фиксированных, так и изменяемых очередей пулов потоков. Переопределяет значения по умолчанию, указанные в opensearch.yml.
cluster.thread_pool.<scaling-threadpool>.max (Целое число): Устанавливает максимальный размер пула потоков с изменяемым размером. Переопределяет значение по умолчанию, указанное в opensearch.yml.
cluster.thread_pool.<scaling-threadpool>.core (Целое число): Указывает базовый размер пула потоков с изменяемым размером. Переопределяет значение по умолчанию, указанное в opensearch.yml.
Прежде чем настраивать параметры пула потоков динамически, обратите внимание, что это настройки для экспертов, которые могут потенциально дестабилизировать ваш кластер. Изменение настроек пула потоков применяет один и тот же размер пула потоков ко всем узлам, поэтому это не рекомендуется для кластеров с различным оборудованием для одних и тех же ролей. Аналогично, избегайте настройки пулов потоков, которые используются как узлами данных, так и узлами управления кластером. После внесения этих изменений рекомендуется следить за вашим кластером, чтобы убедиться, что он остается стабильным и работает как ожидается.
Настройки индекса уровня индекса
Вы можете указать настройки индекса при создании индекса. Существует два типа настроек индекса:
Статические настройки индекса уровня индекса — это настройки, которые нельзя обновить, пока индекс открыт. Чтобы обновить статическую настройку, необходимо закрыть индекс, обновить настройку, а затем снова открыть индекс.
Динамические настройки индекса уровня индекса — это настройки, которые можно обновлять в любое время.
Указание настройки при создании индекса
При создании индекса вы можете указать его статические или динамические настройки следующим образом:
OpenSearch поддерживает следующие статические настройки индекса уровня индекса:
index.number_of_shards (Целое число): Количество первичных шардов в индексе. По умолчанию 1.
index.number_of_routing_shards (Целое число): Количество шардов маршрутизации, используемых для разделения индекса.
index.shard.check_on_startup (Булевый): Указывает, следует ли проверять шардов индекса на наличие повреждений. Доступные опции:
false (не проверять на повреждения),
checksum (проверять на физические повреждения),
true (проверять как на физические, так и на логические повреждения).
По умолчанию false.
index.codec (Строка): Определяет, как сжимаются и хранятся на диске сохраненные поля индекса. Эта настройка влияет на размер шардов индекса и производительность операций индексации.
Допустимые значения:
default
best_compression
zstd (OpenSearch 2.9 и позже)
zstd_no_dict (OpenSearch 2.9 и позже)
qat_lz4 (OpenSearch 2.14 и позже, на поддерживаемых системах)
qat_deflate (OpenSearch 2.14 и позже, на поддерживаемых системах)
Для zstd, zstd_no_dict, qat_lz4 и qat_deflate вы можете указать ур