我想使用 sagetex 随机生成计算,并尝试使用尽可能简单的代码。我最终对此进行了测试,使用pgf
:
\begin{sagesilent}
from random import sample
def alea(n, max):
complete_list = [Integer(i) for i in range(-max, max+1, 1) if i != 0 and i != -1 and i != 1]
list = sample(complete_list, n)
return(list)
def somme(a):
f1 = a[0]/a[1]
f2 = a[2]/a[3]
somme = f1+f2
return [f1, f2, somme]
\end{sagesilent}
\begin{sagesilent}a = alea(4, 15)\end{sagesilent}
\begin{enumerate}
\foreach \n in {0,...,5}{\item $\displaystyle\sage{somme(a)[0]}+\sage{somme(a)[1]}=\sage{somme(a)[2]}$}
\end{enumerate}
这很有趣,但当然,我有 5 次相同的操作,所以我尝试了:
\begin{enumerate}
\foreach \n in {0,...,5}{\item \begin{sagesilent}a = alea(4, 15)\end{sagesilent}$\displaystyle\sage{somme(a)[0]}+\sage{somme(a)[1]}=\sage{somme(a)[2]}$}
\end{enumerate}
但它返回:
Runaway argument?
! File ended while scanning use of \next.
<inserted text>
\par
我不明白如何修复该错误(我使用 lualatex 进行编译)。
答案1
软件包发生冲突并不罕见。鼠尾草文档在第 14-15 页讨论了使用Beamer
和rcol
包时出现的问题。也许这里的某个高手可以找出问题所在,但我无法理解。不过,我可以用以下代码回答您的问题“如何修复错误”:
\documentclass{article}
\usepackage{sagetex}
\begin{document}
\begin{sagesilent}
max = 15
complete_list = [Integer(i) for i in range(-max, max+1, 1) if i != 0 and i != -1 and i != 1]
from random import sample
def alea(n, complete_list):
return(sample(complete_list, n))
def somme(a):
f1 = a[0]/a[1]
f2 = a[2]/a[3]
somme = f1+f2
return [f1, f2, somme]
output = r"\begin{enumerate}"
for i in range(6):
a = alea(4,complete_list)
output += r"\item $\displaystyle %s+\left(%s\right)=%s$"%(latex(somme(a)[0]),latex(somme(a)[1]),latex(somme(a)[2]))
output += r"\end{enumerate}"
\end{sagesilent}
\sagestr{output}
\end{document}
关于代码变化:首先,每次调用时都会alea
创建函数,因此我首先根据您想要的功能定义它。这意味着创建一次而不是6次。其次,没有理由创建一个变量并返回它,而您只需返回即可。第三,在 Python 中严格以字符串形式完成工作并在 LaTeX/Python/LaTeX 处理文档的第三遍中将其插入到文档中通常是最简单的。我使用字符串来创建环境代码,它可以毫无问题地处理诸如 之类的符号。它被复制到带有 的 .tex 文件中。最后,您允许使用负有理数,因此我在第二个数字两边加上括号,以避免在输出中将它们放在一起。complete_list
max
complete_list
list
sample(complete_list, n)
raw
\
enumerate
\sagestr
+-