我已经定义了一个 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}