如以下 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
吗?
是的,但是您必须通过将文件类型添加到\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 被调用时发出警告)。
这听起来并不太难看,而且可以避免这个简单的错误。
我们可以,但它是每个文档的运行时成本,而错误是一个类错误,它表现为错误(但无害)的输出,并且很容易一劳永逸地纠正。 所以我真的不赞成通过运行时检查减慢处理速度。 如果有的话,它应该进入检查选项。 我知道这个运行时成本本身很小,但总的来说它们加起来。