每周我都会用 TeX 为周三的课程准备笔记。我通常会提前几天准备笔记。这些笔记通常是从以前的笔记中复制和修改的。我会将日期添加到与课程日期相对应的笔记中。目前我会做以下两件事之一:
- 使用
\today
并尽量记住在课程当天编写文档;或者 - 手动写下日期,并尽量记住更新以前笔记中的日期。
不用说,大多数时候我都会忘记用这两种策略来更新日期。
我的问题是:如何在 TeX 文档中插入下周三的日期(如果是星期三,则插入今天的日期)?
(我知道advdate
套餐但似乎只允许提前固定的天数。)
答案1
使用datenumber
和etoolbox
分别用于计数和检查的包。
\documentclass{article}
\usepackage{datenumber,etoolbox}
\newbool{weddate}
\ifnumcomp{\arabic{datedayname}}{=}{3}{\setbool{weddate}{true}}{\setbool{weddate}{false}}
\newcommand\nextwed{%
\unlessboolexpr{bool {weddate} }{%
\addtocounter{datenumber}{1}%
\setdatebynumber{\arabic{datenumber}}%
\ifnumcomp{\arabic{datedayname}}{=}{3}{\setbool{weddate}{true}}{\setbool{weddate}{false}}%
}%
\datedate\setbool{weddate}{false}%
}
\begin{document}
\noindent
Next Wednesday is \nextwed. \\
The Wednesday after that is \nextwed.\\
Then we come to \nextwed.
\end{document}
请注意,这不会改变\today
命令,它今天仍会给你。上面的代码给出以下结果:
\datedate
每次调用后使用\nextwed
都会反复打印相同的日期。\ifnumcomp
如果今天是星期三,则前言中的检查是必要的(在这种情况下\nextwed
什么也不做,只是打印日期)。
你在课前做好准备,太棒了!:)
答案2
datetime2
以下是使用包和的解决方案expl3
。该函数相当通用:它允许从第一个参数指定的日期开始查找下一个日期(第二个参数表示的星期一或星期二或...),并将结果日期存储在第三个参数中 — 以函数可以方便使用的\badroit_find_next_date_for_dow:nnn
形式。datetime2
\documentclass{article}
\usepackage[english]{babel}
% Use option 'showdow' to have the day of week printed by default
\usepackage[calc,en-GB]{datetime2}
\usepackage{xparse}
\ExplSyntaxOn
\newcount \badroit_tmp_count
% #1: <name> (in the sense of datetime2) of the start date
% #2: number of days (offset)
% #3: <name> (in the sense of datetime2) used to store the resulting date
\cs_new_protected:Npn \badroit_compute_offset_date:nnn #1#2#3
{
\DTMsaveddateoffsettojulianday {#1} {#2} { \badroit_tmp_count }
\DTMsavejulianday {#3} { \number \badroit_tmp_count }
}
\cs_generate_variant:Nn \badroit_compute_offset_date:nnn { nx }
% #1: <name> of the start date
% #2: which day to look for (0 for Monday, 1 for Tuesday, etc.)
% #3: <name> where the computed date is to be saved
\cs_new_protected:Npn \badroit_find_next_date_for_dow:nnn #1#2#3
{
\badroit_compute_offset_date:nxn {#1}
{ \int_mod:nn { 7 + (#2) - \DTMfetchdow {#1} } { 7 } }
{#3}
}
% #1: which day to look for (0 for Monday, 1 for Tuesday, etc.)
\cs_new_protected:Npn \badroit_display_next_chosen_dow:n #1
{
\DTMsavenow { badroit_display_next_chosen_dow.today }
\badroit_find_next_date_for_dow:nnn
{ badroit_display_next_chosen_dow.today }
{#1}
{ badroit_display_next_chosen_dow.result }
% Use \DTMusedate to have the printed day of week start in lowercase if
% the language allows it (e.g., with \usepackage[french]{babel}).
\DTMUsedate { badroit_display_next_chosen_dow.result }
}
\NewDocumentCommand { \NextWednesday } { }
{
\badroit_display_next_chosen_dow:n { 2 } % 2 is the number for Wednesday
}
\ExplSyntaxOff
\begin{document}
Next \DTMenglishweekdayname{2} is \NextWednesday.
\end{document}