从 .aux 文件导入计数器值

从 .aux 文件导入计数器值

注意:这个问题似乎应该在某个地方问,但我的 Google 搜索功能失败了。如果有人能指出这一点,我可以删除这个问题。

我正在尝试将一个数字保存到.aux文件中,然后导入该值并将其分配给计数器。我正在尝试使用代码SageTex来找到一种基于 Sage 变量为计数器分配值的方法。但是,由于 Sage 需要两次传递,我尝试使用系统zref为计数器使用一个临时值,同时将 Sage 变量作为标签写入文件.aux,然后在第二次传递时提取该值。

我是这个zref系统的新手,所以我可能只是错过了一个明显的命令,但我似乎找不到一种方法来将值作为命令.aux中的参数\setcounter。这是一个 MWE:

\documentclass{article}
\usepackage{zref}
\usepackage{zref-user}
\usepackage{xifthen}

\begin{document}
\makeatother

\zref@newlist{SageStorageList}
\zref@setmainlist{SageStorageList}
\zref@newprop{sageContent}[0]{0}
\zref@addprop{SageStorageList}{sageContent}

\newcommand{\storeSage}[2]{
    \zref@wrapper@immediate{
        \zref@setcurrent{sageContent}{#2}
        \zlabel{#1}
        }
    }

\newcounter{Temp}
\storeSage{TestMe}{5}
\zref[sageContent]{TestMe}
\expandafter\setcounter\expandafter{Temp}\expandafter{\expandafter\zref[sageContent]{TestMe}}

\ifthenelse{\zref[sageContent]{TestMe} > 0}{Ha}{Oh...}

\end{document}

链式\expandafter操作可能有点过头了,但我想确保扩展发生在计数器值之前。尽管如此,我还是得到了“期望数字”错误。我尝试了其他扩展配置,以防计数器专门用于扩展,但没有成功。这产生的错误最少(唯一的错误是,如果您注释掉 ifthenelse 命令,则会出现“期望数字”错误)。

答案1

您想使用 的可扩展版本\zref\zref@extract我将其包装在\recallSage与您的宏配对的宏中\storeSage

\documentclass{article}
\usepackage{zref}
\usepackage{xifthen}

\makeatletter
\zref@newlist{SageStorageList}
\zref@setmainlist{SageStorageList}
\zref@newprop{sageContent}[0]{0}
\zref@addprop{SageStorageList}{sageContent}

\newcommand*\storeSage[2]{
    \zref@wrapper@immediate{%
        \zref@setcurrent{sageContent}{#2}%
        \zref@label{#1}%
    }%
}
\newcommand*\recallSage[1]{%
    \zref@extract{#1}{sageContent}%
}
\makeatother

\newcounter{Temp}

\begin{document}

\storeSage{TestMe}{5}
\recallSage{TestMe}
\setcounter{Temp}{\recallSage{TestMe}}

\ifthenelse{\recallSage{TestMe} > 0}{Ha}{Oh...}

\end{document}

通过使用\zref@label,您可以避免使用zref-user包。现在所有内容都很好地打包在两个宏\storeSage和中\recallSage

答案2

带有 和 的版本,用而不是 来crossreftools存储通用内容。\crtcrossreflabelzref

稍后使用\crtcrossreflabel{content}[labelname]\crtrefnumber提取存储的内容。\crtrefnumber可扩展。

\documentclass{article}

\usepackage{crossreftools}

\crtrefundefinedtext{0}% Returns 0 for undefined references!

\newcommand{\storeSage}[2]{%
  \crtcrossreflabel*{#2}[#1]% 
}

\begin{document}

\newcounter{Temp}

\storeSage{TestMe}{5}


\setcounter{Temp}{\crtrefnumber{TestMe}}

\ifnum0<\crtrefnumber{TestMe}%
Ha!
\else
Oh!
\fi
\end{document}

相关内容