Сегодняшнее обновление fontspec нарушает fontspec_pass_args?

Сегодняшнее обновление fontspec нарушает fontspec_pass_args?

Несколько часов назад следующий код работал отлично (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.

Связанный контент