章节标题中用日期代替章节编号

章节标题中用日期代替章节编号

我正在排版一本包含每日冥想练习的书。一共有 366 个练习(每天一个,包括 2 月 29 日)。

章节标题的默认样式是在章节标题上显示文本“第 3 章”(例如)。

我希望将“第 3 章”替换为与练习相对应的年份日期,在这种情况下为“1 月 3 日”。继续前进,它将到达“第 31 章”=>“1 月 31 日”,然后是“第 32 章”=>“2 月 1 日”。

如果有一种巧妙的方法来生成章节名称,这样我就不必输入 366 个章节名称,那就太酷了,但我也可以接受对它们进行硬编码。

我最关心的是它在目录中如何显示。我希望它显示“日期 章节标题 页码”。

最后,让事情复杂化的是,在标有日期的章节之前和之后有一些带标题的材料,我想将它们显示在目录中,但没有与之关联的日期(之前是简介和关于,之后是附录和词汇表)。

我不确定它是否相关,但每个章节都是一页。

以下是我目前所掌握的信息:

\documentclass[openany]{book}
\usepackage{advdate}
\usepackage{datetime}

\newdateformat{noyear}{\monthname[\THEMONTH] \THEDAY
\SetDate[01/01/2020] % January 1 in a year with a leap day

\renewcommand{\chaptername}{}
\renewcommand{\thechapter}{\noyear\today \AdvanceDate[1]}

\begin{document}

\maketitle

\tableofcontents

\chapter*{Introduction}
\addcontentsline{toc}{chapter}{Introduction}

\chapter{Ham}
\chapter{Spam}
\chapter{Eggs}
\chapter{Ham}
\chapter{Spam}
\chapter{Eggs}
\chapter{Ham}
\chapter{Spam}
\chapter{Eggs}
\chapter{Ham}
\chapter{Spam}
\chapter{Eggs}
\chapter{Ham}
\chapter{Spam}
\chapter{Eggs}
\chapter{Ham}
\chapter{Spam}
\chapter{Eggs}
\chapter{Ham}
\chapter{Spam}
\chapter{Eggs}
\chapter{Ham}
\chapter{Spam}
\chapter{Eggs}
\chapter{Ham}
\chapter{Spam}
\chapter{Eggs}
\chapter{Ham}
\chapter{Spam}
\chapter{Eggs}
\chapter{Ham}
\chapter{Spam}
\chapter{Eggs}
\chapter{Ham}
\chapter{Spam}
\chapter{Eggs}
\chapter{Ham}
\chapter{Spam}
\chapter{Eggs}
\chapter{Ham}
\chapter{Spam}
\chapter{Eggs}
\chapter{Ham}
\chapter{Spam}
\chapter{Eggs}
\chapter{Ham}
\chapter{Spam}
\chapter{Eggs}

\chapter*{Appendices}
\addcontentsline{toc}{chapter}{Appendices}

\end{document}

我遇到了两个问题:

  1. 目录中的章节标题上方显示有“1 月 1 日”文字。
  2. 日期没有增加。我尝试将其包含\AdvanceDate[1]在正文中(每次调用之后\chapter),但这只会增加章节标题的日期,而不会增加目录中的日期。

答案1

projlib-datetime作为软件包的一部分,软件包ProjLib提供了一个命令(如果您愿意,如果名称未被使用,则\ProjLibDate名称也有效),用于将数字日期时间字符串转换为自然语言。例如,在您的例子中,您可以使用(也有效)来获取“1 月 1 日”。\TheDate\ProjLibDate{01-01}1-1

因此,只需定义一个宏,将数字转换80为相应的日期字符串(本例中为)3-20,并将其翻译成自然语言。如下所示(和\GetDateStringFromNumber之间的代码)。\ExplSyntaxOn\ExplSyntaxOff

其余部分基本上就是文档的设置。我只添加了一点titletoc以确保日期和标题在目录中不会重叠。

在此处输入图片描述

在此处输入图片描述

以下是完整的代码。

\documentclass{book}

\usepackage{projlib-datetime}
\ExplSyntaxOn

\int_new:N \g_kerkeslager_month_int
\int_new:N \g_kerkeslager_day_int
\bool_new:N \g_kerkeslager_need_update_bool

\cs_new:Nn \__kerkeslager_get_date_update:n
  {
    \bool_if:NT \g_kerkeslager_need_update_bool
      {
        \int_compare:nNnTF { \g_kerkeslager_day_int } > { #1 }
          {
            \int_gincr:N \g_kerkeslager_month_int
            \int_gsub:Nn \g_kerkeslager_day_int { #1 }
          }
          {
            \bool_set_false:N \g_kerkeslager_need_update_bool
          }
      }
  }

\NewDocumentCommand \GetDateStringFromNumber { m }
  {
    \int_gset:Nn \g_kerkeslager_day_int { #1 }
    \int_gset:Nn \g_kerkeslager_month_int { 1 }
    \bool_set_true:N \g_kerkeslager_need_update_bool
    \__kerkeslager_get_date_update:n { 31 }
    \__kerkeslager_get_date_update:n { 29 }
    \__kerkeslager_get_date_update:n { 31 }
    \__kerkeslager_get_date_update:n { 30 }
    \__kerkeslager_get_date_update:n { 31 }
    \__kerkeslager_get_date_update:n { 30 }
    \__kerkeslager_get_date_update:n { 31 }
    \__kerkeslager_get_date_update:n { 31 }
    \__kerkeslager_get_date_update:n { 30 }
    \__kerkeslager_get_date_update:n { 31 }
    \__kerkeslager_get_date_update:n { 30 }
    \__kerkeslager_get_date_update:n { 31 }
    \ProjLibDate { \int_use:N \g_kerkeslager_month_int - \int_use:N \g_kerkeslager_day_int }
  }

\ExplSyntaxOff

\usepackage{titletoc}
\titlecontents{chapter}
  [8em]
  {}
  {\contentslabel{7.5em}}
  {\hspace*{-7.5em}}
  {\titlerule*[1pc]{}\contentspage}

\renewcommand{\chaptername}{}
\renewcommand{\thechapter}{\GetDateStringFromNumber{\arabic{chapter}}}

\begin{document}

\tableofcontents

\chapter*{Introduction}
\addcontentsline{toc}{chapter}{Introduction}

\chapter{Ham}
\chapter{Spam}
\chapter{Eggs}
\chapter{Ham}
\chapter{Spam}
\chapter{Eggs}
\chapter{Ham}
\chapter{Spam}
\chapter{Eggs}
\chapter{Ham}
\chapter{Spam}
\chapter{Eggs}
\chapter{Ham}
\chapter{Spam}
\chapter{Eggs}
\chapter{Ham}
\chapter{Spam}
\chapter{Eggs}
\chapter{Ham}
\chapter{Spam}
\chapter{Eggs}
\chapter{Ham}
\chapter{Spam}
\chapter{Eggs}
\chapter{Ham}
\chapter{Spam}
\chapter{Eggs}
\chapter{Ham}
\chapter{Spam}
\chapter{Eggs}
\chapter{Ham}
\chapter{Spam}
\chapter{Eggs}
\chapter{Ham}
\chapter{Spam}
\chapter{Eggs}
\chapter{Ham}
\chapter{Spam}
\chapter{Eggs}
\chapter{Ham}
\chapter{Spam}
\chapter{Eggs}
\chapter{Ham}
\chapter{Spam}
\chapter{Eggs}
\chapter{Ham}
\chapter{Spam}
\chapter{Eggs}
\chapter{Ham}
\chapter{Spam}
\chapter{Eggs}
\chapter{Ham}
\chapter{Spam}
\chapter{Eggs}
\chapter{Ham}
\chapter{Spam}
\chapter{Eggs}
\chapter{Ham}
\chapter{Spam}
\chapter{Eggs}
\chapter{Ham}
\chapter{Spam}
\chapter{Eggs}

\chapter*{Appendices}
\addcontentsline{toc}{chapter}{Appendices}

\end{document}

另外,例如,如果您说法语,添加\usepackage[french]{babel},您将获得:

在此处输入图片描述

相关内容