LINUX.ORG.RU

pdflatex → lualatex: почти бесшовный переход

 , , , ,


12

9

Простейшая шапка для документа, ориентированного на русскую типографику. Проверено на дистрибутиве TeX Live 2025. Кодировка по умолчанию юникодная.

%% -*- coding: utf-8; mode: latex; tex-engine: luatex; -*- Уголок емаксера
\documentclass[a4paper,12pt]{scrartcl} % Выбор класса (рекомендую KOMA-script)
\usepackage[warn]{mathtext} % Кириллица в формулах через \text{}
\usepackage[english,russian]{babel} % Переносы и другие языковые особенности
\usepackage{misccorr} % Локализация не вошедшая в babel. Надо загрузить _до_ unicode-math
\usepackage{amsmath} % Расширенная математика
\usepackage{unicode-math} % Улучшенная работа с математическими шрифтами 
\usepackage[regular]{newcomputermodern} % Шрифты Computer Modern
\usepackage{indentfirst} % Отступ для первого параграфа
\usepackage{microtype} % Микротипографика (висячая пунктуация точно работает)
\usepackage[unicode=true,colorlinks=true]{hyperref} % Гиперссылки
\usepackage{srcltx} % Обратный поиск
\usepackage{graphicx} % Вставка графики

Для правильного переноса матсимволов на следующую строку (в русской типографии при переносе символ дублируется) предлагается использовать следующий макрос, которым обкладывается этот символ (символ может быть составным) по месту:

%перенос формул в тексте
\newcommand*{\hm}[1]{#1\nobreak\discretionary{}%
   {\hbox{$\mathsurround=0pt #1$}}{}}
Пример использования: \(a+b\hm{\ne}c\) дублирует ≠ при переносе, если он приключится.

Замеченные потенциальные проблемы:

  • lualatex значительно медленнее pdflatex
  • Старые latex-пакеты могут интерферировать с unicode-math. В частности misccorr (стилевой файл 2004 года рождения из пакета t2) грузит amssymb, что входит в противоречие с unicode-math если unicode-math был загружен ранее. По хорошему его нужно переписать и всю функциональность запихать в babel/polyglossia
  • При составлении библиографии нужно сразу ориентироваться на biblatex/biber, так как у классического bibtex проблемы с сортировкой unicode
  • Для алфавитного указателя классический makeindex тоже не годится, поэтому сразу следует смотреть в сторону xindy или upmendex
  • Обилие доступных шрифтов может снести крышу у неискушённого пользователя и он поставит в качестве основного шрифта Comic Sans.

Можно указать свои шрифты. Например так подключаются свободные шрифты PT имеющие расширенную кириллицу и базовую латиницу (PT Sans, PT Serif, PT Mono):

\usepackage{fontspec} % Работа с OpenType шрифтами
\setmainfont{PT Serif}
\setsansfont{PT Sans}
\setmonofont{PT Mono}
Название конкретного шрифта следует посмотреть в программе просмотра системных шрифтов. В этом случае документ по идее лишается кроссплатформенности, так как с его исходниками нужно распространять и сами шрифты.

Смена математических шрифтов осуществляется так:

\setmathfont{STIX Two Math}
Без понимания, что именно вы делаете и зачем, это делать не рекомендуется. Шрифты по умолчанию Computer Modern по прежнему наиболее безпроблемны для целей набора.

✔ Полезный источник информации по теме: «LaTeX в 2025 году» от Сергея Головань (pdf, исходники).

Шрифты можно загрузить так же по имени файла. В этом случае они не обязаны быть установлены в качестве системных шрифтов, но должны находиться в пределах доступности luatex, например, в директории документа:

\setmainfont{OldStandard-Regular.ttf}
Гарнитуру Old Standard можно взять, например, здесь. Подробности по теме загрузки кастомных шрифтов расписаны в пользовательской документации пакета fontspec.

Комбинированный заголовок для pdflatex/lualatex если не понятно каким именно компилятором будет данный документ обрабатываться (полезно для темплейтов):

\documentclass[a4paper,12pt]{scrartcl}
\usepackage{iftex}
\ifpdftex % pdflatex begin
\usepackage[T2A]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{cmap}
\fi % pdflatex end
\usepackage[warn]{mathtext}
\usepackage[english,russian]{babel}
\usepackage{misccorr}
\usepackage{amsmath}
\ifluatex % lualatex begin
\usepackage{unicode-math}
\usepackage[regular]{newcomputermodern}
\fi % lualatex end
\usepackage{indentfirst}
\usepackage{microtype}
\usepackage[unicode=true,colorlinks=true]{hyperref}
\usepackage{srcltx}
\usepackage{graphicx}
Результаты компиляции будут различаться, так как microtype работает по разному, да и метрики шрифтов представленных в разных форматах (OpenType vs Type1) различаются.

Ещё хороших пакетов в нагрузку:

% Расцветка исходников
\usepackage{minted}
\usepackage[svgnames]{xcolor}
% MetaPost из коробки для LuaTeX
\usepackage{luamplib}

Для справки базовый заголовок для pdflatex:

\documentclass[a4paper,12pt]{scrartcl} 
\usepackage[warn]{mathtext}
\usepackage[T2A]{fontenc} % pdflatex
\usepackage[utf8]{inputenc} % pdflatex
\usepackage[english,russian]{babel}
\usepackage{indentfirst}
\usepackage{misccorr}
\usepackage{amsmath}
\usepackage{microtype}
\usepackage{cmap} % Чтобы можно было выделять и копировать кириллицу в pdf
\usepackage[unicode=true,colorlinks=true]{hyperref}
\usepackage{srcltx}
\usepackage{graphicx}

Вопрос: Почему LuaTeX, а не XeTeX?

Ответ: В ноябре 2024 года LuaTeX был рекомендован TeX-сообществу в качестве движка по умолчанию. Разработка XeTeX де факто заброшена в 2020 году.

★★★★★

Проверено: hobbit ()
Последнее исправление: Evgueni (всего исправлений: 61)
Ответ на: комментарий от TeopeTuK

В моем. Блок настроек tcolorbox полностью стянул у тебя. По другим настройкам ничего похожего и «давящего» на отображение box-ов я не нашёл

arbyz
()
Ответ на: комментарий от arbyz

Тогда отключай поочередно все подряд в преамбуле и смотри, что именно ломает ширину листинга. Даже если кажется, что ничего не должно интерферировать.

TeopeTuK ★★★★★
()
Ответ на: комментарий от TeopeTuK

Хм… Взял полностью твою преамбулу, закомментил только %\usepackage{dtk-logos} из-за отсутствия пакета. В теле документа оставил только

	\begin{figure}[tp]
		
	\begin{latexcode}
		\usepackage[english,russian]{babel}
		\end{latexcode}
        \caption{Подключение пакета babel в LuaLaTeX}\label{babel2}
	\end{figure}

результат - выравнивание по центру.

➜  ~ lualatex -v
This is LuaHBTeX, Version 1.22.0 (TeX Live 2025/Debian)
Development id: 7673

arbyz
()
18 октября 2025 г.

У меня почему-то с такой преамбулой не работают переносы, texlive из репозиториев арча.

Werenter ★★★
()
Ответ на: комментарий от TeopeTuK
\documentclass[a4paper,12pt]{article} % Выбор класса (рекомендую KOMA-script)
\usepackage[warn]{mathtext} % Кириллица в формулах через \text{}
\usepackage[russian,english]{babel} % Переносы и другие языковые особенности
\usepackage{misccorr} % Локализация не вошедшая в babel. Надо загрузить _до_ unicode-math
\usepackage{amsmath} % Расширенная математика
\usepackage{unicode-math} % Улучшенная работа с математическими шрифтами 
\usepackage[regular]{newcomputermodern} % Шрифты Computer Modern
\usepackage{indentfirst} % Отступ для первого параграфа
\usepackage{microtype} % Микротипографика (висячая пунктуация точно работает)
\usepackage[unicode=true,colorlinks=true]{hyperref} % Гиперссылки
\usepackage{srcltx} % Обратный поиск
\usepackage{graphicx} % Вставка графики
\usepackage[top=2cm,bottom=3cm,left=1.5cm,right=1.5cm]{geometry}
\usepackage{booktabs}
\usepackage{float}
\usepackage{tabularray}
\usepackage{pgf}

\begin{document}
В работе удалось произвести измерение скорости пули с точностью порядка 6\% на
вращающемся баллистическом маятнике.
\end{document}

Ну вот пример, слово «вращающемся» не переносится, происходит overfull hbox. Лог: https://pastebin.com/0YhGAieb

Это фрагмент, сам документ сильно больше, и в нём ни одного переноса, кроме проставленных вручную.

Werenter ★★★
()
Последнее исправление: Werenter (всего исправлений: 1)
Ответ на: комментарий от Werenter

Ну вот выдержка из твоего лога:

Package babel Warning: No hyphenation patterns were preloaded for
(babel)                the language 'Russian' into the format.
(babel)                Please, configure your TeX system to add them and
(babel)                rebuild the format. Now I will use the patterns
(babel)                preloaded for \language=0 instead on input line 32.

Что-то неправильно сконфигурировано. В Debian переносы автоматически конфигурируются при установке пакета texlive-lang-cyrillic, как там у вас в Arch, не знаю.

TeopeTuK ★★★★★
()
Ответ на: комментарий от Werenter

Вы будете смеяться, но последовательность языков в

\usepackage[russian,english]{babel}
имеет значение. По умолчанию включаются переносы только для последнего загруженного языка. Для того, чтобы включить переносы для альтернативы нужно явно переключить язык. Иными словами для русских текстов нужно:
\usepackage[english,russian]{babel}
Проверено на локально установленном TeX Live 2025 (с сайта,а не в рамках дистрибутива).

P.S. Варнинг про отсутствие загрузки русских переносов тоже выглядит подозрительным.

Evgueni ★★★★★
() автор топика
Последнее исправление: Evgueni (всего исправлений: 2)
Ответ на: комментарий от Evgueni

А я и не заметил, что порядок языков другой. Так-то переносы должны подключаться для нескольких языков сразу, они в формат включаются, а вот переключаются в коде они выбором языка, и последний в списке – язык по умолчанию (с особенностями, так как языки можно указать и в глобальных опциях).

TeopeTuK ★★★★★
()
Последнее исправление: TeopeTuK (всего исправлений: 1)
Ответ на: комментарий от TeopeTuK

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

По-моему я где-то видел решение, чтобы переносы включались и для русского и английского одновременно, но оно какое-то «наколенное» было.

Evgueni ★★★★★
() автор топика
Последнее исправление: Evgueni (всего исправлений: 1)
Ответ на: комментарий от Evgueni

Я не призываю включать переносы для нескольких языков одновременно. Текущее состояние (есть язык по умолчанию, другой язык и переносы задаются явно) вполне адекватное на мой взгляд. Кстати, для уменьшения неопределенности можно языки в преамбуле задавать так:

\usepackage[main=russian,english]{babel}

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

TeopeTuK ★★★★★
()
Ответ на: комментарий от TeopeTuK

Согласен. Так понятнее, хотя чуть и более многословнее.

Evgueni ★★★★★
() автор топика
Ответ на: комментарий от Evgueni

Сработала переустановка дистрибутивного пакета texlive-langcyrillic, после этого всё заработало.

Werenter ★★★
()
Ответ на: комментарий от einhander

Я тут почитал пару-тройку отзывов, чтобы понять стоит ли трогать polyglossia палочкой и пока ответ отрицательный. Иными словами babel развивается и поддерживается лучше polyglossia, так что никакого смысла в последнем нет.

Evgueni ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.