在带有 sagetex 的 itemize 环境中使用 foreach (pgf)

在带有 sagetex 的 itemize 环境中使用 foreach (pgf)

我想使用 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 页讨论了使用Beamerrcol包时出现的问题。也许这里的某个高手可以找出问题所在,但我无法理解。不过,我可以用以下代码回答您的问题“如何修复错误”:

\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}

Cocalc中的结果如下所示: 在此处输入图片描述

关于代码变化:首先,每次调用时都会alea创建函数,因此我首先根据您想要的功能定义它。这意味着创建一次而不是6次。其次,没有理由创建一个变量并返回它,而您只需返回即可。第三,在 Python 中严格以字符串形式完成工作并在 LaTeX/Python/LaTeX 处理文档的第三遍中将其插入到文档中通常是最简单的。我使用字符串来创建环境代码,它可以毫无问题地处理诸如 之类的符号。它被复制到带有 的 .tex 文件中。最后,您允许使用负有理数,因此我在第二个数字两边加上括号,以避免在输出中将它们放在一起。complete_listmaxcomplete_listlistsample(complete_list, n)raw\enumerate\sagestr+-

相关内容