Как сократить повторяющийся код LaTeX: команды, окружения и подключаемые файлы
Сократить повторяющийся LaTeX можно тремя способами: командами для повторного оформления, окружениями для повторяющихся структур и \input для общих файлов. Начните с действительно одинакового материала, который, вероятно, будет меняться вместе; не всякий повтор требует абстракции.
Повторяющееся оформление: определите команду
Полный пример определяет \vect, \code и \R один раз, затем использует их повторно. Компилируйте XeLaTeX:
\documentclass[11pt]{article}\usepackage{fontspec}\setmainfont{CMU Serif}\setmonofont{CMU Typewriter Text}\usepackage[russian]{babel}\usepackage{amsmath,amssymb}\newcommand{\vect}[1]{\boldsymbol{#1}}\newcommand{\code}[1]{\texttt{#1}}\newcommand{\R}{\mathbb{R}}\begin{document}Для $\vect{x}\in\R^d$ откройте \code{main.tex}.\end{document}Определения в преамбуле доступны во всём основном тексте; определение в тексте доступно лишь после выполнения и в своей области действия. При конфликте имён возможно Command \R already defined. Переименуйте команду, используйте \renewcommand для намеренного переопределения или \providecommand, когда нужно резервное определение.
\newcommand поддерживает до девяти параметров. Даже четыре-пять могут сделать вызовы непонятными без обращения к определению.
Повторяющиеся структуры: определите окружение
Таблицы одинаковой структуры могут использовать общее окружение. Здесь resulttable принимает спецификацию столбцов и строку заголовка:
\documentclass[11pt]{article}\usepackage{fontspec}\setmainfont{CMU Serif}\usepackage[russian]{babel}\usepackage{booktabs}\newenvironment{resulttable}[2]{% \begin{table}[htbp]\centering \begin{tabular}{#1}\toprule #2\\\midrule}{% \bottomrule\end{tabular} \end{table}}\begin{document}\begin{resulttable}{lcc}{Модель & Точность & F1}Базовая & 0.812 & 0.794 \\Наша & 0.867 & 0.851 \\\end{resulttable}\end{document}Каждая таблица задаёт строки данных, а окружение — линии, столбцы и размещение плавающего объекта. Ошибка внутри определения может быть показана в месте раскрытия или использования. Проверьте определение с одним минимальным вызовом, чтобы локализовать проблему.
Общие определения: вынесите их в файл
Вместо копирования одинаковой преамбулы в несколько файлов используйте \input.
preamble.tex:
\usepackage{amsmath,amssymb}\newcommand{\vect}[1]{\boldsymbol{#1}}main.tex:
\documentclass{article}\input{preamble}\begin{document}$\vect{x}$\end{document}В этом примере main.tex находится в корне проекта. Пути подключений разрешаются относительно рабочего каталога компиляции, а не главы, содержащей \input. Если компиляция запускается из корня, для соседнего файла в chapters/intro.tex используйте \input{chapters/intro2}.
\include подходит для самостоятельных глав: вставляет разрывы страниц и создаёт отдельные вспомогательные файлы. \includeonly позволяет ограничивать предварительный просмотр, но ссылки на пропущенные главы зависят от вспомогательной информации. Для итоговой проверки всегда компилируйте проект целиком. Вкладывать \include нельзя.
Решите, оправдана ли абстракция
Проверьте три условия: фрагмент повторяется несколько раз, действительно одинаков, а не просто похож, и, вероятно, будет изменяться одновременно во всех местах. Это практические ориентиры, а не жёсткое числовое правило.
Абстракция для двух использований может создать лишние переходы по файлам. Немного отличающиеся фрагменты иногда требуют стольких переключателей, что вызов становится сложнее исходника.
Скомпилируйте и проверьте ключевые места
Убедитесь, что определения загружаются до основного текста, пути соответствуют структуре относительно корня, а формулы, таблицы и ссылки по-прежнему указывают на нужные объекты.
| Ошибка | Причина | Действие |
|---|---|---|
Command \foo already defined. | Имя уже существует | Переименуйте или намеренно переопределите |
Environment foo undefined. | Определение находится слишком поздно или не загружено | Перенесите его в преамбулу и проверьте \input |
File 'chapters/intro2.tex' not found. | Путь задан относительно главы, а не корня компиляции | Исправьте путь относительно проекта |
| Место в журнале не совпадает с видимым местом в исходнике | Ошибка возникает при раскрытии макроса или окружения | Проверьте только определение и минимальный вызов |
Главное
- Выносите повторяющееся оформление в команды, а повторяющиеся структуры — в окружения.
- Храните общие определения в подключаемых файлах, а границы глав — в основном файле.
- Вводите абстракции только ради удобства чтения и сопровождения.
Импортируйте весь каталог в EasyLaTeX и выберите main.tex точкой входа компиляции.