![我该如何分割约会?](https://linux22.com/image/245038/%E6%88%91%E8%AF%A5%E5%A6%82%E4%BD%95%E5%88%86%E5%89%B2%E7%BA%A6%E4%BC%9A%EF%BC%9F.png)
我需要拆分日期(德语格式)并将其单个元素存储在变量中(以便在 TikZ 日历中使用它)。
德语格式的日期看起来像 23.01.2012(日.月.年),所以我可以使用点作为分隔标记。
不幸的是我不知道如何开始。有人有建议或做过这样的事吗?
答案1
对于简单的拆分函数,您可以使用分隔宏。您可以简单地执行以下操作:
\def\mysplit#1.#2.#3.{\def\myday{#1}\def\mymonth{#2}\def\myyear{#3}}
\def\splitdate#1{\expandafter\mysplit#1.}
\documentclass{article}
\begin{document}
\noindent We have the date: 23.01.2012 \splitdate{23.01.2012}\\
Day: \myday\\
Month: \mymonth\\
Year: \myyear
\end{document}
结果:
请注意,目前这种方法缺乏针对错误格式输出的任何类型的错误处理。
编辑:关于 的一些补充解释\expandafter
。
不同之处在于添加了\expandafter
。使用 时会发生什么情况,\splitdate{<argument>}
则将\mysplit#1
其替换为\mysplit<argument to \splitdate>
。当<argument to \splitdate>
不是像 格式化的日期而是一个定义为 的dd.mm.yyyy
宏时,则与的定义不匹配(因为 需要用 分隔的参数)。当我们使用 时,保持不变并先进行扩展。这导致,然后进行扩展并且参数与定义匹配。当我们有一个额外的层时,就像 一样,这仍然会失败,因为只会扩展一次令牌。我们也可以通过添加我们使用的本地扩展定义来使其工作。完整的代码将如下所示:\mydate
\def\mydate{10.10.2010}
\mysplit\mydate
\mysplit
.
\expandafter
\mysplit
\mydate
\mysplit10.10.2010
\mysplit
\def\mydate{12.12.2012}\def\otherdate{\mydate}
\expandafter
\def\mysplit#1.#2.#3.{\gdef\myday{#1}\gdef\mymonth{#2}\gdef\myyear{#3}}
\def\splitdate#1{{\edef\x{#1}\expandafter\mysplit\x.}}
\documentclass{article}
\begin{document}
\def\mydate{23.01.2012}
\def\deepdate{\mydate}
\noindent We have the date: 23.01.2012 \splitdate{\deepdate}\\
Day: \myday\\
Month: \mymonth\\
Year: \myyear
\end{document}
请注意,我们必须将等的定义更改\myday
为全局的。
答案2
您还可以使用\StrBefore
、\StrBetween
和\StrBehind
来自包裹xstring
:
\documentclass{article}
\usepackage{xstring}
\newcommand*{\ExtractDay}[1]{\StrBefore[1]{#1}{.}}%
\newcommand*{\ExtractMonth}[1]{\StrBetween[1,2]{#1}{.}{.}}%
\newcommand*{\ExtractYear}[1]{\StrBehind[2]{#1}{.}}%
\newcommand*{\MySplit}[1]{%
\def\MyDay{\ExtractDay{#1}}%
\def\MyMonth{\ExtractMonth{#1}}%
\def\MyYear{\ExtractYear{#1}}%
}%
\begin{document}
\noindent We have the date: 23.01.2012\\
Day: \ExtractDay{23.01.2012}\\
Month: \ExtractMonth{23.01.2012}\\
Year: \ExtractYear{23.01.2012}
\bigskip
\noindent If you prefer to have separate macros define for each component
\noindent We have the date: 23.01.2012 \MySplit{23.01.2012}\\
Day: \MyDay\\
Month: \MyMonth\\
Year: \MyYear
\end{document}
答案3
只需使用\year
和\month
即可\day
获取日期的不同部分。它们用作整数寄存器。因此您可以使用
\the\year.\the\month.\the\day
得到你想要的。