我想使用 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}
令我大吃一惊的是,这个方法有效: