LINUX.ORG.RU

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

 , , , ,


11

8

Простейшая шапка для документа, ориентированного на русскую типографику. Проверено на дистрибутиве 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)

Кто-нибудь может сказать зачем нужен lualatex?

P.S. Лет 7 пользуюсь обычным latex’ом (в основном pdflatex) и меня почти все устраивает

rOgret
()

Если ты не собираешься использовать математические шрифты, отличные от CM, то unicode-math не нужен. Более того, в Latin Modern (шрифт по умолчанию для unicode-math) масса багов, портящих набор математики, так что умолчальный unicode-math скорее вреден. Хотя концептуально хорош.

TeopeTuK ★★★★★
()

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

Спасибо, почитаем!

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

Лично мне unicode-math не нужен, поэтому не совсем понимаю что именно такого с юникодом в lualatex есть.

rOgret
()
Ответ на: комментарий от rOgret
  • Поддержка системных шрифтов по имени, а не только идущих с дистрибутивом.
  • Отсутствие ограничений на число глифов в шрифте.
  • Поддержка Unicode, то есть при переходе на другой язык нет необходимости явно переключать его.
  • В случае lualatex поддержка lua и развитие pdflatex (то есть поддержка микротипографики)

И да, если пользуешься latex, то транслятором является pdflatex уже лет наверное 15+ как.

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

Чем XeLaTeX. КО

Более активно развивается, лучше поддерживает микротипографику, является развитием pdflatex.

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

Использовать старые добрые математические шрифты без unicode-math. По качеству они все ещё лучше всех, пожалуй. Хотя мне не нравятся, я где могу, использую STIX Two Math вместе с unicode-math, хоть он и похуже местами в части всяких пробелов или позиционирования акцентов или индексов/пределов интегрирования.

TeopeTuK ★★★★★
()

а с \today как? Я попытался тут перелезть с xelatex и наткнулся \today хочет t2a, t2a конфликтует с lualatex, что то там со шрифтами.

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

До машины с TeX Live 2025 смогу добраться только в понедельник. С этой шапкой тоже не работает?

По идее все проблемы с шрифтами должен решать пакет newcomputermodern.

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

Именно с таким непробывал, в понедельник попробую.\today его надо, именно на что то менять, он прибит гвоздями к t2a, вот я и спросил, а вдруг знаешь? т.е его поведение без t2a он выдает начала эпохи, а с t2a не компилируется, потому как у lulatex какие притензии к размеру русских шрифтов

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

Не очень понял что ты хочешь от today. Если тебе нужен вывод в каком-то специальном формате, то лучше использовать специализированные пакеты (что-то вроде datetime было). Хаки (по примеру misccorr) действительно могут поломаться.

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

да все просто, документ написан \today, или \bibitem url -… проверено \today - это довольно древний метод, работал и с pdflatex и с xelatex. Тут на работе документацию писать надо, а так как это процесс не спешный, вот я и решил попробовать переползти на что то новое, а с наскока не вышло, пришлось, откатится на свой конфиг 15 летней давности,

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

Если pdflatex устраивает, то особых причин менять его не стоит. Тем более он объективно быстрее. lualatex IMHO показан только для новых проектов если хочется чего-то отличного от Computer Modern, да и то нужно понимать что делается.

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

в моем случае да, я как цирковая обезьянка, заучил пяток трюков по latex, и раз в несколько лет пытаюсь их использовать

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

\today не прибит ничем к t2a в достаточно современных латехах. С авторской преамбулой в посте \today вполне работает. Покажи, как ты его используешь, что в lualatex не работает.

TeopeTuK ★★★★★
()

Поправлюсь: при применении unicode-math пакет newcomputermodern к счастью замещает шрифт Latin Modern Math своим шрифтом NewComputerModernMath, который более качественный. Багтрекера у него я, увы, не нашел. Так что может и unicode-math можно использовать. И пользоваться его преимуществами.

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

в понедельник попробую перенести то что написано у тс, там и посмотрим, в текущей реализации без t2a выдает \today выдает 1 января 1980, а с t2a компилируется только pdflatex и xelatex

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

вот смотри

\documentclass[a4paper,12pt]{report}
\usepackage[utf8]{inputenc}
\usepackage[russian]{babel}
\usepackage{geometry}
\usepackage{graphicx}
\usepackage{hyperref}
\usepackage{xcolor}
\usepackage{listings}
\usepackage{titlesec}

% Настройки документа
\geometry{left=3cm, right=2cm, top=2cm, bottom=2cm}
\hypersetup{
    colorlinks=true,
    linkcolor=blue,
    filecolor=magenta,      
    urlcolor=cyan,
    pdftitle={Руководство по виртуализации},
}

% Настройка стилей разделов
\titleformat{\chapter}[display]
{\normalfont\huge\bfseries}{\chaptertitlename\ \thechapter}{20pt}{\Huge}
\titleformat{\section}{\normalfont\Large\bfseries}{\thesection}{1em}{}

% Настройка листингов
\lstset{
    basicstyle=\ttfamily\small,
    breaklines=true,
    frame=single,
    numbers=left,
    numberstyle=\tiny\color{gray},
    captionpos=b,
    abovecaptionskip=10pt,
    belowcaptionskip=10pt
}

\begin{document}

% Титульная страница
\begin{titlepage}
    \centering
    {\scshape\Large Полное руководство по\\ виртуализации на Linux\par}
    \vspace{2cm}
    {\huge\bfseries KVM, QEMU и libvirt\par}
    \vspace{3cm}
    {\Large Версия 1.0\par}
    \vfill
    {\large \today\par}
\end{titlepage}

% Оглавление
\tableofcontents

% Введение
\chapter*{Введение}

% Литература
\begin{thebibliography}{9}
\addcontentsline{toc}{chapter}{Литература}
\bibitem{libvirt} Официальная документация libvirt: \url{https://libvirt.org/docs.html}
\bibitem{qemu} QEMU documentation: \url{https://www.qemu.org/docs/master/}
\end{thebibliography}

\end{document}

при добавление \usepackage[T2A]{fontenc}

ERROR: Font \T2A/cmr/m/n/12=larm1200 at 12pt not loadable: metric data not found or bad.

--- TeX said ---
<to be read again> 
                   relax 
l.116 ...\familydefault\seriesdefault\shapedefault

но при этом стоит скомпилировать через xetex и все нормально и компилирует и дату показывает.

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

Убрал \usepackage[utf8]{inputenc}, добавил из преамбулы топика \usepackage[regular]{newcomputermodern}, все скомпилировалось (lualatex из TeXLive 2024.20250309-1 из Debian 13/trixie), дата сегодняшняя.

TeopeTuK ★★★★★
()

Я на lualatex переехал года три назад. И ни разу не пожалел. Да, сборка документа занимает чуть более длительное время, чем при использовании классики в виде pdflatex, но результат того стоит. ttf и unicode значительно расширяют возможности, позволяют создавать действительно визуально красивые документы. А вот KOMA-script всё никак не осилю. Юзаю старый-добрый extarticle.

Спасибо @Evgueni и @TeopeTuK за придания бодрости TeX-теме )))

P.S. @TeopeTuK сырцы б документика глянуть. Уж больно симпотишный

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

Проверил с представленной в статье шапкой. \today{} выдал локализованный результат с сегодняшней датой (25 августа 2025 г.), то есть то, что от него и ожидается.

Evgueni ★★★★★
() автор топика

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

Нужно кому-нибудь?

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

опыты показали у меня что то с luatex, им твоя шапка + \today - начало эпохи, xetex - все нормально, не знаю что за хрень. Почитаю тот документик,что ты выложил, на досуге, и переделаю свою преамбулу, но видимо останусь на xetex

Silerus ★★★★
()

Добавил ещё немного информации, чтобы закрыть тему. Какие у кого идеи/предложения есть?

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

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

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

Ничего особо осиливать в KOMA-script не нужно. Умолчание там уже более правильные, чем то, что уже прибито гвоздями в классическом article. Замены класса на extartcle на scrartcl в первом приближении достаточно.

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

У меня скорее не предложения вопросы, а поддерживает ли luatex пакет multimedia? Поддерживает ли luatex разбиение ячеек таблицы между страницами?

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

Понятия не имею. Но, если pdftex поддерживает, то и luatex по идее должен.

Проблемы могут быть у пакетов, которые считают, что одна буква — это один байт. Например, у listings, но и там есть сторонние костыли для работы с unicode.

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

Почитал по теме и возник вопрос, а какой программой просмотра предполагается пользоваться при просмотре этой самой мультимедиа?

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

Ты расскажи подробнее, что у тебя за латех, как компилирует, что получилось при замене, которую я предложил в предыдущем сообщении. Лог покажи. Попробуем помочь починить.

TeopeTuK ★★★★★
()

lualatex значительно медленнее pdflatex

Я ничего не знаю про latex не знаю, кроме того что на ЛОРе от него писают кипятком, но чисто из интереса в области луашных тормозов, в каких случаях медленнее? Можно ли какой-то пример/ры реальные, где прям затупы и бесит? Я бы может быть попробовал поковырять, найти проблемные места (вдруг они там явные и неприкрытые, а может сложные дела там) и попытался это дело оптимизировать, может быть хотя бы частично.

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

Там, если я правильно понял, проблема в загрузке шрифтов, которая и должна быть более долгой, так OpenType (luatex) гораздо сложнее и развесистие, чем Type1 (pdflatex). Так что вряд ли дело в lua, который идёт скорее как фича.

Но постараюсь посмотреть с этой стороны, чтобы выделить проблему.

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

а тут как с нисаном. я на nixos подсел, ну и латех у меня в flake

{
  description = "Flake for work with latex";
  inputs = {
    nixpkgs.url = "github:nixos/nixpkgs?ref=nixos-unstable";
    flake-utils.url = "github:numtide/flake-utils";
  };
  outputs =
    {
      self,
      nixpkgs,
      flake-utils,
    }:
    flake-utils.lib.eachDefaultSystem (
      system:
      let
        pkgs = import nixpkgs {
          inherit system;
          config.allowUnfree = true;
        };
        # TeXLive configuration with Russian language support
        texlive = pkgs.texlive.combine {
          inherit (pkgs.texlive)
            scheme-medium
            latexmk
            collection-langcyrillic
            polyglossia
            cm-super
            lh
            babel-russian
            hyphen-russian
            fontspec
            collection-latex
            collection-latexrecommended
            collection-latexextra
            collection-fontsrecommended
            newcomputermodern
            luatex
            luatextra
            luatexbase
            collection-luatex
            ;
        };
      in
      {
        devShells.default = pkgs.mkShell {
          buildInputs = with pkgs; [
            texlive
            corefonts
            liberation_ttf
            fontconfig
            newcomputermodern
			lua
          ];
          shellHook = ''
            export PATH="${texlive}/bin:$PATH"
            export FONTCONFIG_FILE=${pkgs.fontconfig.out}/etc/fonts/fonts.conf
            fc-cache -f
                      		  '';
        };
      }
    );
}

И честно говоря ничего он не выдает, компилируется как положено только дата не та, из ворнингов только вот это

LaTeX Font Warning: Font shape `OML/lmr/m/up' undefined
LaTeX Font Warning: Font shape `OMS/lmr/m/up' undefined  
LaTeX Font Warning: Font shape `TS1/lmr/m/up' undefined

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

Ну вот lualatex и использует ее значение в качестве timestamp для установки даты. Сделано это для воспроизводимости сборки. Удали переменную, и lualatex будет текущую дату выводить…

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

да только что удалил и все хорошо стало, как поправить flake теперь понятно, спасибо

Silerus ★★★★
()

Оказалось, что непосредственно в LuaTeX так же встроили MPlib, то есть можно использовать MataPost не выходя за пределы TeX-файла для рисования картинок: MetaPost на новый лад

Evgueni ★★★★★
() автор топика

Было бы крайне полезно, если pandrey подсказал бы как делать правильно в разрезе шрифтов.

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

Благодарю, давно желал поковыряться. Нашёл много интересных фишек. Единственный момент – у меня исходный код в tcolorbox центрируется, и повлиять на этот никак не получается.

arbyz
()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.