Latex3: Classes 消息声称是“Package”消息

创建于 2021-04-26  ·  14评论  ·  资料来源: latex3/latex3

如以下 MCE 所示,类消息被称为“包”消息:

\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

如果使用\ProvidesExpl<Thing> ,也许l3msg可以自动填充类型......


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}

如果使用\ProvidesExpl<Thing> ,也许l3msg可以自动填充类型......

会好的! :微笑:

\ProvidesExpl...和用于代码的模块前缀之间没有特别的关系:我认为这只是必须手动完成的事情。

那是在整个“真正的类不应该使用expl3语法”问题之前 - 这是一个不太可行的想法。 (类仍然需要更多的工作,但不应该进行编程,这属于包。)

\ProvidesExpl...和用于代码的模块前缀之间没有特别的关系:我认为这只是必须手动完成的事情。

我不明白为什么。

那是在整个“真正的类不应该使用expl3语法”问题之前 - 这是一个不太可行的想法。 (类仍然需要更多的工作,但不应该进行编程,这属于包。)

我不明白什么想法行不通。

\ProvidesExpl...和用于代码的模块前缀之间没有特别的关系:我认为这只是必须手动完成的事情。

我不明白为什么。

\ProvidesExplClass中,类的名称不必与代码使用的前缀匹配。 或者代码可以同时被包和类使用(我用 LaTeX2e 术语在achemso这样做),所以链接不会很明显。

那是在整个“真正的类不应该使用expl3语法”问题之前 - 这是一个不太可行的想法。 (类仍然需要更多的工作,但不应该进行编程,这属于包。)

我不明白什么想法行不通。

类真的应该是关于格式/样式/等,而不是功能。 后者应该由包添加,理想情况下,包独立于它们所使用的类。 目前的情况并不理想,早期的\ProvidesExpl...集被提供来简单地从 LaTeX2e 内核镜像\Provides... 。 但是事后看来这是错误的方法:_packages_ 应该使用expl3代码,_classes_ 应该使用文档级或设计级接口,这些接口 _可能_在expl3

类真的应该是关于格式/样式/等,而不是功能。

我目前正在处理的课程应该在文档的第一页上插入一个图形......如果找到这个图形,否则应该显示一条警告(除了日志文件中的警告)。 是设计还是功能?

我已经通过在l3msg文档中移动\g_msg_module_name_prop\g_msg_module_type_prop之前的文档来解决手头的问题。

@dbitouze虽然你问了一个关于设计与代码的好问题,但我认为这个问题不是正确的地方。 也许在 stackexchange 上发布问题并让其中一名团队成员在那里回答可能有意义? 或者 LaTeX-L 邮件列表上的问题。 我真的不知道。

完成

我已经通过在l3msg文档中移动\g_msg_module_name_prop\g_msg_module_type_prop之前的文档来解决手头的问题。

AFAICS,OP 中的 MCE 仍然写道:

包 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 }

Bruno 消息中的“修复”是提前移动文档,以明确表示这样的行需要添加而不是不再需要这样的 ine。

@dbitouze你申请了吗

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

嗯,不,抱歉误会了。

Bruno 消息中的“修复”是提前移动文档,以明确表示这样的行需要添加而不是不再需要这样的 ine。

太糟糕了:我认为(并希望)修复不再需要类作者的任何操作 :smile: 是否已计划好?

正如@josephwright 所解释的那样,使用的前缀与类或包名称之间没有可自动检测的联系。 这与显式说出\ClassWarning然后给出名称的旧 2e 方法并没有真正不同,只是现在您只需定义一次连接,而过去您必须在每次调用时使用\Class...命令为其指定类名。

因此,使用“myclass”只是传递给 msg 系统的字符串,虽然我们人类可能认为在名称中看到“class”意味着它是一个类,但 msg 系统无法进行推断(无论如何它可能是错误的)。 这就是为什么需要类作者采取行动的原因,并且在过去您编写\ClassWarning{<classname>}需要采取行动。 \ProvidesExplClass知道类名这一事实并不意味着 msg 中使用的字符串正在使用该名称。 例如,我的大部分包名都很长,但我使用的前缀很短。 所以你必须告诉 msg 系统一个特定的字符串是一个类。

当 \ProvidesExplClass 被调用时,我们可以合理地跟踪
\g_msg_module_type_prop 在开始和结束之间没有被修改
文件(可能只在 \msg_new:nnnn 被调用时发出警告)。

这听起来并不太难看,而且可以避免这个简单的错误。

我们可以,但它是每个文档的运行时成本,而错误是一个类错误,它表现为错误(但无害)的输出,并且很容易一劳永逸地纠正。 所以我真的不赞成通过运行时检查减慢处理速度。 如果有的话,它应该进入检查选项。 我知道这个运行时成本本身很小,但总的来说它们加起来。

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

JairoAdelRio picture JairoAdelRio  ·  7评论

EvanAad picture EvanAad  ·  49评论

dbitouze picture dbitouze  ·  12评论

josephwright picture josephwright  ·  12评论

dbitouze picture dbitouze  ·  43评论