ToC 和标签之类的东西如何在编译之间保存信息?

ToC 和标签之类的东西如何在编译之间保存信息?

我有一些代码可以生成一些随机内容。我想添加使用最后结果而不是生成新随机值的功能。我认为这样做的方法是将随机数/结果“保存”到持久位置,并在某些条件下加载它们(例如,在生成随机值的命令中有一些可选参数,允许您标记是否要使用最后的结果或生成新的结果)。

我知道像\label\ref系统这样的系统会这样做,这就是为什么你必须编译两次,所以我在考虑利用在后台与它们一起工作的任何系统。不幸的是,我从来没有摆弄过 LaTeX 的这个部分,也不知道它叫什么,也不知道在哪里可以找到有关它的信息。如果有人至少能给我指明正确的方向(或者告诉我这实际上不可能做到),我将不胜感激。

如果这很重要的话,我通常更喜欢使用 LaTeX2 或 LaTeX,但我一直在(慢慢地)学习 LaTeX3,所以这至少也是可行的。谢谢!

答案1

一种方式是phantomlabel,将其设置\@currentlabel为宏的第一个参数的内容,\label{#2}然后再应用。

随机内容是用生成的\fpeval{rand()},以便\getrefnumberrefcount包中检索它并可能进行扩展使用。

\documentclass{article}

\usepackage{refcount}
\usepackage{xfp}
\usepackage{xparse}
\makeatletter
\NewDocumentCommand{\saverandom}{+mm}{%
  \protected@edef\@currentlabel{#1}%
  \label{#2}%
}
\makeatother

\begin{document}
\pdfsetrandomseed100
The last value was \getrefnumber{foo}
\saverandom{\fpeval{rand()}}{foo}

However: \fpeval{rand()}

\end{document}

基本上是相同的版本,但关于\edef和强大的命令的更多讨论

\documentclass{article}

\usepackage{refcount}
\usepackage{xfp}
\usepackage{xparse}

\usepackage[most]{tcolorbox}

\DeclareRobustCommand{\foo}[1]{\begin{tcolorbox}[colback=white!60!yellow]#1\end{tcolorbox}}

\newcommand{\fooagain}[1]{\begin{tcolorbox}[colback=white!60!yellow]#1\end{tcolorbox}}

\makeatletter
\NewDocumentCommand{\saverandom}{+mm}{%
  \protected@edef\@currentlabel{#1}%
  \label{#2}%
}
\makeatother

\newcommand{\sometestcontent}{This is a command}

\begin{document}
\pdfsetrandomseed100
The last value was \getrefnumber{foo} or \getrefnumber{fooagain} or \ref{fooagain}
\saverandom{\fpeval{rand()}}{foo}

However: \fpeval{rand()}

\saverandom{Some \foo{A box} stuff}{foostuff}

\saverandom{Some \foo{\sometestcontent} stuff}{foomorestuff}

\saverandom{Some \protect\fooagain{A box} stuff}{fooagain}

\saverandom{Some \protect\fooagain{\sometestcontent} stuff}{fooagainagain}

\end{document}

在此处输入图片描述

这提供了.aux文件(%%%%我后来添加的评论)

\relax 
\providecommand\tcolorbox@label[2]{}
\newlabel{foo}{{0.6812090612411411}{1}}
\newlabel{foostuff}{{Some \foo  {A box} stuff}{1}}
\newlabel{foomorestuff}{{Some \foo  {This is a command} stuff}{1}}%%%% \sometestcontent is expanded, \foo isn't
\newlabel{fooagain}{{Some \fooagain {A box} stuff}{1}}
\newlabel{fooagainagain}{{Some \fooagain {This is a command} stuff}{1}}%%%% \sometestcontent is expanded, but \fooagain isn't because of \protect

相关内容