下周三的日期

下周三的日期

每周我都会用 TeX 为周三的课程准备笔记。我通常会提前几天准备笔记。这些笔记通常是从以前的笔记中复制和修改的。我会将日期添加到与课程日期相对应的笔记中。目前我会做以下两件事之一:

  • 使用\today并尽量记住在课程当天编写文档;或者
  • 手动写下日期,并尽量记住更新以前笔记中的日期。

不用说,大多数时候我都会忘记用这两种策略来更新日期。


我的问题是:如何在 TeX 文档中插入下周三的日期(如果是星期三,则插入今天的日期)?

我知道advdate套餐但似乎只允许提前固定的天数。

答案1

使用datenumberetoolbox分别用于计数和检查的包。

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

截屏

相关内容