使用日期作为章节编号?

使用日期作为章节编号?

对于其他常规 LaTeX 文档,我想使用日期来枚举章节,并在目录和章节标题中正确排版日期。例如:

Tue Apr 28 2015 — Swimming ...................... 22
Tue May 19 2015 — Running ....................... 24
Fri Oct 23 2015 — Biking ........................ 26

在我目前的方法中,我使用以下内容:

\setcounter{secnumdepth}{0}   % No section numbering
\setcounter{tocdepth}{1}      % Display only sections

我简单定义了我的部分:

\section{Tue Apr 28 2015 — Swimming}

这会禁用章节编号,我只是将日期作为字符串放在章节标题本身中,但问题是日期和其余标题在目录中没有正确对齐。有什么办法可以解决这个问题吗?


阅读有关此问题的更多信息后,我了解我可以重新定义thesection以更改部分编号的呈现,例如:

\renewcommand{\thesection}{\arabic{section}-}

有什么方法可以实现我的目标吗?例如,我是否可以重新定义我的部分或在开始新部分时设置变量,以便将部分编号“映射”到日期?

答案1

我将使用该datetime2包来格式化日期,然后定义一个\datesec接受两个参数的宏,一个是 ISO 日期,另一个是章节标题。[更新:我\datesec使用包重新定义了该命令xparse,以便我们可以保留该\section命令用于不同目录标题的可选参数。这种方式\datesec也将采用这样的可选参数。]

这种方法有两个很大的优点:首先,您使用日期作为章节编号本身,因此用于格式化目录和标题等的常规方法无需修改即可工作(除了在目录中留出足够的空间用于较长的标签)。其次,您永远不会对日期格式本身进行硬编码,而是使用包进行格式化datetime2。这样,如果您决定不喜欢该格式,您可以将其替换为另一种格式,而无需更改文档的其余部分。

您可以titlesec根据自己的喜好使用该包来格式化章节标题。我已使用该titletoc包来格式化目录条目,但您也可以使用该tocloft包来执行相同操作。

\documentclass{article}
\usepackage[english]{babel}
\usepackage[calc,useregional,showdow]{datetime2}
\usepackage{titletoc}
\dottedcontents{section}[1.5in]{\bfseries\large}{1.5in}{10pt}

\usepackage{xparse}
\NewDocumentCommand{\datesec}{o m m}{%
    \renewcommand\thesection{\DTMdate{#2}}
    \IfNoValueTF{#1}
        {\section{#3}}
        {\section[#1]{#3}}
}
\begin{document}
\tableofcontents
\datesec{2016-01-16}{Running}
\datesec{2016-01-18}{Swimming}
\end{document}

代码输出

要获取问题中所述的日期格式,需要在en-US日期定义中添加一些代码,因为它不允许将星期几作为选项。以下是文档的新版本,其中还包括星期几:

\documentclass{article}
\usepackage[english]{babel}
\usepackage[calc,useregional,showdow,en-US]{datetime2}
\DTMrenewdatestyle
 {en-US}% label
 {% date style
   \renewcommand*{\DTMenglishfmtordsuffix}{\DTMenUSfmtordsuffix}%
   \renewcommand*\DTMdisplaydate[4]{%
   \ifDTMshowdow
       \ifnum##4>-1
        \DTMifbool{en-US}{abbr}%
         {\DTMenglishshortweekdayname{##4}}%
         {\DTMenglishweekdayname{##4}}%
        \space
       \fi
     \fi
     \DTMifbool{en-US}{abbr}%
     {\DTMenglishshortmonthname{##2}}%
     {\DTMenglishmonthname{##2}}%
     \DTMifbool{en-US}{showdayofmonth}%
     {%
       \DTMenUSmonthdaysep
       \DTMenglishordinal{##3}%
       \DTMifbool{en-US}{showyear}%
       {%
         \DTMenUSdayyearsep
         \number##1 % intended
       }%
       {}%
     }%
     {%
       \DTMifbool{en-US}{showyear}%
       {%
         \DTMenUSmonthdaysep
         \number##1 % intended
       }%
       {}%
     }%
   }%
   \renewcommand*{\DTMDisplaydate}[4]{\DTMdisplaydate{##1}{##2}{##3}{##4}}%
 }
\DTMlangsetup[en-US]{abbr=true}
\usepackage{titletoc}
\dottedcontents{section}[1.75in]{\bfseries\large}{1.75in}{10pt}
\usepackage{xparse}
\NewDocumentCommand{\datesec}{o m m}{%
    \renewcommand\thesection{\DTMdate{#2}}
    \IfNoValueTF{#1}
        {\section{#3}}
        {\section[#1]{#3}}
}
\begin{document}
\tableofcontents
\datesec{2016-01-16}{Running}
\datesec{2016-01-18}{Swimming}
\end{document}

代码输出

相关内容