使用 isodate 中的 \printdate 计算日期

使用 isodate 中的 \printdate 计算日期

\printdate我想使用from格式化日期isodate,但我想即时计算要格式化的日期。这两个部分可以单独工作:我可以计算日期并格式化日期,但当我尝试格式化计算出的日期时,我收到错误。

以下是 MWE:

\documentclass[a4paper,12pt]{article}
\usepackage[UKenglish]{isodate}
\usepackage{xstring}
\begin{document}
\StrLeft{2017-03-11}{4}-08-31\par
\origdate\printdate{2017-08-31}\par
%\origdate\printdate{\StrLeft{2017-03-11}{4}-08-31}
\end{document}

如果我取消注释掉注释掉的行,就会出现以下错误:

! Argument of \@xs@StrLeft has an extra }.
<inserted text> 
                \par 
l.7 ...te\printdate{\StrLeft{2017-03-11}{4}-08-31}

错误消息表明我的括号不平衡,但除非我特别不注意,否则似乎并非如此。有什么想法吗?我正在使用 LaTeX,但 XeLaTeX 也出现了同样的问题。

答案1

xstring不存储或返回值,而是将结果字符串输出到文档。由于\printdate需要值(而不是生成输出文档的代码定义),因此这不起作用。

但是,xstring允许使用可选参数将值存储在宏中。此宏可以在 中使用\printdate

梅威瑟:

\documentclass[a4paper,12pt]{article}
\usepackage[UKenglish]{isodate}
\usepackage{xstring}
\begin{document}
\StrLeft{2017-03-11}{4}[\myyear]
\origdate\printdate{\myyear-08-31}
\end{document}

请注意,LaTeX 被设计为一种宏扩展语言,这意味着没有函数具有可用作其他函数的输入参数的返回值(如在其他编程语言中)。

相反,宏的定义会插入到宏调用的位置。当在宏 B 的参数中使用宏 A 时,这仅当宏 A 的定义包含宏 B 期望的元素时才有效 - 在此示例中,宏\myyear包含一个简单的字符串,而宏\StrLeft包含复杂的字符串处理代码。

相关内容