我该如何分割约会?

我该如何分割约会?

我需要拆分日期(德语格式)并将其单个元素存储在变量中(以便在 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

得到你想要的。

相关内容