如何结合这两个基于 expl3 的函数来用英语显示星期几?

如何结合这两个基于 expl3 的函数来用英语显示星期几?

我编写了一个函数\projlib_datetime_calculate_day_of_week_with_year_month_day:nnn,根据年、月、日计算“星期几”(所采用的算法应该适用于 1800 年代以后的日期),还编写了一个函数,\projlib_datetime_display_week_english:n将给定的数字从 1 到 7 转换为英文单词。但是,我不知道如何将它们组合起来以英文显示给定日期的星期几。我以为\exp_args:Ne获取第一个的值然后传递给第二个就足够了,但事实并非如此。

以下是我的代码。提前感谢大家的帮助!

\documentclass{article}

% \usepackage{projlib-datetime}

\ExplSyntaxOn

\int_new:N \l__projlib_datetime_day_of_week_day_int
\int_new:N \l__projlib_datetime_day_of_week_month_int
\int_new:N \l__projlib_datetime_day_of_week_year_int
\int_new:N \l__projlib_datetime_day_of_week_century_int
\int_new:N \l__projlib_datetime_day_of_week_result_int
\cs_new:Nn \projlib_datetime_calculate_day_of_week_with_year_month_day:nnn
  {
    \int_set:Nn \l__projlib_datetime_day_of_week_day_int { #3 }
    \int_compare:nNnTF { #2 } < { 3 }
      {
        \int_set:Nn \l__projlib_datetime_day_of_week_year_int { \int_eval:n { #1 - 1 } }
      }
      {
        \int_set:Nn \l__projlib_datetime_day_of_week_year_int { #1 }
      }
    \int_set:Nn \l__projlib_datetime_day_of_week_century_int { \int_eval:n { \l__projlib_datetime_day_of_week_year_int / 100 } }
    \int_set:Nn \l__projlib_datetime_day_of_week_year_int { \int_mod:nn { \l__projlib_datetime_day_of_week_year_int } { 100 } }
    \int_set:Nn \l__projlib_datetime_day_of_week_month_int
      {
        \int_case:nnF { #2 }
          {
            {  1 } { 0 }
            {  2 } { 3 }
            {  3 } { 2 }
            {  4 } { 5 }
            {  5 } { 0 }
            {  6 } { 3 }
            {  7 } { 5 }
            {  8 } { 1 }
            {  9 } { 4 }
            { 10 } { 6 }
            { 11 } { 2 }
            { 12 } { 4 }
          }        { 0 }
      }
    \int_set:Nn \l__projlib_datetime_day_of_week_result_int
      {
        \int_eval:n
          {
              \l__projlib_datetime_day_of_week_day_int
            + \l__projlib_datetime_day_of_week_month_int
            +\l__projlib_datetime_day_of_week_year_int
            + \int_div_truncate:nn { \l__projlib_datetime_day_of_week_year_int } { 4 }
            + \int_div_truncate:nn { \l__projlib_datetime_day_of_week_century_int } { 4 }
            - 2 * \l__projlib_datetime_day_of_week_century_int
          }
      }
    \int_set:Nn \l__projlib_datetime_day_of_week_result_int
      {
        \int_mod:nn { \l__projlib_datetime_day_of_week_result_int } { 7 }
      }
    \int_compare:nNnT { \l__projlib_datetime_day_of_week_result_int } < { 1 }
      {
        \int_set:Nn \l__projlib_datetime_day_of_week_result_int
          {
            \int_eval:n { \l__projlib_datetime_day_of_week_result_int + 7 }
          }
      }
    \int_use:N \l__projlib_datetime_day_of_week_result_int
  }



\cs_new:Nn \projlib_datetime_display_week_english:n
  {
    \int_case:nnF { #1 }
      {
        { 1 }  { Monday    }
        { 2 }  { Tuesday   }
        { 3 }  { Wednesday }
        { 4 }  { Thursday  }
        { 5 }  { Friday    }
        { 6 }  { Saturday  }
        { 7 }  { Sunday    }
      } { ??? }
  }


\ExplSyntaxOff

\begin{document}

\ExplSyntaxOn

\projlib_datetime_calculate_day_of_week_with_year_month_day:nnn { 2022 } { 02 } { 16 }

\projlib_datetime_calculate_day_of_week_with_year_month_day:nnn { 2022 } { 02 } { 28 }

\projlib_datetime_calculate_day_of_week_with_year_month_day:nnn { 2022 } { 03 } { 01 }

% \exp_args:Ne
% \projlib_datetime_display_week_english:n
%   {
%     \projlib_datetime_calculate_day_of_week_with_year_month_day:nnn { 2022 } { 02 } { 01 }
%   }

\ExplSyntaxOff

\end{document}

答案1

按照您的描述,您的第一个函数不可扩展,因此不能在e参数等扩展上下文中使用。您可以通过删除所有内部赋值来将其编写为可扩展的,但更简单的方法是删除 final,\use这样结果就留在局部变量中,然后您可以根据需要使用该变量或将其传递给第二个函数。

在此处输入图片描述

\documentclass{article}

% \usepackage{projlib-datetime}

\ExplSyntaxOn

\int_new:N \l__projlib_datetime_day_of_week_day_int
\int_new:N \l__projlib_datetime_day_of_week_month_int
\int_new:N \l__projlib_datetime_day_of_week_year_int
\int_new:N \l__projlib_datetime_day_of_week_century_int
\int_new:N \l__projlib_datetime_day_of_week_result_int
\cs_new:Nn \projlib_datetime_calculate_day_of_week_with_year_month_day:nnn
  {
    \int_set:Nn \l__projlib_datetime_day_of_week_day_int { #3 }
    \int_compare:nNnTF { #2 } < { 3 }
      {
        \int_set:Nn \l__projlib_datetime_day_of_week_year_int { \int_eval:n { #1 - 1 } }
      }
      {
        \int_set:Nn \l__projlib_datetime_day_of_week_year_int { #1 }
      }
    \int_set:Nn \l__projlib_datetime_day_of_week_century_int { \int_eval:n { \l__projlib_datetime_day_of_week_year_int / 100 } }
    \int_set:Nn \l__projlib_datetime_day_of_week_year_int { \int_mod:nn { \l__projlib_datetime_day_of_week_year_int } { 100 } }
    \int_set:Nn \l__projlib_datetime_day_of_week_month_int
      {
        \int_case:nnF { #2 }
          {
            {  1 } { 0 }
            {  2 } { 3 }
            {  3 } { 2 }
            {  4 } { 5 }
            {  5 } { 0 }
            {  6 } { 3 }
            {  7 } { 5 }
            {  8 } { 1 }
            {  9 } { 4 }
            { 10 } { 6 }
            { 11 } { 2 }
            { 12 } { 4 }
          }        { 0 }
      }
    \int_set:Nn \l__projlib_datetime_day_of_week_result_int
      {
        \int_eval:n
          {
              \l__projlib_datetime_day_of_week_day_int
            + \l__projlib_datetime_day_of_week_month_int
            +\l__projlib_datetime_day_of_week_year_int
            + \int_div_truncate:nn { \l__projlib_datetime_day_of_week_year_int } { 4 }
            + \int_div_truncate:nn { \l__projlib_datetime_day_of_week_century_int } { 4 }
            - 2 * \l__projlib_datetime_day_of_week_century_int
          }
      }
    \int_set:Nn \l__projlib_datetime_day_of_week_result_int
      {
        \int_mod:nn { \l__projlib_datetime_day_of_week_result_int } { 7 }
      }
    \int_compare:nNnT { \l__projlib_datetime_day_of_week_result_int } < { 1 }
      {
        \int_set:Nn \l__projlib_datetime_day_of_week_result_int
          {
            \int_eval:n { \l__projlib_datetime_day_of_week_result_int + 7 }
          }
      }
%    \int_use:N \l__projlib_datetime_day_of_week_result_int
  }



\cs_new:Nn \projlib_datetime_display_week_english:n
  {
    \int_case:nnF { #1 }
      {
        { 1 }  { Monday    }
        { 2 }  { Tuesday   }
        { 3 }  { Wednesday }
        { 4 }  { Thursday  }
        { 5 }  { Friday    }
        { 6 }  { Saturday  }
        { 7 }  { Sunday    }
      } { ??? }
  }


\ExplSyntaxOff

\begin{document}

\ExplSyntaxOn

\projlib_datetime_calculate_day_of_week_with_year_month_day:nnn { 2022 } { 02 } { 16 }
\int_use:N \l__projlib_datetime_day_of_week_result_int

\par\bigskip

\projlib_datetime_calculate_day_of_week_with_year_month_day:nnn { 2022 } { 02 } { 28 }
\int_use:N \l__projlib_datetime_day_of_week_result_int

\par\bigskip

\projlib_datetime_calculate_day_of_week_with_year_month_day:nnn { 2022 } { 03 } { 01 }
\int_use:N \l__projlib_datetime_day_of_week_result_int

\par\bigskip

\projlib_datetime_calculate_day_of_week_with_year_month_day:nnn { 2022 } { 02 } { 01 }
\projlib_datetime_display_week_english:n\l__projlib_datetime_day_of_week_result_int


\ExplSyntaxOff

\end{document}

相关内容