注意:这个问题似乎应该在某个地方问,但我的 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
存储通用内容。\crtcrossreflabel
zref
稍后使用\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}