我正在做一些项目,在这些项目中,从 sagetex 环境中获取一些数字,然后直接在 latex 中使用它们会非常有帮助。我知道 Latex 不擅长存储数字/信息,目前我知道的唯一方法是命名和使用计数器。问题是所有存储数据的命令(例如 /setcounter)都是接受输入的命令,我无法直接在这些命令中调用 sage。例如,我想执行以下操作:
\begin{sagesilent}
a = Integer(randint(1,5))
\end{sagesilent}
\setcounter{Seed}{\sage{a}}
不幸的是,由于 latex 无法理解命令调用中的 \sage{a},因此出现了错误。
有什么方法可以做到这一点或类似的东西吗?一个原因是使用 sage 为 Latex 生成实际的良好随机数(所有 latex 随机数生成器似乎都低于标准),但我还有其他用途,这会让我的生活更轻松。
答案1
这是一种方法。虽然有点笨拙、脆弱和迂回,但应该可行。其想法是让 Sage 将 LateX 代码写入文件,然后将其读入文档。尝试以下方法:
\begin{sagesilent}
import string
with open('counters.tex', 'w') as f:
s = string.Template(r'\setcounter{Seed}{$seed}').substitute(seed=randint(1, 5))
f.write(s)
# more "s =" and "f.write()" as desired.
\end{sagesilent}
{
使用和格式化字符串}
会让你抓狂,这就是为什么我使用 Python 的模板字符串。
在该块之后,counters.tex
将被关闭并写入磁盘。然后,稍后在您的 tex 文件中,执行
\InputIfFileExists{counters.tex}
这将设置计数器。(我还没有测试过,但一般的想法是让 Sage/Python 写出一个文件 - 您可以在该文件中控制字符串、生成数字等 - 然后让 TeX 读入它 - 应该可以工作。