也许我以前在某个地方问过这个问题。
有没有办法将动态数据转换为静态数据?
我已经定义了宏
\def\date{\the\day.\the\month.\the\year}
每次运行 TeX,结果都是当前日期。我的目标是静态更改给定日期的数据,例如,存储“1.4.2019”的数据,而不是通过新运行 TeX 将其更改为当前日期。
我必须改进这个问题,它不够清楚。我想存储大量日期,即 2019.5.6、2019.5.7、2019.5.8 等,并且最近存储的日期不会被当前日期覆盖。因此,解决方案不能是静态定义 \date,而是生成类似 \date1 \date2 \date3... 的定义。
背景是,我有一张非常大的表,有数千个单元格,其中应该出现新条目或更新的日期,类似于 mysql 数据库中的“时间戳”。
解决方案应该仅限于 TeX,而不是 LaTeX。
谢谢
答案1
\openin0=\jobname.dat
\ifeof0
\closein0
\immediate\openout0=\jobname.dat
\immediate\write0{\def\string\date{\the\day.\the\month.\the\year}}
\immediate\closeout0
\fi
\input\jobname.dat
date: \date
\bye
对于修改后的问题,它本质上是相同的,但你必须循环遍历所有日期,所以
如果.dat
文件以 4 个日期为种子,以使其有趣
\datecount=4
\def\dateiv {8.4.2019}
\def\dateiii{8.3.2019}
\def\dateii{8.2.2019}
\def\datei{6.1.2019}
并修改文本看起来像
\newcount\datecount
\openin0=\jobname.dat
\ifeof0
\else
\closein0
\input \jobname.dat
\fi
\immediate\openout0=\jobname.dat
\advance\datecount by 1
\expandafter\gdef\csname date\romannumeral\datecount\endcsname{\the\day.\the\month.\the\year}
{\immediate\write0{\string\datecount=\the\datecount}
\loop
\immediate\write0{\string\def\string\date\romannumeral\datecount{\csname date\romannumeral\datecount\endcsname}}
\ifnum\datecount>1
\advance\datecount -1
\repeat
\immediate\closeout0
}
date: \datei -- \csname date\romannumeral\datecount\endcsname
\bye
那么下次运行后,dat 文件将如下所示
\datecount=5
\def\datev{6.5.2019}
\def\dateiv{8.4.2019}
\def\dateiii{8.3.2019}
\def\dateii{8.2.2019}
\def\datei{6.1.2019}
带排版输出
答案2
类似于 mysql 数据库中的“时间戳”
MySQL 和其他数据库软件持久性作为其主要功能之一:今天您可以执行类似这样的语句,INSERT INTO ...
并且其效果在几天或几个月后访问数据库时仍然存在。从本质上讲,这通常是通过写入某些文件来实现的,但这个细节对您(用户)来说是隐藏的。
TeX 不是数据库;它是一个排版程序。你有一个.tex
文件,你在上面运行 TeX,然后 TeX 会忘记这个文件;它不会为将来保留任何东西。但这似乎正是你想要的:
我的目标是 […] 获取“2019.4.1”的数据存储[…] 我想要店铺大量的日期 [...] TeX 生成当前日期和商店它是静态的和不可改变的 […] 我想要店铺特定时刻的 […] 值和保存数据和 …
这不是 TeX 的设计初衷,但如果您想要持久性,您可以像数据库一样轻松实现它:即通过写入文件。您在文件上运行 TeX,让它计算时间戳(或其他内容)并将其写入文件,然后在以后的运行中它可以从文件中获取数据。这是 David Carlisle 在他的回答的评论中告诉您的:
“静态存储值”==“将其写入文件”所以这几乎是唯一可能的答案。
如果您不想写入文件那么您要求的就是(本质上)不可能的事情。
可惜的是,Knuth 还没有想到实现时间戳,所以故事到此结束......
\the\day
这是不正确的。TeX 中的、\the\month
等的语义与MySQL 中的 (etc) 函数\the\year
的语义完全相同:CURRENT_TIMESTAMP()
如果 TeX
\the\day
在某个日期遇到,那么该值就是当天的日期。如果 MySQL
CURRENT_DATE()
在某个日期遇到,那么该值就是当天的日期。
没有区别。区别在于其他地方:数据库旨在存储数据(通过在后台自动写入文件),而在 TeX 中,您必须自己通过写入文件来执行此操作(出于某种原因,您似乎对此并不满意)。
答案3
似乎不可能,所有答案都不起作用。无论如何,看来我必须手动输入数据。
可惜的是,Knuth 还没有想到实现时间戳,所以故事到此结束......