如何访问日期数组(tikz 日历)

如何访问日期数组(tikz 日历)

我已经定义了一个 ISO 日期数组。接下来,我需要将日期转换为儒略日。

如以下代码所示,使用\foreach语句 +可以实现这\pgfcalendardatetojulian一点(方法 1)。但是,我希望通过调用数组的第一个和最后一个元素来获取它,以便轻松计算较长的时间段(方法 2)。不幸的是,它不起作用。

我如何存档此内容?

\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{calendar}
        
\pgfkeys{/pgf/calendar/method one/.code={
    \newcount\n
    \foreach \d in \holiday{
        \pgfcalendardatetojulian{\d}{\n}
        \ifnum \pgfcalendarcurrentjulian = \n
            \global\pgfcalendarmatchestrue
        \fi
        }}}
            
\pgfkeys{/pgf/calendar/method two/.code={
    \newcount\first \pgfcalendardatetojulian{\holiday[0]}{\first} \advance \first -1
    \newcount\last \pgfcalendardatetojulian{\holiday[1]}{\last} \advance \last +1
    \ifnum \pgfcalendarcurrentjulian > \first
        \ifnum \pgfcalendarcurrentjulian < \last
            \global\pgfcalendarmatchestrue
    \fi\fi
    }}
        
\begin{document}
        
\def\holiday{2021-1-1, 2021-1-10}
        
\begin{tikzpicture}
\calendar[dates=2021-01-01 to 2021-01-last, style = week list]
%   if (method one) [red];    % this works
    if (method two) [red];    % this doesn't
\end{tikzpicture}
        
\end{document}

答案1

.code我认为没必要做太多。

您可以定义一种样式,获取列表中的第一个和第二个日期,然后将其转发给/pgf/calendar/between基本上执行与您的相同的操作的键method two

这里我定义了一个/pgf/calendar/parse between键,一旦展开,您就可以赋予它\holiday

您还可以像定义自己的密钥一样定义一个holiday可以执行下列操作的密钥:

/pgf/calendar/holiday/.style={parse between/.expand once=\holiday}

那你只要说就可以了if (holiday) […]

如果您希望所有节假日都变成红色,无论哪种方式,您都可以/tikz/holiday像上一个例子那样定义一个键。

代码

\documentclass[tikz]{standalone}
\usetikzlibrary{calendar}
\pgfqkeys{/pgf/calendar}{
  parse between/.style args={#1,#2}{between=#1and#2}}
\newcommand*\holiday{2021-1-1, 2021-1-10}

\begin{document}
\begin{tikzpicture}
\calendar[dates=2021-01-01 to 2021-01-last, week list]
    if (parse between/.expand once=\holiday) [red];
\end{tikzpicture}

\begin{tikzpicture}[
  /pgf/calendar/holiday/.style={parse between/.expand once=\holiday}]
\calendar[dates=2021-01-01 to 2021-01-last, week list]
    if (holiday) [red];
\end{tikzpicture}

\begin{tikzpicture}[
  holiday/.style={if={(parse between/.expand once=\holiday)[red]}}]
\calendar[dates=2021-01-01 to 2021-01-last, week list]
    [holiday];
\end{tikzpicture}
\end{document}

答案2

我不知道这样可以吗

\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{calendar}
        
\pgfkeys{/pgf/calendar/method one/.code={
    \newcount\n
    \foreach \d in \holiday{
        \pgfcalendardatetojulian{\d}{\n}
        \ifnum \pgfcalendarcurrentjulian = \n
            \global\pgfcalendarmatchestrue
        \fi
        }}}
            
\pgfkeys{/pgf/calendar/method two/.code={
    \newcount\first \pgfcalendardatetojulian{\holiday[0]}{\first} \advance \first -1
    \newcount\last \pgfcalendardatetojulian{\holiday[1]}{\last} \advance \last +1
    \ifnum \pgfcalendarcurrentjulian > \first
        \ifnum \pgfcalendarcurrentjulian < \last
            \global\pgfcalendarmatchestrue
    \fi\fi
    }}
        
\begin{document}
        
\def\holiday{2021-1-1, 2021-1-10}
        
\begin{tikzpicture}
\calendar[dates=2021-01-01 to 2021-01-last, style = week list]
%   if (method one) [red];    % this works
%    if (method two) [red];    % this doesn't
if (between =2021-1-1 and 2021-1-10) [red];
\end{tikzpicture}
        
\end{document}

在此处输入图片描述

相关内容