使用 python 处理 LaTeX 文件并创建随机问题



我正在使用python来预处理LaTeX文件,然后再通过LaTeX编译器运行它。我有一个读取.def文件的python脚本。.def文件在顶部包含一些python代码,有助于初始化随机化问题。在python代码下面,我有LaTeX代码来解决这个问题。对于 LaTeX 代码中的每个变量,我使用符号@来表示在编译之前应该将其随机化和替换。例如,我可能会将@a写成 1 到 10 之间的随机整数。

我正在尝试做的事情可能存在更大的问题,但到目前为止,它主要按照我的需要工作。下面是一个示例.def文件:

a = random.choice(range(-3,2))
b = random.choice(range(-6,1))
x1 = random.choice(range(a-3,a))
x2 = x1+3
m = 2*x1 - 2*a + 3
y1 = (x1-a)**2+b
y2 = (x2-a)**2+b
xmin = a - 5
xmax = a + 5
ymin = b-1
ymax = b+10
varNames = [["@a", str(a)],["@b", str(b)], ["@x1",str(x1)], ["@x2",str(x2)], ["@m", str(m)], ["@y1",str(y1)], ["@y2",str(y2)], ["@xmin", str(xmin)], ["@xmax", str(xmax)], ["@ymin", str(ymin)], ["@ymax", str(ymax)]]
#####
question The graph of $f(x) = (x-@a)^2+@b$ is shown below along with a secant line between the points $(@x1,@y1)$ and $(@x2,@y2)$.
begin{center}
begin{wc_graph}[xmin=@xmin, xmax=@xmax, ymin=@ymin, ymax=@ymax, scale=.75]
draw[domain=@a-3.16:@a + 3.16, smooth] plot ({x}, {(x-@a)^2+@b});
draw (@x1,@y1) to (@x2,@y2);
pic at (@x1,@y1) {closed};
pic at (@x2,@y2) {closed};
end{wc_graph}
end{center}
begin{parts}
part What does the slope of the secant line represent?
vfill
part Compute the slope of the secant line.
vfill
end{parts}
newpage

如您所见,删除@a并将其替换为a的实际值开始变得乏味。在我的 python 脚本中,我只是替换了latexCode字符串中的所有@内容。

for x in varNames:
latexCode = latexCode.replace(x[0],x[1])

这似乎工作正常。然而,它似乎令人讨厌和丑陋。

我的问题:在变量标识符和标识符的字符串版本之间是否有更好的工作方法?如果我能简单地制作一个我在 .def 文件中使用的变量名称的 python 列表,然后运行一个简单的命令来更新 LaTeX 代码,那就太好了。我所做的是繁琐和痛苦的。提前感谢!

是的,要么是eval (name),要么是getattr (obj, name),要么是globals () [name]。在这种情况下,我会说globals [name].

vars也可以工作:

https://docs.python.org/3/library/functions.html#vars

在下面的片段中,例如用于使对象知道自己的名称:

def _setPublicElementNames (self):
for var in vars (self):
if not var.startswith ('_'):
getattr (self, var) ._name = var

另一个不必要的复杂解决方案是生成一个.py文件,其中包含 .def 文件中的正确替换语句。

最新更新