一个简单的and函数

一个简单的and函数

我想在日历上特别标记国定假日。规则包括“六月第一个星期一”和“十月最后一个星期一”。

我一直在查看 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函数

如果您只是想要一个andPGF 日历函数,则可以使用以下代码。它检查第一个参数,并且只有当其为真时才会检查另一个参数。(如果第一个参数已经为假,为什么还要检查第二个参数?)

这可以用作

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 monthweek 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}

输出

在此处输入图片描述

相关内容