如何将动态数据转换为静态数据

如何将动态数据转换为静态数据

也许我以前在某个地方问过这个问题。

有没有办法将动态数据转换为静态数据?

我已经定义了宏

\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在某个日期遇到,那么该值就是当天的日期。

  • 如果 MySQLCURRENT_DATE()在某个日期遇到,那么该值就是当天的日期。

没有区别。区别在于其他地方:数据库旨在存储数据(通过在后台自动写入文件),而在 TeX 中,您必须自己通过写入文件来执行此操作(出于某种原因,您似乎对此并不满意)。

答案3

似乎不可能,所有答案都不起作用。无论如何,看来我必须手动输入数据。

可惜的是,Knuth 还没有想到实现时间戳,所以故事到此结束......

相关内容