对于其他常规 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}