\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
包含复杂的字符串处理代码。