使用练习包构建大量数学/微积分练习列表和测试

使用练习包构建大量数学/微积分练习列表和测试

我使用 exercise.sty 包已经有一段时间了,主要是为我的学生创建练习列表。几个月后,代码变得非常复杂。今天,它简直就是一场噩梦。

但首先,让我解释一下我的用途:

我正在为我的学生建立数学、预科微积分和微积分练习列表和测试。它们的范围从二次方程、积分技术、磁盘卷,应有尽有。也就是说,我教授的每种类型的课程都需要单独的“筛选”材料,以便最适合该课程:难度级别、主题、练习列表中的问题数量等等。

问题是:我有近 500 个练习,但我不知道从哪里开始。我想以正确的方式开始,这样我就不会陷入困境(就像我今天一样)。

我的问题:

  • 我怎样才能以最有效的方式输入这些练习,以便我可以轻松构建这些包含与给定主题相对应的练习的 pdf?我应该将这 500 个练习写在一个 .tex 文件中吗?
  • 是否有一个软件包允许对同一问题使用两种不同类型的解决方案?让我解释一下:有时我只想显示最终解决方案,有时则显示完整的(已解决的)解决方案。
  • 我的一些学生来自美国,那么有没有办法针对同一个练习创建两个(或更多)不同的描述和答案(一个用葡萄牙语,一个用英语)?
  • 假设我某一时刻的练习达到 10,000 道。我可以使用一个包含所有练习的 .tex 文件来构建一个包含 40 道“二次方程”练习的练习列表吗?换句话说:使用这些包中的“过滤器”或“标签”进行此过滤过程?

我知道这些软件包的功能非常强大,所以如果有人能以一种非常有效的方法阐明这一点,我将非常高兴。

谢谢。

附言:如果我的解释不是很清楚,请告诉我。

答案1

由于您的问题是关于存储、维护和引用大量练习(可能在 10,000 个数量级),我将集中精力讨论这个问题,因此这里的风格非常基础。

可以使用以下软件包提供的命令来定义条件语句\newif(或通过以下软件包提供的命令来定义条件语句):etoolbox)。 例如:

\newif\ifsolutions
\newif\ifcomplete

这些默认为 false,但可以打开:

\solutionstrue
\completetrue

提供语法命令来标记解决方案也很有用。例如:

\newcommand{\solutionname}{Solution}
\newcommand{\solution}{\par\textbf{\solutionname}:\par}

正如在其他答案中提到的那样,也可以使用环境和comment包。对于多语言支持,可以使用标题钩子\solutionname根据需要重新定义。例如:

\usepackage[USenglish]{babel}

\addto\captionsUSenglish{%
  \renewcommand\solutionname{Solution}%
}

现在可以使用以下命令编写练习。例如:

$y = \sin(2x)$
\ifsolutions
 \solution
 \ifcomplete
  Intermediate steps, further details etc.
 \fi
 $y' = 2\cos(2x)$
\fi

环境提供了更多的 LaTeXy 感觉,但让我们集中精力存储和访问问题。

已经建议的简单方法是将每个问题放在单独的文件中,然后用 加载\input。例如,如果此练习在文件中,exercises/calculus/easy/dsin.tex则以下 MWE 有效:

\documentclass{article}

\newif\ifsolutions
\newif\ifcomplete

\solutionstrue
\completetrue

\newcommand{\solutionname}{Solution}
\newcommand{\solution}{\par\textbf{\solutionname}:\par}

\begin{document}
\begin{enumerate}
\item \input{exercises/calculus/easy/dsin}

\end{enumerate}
\end{document}

这是一个相对通用的方法,可以很容易地转换为其他 TeX 格式。例如,Plain TeX 的等效方法是:

\newif\ifsolutions
\newif\ifcomplete

\solutionstrue
\completetrue

\def\solutionname{Solution}
\long\def\solution{\par{\bf\solutionname}:\par}

\newcount\questionnum

\long\def\question{%
 \par
 \advance\questionnum by 1\relax
 \number\questionnum.
}

\question \input exercises/calculus/easy/dsin

\bye

问题是,虽然这种结构对于少量问题来说没问题,但对于 10,000 个问题来说,它可能会变得难以管理。我提到datatooltk在注释中,它可以读取和写入.dbtex文件(datatool的内部格式),但我不建议直接使用这种格式。这些文件只包含 LaTeX 代码,用于定义datatool存储所需的数据。没有压缩,占用大量资源。该datatooltk应用程序作为中介,可以从外部来源提取经过过滤、打乱或排序的数据,以便轻松输入文档。(请参阅datatool性能页面比较大型数据库的构建时间。

有一些开关,例如--shuffle--sort,用于指示datatooltk对数据进行随机排序或排序它已从数据源中提取。这使用 Java,它比 TeX 更高效,但如果数据存储在 SQL 数据库中,则将这些步骤包含在实际--sql切换中会更有效。(目前,仅为 MySQL 配置,但如果可以将必要的文件添加到类路径中,则datatooltk可以使用其他东西。).jar

SQL 数据库可以优化以提高性能。假设您想从 500 个问题中随机选择 20 个问题。如何在 LaTeX 中执行该选择?首先,您需要使用 shell 找出所有可用文件(或拥有可以解析的索引文件)。然后您需要对列表进行打乱。使用 TeX 执行此操作需要一段时间。使用 SQL 执行此操作效率更高。(例如,请参阅MySQL 从 600K 行中快速选择 10 个随机行

如果您决定使用 SQL,接下来要考虑的就是表结构。

  • 您需要一个唯一的 ID 字段。通过这个,您将能够专门选择某些问题,而不是随机选择。(自增主键是最好的。)
  • 包含问题的字段。(我们称之为Question。)
  • 包含简短答案的字段。(我们称之为Answer。)
  • 包含扩展答案的字段。(我们称之为ExtendedAnswer。)
  • 标识难度级别的字段。(我们称之为Level。)这可以是整数(1 = 简单)或枚举(easy,,)。mediumhard
  • 标识主题的字段。(我们称之为Topic。)枚举可能是最简单的类型(例如,,calculussettheory

我不太确定语言。我能想到两种方法:为其他语言设置字段(例如,QuestionPortugesAnswerPortugesExtendedAnswerPortuges,或者为不同语言的问题设置单独的条目,并为该语言设置额外的字段。

因此,上面的练习示例可以

  • Question=>$y = \sin(2x)$
  • Answer=>$y' = 2\cos(2x)$
  • ExtendedAnswer=>Intermediate steps, further details etc. \[y' = 2\cos(2x)\]
  • Level=>1
  • Topic=>calculus
  • Language=>englishExtendedAnswerPortuges=>Passos intermédios, etc. \[y' = 2\cos(2x)\]

请注意,这不包括句法命令\solution或条件\ifsolutions\ifcomplete,这使得安排问题和答案的各个部分变得更容易。

有些练习可能需要特定的包(例如amsmathgraphicx),因此也许还可以有一个字段用于指定所需的包。例如Packages=> graphicx,amsmath

任何图像或逐字文本都必须存储在数据库之外的文件系统的某个位置。它们可以位于 TeX 的路径上,或者数据库表可以有一个包含外部资源列表的字段,或者问题/答案可以简单地使用完整路径。

调用datatooltk可以在 LaTeX 运行之前完成,也可以使用 shell escape 完成。还有一条datatooltk规则arara用户。假设我使用datatooltk来随机抽取问题并将结果保存在名为 的文件中exercises.dbtex。然后可以使用以下方法将其加载到文档中:

\DTLloaddbtex{\exercisedb}{exercises.dbtex}

如果数据包含该Packages字段,您可以通过在前言中添加以下内容来确保已加载所有必需的包:

\DTLforeach*{\exercisedb}{\Packages=Packages}
{\DTLifnullorempty{\Packages}{}{\usepackage{\Packages}}}

在文档的主要部分:

\begin{enumerate}
\DTLforeach*{\exercisedb}% data base
{\Question=Question,\Answer=Answer,\ExtendedAnswer=ExtendedAnswer}% assignment list
{%
  \item \Question
  \ifsolutions
   \solution
   \ifcomplete
    \ExtendedAnswer
   \else
     \Answer
   \fi
  \fi
}
\end{enumerate}

进一步阅读:使用 datatool 包进行考试或作业表

答案2

我为我的学生所做的就是这样的。

  1. 我把所有练习按主题放在不同的文件夹中。每个文件夹都以“1_package、2_package”等形式命名。
  2. 任何文件夹中的每个练习都按文件夹名称和练习编号进行编号。例如“3_294”表示第 3 个文件夹中的第 294 个练习。
  3. 为了记住每个文件夹的内容,我制作了一个列表来显示其中的内容。假设 1-> 积分,2-> 限制等。
  4. 我创建了以下(mwe)Test.tex模板:
\documentclass[a4paper]{article}
  \usepackage{amsmath}
  \usepackage{enumitem}
  \newcommand{\exercise}[2]{\input{#1_package/#1_#2.tex}} 
  \begin{document}
  \begin{enumerate}
  \item \exercise{1}{3}
  \item \exercise{2}{28}
  \item \exercise{3}{294}
  \end{enumerate}
  \end{document}

例如结果可能是这样的: 在此处输入图片描述

但我也担心如何在 500 多个练习中选择合适的练习。因此,我使用以下代码在文件中创建了一个列表Database.tex

\begin{enumerate}[label=Integration.\arabic*.]
\foreach \t in {1,...,"number of the last ex. in folder 1"}{\item\exercise{1}{\t}}
\end{enumerate}
\begin{enumerate}[label=Differential Equations.\arabic*.]
\foreach \x in {1,...,"number of the last ex. in folder 2"}{\item\exercise{2}{\x}}
\end{enumerate}
\begin{enumerate}[label=Limits.\arabic*.]
\foreach \y in {1,...,"number of the last ex. in folder 3"}{\item\exercise{3}{\y}}
\end{enumerate}

......等等 输出是我所有文件夹中所有练习的列表。也许打印该列表对选择练习更有帮助。


编辑 24/11/2021


我想介绍数据TeX。它是一个用于创建和管理 LaTeX 文件数据库以及 LaTeX 文档数据库的程序。我将对这两种数据库类型分别进行简要介绍:

1. 文件数据库 在此处输入图片描述

  • LaTeX 文件可以是定义、定理、练习或任何其他需要存储并添加到文档中的文件类型。每次创建文件时,我们都可以选择文件类型、主题、章节、节等标签,然后使用这些标签过滤数据库并轻松找到所需的文件。 在此处输入图片描述
  • 可以解决练习,并且每个文件可以存储许多解决方案。 在此处输入图片描述
  • 可以添加、删除和编辑文件。

2. 文档数据库 在此处输入图片描述

  • 在 DataTeX 中,我们可以创建 LaTeX 文档数据库,其中每个文档可以按类型进行过滤,例如考试、笔记等。 在此处输入图片描述
  • 在这些文档中,我们可以通过从数据库表中选择上面提到的文件来添加它们。 在此处输入图片描述
  • 如果文档包含练习,那么我们几乎可以自动创建解决方案文档。 在此处输入图片描述

可以创建许多文件和文档数据库。数据库引擎是 Sqlite。它是用 C++ 编写的。

该程序使用一个非常简单的 pdf 查看器和一个最小的 LaTeX 编译器来运行 PdfLaTeX、LaTeX、XeLaTeX、PythonTeX、Asymptote 和 BibTeX 的文件。(PdfLaTeX、XeLaTeX 和 PythonTeX 已经过测试并且运行良好,但还需要许多改进)

免责声明

我不是专业程序员,所以代码可能比较乱,软件还需要做很多工作才能完全正常运行。我可以说 70%-80% 已经完成,上面提到的基本功能运行良好。

目前它只适用于安装了 Texlive 的 Linux。

我不知道如何让软件准备好在 Linux 中构建和安装,所以 qt creator(5.15.2)是我目前所知道的唯一第一次编译它的方法。

欢迎任何帮助和贡献!!

答案3

这是针对您问题的简单部分(第二和第三个要点)的概念验证解决方案。

您可以轻松地使其更加复杂,格式化和编号练习,添加关键字和标签。我认为在整体项目结构确定之前这样做没有意义。

\documentclass{article}

\usepackage{comment}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%This material should be in a preamble  
%
\newenvironment{exercise}
{}{}

\newenvironment{portuguese}
{}{}

\newenvironment{english}
{}{}

\newenvironment{final}
{}{}
\newenvironment{workedout}
{}{}


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% This part can be in a master file for one handout that inputs the
% preamble and then the exercises for that handout.

% \documentclass{whatever}
% \input{preamble}

% decide what appears in the document

\excludecomment{english}
%\includecomment{english}

%\excludecomment{portuguese}
\includecomment{portuguese}

\excludecomment{final}
%\includecomment{final}

%\excludecomment{workedout}
\includecomment{workedout}

\begin{document}

General description for this worksheet.

%\input{ex1}
%\input{ex2}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% for each exercise in its own file
% \documentclass{standalone} 
\begin{exercise}

\begin{english}
This is an exercise.
\end{english}
\begin{portuguese}
Exercise text in Portuguese.
\end{portuguese}

\begin{final}

Solution here, no details. Could switch between English and Portuguese
easily, as above.
\end{final}

\begin{workedout}
Complete worked out solution. Could be multilingual.
\end{workedout}
\end{exercise}

\end{document}

相关内容