Latex3: Классы сообщений, заявленных как "Пакетные" сообщения

Созданный на 26 апр. 2021  ·  14Комментарии  ·  Источник: latex3/latex3

Как показано на следующем MCE, сообщения классов считаются сообщениями "Package":

\begin{filecontents*}[overwrite]{myclass.cls}
\ProvidesExplClass
  {myclass}
  {2021/04/26}
  {0.1}
  {
    My Nice Class
  }
\NeedsTeXFormat{LaTeX2e}
\LoadClass { article }
%
\msg_new:nnn {myclass} {Foo} {Bar}
\msg_warning:nn {myclass} {Foo}
\end{filecontents*}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\documentclass{myclass}
\begin{document}
\end{document}

пишет:

Предупреждение о пакете myclass: панель

Разве модуль l3msg не должен различать \ProvidesExplClass и \ProvidesExplPackage ?

documentation feature-request

Все 14 Комментарий

Это так, но вы должны указать это явно, добавив тип вашего файла в \g_msg_module_type_prop :

\prop_gput:Nnn \g_msg_module_type_prop { myclass } { Class }

и, возможно, его имя на \g_msg_module_name_prop :

\prop_gput:Nnn \g_msg_module_name_prop { myclass } { My~Nice~Class }

тогда вы получите предупреждение вроде:

Class My Nice Class Warning: Bar

Возможно, l3msg сможет автоматически заполнить тип, если использовалось \ProvidesExpl<Thing> ...


MWE:

\begin{filecontents*}[overwrite]{myclass.cls}
\ProvidesExplClass
  {myclass}
  {2021/04/26}
  {0.1}
  {
    My Nice Class
  }
\NeedsTeXFormat{LaTeX2e}
\LoadClass { article }
%
\prop_gput:Nnn \g_msg_module_type_prop { myclass } { Class }
\prop_gput:Nnn \g_msg_module_name_prop { myclass } { My~Nice~Class }
\msg_new:nnn {myclass} {Foo} {Bar}
\msg_warning:nn {myclass} {Foo}
\end{filecontents*}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\documentclass{myclass}
\begin{document}
\end{document}

Возможно, l3msg сможет автоматически заполнить тип, если использовалось \ProvidesExpl<Thing> ...

Было бы здорово! :улыбка:

Нет особой взаимосвязи между \ProvidesExpl... и префиксом модуля, используемым для кода: я думаю, что это просто то, что нужно делать вручную.

Это до того, как вся проблема «действительно классы не должны использовать синтаксис expl3 » - это была идея, которая не совсем сработала. (Классы по-прежнему нуждаются в гораздо большей работе, но не должны заниматься программированием, которое принадлежит пакетам.)

Нет особой взаимосвязи между \ProvidesExpl... и префиксом модуля, используемым для кода: я думаю, что это просто то, что нужно делать вручную.

Не понимаю почему.

Это до того, как вся проблема «действительно классы не должны использовать синтаксис expl3 » - это была идея, которая не совсем сработала. (Классы по-прежнему нуждаются в гораздо большей работе, но не должны заниматься программированием, которое принадлежит пакетам.)

Я не понимаю, в чем идея, что не совсем работает.

Нет особой взаимосвязи между \ProvidesExpl... и префиксом модуля, используемым для кода: я думаю, что это просто то, что нужно делать вручную.

Не понимаю почему.

В \ProvidesExplClass имя класса не обязательно должно совпадать с префиксом, используемым кодом. Или код может использоваться как пакетом, так и классом (я делаю это в терминах LaTeX2e в achemso ), поэтому ссылка не будет очевидна.

Это до того, как вся проблема «действительно классы не должны использовать синтаксис expl3 » - это была идея, которая не совсем сработала. (Классы по-прежнему нуждаются в гораздо большей работе, но не должны заниматься программированием, которое принадлежит пакетам.)

Я не понимаю, в чем идея, что не совсем работает.

Классы действительно должны касаться форматирования / стиля / и т. Д., А не функциональности. Последние должны добавляться пакетами, которые в идеале не должны зависеть от классов, с которыми они используются. Текущая ситуация не идеальна, и вначале набор \ProvidesExpl... был предоставлен для простого зеркалирования \Provides... из ядра LaTeX2e. Но задним числом это неправильный подход: _packages_ должен использовать expl3 code, _classes_ должны использовать интерфейсы уровня документа или дизайна, которые _might_ могут быть реализованы в expl3 .

Классы действительно должны касаться форматирования / стиля / и т. Д., А не функциональности.

Класс, над которым я сейчас работаю, должен вставить рисунок на первую страницу документа ... если этот рисунок найден, а в противном случае должен отображать предупреждение (в дополнение к предупреждению в файле журнала). Дизайн или функциональность?

Я исправил возникшую проблему, переместив документацию \g_msg_module_name_prop и \g_msg_module_type_prop ранее в документацию l3msg .

@dbitouze Хотя вы задаете хороший вопрос о дизайне и коде, я не думаю, что эта проблема - подходящее место. Возможно, имеет смысл опубликовать вопрос о stackexchange и попросить одного из членов команды там ответить? Или вопрос по списку рассылки LaTeX-L. Я точно не знаю.

Я исправил возникшую проблему, переместив документацию \g_msg_module_name_prop и \g_msg_module_type_prop ранее в документацию l3msg .

AFAICS, MCE в OP по-прежнему пишет:

Предупреждение о пакете myclass: панель

даже с pdflatex-dev . Вот результат в терминале (плюс список файлов):

This is pdfTeX, Version 3.141592653-2.6-1.40.22 (TeX Live 2021) (preloaded format=pdflatex-dev)
 restricted \write18 enabled.
entering extended mode
(./test.tex
LaTeX2e <2021-12-01> pre-release-0 (develop 2021-6-6 branch)
L3 programming layer <2021-06-01>

LaTeX Warning: Writing or overwriting file `./myclass.cls'.


(./myclass.cls
Document Class: myclass 2021/04/26 v0.1  My Nice Class 
(/usr/local/texlive/2021/texmf-dist/tex/latex-dev/base/article.cls
Document Class: article 2021/02/12 v1.4n Standard LaTeX document class
(/usr/local/texlive/2021/texmf-dist/tex/latex-dev/base/size10.clo))

Package myclass Warning: Bar

) (/usr/local/texlive/2021/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def)
 (./test.aux) (./test.aux)

 *File List*
 myclass.cls    2021/04/26 v0.1  My Nice Class 
 article.cls    2021/02/12 v1.4n Standard LaTeX document class
  size10.clo    2021/02/12 v1.4n Standard LaTeX file (size option)
l3backend-pdftex.def    2021-05-07 L3 backend support: PDF output (pdfTeX)
 ***********

 )
No pages of output.
Transcript written on test.log.

@dbitouze вы подали заявку

\prop_gput:Nnn \g_msg_module_type_prop { myclass } { Class }

«Исправлено» в сообщении Бруно было переместить документацию раньше, чтобы было ясно, что такая строка нуждается в добавлении, а не о том, что такая строка больше не нужна.

@dbitouze вы подали заявку

\prop_gput:Nnn \g_msg_module_type_prop { myclass } { Class }

Хм, нет, извините за недоразумение.

«Исправлено» в сообщении Бруно было переместить документацию раньше, чтобы было ясно, что такая строка нуждается в добавлении, а не о том, что такая строка больше не нужна.

Жаль: я думал (и надеялся), что исправление больше не требует никаких действий со стороны автора класса: smile: Это запланировано?

Как объяснил @josephwright, не существует автоматически обнаруживаемой связи между используемым префиксом и именем класса или пакета. Это на самом деле не отличается от старого метода 2e, в котором \ClassWarning явно указывается с последующим присвоением имени, только теперь вам нужно определять соединение только один раз, а в прошлом вам приходилось делать это при каждом вызове, используя \Class... и присвоив ей имя класса.

Таким образом, использование «myclass» - это просто строка, переданная в систему msg, и хотя мы, люди, могли бы подумать, что вид «class» в имени означает, что это класс, система msg не может сделать такой вывод (и это может быть в любом случае неверным). Вот почему необходимо действие от автора класса, и оно было необходимо в прошлом, когда вы писали \ClassWarning{<classname>} . Тот факт, что имя класса известно \ProvidesExplClass , не означает, что строка, используемая в msg, использует это имя. Например, большинство моих имен пакетов длинные, но префиксы, которые я использую, довольно короткие. Таким образом, вы должны сообщить системе msg, что конкретная строка является классом.

Мы могли бы правдоподобно отслеживать, когда вызывается \ ProvidesExplClass и
\ g_msg_module_type_prop не был изменен между началом и концом
файл (вероятно, только предупредить, если был вызван \ msg_new: nnnn).

Это звучит не слишком уродливо, и с его помощью можно было бы избежать этой простой ошибки.

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

Была ли эта страница полезной?
0 / 5 - 0 рейтинги

Смежные вопросы

stone-zeng picture stone-zeng  ·  25Комментарии

EvanAad picture EvanAad  ·  49Комментарии

josephwright picture josephwright  ·  12Комментарии

tail-reversion picture tail-reversion  ·  8Комментарии

bastien-roucaries picture bastien-roucaries  ·  19Комментарии