LuaTeXで2次関数の頂点を計算する問題の解答を作る(2次の係数は1, 頂点整数のケース)

数学の授業を持っていると、自分の思う通りの途中式で解答を作りたくなることがある。特に、持っている学力層によっては問題集そのままの解答は使えないので、必然的にそうせざるをえない。解答は数値だけを見て、問題を解く方法は授業で教えた方法に読み替える、という行為は、相当に高度な行為なのである。

問題・解答の生成で面倒なのは、単純反復系・同系統の問題の大量作成である。学力層によってはこの作業が頻繁に発生する。この作業はそれなりに骨が折れる。解答をミスすることも良くある。

同系統の問題を大量生成するとき、TeXのマクロで途中式に数字をはめ込むぐらいのことは今までもしていた。しかし、計算もやってくれると助かる、と思うことはよくあった。そこで、Luaの力を借りて計算をしてみる方法を考えることとした。

手始めに2次関数の頂点を求める問題とその解答の作成を自動化してみた。現状は、2次の係数が1で頂点が整数になるケースのみしか扱えない。しかし、とりあえずは動くものができたので紹介。

f:id:baruku07:20180212160040p:plain

以下はソース。luaの部分。(色分けをさせるためにあえてブロックをわけている)

function add_plus(num) -- +記号をつけて出力
 if num > 0 then
  return "+" .. num
 else
  return num
 end
end

function calc_choten(ary) --頂点の計算
  ary1 ={}
  ary1[1] = -ary[1]/2
  ary1[2] = -(ary[1])^2/4 + ary[2]
  return ary1
end

function h1(ary) --問題文の式
 tex.print("x^2" ..add_plus(ary[1]) .. "x" ..add_plus(ary[2]) )
end

function h2(ary) --途中式1行目
 tex.print("(x" .. add_plus(ary[1]/2) .. ") ^2-" .. math.abs(ary[1])/2 .. "^2" .. add_plus(ary[2])   ) 
end

function h3(ary) --平方完成済の式
 choten_x = calc_choten(ary)[1]
 choten_y = calc_choten(ary)[2] 
 tex.print("(x" .. add_plus(-choten_x) .. ") ^2" .. add_plus(choten_y)  ) 
end

function h4(ary) --頂点の座標の出力
 choten_x = calc_choten(ary)[1]
 choten_y = calc_choten(ary)[2] 
 tex.print(choten_x .."," .. choten_y)
end

texの部分。

\documentclass{ltjsarticle}
\usepackage{luacode}
\usepackage{amsmath}
\usepackage{tcolorbox}
\begin{luacode*}
%%この部分に上のluaのコードを挿入
\end{luacode*}

\newcommand{\gentoi}[2]{%
$y=\luaexec{h1({#1,#2})}$
\begin{tcolorbox}[colback=white,colframe=white, width=7truecm,height=9pc,visible]
  \begin{align*}
   y &= \luaexec{h2({#1,#2})} \\
      &= \luaexec{h3({#1,#2})} 
  \end{align*}

よって、頂点は点$(\luaexec{h4({#1,#2})})$となる。
\end{tcolorbox}
}

\begin{document}
以下の2次関数のグラフの頂点の座標を求めよ。
\begin{enumerate}
 \item \gentoi{-4}{12}
 \item \gentoi{2}{-5}
 \item \gentoi{8}{6}
 \item \gentoi{-6}{-6}
\end{enumerate}


\end{document}

本体については、特に説明を要する部分はない。

なお、tcolorboxを使っているのは次の意図。

  • widthとheightの指定
  • visibleとinvisibleで問題と解答を切り替える

レイアウトは手抜き。問題の生成の例をみせるためだから。実際のプリントはもう少し丁寧にレイアウトして作る(たぶん問題を横に2つ並べると思う。)。

途中式は私の好みである。学力層によって、ここは書き分けるべきである。それをしたいからこそ、自分でマクロを書いているとも言える。いちおう、意図。

  • 2で割る式は省略。それはさすがに何をやっているか類推できる。
  • 1行目の2乗を引く式はあえて計算していない(()内の第2項と同じものの絶対値の2乗を引いている、ということを見せる。)
  • 2乗の計算結果と定数項との足し算は省略(学力次第ではこの行も必要となる。)

もう少し拡張したい

配列から多項式の式を組み立てる関数を書けば、2次の係数が-1のケースは扱えそう。2次の係数が2以上のケースは、途中式が変わってくるので手間が少しかかりそう。

頂点分数ぐらいまでは対応させたいけどな・・・

でも、このプリントを使うこともないのでいつになるかわからない。。。