我想为我的文档创建唯一的 ID 号,并使用如下随机数生成器进行创建:
\usepackage[first=1, last=100000000]{lcg}
\newcommand{\random}{\rand\arabic{rand}}
但是,我实际上想在第一次构建文档时创建一个随机数,然后在后续构建中使用相同的数字。我可以这样做吗?如果可以,怎么做?
答案1
您可以将生成的随机数保存到名为 的文件中\jobname.rid
,然后每次构建文档时,它都会读取该文件。如果您删除 .rid 文件,则会生成一个新的随机数:
\begin{filecontents*}{myclass.cls}
\LoadClass{article}
% ID code
\ExplSyntaxOn
% Create a variable "\c_crobar_id_file_str" that contains the .rid file name:
\str_const:Nx \c_crobar_id_file_str { \c_sys_jobname_str . rid }
% Create a macro "\crobar@set@ID" that assigns its argument to the integer "\c_crobar_random_int":
\cs_new_protected:Npn \crobar@set@ID #1
{ \int_const:Nn \c_crobar_random_int {#1} }
% Check if the .rid file exists:
\file_if_exist:nTF { \c_crobar_id_file_str }
{
% If it does, input it:
\file_input:n { \c_crobar_id_file_str }
}
{
% If the file doesn't exist, create one and assign using \crobar@set@ID
\crobar@set@ID { \int_rand:nn { 1 } { 100000000 } }
% Then open the .rid file for writing (iow = IO/Write)
\iow_open:Nn \g_tmpa_iow { \c_crobar_id_file_str }
% Now write "\crobar@set@ID{<random number>}" to the .rid file
\iow_now:Nx \g_tmpa_iow
{ \crobar@set@ID { \int_use:N \c_crobar_random_int } }
% And close the .rid file
\iow_close:N \g_tmpa_iow
}
% Finally, create a user-level command \random that writes the integer \c_crobar_random_int
\cs_new:Npn \random { \int_to_arabic:n { \c_crobar_random_int } }
\ExplSyntaxOff
% ID code
\end{filecontents*}
\documentclass{myclass}
\begin{document}
This document ID is \random.
\end{document}
在我的计算机上运行该文档的结果如下:
答案2
答案3
尝试加载\jobname.rid
,如果失败,则为命令创建一个随机 ID\docID
并将其定义存储在中\jobname.rid
。
\documentclass{report}
\usepackage[first=1, last=100000000]{lcg}
\IfFileExists{\jobname.rid}
{\input{\jobname.rid}}
{\rand
\def\docID{\arabic{rand}}
% writing \def\docID{<ID>} to \jobname.rid
\newwrite\docIDoutput
\immediate\openout\docIDoutput=\jobname.rid
\write\docIDoutput{\protect\def\protect\docID{\docID}}}
\begin{document}
ID: \docID
\end{document}
注意:随机种子接缝取决于时间,精确到分钟(因此在同一分钟内的运行中是相同的)。