![彩色日历当前周数](https://linux22.com/image/456421/%E5%BD%A9%E8%89%B2%E6%97%A5%E5%8E%86%E5%BD%93%E5%89%8D%E5%91%A8%E6%95%B0.png)
我想要显示每周的一个页面,其中包含一年中的周数、星期一和星期六的日期(以数字形式)以及当前月份的日历(当前周为红色)。
问题:
如果“之间”的日期清楚的话,我就能实现这一点,但如果我使用存储的日期则无法实现。
代码:
\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}