我会交换一下 \tl_if_eq:Nn
和 \cs_set:Npn \@makefntext
的顺序
% test.cls
\NeedsTeXFormat {LaTeX2e}
\ProvidesExplClass {test} {2023/02/17} {0.1} {Just a test}
\RequirePackage {l3keys2e}
%%
\LoadClass{article}
%%
\cs_new:Npn \__symbol:n #1 {\tex_char:D #1 \scan_stop:}
\tl_new:N \g__fn_num_style_tl
\tl_new:N \g__fn_num_XITS_tl
\tl_new:N \g__fn_num_plain_tl
\tl_gset:Nn \g__fn_num_XITS_tl {XITS}
\tl_gset:Nn \g__fn_num_plain_tl {plain}
%%
\keys_define:nn {test/style} {
footnote-num .choice:,
footnote-num .value_required:n = true,
footnote-num .choices:nn =
{XITS, plain}
{\tl_gset:NV \g__fn_num_style_tl \l_keys_choice_tl},
footnote-num .initial:n = {XITS}
}
%%
%% 这个函数是带圈数字支持
\cs_new:Npn \__select_fn_num:n #1 {
\int_compare:nTF {#1>=21}
{
\int_compare:nTF {#1>=47}
{\__symbol:n {\int_eval:n {"24B6-47+#1}}}
{\__symbol:n {\int_eval:n {"24D0-21+#1}}}
}
{\__symbol:n {\int_eval:n {"2460-1+#1}}}
}
\cs_new:Npn \__plain_fn_num:n #1 {\int_use:N #1}
%%
\cs_new:Npn \__fn_num_:N #1 {
\tl_case:Nn \g__fn_num_style_tl {
\g__fn_num_XITS_tl {\__select_fn_num:n {#1}}
\g__fn_num_plain_tl {\__plain_fn_num:n {#1}}
}
}
%% 以下是脚注调整
\tl_set:Nn \thefootnote {\__fn_num_:N \c@footnote}
\tl_new:N \g__makefnmark_tl
\tl_gset:Nn \g__makefnmark_tl {\hbox{\normalfont\@thefnmark\space}}
\cs_set_eq:NN \__old_@makefntext:n \@makefntext
\cs_set:Npn \@makefntext #1
{
\tl_if_eq:NnTF \g__fn_num_style_tl {plain}
{ \__old_@makefntext:n {#1} }
{ \noindent\hb@xt@2em{\hss\g__makefnmark_tl}#1 }
}
%%
\NewDocumentCommand \testsetup {m} {
\keys_set:nn {test} {#1}
}
%%
\endinput
另外借个楼,看有没有人感兴趣。我写毕业论文的时候也用到了带圈数字的功能,觉得这个功能完全可以模块化成单独宏包,然后就写了个自用的小包包,哈哈~ circlenum.sty 。
问 如何更合理地为文档类设计用户接口?