Несколько часов назад следующий код работал отлично (LuaLatex, TeXlive 2016 на Ubuntu):
\DeclareDocumentCommand \SetBaseFont { o m }
{ \__fontspec_pass_args:nnn \__fontspec_SetBaseFont:nn {#1} {#2} }
\cs_new:Nn \__fontspec_SetBaseFont:nn
{
\long\xdef\@basefontfeatures{#1}
\long\xdef\@basefontname{#2}
\global\@basefontsettrue
\ignorespaces
}
Теперь он не работает. За это время я только обновил texlive через tlmgr. Никаких изменений в моем собственном коде. Я заметил, что fontspec был среди обновленных пакетов.
Я сузил круг до строки с fontspec_pass_args
этим.
У кого-нибудь еще есть похожая проблема?
EDIT: Определенно изменение в коде fontspec (говорит этот скромный пользователь). Я отредактировал \__fontspec_pass_args:nnn
все, где это появлялось в моем собственном коде. Затем для моих определений шрифтов, в отличие от предыдущего, мне нужно было использовать скобки опций (даже когда не было необходимости в какой-либо функции): \SetBaseFont[]{Some Font}
и теперь мой код компилируется. К счастью, что бы ни делал проблемный код, это было не то, что мне было нужно. Обратите внимание, что я использовал похожий код для шрифтов с гораздо более простыми определениями, так что это не вопрос \long\xdef
или что-то в этом роде.
БОЛЬШЕ ИЗМЕНЕНИЙ:
В файле журнала (после того, как я скомпилировал свой код, отредактировав его, как описано выше) я вижу множество сообщений, которые выглядят следующим образом. Я не помню, чтобы видел их раньше, но, возможно, я просто не замечал. Поскольку это TU
относится к fontspec, вот пример. Проблема была фактически обнаружена microtype. Все шрифты, которые я использую, являются шрифтами Open Type:
Package microtype Warning: Unknown slot number of character
(microtype) `\textgreater '
(microtype) in font encoding `TU' in protrusion list
(microtype) `T1-default'.
Может быть, это связано, а может и нет.
ЕЩЕ РАЗ:
Мой вопрос на самом деле отвечает сам на себя! Причина, fontspec_pass_args
вызывающая ошибку, заключается в том, что последняя версия fontspec (2.5c, трехнедельной давности) больше не имеет этой команды. Так что, если у других нет моей проблемы, это потому, что они не копируют старый код fontspec в своем собственном коде. Но странные сообщения о TU все еще там, и они загадочны.
решение1
Ваш вопрос имеет два аспекта:
Проблемы с микротипом/TU будут исправлены в обновлении LaTeX2e, которое запланировано на очень скорое время.
Что касается взлома вашего кода, я отошлю вас к руководству по стилю программирования expl3 (l3styleguide.pdf):
Частные функции (начинающиеся с
\__
) не должны использоваться между модулями.
Но это, вероятно, слишком краткое объяснение.:)
Функция \__fontspec_pass_args:nnn
была разработана для управления необязательными аргументами, чтобы вы могли написать
\fontspec[<options>]{fontname}
ИЛИ
\fontspec{fontname}[<options>]
НО НЕТ
\fontspec[<options>]{fontname}[<options>]
Это было видно, как бы это сказать,довольно неблагоприятносреди иллюминатов LaTeX3 в чате tex.sx, поскольку это противоречит общей философии пакета, xparse
заключающейся в предоставлении последовательного способа работы с аргументами команд.
Поэтому мне потребовалось некоторое время, чтобы отказаться от этого, возможно, к сожалению, и теперь fontspec
допускается также форма «двойной необязательный»:
\fontspec[<options>]{fontname}[<options>]
Здесь используется что-то вроде
\DeclareDocumentCommand \fontspec { O{} m O{} }
В стороннем коде никому не должно было понадобиться воспроизводить старое поведение, предоставляемое \__fontspec_pass_args:nnn
.
Действительно, API для fontspec
предоставляет стандартный способ загрузки шрифтов без использования внутренних \__
-команд. Если это не обеспечивает то, что нужно, смело отправляйте запрос на функцию в репозиторий Github.