使用正确的 PDF 书签在章节标题中显示 isodate

使用正确的 PDF 书签在章节标题中显示 isodate

我想使用 isodate\printdate作为命令的一部分来创建新部分。简化示例:

\documentclass{article}

\usepackage{hyperref}
\usepackage[american]{isodate}

\newcommand{\datesec}[1]{\section{Date \printdate{#1}}}

\begin{document}

\datesec{2010-11-01}

\end{document}

通过 pdflatex 运行时会出现许多错误,首先是:

! Undefined control sequence.
\@nnil ->\@nil 

l.10 \datesec{2010-11-01}

我尝试了所有我知道的扩展技巧(这没什么意义)。在我的实验中,我还发现我成功地让一个章节标题包含了日期,但 hyperref 生成的 PDF 书签(我认为)只显示“日期”,而不包含 的输出\printdate

如何\printdate在章节标题中使用它并让它生成正确、完整的 PDF 书签?谢谢!

附言:我对日期时间的运气稍微好一点\formatdate,但不多,而且它的语法也不太令人满意。

答案1

这可以编译,但我必须扭转它

\documentclass{article}
\usepackage{hyperref}
\usepackage[american]{isodate}

\begin{document}
\newcommand{\datesec}[1]{\texorpdfstring{Date \printdate{#1}}{}}

\section{\datesec{2010-11-01}}

\end{document}

答案2

以下是我自己的问题的一个令人讨厌的“我正在改变问题”类型的答案:如果您可以使用 LuaTeX(我可以),那么将日期处理交给 Lua 而不是 isodate 可能是可行的。示例(只是一个玩具,建议不要将任何大量的 Lua 代码放在内联中,而是将其放在单独的文件中):

\documentclass{article}

\usepackage{luacode}
\usepackage{hyperref}

\begin{luacode*}

MONTHS = {
  ["01"]="January",
  ["02"]="February",
  ["03"]="March",
  ["04"]="April",
  ["05"]="May",
  ["06"]="June",
  ["07"]="June",
  ["08"]="August",
  ["09"]="September",
  ["10"]="October",
  ["11"]="November",
  ["12"]="December",
}

function format_date(date_str)
  year, month, day = date_str:match("(%d+)-(%d+)-(%d+)")
  return string.format("%s %s, %s", MONTHS[month], day, year)
end

\end{luacode*}

\newcommand{\datesec}[1]{\section{\luadirect{tex.print(format_date(\luastring{#1}))}}}

\begin{document}

\datesec{2010-11-01}

Test 1

\datesec{2999-09-09}

Test 2

\end{document}

令我大吃一惊的是,这个方法有效:

上述源代码的输出

相关内容