我编写了一个函数\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}