我想在日历上特别标记国定假日。规则包括“六月第一个星期一”和“十月最后一个星期一”。
我一直在查看 PGF 2.10 手册第 280 页上的示例,但我无法根据自己的目的对其进行修改。此示例的有用部分是:
if (between=\year-\month-\day+8 and \year-\month-\day+10)
[red]
if (Sunday)
[gray,nodes={draw=none}]
我相信,这是一个 MWE。
% Based on Hakon Malmedal's 'Birthday calendar' from TeXamples
\documentclass[fontsize=20pt]{scrartcl}
\usepackage{tikz}
\usetikzlibrary{calendar,fit}
\begin{document}
\begin{tikzpicture}[thick]
\calendar[dates=2014-01-01 to 2014-01-last,
week list,
month label above centered,
month text=\textsc{\%mt \%y0}]
if (equals=01-01,
equals=03-17,
equals=12-25,
equals=12-26) [orange]
% p. 280 of PGF 2.10 manual is useful
if (between=2014-01-08 and 2014-01-14) [orange]
% following doesn't work:
% if (Monday \AND between=2014-01-08 and 2014-01-14) [orange]
;
\end{tikzpicture}
\end{document}
1 月 8 日至 14 日的 7 天以橙色显示,但我希望星期一(每月第二个星期一)仅显示为橙色,正如注释行所期望的那样。
我如何建立两个条件的连接以便用橙色打印假期?
答案1
一个简单的and
函数
如果您只是想要一个and
PGF 日历函数,则可以使用以下代码。它检查第一个参数,并且只有当其为真时才会检查另一个参数。(如果第一个参数已经为假,为什么还要检查第二个参数?)
这可以用作
if (and={between=2014-01-08 and 2014-01-14}{Monday}) [orange];
也许最好这样写
if (between=2014-01-08 and 2014-01-14, And=Monday, And=…) [orange];
{}
这也行得通。显然,如果你像这样使用它,你将需要:
if (Monday, And={between=2014-01-08 and 2014-01-14}) [orange];
代码
\documentclass[tikz]{standalone}
\usetikzlibrary{calendar}
\makeatletter
\pgfqkeys{/pgf/calendar}{
and/.code 2 args=%
\begingroup
\let\pgf@cal@temp\pgfutil@empty
\pgfcalendar@launch@ifdate{#1}{\pgfcalendar@launch@ifdate{#2}{\def\pgf@cal@temp{\let\ifpgfcalendarmatches\iftrue}}{}}{}%
\expandafter\endgroup\pgf@cal@temp,
And/.code=%
\begingroup
\let\pgf@cal@temp\pgfutil@empty
\ifpgfcalendarmatches\expandafter\pgfutil@firstofone\else\expandafter\pgfutil@gobble\fi
{\pgfcalendar@launch@ifdate{#1}{\def\pgf@cal@temp{\let\ifpgfcalendarmatches\iftrue}}{}}%
\expandafter\endgroup\pgf@cal@temp}
\makeatother
\begin{document}
\begin{tikzpicture}
\calendar[dates=2014-01-01 to 2014-01-last, week list,
month label above centered, month text=\textsc{\%mt \%y0}]
if (equals=01-01, equals=03-17, equals=12-25, equals=12-26) [orange]
if (between=2014-01-08 and 2014-01-14, And=Monday) [orange]
if (and={between=2014-01-08 and 2014-01-14}{Monday}) [days={fill=gray}];
\end{tikzpicture}
\end{document}
输出
五月的第二个星期日?
这图书馆qrr.calendar
引入条件
leap year
这也可以用于其他年份:
2000 was\ifdate{leap year=200}{}{ not} a leap year
week of month=<arg>
测试我们是否处于<arg>
该月的第 1 周。这与周一至周日(或周日至周六)的一周不对应。第一周从第 1 天到第 7 天,第二周从第 8 天到第 14 天,依此类推。week of month'=<arg>
与 相同,week of month
但是从最后一天开始。week of month'=1
将(当前为 10 月)测试我们是否处于该月的第 25 天和第 31 天之间。这将使用宏来获取当月份为 2 月时\pgfcalendar@getlastYMX
使用密钥的月份最后一天。leap year
first=[<i>:]<conditonal>
并将和与last=[<i>:]<conditional>
结合起来。你可以使用以下方法检查一个月中的第二个星期一week of month
week of month'
<conditional>
first=2:Monday
如果没有给出,则使用
<i>:
第一个/最后一个(即)。1:
实际上
<conditional>
可以是任何东西,但自然你想在这里指定星期几。between days=<first> and <last>
检查日期是否在first
和之间<last>
。not=<cond>
否定结果<cond>
加载
\usetikzlibrary{qrr.calendar}
% or
\usepgflibrary{qrr.calendar}
代码
\documentclass[tikz]{standalone}
\usetikzlibrary{calendar,qrr.calendar}\usepackage{libertine}
\begin{document}\sffamily
\begin{tikzpicture}
\calendar[dates=2023-01-01 to 2023-12-31, month list, month label left,
month yshift={!mod(\numexpr\pgfcalendarcurrentmonth-1\relax,3)*.25em+1.25em}]
if (Sunday) [black!50]
if (first=2:Sunday, And=May)
[days={fill=red, text=black, rounded corners, text depth=0pt},
day text=$\heartsuit$];
\end{tikzpicture}
\end{document}