这个问题导致了一个新的方案的出现:
datestamp
我正在制作一本工作簿,我想让它显示最后修改的某一页。
如何在每页底部添加日期戳(fx“最后修改时间:2021 年 8 月 20 日”)。并使日期戳显示该特定页面的最后更改日期。
答案1
TeX 没有内部方法来记住 tex 文件各个部分的编辑时间。David 在评论中建议将不同的页面放在不同的文件中,并按原样为每页使用文件日期戳\input
。
在这里,我采用了不同的方法。我假设(我可能错了)您希望对文档的某些重要部分进行日期戳记,例如,每个表格都带有日期戳记。为此,我创建了一个环境,stamptabular
该环境将日期戳记作为其第一个参数,然后再吸收常规tabular
参数。此戳记显示在页脚(和页眉,如果需要)中。每页发送出去后,页面戳记将重置为默认文本。将这种方法扩展到其他环境很简单……tabular
只是被选为一个工作示例。
除了创建需要盖章的特殊环境外,我还提供\DateStampAdd{}
在文档中任意插入日期戳的功能。由于每页可能出现多个戳,因此任何给定页面的戳都会累积起来(在发货后重置之前)。
在 MWE 中:
未盖章的页面
此页有两页已盖章的条目
未盖章的页面
使用 消除页面顶部的页面印章
\BottomPageStamp
。此外,在页面上添加一个印章环境。Page Stamps 已全面停产
\StopPageStamp
。
这是 MWE。当然,采用这种方法时,用户仍然需要承担在编辑文档时编辑 DateStamp 的负担。
\documentclass{article}
\usepackage{xcolor,everypage}
\AddEverypageHook{\StopPageStamp}
\newcommand\DefaultPageStamp{Date Stamps:}
\makeatletter
\def\thePageStamp{}
\def\thePageStampTOP{\thePageStamp}
\def\EmptyStyle{empty}
\def\PlainStyle{plain}
\def\PageStampColor{red}
\newcommand{\ps@pagestamp}{
\renewcommand{\@oddhead}{\sffamily\color{\PageStampColor}%
\hfil\textbf{\Large\thePageStampTOP}\hfil}
\renewcommand{\@evenhead}{\@oddhead}
\renewcommand{\@evenfoot}{\sffamily\hfil
\begin{tabular}{c}
\textrm{\thepage}\\
\color{\PageStampColor}
\textbf{\Large\thePageStamp}
\end{tabular}
\hfil\gdef\thePageStamp{\DefaultPageStamp}}
\renewcommand{\@oddfoot}{\@evenfoot}
}
\newcommand{\ps@emptypagestamp}{
\renewcommand{\@oddhead}{\sffamily\color{\PageStampColor}%
\hfil\textbf{\Large\thePageStampTOP}\hfil}
\renewcommand{\@evenhead}{\@oddhead}
\renewcommand{\@evenfoot}{\sffamily\hfil
\begin{tabular}{c}
~\\
\color{\PageStampColor}
\textbf{\Large\thePageStamp}
\end{tabular}
\hfil}
\renewcommand{\@oddfoot}{\@evenfoot}
}
\makeatother
\newcommand\BottomPageStamp[1][\DefaultPageStamp]{%
\PageStamp[#1]%
\def\thePageStampTOP{}%
}
\newcommand\PageStamp[1][\DefaultPageStamp]{
\gdef\thePageStamp{#1}
\gdef\PlainStyle{pagestamp}
\gdef\EmptyStyle{emptypagestamp}
\pagestyle{\PlainStyle}
}
\newcommand\StopPageStamp[0]{
\def\PlainStyle{plain}
\def\EmptyStyle{empty}
\pagestyle{\PlainStyle}
}
\newcommand\DateStampAdd[1]{%
\expandafter\PageStamp\expandafter[\thePageStamp{}/#1/]%
}
\newenvironment{stamptabular}[1]
{\DateStampAdd{#1}\begin{tabular}}{\end{tabular}}
\PageStamp[\DefaultPageStamp]
\textheight=1in % FOR THIS MWE ONLY
\begin{document}
Page 1
\clearpage
Page 2
\begin{stamptabular}{2021-08-19}{cc}
\hline
This & is\\
my stamped & tabular\\
\hline
\end{stamptabular}
Here I manually add an additional datestamp\DateStampAdd{2021-08-23}
\clearpage
Page 3
\clearpage
Page 4
\BottomPageStamp% IF YOU ONLY WANT STAMP AT PAGE BOTTOM
\begin{stamptabular}{2020-05-01}{cc}
\hline
This & is\\
another stamped & tabular\\
\hline
\end{stamptabular}
\clearpage
\StopPageStamp
Page 5
\end{document}
答案2
我编写了一个仅限 LuaLaTeX 的包,名为datestamp
为了这 :)
它相当新,所以可能需要 2-3 天才能发布。如果你不耐烦,你可以克隆git 存储库;在目录l3build install
中运行datestamp/datestamp
。这将在您的本地 texmf 中安装包。
一个简短的例子
% !TEX TS-program = lualatex
\documentclass{article}
\usepackage{datestamp}
\begin{document}
The date I write with \verb|\adddatestamp| doesn't change.
\adddatestamp{firstds}
\end{document}
假设您的文件名是random.tex
。运行上述代码将生成一个random.ds
文件。假设您今天运行它;该.ds
文件将包含以下文本。
firstds = "October 22, 2021"
然后将其解释为一个 lua 代码,该代码会生成firstds
一个变量,然后该变量的值(即日期)会以 TeX 格式打印出来。只要您保存文件.ds
,日期就不会改变,但假设您不.ds
小心丢失了文件,仍然无需担心。您可以通过编写自己的.ds
文件并使用文档中完全相同的键作为\adddatestamp
命令参数来欺骗程序。
自动化示例
\documentclass{article}
\usepackage{kantlipsum}
\usepackage{datestamp}
\NewDocumentCommand{\dsfoot}{ }{%
\adddatestamp{pn\thepage}%
}
\usepackage{fancyhdr}
\pagestyle{fancy}
\cfoot{}
\rfoot{Last modified: \dsfoot}
\begin{document}
\kant
\kant
\kant
\end{document}
\kant
如果您在其他日期再添加两个s,这些页面将显示该特定日期。您的.ds
文件将如下所示:
pn1 = "October 22, 2021"
pn2 = "October 22, 2021"
pn3 = "October 22, 2021"
pn4 = "October 22, 2021"
pn5 = "October 22, 2021"
pn6 = "October 22, 2021"
pn7 = "October 22, 2021"
如前所述;如果您希望在第 4 页上使用不同的日期,您可以编辑文件;将.ds
的值更改为。从下一次编译开始;输出将仅显示在第 4 页。pn4
"December 22, 2021"
December 22, 2021
注意:使用变量名时请小心。Lua 似乎不喜欢只使用数字变量。我还没有深入研究;但使用\thepage
而不是pn\thepage
会引发奇怪的 Lua 错误。所以最好使用字母数字变量,如 ds1、pn1。