在我的文档类中,我希望有一个选项“load-custom-font-file”,它由 bool 变量记录\l__myclass_load_custom_font_file_bool
。启用此选项后,该类将搜索是否存在名为的字体配置文件myclass.font.tex
,如果存在,则输入该文件,否则使用预设配置。我脑海中的代码如下所示:
\bool_if:NTF \l__myclass_load_custom_font_file_bool
{
\file_if_exist_input:nF { myclass.font.tex }
{
%% preset configuration
}
}
{
%% preset configuration
}
我的问题是,有没有更好的方法,这样我就不必写preset configuration
两次了?(由于预设配置很长并且包含其他几个条件,因此将其存储到令牌列表中然后在需要时调用它似乎有点不合适。)
答案1
正如您自己所说,您可以将其存储在宏/令牌列表中,并在以后使用它,这相当容易。您还可以使用参数抓取逻辑仅编写一次预设配置。当您执行某些条件判断时,这是一个相当常见的技巧,但您仍然没有提前抓取代码(例如,无论出于何种原因,它可能不存在)。对于您来说,您可以这样写:
\bool_if:NT \l__myclass_load_custom_font_file_bool
{
\file_if_exist:nT { myclass.font.tex }
{
\input { myclass.font.tex }
\use_none:nn
}
}
\use:n
{
%% preset configuration
}
如果布尔值为假,或者文件不存在,则会完全跳过第一个块(请注意,T
在此示例中只有分支),只剩下\use:n { %% preset configuration }
,它将只运行代码。
如果布尔值为真和文件存在,文件已输入,然后您就有了\use_none:nn \use:n { %% preset configuration }
。\use_none:nn
从输入流中删除两项,从而删除了预设的配置。
答案2
不幸的\file_if_exist:nTF
是不可扩展。
\bool_new:N \l__myclass_temp_bool
\file_if_exist:nTF { myclass.font.tex }
{ \bool_set_true:N \l__myclass_temp_bool }
{ \bool_set_false:N \l__myclass_temp_bool }
\bool_lazy_and:nnTF { \l__myclass_load_custom_font_file_bool } { \l__myclass_temp_bool }
{
\file_input:n { myclass.font.tex }
}
{
% preset configuration
}
如果您有多个这样的构造,那么您将定义一个合适的函数:
\cs_new_protected:Nn \__myclass_loadfile_or_conf:Nnn
{
\file_if_exist:nTF { #2 }
{ \bool_set_true:N \l__myclass_temp_bool }
{ \bool_set_false:N \l__myclass_temp_bool }
\bool_lazy_and:nnTF { #1 } { \l__myclass_temp_bool }
{
\file_input:n { #2 }
}
{
#3
}
}
并称之为
\__myclass_loadfile_or_conf:Nnn \l__myclass_load_custom_font_file_bool
{ myclass.font.tex }
{
% preset configuration
}