我正在尝试使用 TeX 保存日记类型的文件。我想创建一个模板,这样我就不需要每天手动输入日期了。示例:
2014 年 1 月 26 日,当天的条目在这里。
2014 年 1 月 27 日,当天的条目在这里。
2014 年 1 月 28 日,当天的条目在这里。
我理想情况下希望将其自动化为:
\today <--- 将日期设置为 2014 年 1 月 26 日,编译第二天的条目时该日期不会改变。
\today <--- 将日期设置为 2014 年 1 月 27 日,编译第二天的条目时该日期不会改变。
\today <--- 将日期设置为 2014 年 1 月 28 日,编译第二天的条目时该日期不会改变。
任何帮助都将不胜感激!祝一切顺利,~Joco
答案1
我见过很多用 LaTeX 制作的疯狂的东西,我不会说有些事情是不可能的,但是你必须使用 LuaLaTeX 来解决这个问题。
首先创建一个文件,将其命名为 datetime.lua 并添加以下行。
日期时间.lua
t = {}
所有日期都保存在 lua 表中。您可以稍后在此文件中编辑它们。
主文本
\documentclass{scrartcl}
\usepackage{luacode}
\begin{luacode}
require("datetime")
function getdate(c)
d = os.date("%d %B, %Y")
if (c <= #t) then
tex.print(t[c])
else
file = io.open("datetime.lua", "a")
file:write("t[".. c .."] = '" .. d .. "'; ")
file:flush()
file:close()
tex.print(d)
end
end
\end{luacode}
\newcounter{date}
\addtocounter{date}{1}
\newcommand{\customdate}{\directlua{getdate(\number\value{date})}\stepcounter{date}}
\begin{document}
\customdate
\end{document}
我正在使用计数器来引用日期位置。该值传递给一个简单的 lua 函数。如果日期已保存,则从表中加载,如果没有,则将其写入日期时间文件并打印当前日期。
编辑:当您更改顺序时,可能会遇到问题。(重新排序 datetime.lua 中的数字)
答案2
好吧,这里有一种方法可以实现您的目标,但这需要您:
- 在底部添加任何新条目(即,文件的条目按照您添加的顺序排列)。
pdflatex
每次添加新条目时运行。- 保存 ,
\jobname.db
以跟踪每个 所指\today
的内容。
因此,任何先前的使用\today
(在此示例中是前两个)都以蓝色标记),而今天的条目则以红色显示:
进一步增强:
- 定义一个
\yesterday
宏,以防您由于某种原因直到午夜之后才添加条目。
代码:
\documentclass{article}
\usepackage{datatool}
\usepackage{xstring}
\usepackage{tikz}
\usetikzlibrary{calc}
%%http://tex.stackexchange.com/questions/179425/a-new-command-of-the-form-tex
\newcommand{\CenteredText}[2][]{%
\noindent\tikz \draw [draw=black, ultra thick, #1]
($(current page.center)-(0.5\linewidth,0)$) --
($(current page.center)+(0.5\linewidth,0)$)
node [midway, fill=white] {#2};
}
\let\OldToday\today
\newcounter{CountOfPriorHistory}
\newcommand*{\TempMonthAndDay}{}%
\newcommand*{\TempYear}{}%
\newcommand*{\LoadHistory}{%
\IfFileExists{\jobname.db}{%
\DTLloaddb[keys={TodayCount,MonthAndDay,Year}]{HistoryDB}{\jobname.db}% Read prior DB
}{%
\DTLnewdb{HistoryDB}% Initialize new DB (this is first time usage)
}%
\renewcommand{\today}{% Get data from HistoryDB while we can
\stepcounter{CountOfPriorHistory}%
\ifnum\arabic{CountOfPriorHistory}>\DTLrowcount{HistoryDB}\relax
% Then this is a new entry
\StrBefore{\OldToday}{,}[\TempMonthAndDay]%
\StrBehind{\OldToday}{,}[\TempYear]%
\dtlexpandnewvalue%
\DTLnewrow{HistoryDB}%
\DTLnewdbentry{HistoryDB}{TodayCount}{\arabic{CountOfPriorHistory}}%
\DTLnewdbentry{HistoryDB}{MonthAndDay}{\TempMonthAndDay}%
\DTLnewdbentry{HistoryDB}{Year}{\TempYear}%
\DTLsavedb{HistoryDB}{\jobname.db}%
\bigskip\par\CenteredText[thin,red]{\textbf{\OldToday}}%
\else
% This is an older entry, so need to retrieve the date for it
\DTLgetvalue{\HistoryMonthAndDay}{HistoryDB}
{\arabic{CountOfPriorHistory}}
{\dtlcolumnindex{HistoryDB}{MonthAndDay}}%
\DTLgetvalue{\HistoryYear}{HistoryDB}
{\arabic{CountOfPriorHistory}}
{\dtlcolumnindex{HistoryDB}{Year}}%
\bigskip\par\CenteredText[thin,blue]{\textbf{\HistoryMonthAndDay, \HistoryYear}}%
\fi
}%
}%
\AtBeginDocument{\LoadHistory}
\begin{document}
\today
Well, today I saw this problem at TeX.SE that some say can't be done.
Of course this make me want to tackle it.
\today
Had an idea as to how to tackle it, but since I am flying out of the country I can't quite work on it.
\today
Now that I have done enough procrastinating on TeX.Se, I can do some more by working on that
so-called "unsolvable problem". I think I have a solution ready to post.
\end{document}
答案3
我编写了一个仅限 LuaLaTeX 的包,名为datestamp
为了这 :)
该方法与Slx64的答案中的方法非常相似,但是这个包有一些优点。
- 它不会覆盖任何内容。它会检查您传递的密钥是否存在于辅助设备中,如果是,它绝对不会执行任何操作。
- 它不需要任何额外的 Lua 模块。
- 由于它使用 TeX 命令打印日期,因此它也可以打印本地化日期。
一个简短的例子
% !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 = "December 3, 2021"
然后将其解释为一个 lua 代码,该代码会生成first
一个变量,然后该变量的值(即日期)会以 TeX 格式打印出来。只要您保存文件.ds
,日期就不会改变,但假设您不.ds
小心丢失了文件,仍然无需担心。您可以通过编写自己的.ds
文件并使用文档中完全相同的键作为\adddatestamp
命令参数来欺骗程序。
本地化示例(马拉地语)
\documentclass{article}
\usepackage{polyglossia}
\setdefaultlanguage{marathi}
\setmainfont[Script=Devanagari,Renderer=Harfbuzz]{Shobhika}
\usepackage{datestamp}
\begin{document}
\adddatestamp{firstdate}
\end{document}
自动化示例
\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 = "December 3, 2021"
pn2 = "December 3, 2021"
pn3 = "December 3, 2021"
pn4 = "December 3, 2021"
pn5 = "December 3, 2021"
pn6 = "December 3, 2021"
pn7 = "December 3, 2021"
如前所述;如果您希望在第 4 页上使用不同的日期,您可以编辑文件;将.ds
的值更改为。从下一次编译开始;输出将仅显示在第 4 页。pn4
"December 22, 2021"
December 22, 2021
注意:使用变量名时请小心。Lua 似乎不喜欢只使用数字变量。我还没有深入研究;但使用\thepage
而不是pn\thepage
会引发奇怪的 Lua 错误。所以最好使用字母数字变量,如 ds1、pn1。
答案4
将每个条目放入一个单独的文件中。使用一致的命名方案;我将使用entry
整数.tex
下面与平台无关的pgffor
,但你也可以使用标准 ls
(Unix,Linux,OS X)或dir
(DOS,Windows)--shell-escape
(另请参阅包ifplatform
)可能看起来像这样:
\documentclass{minimal}
\usepackage{pgffor} % \foreach
\usepackage{filemod} % \Filemodtoday etc., does not work with xetex
\def\inputentries#1{% takes the max number of entries as an argument
\foreach \i in {1,2,...,#1}{%
\IfFileExists{entry\i.tex}{%
\section{\Filemodtoday{entry\i.tex}}
\input{entry\i}%
}{}%
}
}
\begin{document}
\inputentries{9}
\end{document}
唉,我猜你想把所有东西都放在一个文件中。但那行不通。