如何仅在第一次构建时为文档创建随机数,然后在后续构建中重复使用它?

如何仅在第一次构建时为文档创建随机数,然后在后续构建中重复使用它?

我想为我的文档创建唯一的 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

这不是一个答案,而是将 ID 的概念扩展到视觉空间:

由于字体中的字形是(可映射到)代码号,将随机器设置为 Unicode 代码块,例如,\int_rand:nn { 19968 } { 40938 }多次运行它并以适当的字体排版,多位 ID 号可以成为 ID“短语”:

识别字

有很多块:

识别字2

可能的用例是替换 GUID 或更大的值,以更紧凑的形式表示它们。

答案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}

注意:随机种子接缝取决于时间,精确到分钟(因此在同一分钟内的运行中是相同的)。

相关内容