报错信息要看完整。
(./skyrmion-part1-module.code.tex
! Undefined control sequence.
l.1 \skyrmion
_provide_module:n {part1}
?
说明是在 skyrmion-part1-module.code.tex
这个文件的第一行报错,明显是由于没有处于 LaTeX3 环境而出错。因为是在导言区导入的模块,并不是 LaTeX3 环境。把名字替换成 \SkyrmionProvideModule
就好了。
另外,只是简单的用 \file_if_exist_input:n..
,如果重复加载一个模块,就会出现重复定义的问题,还可能会像加载 tikz 库一样,遇到类别码的问题,建议使用 \@onefilewithoptions
加载文件,不仅可以解决这两个问题,还可以像加载宏包时有宏包选项一样,有自己的模块选项。
%% skyrmion.cls, 另外两个模块文件的第一行也要修改
\def\skyrmion@date{2024/10/05}
\def\skyrmion@version{0.1.1}
\ExplSyntaxOn
\cs_new_protected_nopar:Npn \SkyrmionProvideModule #1
{
\ProvidesExplFile{skyrmion-#1-module.code.tex}{\skyrmion@date}{\skyrmion@version}
{skyrmion~ \text_titlecase:n { #1 } ~Module}
}
\ExplSyntaxOff
\ProvidesExplClass{skyrmion} {\skyrmion@date} {\skyrmion@version}
{Skyrmion in Hong Kong}
\cs_new_protected:Npn \skyrmion_msg_new:nn #1#2
{ \msg_new:nnn { skyrmion } { #1 } { #2 } }
\cs_new_protected:Npn \skyrmion_msg_error:nn #1#2
{ \msg_error:nnn { skyrmion } { #1 } { #2 } }
\cs_generate_variant:Nn \skyrmion_msg_error:nn { nx }
\skyrmion_msg_new:nn { not found module }
{
The~skyrmion~module~`#1'~not~found.
}
\tl_const:Nn \c__skyrmion_module_ext_tl { tex }
\cs_new_protected_nopar:Npn \skyrmion_load_module:n #1
{
\clist_map_inline:nn { #1 }
{
\file_if_exist:nTF { skyrmion-##1-module.code. \c__skyrmion_module_ext_tl }
{ \@onefilewithoptions { skyrmion-##1-module.code } [{}] [0000-00-00] { \c__skyrmion_module_ext_tl } } % 第一个方括号是模块选项,第二个是日期
{
\skyrmion_msg_error:nn { not found module } { ##1 }
}
}
}
\DeclareOption*{\PassOptionsToClass{\CurrentOption}{article}}
\ProcessOptions\relax
\LoadClass[a4paper]{article}
\keys_define:nn {skyrmion/foo}
{
tel.tl_set:N = \l__skyrmion_tel_tl
}
\NewDocumentCommand{\foo}{m}
{
\keys_set:nn {skyrmion/foo} {#1}
\int_compare:nNnT { \tl_count:N \l__skyrmion_tel_tl } = {8}
{
\skyrmion_load_module:n {part1}
}
\int_compare:nNnT { \tl_count:N \l__skyrmion_tel_tl } = {10}
{
\skyrmion_load_module:n {part2}
}
}
% \skyrmion_load_module:n {part1} % ?
\endinput
问 通过expl3设计“根据\tl_count:N”结果加载不通模块的error?