LuaTeXで簡単な2次方程式の問題と解答を作る

中学生的な数学を教えていると、ワンパターンの2次方程式を解く練習を大量に作りたいということがある。

LuaTeXを使って作ってみた。2次の係数は1・解は0か2解を足して0になる以外の整数・異なる2解を持つケースに対応している。前の2次関数のときと違い、方程式の1次の係数が-1と1になるケースについても対応した。

f:id:baruku07:20180212205953p:plain

以下がluaのコード。(色分けのためブロックをわけた)

function add_plus(num) -- +記号をつけて出力。定数項で使用。
 if num > 0 then
  return "+" .. num
 else
  return num
 end
end

function add_plus2(num) -- +記号をつけて出力・係数1を無視する。定数項以外で使用。
 if  num ==1 then
 return "+"
 elseif num ==-1 then
 return "-"
 elseif num > 0 then
  return "+" .. num
 else
  return num
 end
end

function h1(ary) --問題文の式
 x1_plus_x2 = ary[1] + ary[2]
 x1_times_x2 = ary[1]*ary[2]
 tex.print("x^2" ..add_plus2(-x1_plus_x2) .. "x" ..add_plus(x1_times_x2) .."=0")
end

function h2(ary) --因数分解の式の生成
 a = add_plus(-ary[1])
  b = add_plus(-ary[2])
 tex.print("(x" ..  a .. ")(x" ..  b ..")=0" )
end

以下がtexのソース。

\documentclass{ltjsarticle}
\usepackage{luacode}
\usepackage{amsmath}
\usepackage{tcolorbox}
\begin{luacode*}
%%ここに上のluaのコードが入る
\end{luacode*}

\newcommand{\gentoi}[2]{%
$\luaexec{h1({#1,#2})}$
\begin{tcolorbox}[colframe=white,colback=white,width=4truecm,height=5pc,left=-5truemm,top=-3truemm,visible]
\begin{gather*}
   \luaexec{h2({#1,#2})}\\
   x =  #1, #2
\end{gather*}
\end{tcolorbox}
}

\begin{document}
\begin{enumerate}
 \item \gentoi{3}{5}
 \item \gentoi{6}{-5}
 \item \gentoi{5}{-6}
 \item \gentoi{-7}{-5}
\end{enumerate}
\end{document}

この問題については、既製品は色々とある。既製品に対する利点は、細かい部分を自分で思うようにできるというだけである。定型パターンで対応できない集団を教えているときには、この点が大きい。

自分が定型的なパターンで対応できない集団を教えているときには、自分で自動生成をやろうと試行錯誤していた。

この手の2次方程式の生成は、Rubyで文字列を生成してから貼り付けをしていたこともあった。Rubyの機能を生かして、2解の候補の配列候補を生成しておいて、それからランダムに選んでプリントに貼り付けたこともある。しかし、コピーアンドペーストもだるいし、スクリプトファイルをどこに置いたか行方不明にもなることがある。TeXで済むならそれが良い。