如何简化条件的使用,以便核心代码不需要编写两次?

如何简化条件的使用,以便核心代码不需要编写两次?

在我的文档类中,我希望有一个选项“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
  }

相关内容