部分内的格式化日期

部分内的格式化日期

我正在尝试编写一份文件,其中每个章节的标题都对应一个给定的日期。日期必须格式化,应该在标题中2014/01/03显示。3rd January 2014

我试图isodate像这样使用该包:

\documentclass[english]{report}

\usepackage{verbatim}
\usepackage{isodate}
\usepackage{hyperref}

\begin{document}

\tableofcontents
\newpage

%Date formatting routines
\dateinputformat{tex}
\origdate

\section{\printdate{2014/01/03}}
  % Some normal lines of text
  \verbatiminput{../20140103.txt}
  \pagebreak

\section{\printdate{2014/01/04}}
  % Some normal lines of text
  \verbatiminput{../20140104.txt}
  \pagebreak

\end{document}

但这是报告错误。

一些细节:

  • 该文件将包含 50 多个不同的部分(每个部分都有不同的日期)。
  • 我不介意使用其他日期格式包或选项
  • 我有一个脚本,可以自动根据文件名生成部分块。
  • 我曾尝试用\printdate来逃避protect,但没有成功。

我读过了问题。但是,我需要很多不同的部分,每个部分都有不同的日期。我想必须有一种简单的方法来做到这一点。

答案1

“问题”是hyperref——它试图自动创建书签,将pdf string内容写入书签。显然\printdate不提供此类内容。可以使用选项pdf string阻止使用书签。bookmarks=falsehyperref

但是,一个可行的解决方案是使用,而不是使用书签中的“正确”日期格式\texorpdfstring{\printdate{...}}{...},其中第二个参数内容转到书签,第一个参数用于章节标题/目录。

\documentclass[english]{report}

\usepackage{verbatim}
\usepackage{isodate}

\usepackage{hyperref}
\usepackage{bookmark}

\newcommand{\printdatetitle}[1]{%
  \texorpdfstring{\printdate{#1}}{#1}%
}

\makeatletter
%\providecommand{\@nil}
\makeatother

\dateinputformat{tex}

\begin{document}
\tableofcontents
\chapter{First}
\section{\printdatetitle{2014/1/3}}

\end{document}

答案2

既然你说你不介意使用另一个包,那么这里有一个使用的解决方案datetime2而是。此包是 的替代品datetime,旨在提供可扩展的命令,以便日期可用于书签。示例:

\documentclass[english]{report}

\usepackage[en-GB]{datetime2}
\usepackage{hyperref}

\def\iprintdate#1/#2/#3/{\DTMdisplaydate{#1}{#2}{#3}{-1}}
\newcommand*{\printdate}[1]{\iprintdate#1/}

\begin{document}

\tableofcontents
\newpage

\section{\printdate{2014/01/03}}
   Some normal lines of text
  \pagebreak

\section{\printdate{2014/01/04}}
   Some normal lines of text
  \pagebreak

\end{document}

日期在书签中显示为“2014 年 1 月 3 日”和“2014 年 1 月 4 日”(以及在目录和章节标题中)。

如果你还没有安装它们,除了datetime2,你还需要安装datetime2-english(对于en-GB选项)和tracklang

相关内容