彩色日历当前周数

彩色日历当前周数

我想要显示每周的一个页面,其中包含一年中的周数、星期一和星期六的日期(以数字形式)以及当前月份的日历(当前周为红色)。

问题

如果“之间”的日期清楚的话,我就能实现这一点,但如果我使用存储的日期则无法实现。

代码

 \documentclass[12pt,a4paper,french]{article} 

\usepackage{tikz}
 \usetikzlibrary{ext.calendar-plus}
 \usepackage[useregional,showdow,calc,datesep=-]{datetime2}

\usepackage{ifthen}  % fo whiledo 

\begin{document}


% Start date 
\DTMsavedate{dateCourante}{2023-01-16}
\newcount\julianCourant
\DTMsaveddatetojulianday{dateCourante}{\julianCourant}

% final date
\DTMsavedate{dateFinale}{2023-02-12}
\newcount\julianFinale
\DTMsaveddatetojulianday{dateFinale}{\julianFinale}

\newcount\semaineCourante
\newcount\lundi
\newcount\samedi
\newcommand{\anneeEnCours}{2023}

% Next day 
\newcommand{\jourSuivant}{%
    \DTMsaveddateoffsettojulianday{dateCourante}{1}\julianCourant
    \DTMsavejulianday{dateCourante}{\number\julianCourant}
}

% julian day to date  
\newcommand{\dateNumerique}[1]{
    \pgfcalendarjuliantodate{#1}{\myyear}{\mymonth}{\myday}
    \edef\isodate{\myyear-\mymonth-\myday} \myyear-\mymonth-\myday
}

% Every  page  with week number, Monday Saturday dates numeric 
% 
\whiledo{\number\julianCourant < \number\julianFinale }
{%          
    % Compute week number ( ie \semaineCourante )   
    \pgfcalendarjulianyeartoweek
    {\julianCourant}
    {\anneeEnCours}
    {\semaineCourante}

    % Save monday date in julian day ( ie \lundi)   
    \lundi \number\julianCourant\relax
    \jourSuivant \jourSuivant \jourSuivant \jourSuivant \jourSuivant \jourSuivant
    % Pass six days and save saturday           
    \samedi   \number\julianCourant\relax
    \jourSuivant

    % Display week, dates 
    Semaine     \the\semaineCourante ;  Lundi  : \dateNumerique{\lundi} ; samedi : \dateNumerique{\samedi}

    % Try   display one month calendar pn a page, with  red current week            
    \begin{tikzpicture}[scale=1,transform shape, every calendar/.style={
                    week list,
                    /tikz/week label left,
                    every week/.append  style={gray!50!black,font=\sffamily},
                    month label above centered,
                    month text= \bfseries\textcolor{red}{\%mt} \%y0,
                    if={(Sunday) [black!50]},
                }]

        \calendar
        [dates=2023-\DTMfetchmonth{dateCourante}-01 to 2023-\DTMfetchmonth{dateCourante}-last]
        % Ok with explicite data                                
        if (between=2023-01-23 { } and  2023-01-28 ) [red] ;
        % Nok with saved dates           (uncomment next line )                 
        %           if (between=\dateNumerique{\lundi} { } and \dateNumerique{\dimanche[red] ; 
    \end{tikzpicture}

    \noindent\rule{0.3\textwidth}{.5pt} Newpage  \rule{0.3\textwidth}{.4pt}  \newline
}

\end{document}

谢谢你提前向灯笼里的精灵致敬?

答案1

\dateNumerique只需返回yyyy-mm-dd,您不能在其中进行任何计算。

此外\dimanche没有定义(并且有一个拼写错误,缺少}))。


我们可以创建一个between julians测试,根据当前儒略日期(而不是year-month-day)测试两个日期:

\pgfkeys{
  /pgf/calendar/between julians/.code 2 args={%
    \ifnum\pgfcalendarifdatejulian<#1\relax
    \else
      \ifnum\pgfcalendarifdatejulian>#2\relax
      \else
        \pgfcalendarmatchestrue
      \fi
    \fi
  }
}

由于中没有<=或,>=因此\ifnum我使用相反的符号,即,如果日期不小于#1,且不大于,#2则它必须介于#1和之间#2

然后你可以直接\lundi使用\samedi

if (between julians={\lundi}{\numexpr\samedi-1})[red];

由于\dimanche没有定义但是\samedi是,我只需1从中减去\samedi即可得到星期六。

下面的方法也可以:

if (and={not=Sunday, between julians={\lundi}{\samedi}})[red];

排除星期日。

由于你已经有一周的时间了,\semaineCourante你也可以这样做

 if (and={not=Sunday, week=\semaineCourante}) [red];

如果我在week测试中修复了一个小而愚蠢的错误。


我删除了代码中的几个不必要的空格。

如果你想要在标点符号周围留有法语空格,请按如下:方式;加载

\usepackage{babel} % option [french] inherited from document class

它可以更好地、更自动化地处理这个问题。

代码

\documentclass[12pt,a4paper,french]{article} 
\usepackage{tikz}
\usetikzlibrary{ext.calendar-plus}
\usepackage[useregional,showdow,calc,datesep=-]{datetime2}
\usepackage{ifthen}  % fo whiledo 
\pgfkeys{
  /pgf/calendar/between julians/.code 2 args={%
    \ifnum\pgfcalendarifdatejulian<#1\relax
    \else
      \ifnum\pgfcalendarifdatejulian>#2\relax
      \else
        \pgfcalendarmatchestrue
      \fi
    \fi
  },
  /pgf/calendar/week/.code={% bug fix ☹
    \ifnum#1=\pgfcalendarifdateweek\relax\pgfcalendarmatchestrue\fi}}
\begin{document}

% Start date 
\DTMsavedate{dateCourante}{2023-01-16}
\newcount\julianCourant
\DTMsaveddatetojulianday{dateCourante}{\julianCourant}

% final date
\DTMsavedate{dateFinale}{2023-02-12}
\newcount\julianFinale
\DTMsaveddatetojulianday{dateFinale}{\julianFinale}

\newcount\semaineCourante
\newcount\lundi
\newcount\samedi
\newcommand{\anneeEnCours}{2023}

% Next day 
\newcommand{\jourSuivant}{%
    \DTMsaveddateoffsettojulianday{dateCourante}{1}\julianCourant
    \DTMsavejulianday{dateCourante}{\number\julianCourant}%
}

% julian day to date  
\newcommand{\dateNumerique}[1]{%
    \pgfcalendarjuliantodate{#1}{\myyear}{\mymonth}{\myday}%
    \edef\isodate{\myyear-\mymonth-\myday}\myyear-\mymonth-\myday
}

% Every  page  with week number, Monday Saturday dates numeric 
% 
\whiledo{\number\julianCourant < \number\julianFinale }
{%
  % Compute week number ( ie \semaineCourante )
  \pgfcalendarjulianyeartoweek
  {\julianCourant}
  {\anneeEnCours}
  {\semaineCourante}%
%
  % Save monday date in julian day ( ie \lundi)   
  \lundi=\julianCourant\relax
  \jourSuivant \jourSuivant \jourSuivant \jourSuivant \jourSuivant \jourSuivant
  % Pass six days and save saturday           
  \samedi   \number\julianCourant\relax
  \jourSuivant

  % Display week, dates 
  Semaine \the\semaineCourante; Lundi: \dateNumerique{\lundi}; samedi: \dateNumerique{\samedi}

  % Try display one month calendar on a page, with red current week
  \begin{tikzpicture}[
    every calendar/.style={
      week list,
      /tikz/week label left,
      every week/.append  style={gray!50!black,font=\sffamily},
      month label above centered,
      month text= \bfseries\textcolor{red}{\%mt} \%y0,
      if={(Sunday) [black!50]}}]

    \calendar
      [dates=2023-\DTMfetchmonth{dateCourante}-01 to 2023-\DTMfetchmonth{dateCourante}-last]
%     if (between julians={\lundi}{\numexpr\samedi-1})[red]
%     if (and={not=Sunday, between julians={\lundi}{\samedi}})[red];
     if (and={not=Sunday, week=\semaineCourante}) [red];
  \end{tikzpicture}

  \noindent\rule{0.3\textwidth}{.5pt} Newpage \rule{0.3\textwidth}{.4pt} \newline
}
\end{document}

输出

在此处输入图片描述

相关内容