帮助使用(LaTeX?)创建一页方程式

帮助使用(LaTeX?)创建一页方程式

我想创建一个模板,以便快速生成几页基本数学方程式。LaTeX 似乎是开始排版数学方程式的好地方,但我完全搞不懂它的语法。

我的想法是首先建立一个模板,使用 python 用随机数生成模板代码,转换为 PDF,然后打印。这是我目前想到的一个例子,但尝试将其嵌套在另一个表中会产生问题。

\halign{\hfil # & # \hfil \cr 4\cr \underline{+2}\cr}

这产生了渲染示例

有没有其他语言或工具可以帮助我实现我的目标?我洗耳恭听。

答案1

虽然不是那么黑客,但还是有点,这里有一些想法。

首先定义一个新命令来生成每个方程式。我使用array环境来执行此操作。

\newcommand{\myeq}[2]{$\begin{array}{@{}r@{}}#1\\#2\\\hline\end{array}$}

然后使用环境将它们排列在网格页面上tabular

\begin{tabular}{c@{\qquad}c}
\myeq{4}{+2} & \myeq{3}{\times 2} \\[2em]
\myeq{4}{+2} & \myeq{3}{\times 2}
\end{tabular}

渲染示例

请注意,您可以为命令提供一个可选参数\\[..],以控制行间距。在@{..}传递给的说明符中tabular,您还可以使用\qquad或等命令\hspace{..}来控制列间距。

答案2

您甚至可以使用 LaTeX 来生成随机数,使用以下pgfmath包,它是pgf/tikz。下面是使用 Juan 回答中的宏的简单示例:

\documentclass{article}
\usepackage{pgfmath}

% Juan's macro:
\newcommand{\myeq}[2]{$\begin{array}{@{}r@{}}#1\\#2\\\hline\end{array}$}

% Generate random integer between 1 and 9:
\newcommand{\rand}{\pgfmathrandominteger{\rndint}{1}{9}\rndint}

% The rest is from Juan's answer again, with numbers replaced by \rand:
\begin{document}
\begin{tabular}{c@{\qquad}c}
\myeq{\rand}{+\rand} & \myeq{\rand}{\times \rand} \\[2em]
\myeq{\rand}{+\rand} & \myeq{\rand}{\times \rand}
\end{tabular}

\end{document}

然后您需要做的就是处理文件以pdflatex获取 pdf。

另一个选择是使用lua生成数字,并通过以下方式处理文件路特克斯。这将为您提供更大的灵活性,您可以按照您想要的方式生成数字。

答案3

根据已接受的答案,我能够编写一个快速脚本,该脚本完全按照我的计划执行。我添加了逻辑以避免遗留问题。感谢您的所有意见。

#!usr/bin/python
import random

#cfg
numRows = 6
numColumns = 5
numPages = 1
equation_top_range=[1,30]
equation_bottom_range=[1,20]


# text blocks
multiply = r'\myeq{%s}{\times %s}'
add = r'\myeq{%s}{+%s}'
subtract = r'\myeq{%s}{-%s}'
page = r'''\begin{center}
\begin{tabular}{%s}
%s
\end{tabular}
\end{center}'''
end_row = r'\\[6em]'
column = r'c@{\hspace{%sin}} '%(5.0/numColumns)



def hasCarryOver(top,bottom):
    a = b = c = d = 0
    if len(str(top))==2:a,b = int(str(top)[0]),int(str(top)[1])
    else:b = top

    if len(str(bottom))==2:c,d = int(str(bottom)[0]),int(str(bottom)[1])
    else:d = bottom

    if a+c > 9 or b+d > 9:return True
    else:return False



pages = []
for p in range(numPages):
    lines = []
    for x in range(numRows):
        line = []
        for y in range(numColumns):
            reject = True
            while reject:
                top = random.randrange(*equation_top_range)
                bottom = random.randrange(*equation_bottom_range)
                reject = hasCarryOver(top,bottom)

            line.append(add%(top,bottom))
        lines.append(' & '.join(line)+end_row)
    pages.append(page%("".join(column * column_number),'\n'.join(lines)))


body = r'''\documentclass[10pt,letterpaper]{report}
\usepackage[latin1]{inputenc}
\usepackage{amsmath}
\usepackage{amsfonts}
\usepackage{amssymb}
\usepackage[margin=2.5cm]{geometry}

\newcommand{\myeq}[2]{$\begin{array}{@{}r@{}}#1\\#2\\\hline\end{array}$}

\DeclareMathSizes{10}{18}{12}{8}
\begin{document}
%s
\end{document}
'''%('\pagebreak'.join(pages))

print body

生产 替代文本

相关内容