
LuaLaTeX не вставляет длинные тире, если вокруг тройного тире нет места. Работает нормально при использовании длинного тире Unicode или при явном использовании макроса \textemdash
.
Вот MWE:
\documentclass{article}
\begin{document}
\begin{enumerate}
\item en--dash
\item em---dash
\item em --- dash space
\end{enumerate}
\begin{enumerate}
\item en–dash unicode
\item em—dash unicode
\item em — dash space unicode
\end{enumerate}
\begin{enumerate}
\item en\textendash{}dash macro
\item em\textemdash{}dash macro
\item em \textemdash{} dash space macro
\end{enumerate}
\end{document}
Что производит:
Скомпилировано с использованием LuaTeX, версия 1.07.0 (TeX Live 2018)
Вопрос в том:
Я хотел бы узнать, почему лигатуры длинного тире без окружающих пробелов не отображаются как длинное тире в выходных данных PDF. Мне кажется, это ошибка. Как ее исправить?
решение1
Вы можете добавить \automatichyphenmode=1
в преамбулу:
\documentclass{article}
\automatichyphenmode=1
\begin{document}
\begin{enumerate}
\item en--dash
\item em---dash
\item em --- dash space
\end{enumerate}
\begin{enumerate}
\item en–dash unicode
\item em—dash unicode
\item em — dash space unicode
\end{enumerate}
\begin{enumerate}
\item en\textendash{}dash macro
\item em\textemdash{}dash macro
\item em \textemdash{} dash space macro
\end{enumerate}
\end{document}
решение2
Обновление 3/2019
Ошибка будет устранена в следующем обновлении luaotfload.
==============================================================
Немного расширим ответ Алана:
По-моему, это явная ошибка в загрузчике шрифтов, импортированном из контекста (то же самое вы увидите в контексте, если установите \automatichyphenmode=0
). Это происходит только в том случае, если шрифты отображаются с помощью mode=node
:
\documentclass{article}
\begin{document}
\font\test={file:lmroman10-regular.otf:mode=node;+tlig}
\test
A---B
\font\test={file:lmroman10-regular.otf:mode=base;+tlig}
\test
A---B
\end{document}
Источник проблемы, по моему скромному мнению, в том \automatichyphenmode=0
, что luatex сначала должен преобразовать последний дефис в дискреционный, чтобы разрешить перенос строки:
A---B ---> A--\discretionary{-}{}{-}B
и после того, как линия установлена, ее приходится снова преобразовывать в ---
, и этот шаг, похоже, не удается.
О проблеме сообщено, но пока неясно, будет ли она устранена.
\automatichyphenmode=1
избегает проблемы, не преобразуя дефис в дискреционный в ряде случаев. Поэтому вы должны знать о том, что это подавляет перенос строки в ряде случаев:
\documentclass[parskip=half-]{scrartcl}
\begin{document}
\parbox[t]{1pt}{%
\textbf{0}
\automatichyphenmode=0
A-B
A--B
A---B
-begin
A!-B}
\hspace{2cm}
\parbox[t]{1pt}{\automatichyphenmode=1
\textbf{1}
A-B
A--B
A---B
-begin
A!-B}
\end{document}