🦋

typstで高校の数学のテスト作成しました

2024/12/18に公開

はじめに

30年くらい,Mac上で\LaTeXを使って,中学・高校の数学のプリントやテストを作成してきました。
一度どんな形で利用してきたのか振り返ってみました。

〜2000年ごろ

資料が残っていないのですが,恐らくCanvasというドロー系のソフトと,Mathtypeを使ってプリントを作っていたと思います。探したら,データあるかな。。。

https://ja.wikipedia.org/wiki/Canvas_(グラフィックソフト)

https://ja.wikipedia.org/wiki/MathType

2001年〜2017年ごろ

Mac でplatexを使っていました。dviファイルを経由してpdfを作成していましたね。初期の頃はepsの画像を取り込んだりしてますね。統合環境はTeXShopを使っていたと思います。

https://ja.wikipedia.org/wiki/TeXShop

2018年1月

統合環境をTeXShopからatomに変更したようです。ツイートが残ってました。これはJulia言語を使い出したからですね。

https://x.com/dannchu/status/950009256882749440

そういえばatomは途中で開発終了したんですよね。

https://ja.wikipedia.org/wiki/Atom_(テキストエディタ)

2019年1月

統合環境をatomからVSCodeに変更しました。platexで同じようにdviファイルを経由してpdfを作っていました。やっぱりお正月は新しいことにチャレンジしたくなるようですね。atomが開発中止になることと,VSCode上でJupyter notebookが利用できて,Julia言語もバッチリ使えることが理由としてあったのかもしれませんね。

https://ja.wikipedia.org/wiki/Visual_Studio_Code

https://ja.wikipedia.org/wiki/Project_Jupyter

2022年2月

統合環境は引き続きVSCodeなのですが,platexでdviファイルを経由してpdfを作る形からお別れすることになりました。lualatexに移行し,dviファイルを経由せず,pdfを作成するようになります。そこそこ良かったのですが,私の環境では思ったほど処理は速くなりませんでした。確か,この時のモチベーションは「フォントを柔軟に設定したい」だったと思います。プリント作成でユニバーサルデザインのフォント(UDフォント)を使いたいと思っていました。

https://lualatexlab.blog.fc2.com/blog-entry-31.html

2024年6月

統合環境は引き続きVSCodeなのですがついにtypstに移行することにしました。まだ,利用者も少なく,設定も大変そうだったのですが,移行しようと思った理由は次のような感じです。

  • typstのソースからpdfを作成するスピードが圧倒的に速い
  • フォントを柔軟に設定ができる
  • Rustの言語が利用できる
  • コードを挿入していくときも簡単

https://typst.app

とはいえ,数学のプリントやテストの設定ができるかちょっと心配だったのですが,少しずつユーザーも増えてきていて,なんとか数学のテストを作成できるまでになりました。最近は\LaTeXの書籍の著者の奥村先生も興味を持ってもらえているようですね。

https://okumuralab.org/~okumura/misc/241111.html

今回は,私のtypstのコード公開することで,typstのより良いスタイファイルができることを願っています。

typstで作成した数学のテスト

実際のテストに近いです。(本物ではありません)

問題用紙

B4横置き。2段組です。表題だけは1段組です。

解答用紙

B4縦置き。2段組です。表題だけは1段組です。設問ごと解答欄を四角の枠で囲っています。

解答

解答用紙に解答を記入したものです。答えのみのところは,重ねる感じで記入してますね。

typstのコード

問題用紙



// ページの設定
#set page(
paper: "jis-b4",  //JIS規格B4
flipped: true,  //横置き
margin: (x: 1.5cm, y: 1cm), //マージン左右1.5cm,上下1cm
)
 
//  段落の設定
#set par(
  justify: true,  // 両端揃え:有効
  leading: 1em, //行間 1em
)
 
 // テキストの設定
#set text(
  font: ("New Computer Modern","BIZ UDPMincho",), //フォント(英語と日本語)
  size: 10pt, // サイズ
  lang: "ja", //言語:日本語
)

// 節の設定:問題番号に利用します。
#set heading(numbering: "1. ", )
#show heading: it => [
  #set text(font: "BIZ UDPGothic")
  #counter(heading).display(
    it.numbering,
     ) 
  #emph(it.body)
]

// 箇条書きの設定 問題の中の小問に使います。
#set enum(numbering: "(1)",)


//カラフル・ボックスパッケージをインポート 
#import "@preview/colorful-boxes:1.2.0": *

//ローレルパッケージのインポート
#import "@preview/roremu:0.1.0": roremu


//関数の登録

//試験名
#let dai(n) = text(font: "BIZ UDPGothic",size: 18pt)[ #underline(stroke:1.5pt,offset:5pt,)[*#n*]]

//日本語・太字
#let bf(n) = text(font: "BIZ UDPGothic")[*#n*]

//日本語・標準字
#let nm(n) = text(font: "BIZ UDPMincho",size: 10pt)[#n]

//箱の表示
#let hako(A) = box(stroke: black, inset: 1.5mm,width:1cm,baseline:1.8mm,height:6mm,[#h(2mm)#A])


// =====================================================



#dai("2024年度 第2学期 期末考査 高校1年 数学B")

#columns(2)[


#h(10cm) #bf("2024年12月1日(日) 担当:清水")

#bf("【注意事項】")

#bf("4. 〜 9. は答えのみではなく,考え方や計算式・図などを記すこと。")


#bf("9. は選択問題です。指定されたクラスの問題を解くこと。")





= #nm([次の数を指定された形に直せ。 (答えのみでよい。 20点)])

#v(3mm)
+  $23$ #h(5mm) [2進法]
  #v(5mm)

+  $875$ #h(5mm) [4進法]
  #v(5mm)

+ $110001_((2))$ #h(5mm) [10進法]
  #v(5mm)
 
+ $67_((8))$ #h(5mm) [10進法]
  #v(5mm)

  

#v(8mm)

= #nm([次の計算の結果を,2進数で表せ。 (答えのみでよい。 10点)])


+ $10111_((2))+ 1011_((2)) $
  #v(5mm)

 
+ $10111_((2))times 1011_((2)) $
  #v(5mm)

  

#v(8mm)




= #nm([平らな広場の地点Oを原点として,東の方向を $x$ 軸の正の向き,北の方向を $y$ 軸の正の向き,真上の方向を $z$ 軸の正の向きとする座標空間を考える。また,$1$ mを $1$ の長さとする。例えば,地点Oから東に $1$ m,北に $2$ m進み,真上に $3$ m上がった点の座標は $(1","2","3)$ である。

 次の問いに答えよ。  (答えのみでよい。 10点)])

#v(3mm)

+ 地点Oから西に $4$ m,北に $2$ m進み,真下に $3$ m下がった位置にある点Cの座標を求めよ。

+ 2点間OCの距離を求めよ。




#colbreak()

#v(8mm)

= #nm([ユークリッドの互除法を用いて,次の問いに答えよ。 (10点)])
#v(3mm)
+ $3007$ と $1649$ の最大公約数を求めよ。
  #v(5mm)
+ $n$ を自然数とする。$n+1$ と $2n+1$ の最大公約数を求めよ。

#v(3mm)
#v(8mm)




= #nm([ $x$ , $y$ が整数のとき,方程式 $7x-5y=1 #h(1mm)dots.c #h(1mm)"①"$ を次の順序で解け。 (10点)])

#v(3mm)

+ ①を満たす1組の $(x "," y)$ を求めよ。

+ ①の一般解を求めよ。

#v(3mm)
#v(8mm)


= #nm([ $29$ で割ると $20$ 余り, $37$ で割ると $21$ 余る自然数で,最小のものを求めよ。 (10点)])

#v(3mm)
#v(8mm)





= #nm([ $x^2-3x y+2 y^2 =12$ を満たす自然数 $x$ , $y$ の組をすべて求めよ。 (10点)])

#v(3mm)
#v(8mm)



= #nm([ $display(1/p+1/q+1/r=1)$ を満たす自然数 $p","q","r$ ( $p lt.equiv q lt.equiv r$ )の組をすべて求めよ。 (10点)])


#v(3mm)
#v(8mm)




= #nm([選択問題です。指定されたクラスの問題を解くこと。])

#v(3mm)

#bf("<ABC組>")
#nm([ $a+b+c =a b c$ を満たす自然数 $a","b","c$ の組は何組あるか。 (10点)])

#v(8mm)


#bf("<DEF組>")
 #nm([ $a+b+c+d =a b c d$ を満たす自然数 $a","b","c","d$ の組は何組あるか。 (10点)])

#v(3mm)
#v(8mm)



]

解答用紙+解答


// ページの設定
#set page(
paper: "jis-b4", //JIS規格B4
flipped: false, //縦置き
margin: (x: .5cm, y: 1cm),//マージン左右0.5cm,上下1cm
)
 

//  段落の設定
#set par(
  justify: true,  // 両端揃え:有効
  leading: 1em, //行間 1em
)
 

// テキストの設定
#set text(
  font: ("New Computer Modern","BIZ UDPMincho",), //フォント(英語と日本語)
  size: 10pt, // サイズ
  lang: "ja", //言語:日本語
)


// 節の設定:問題番号に利用します。
#set heading(numbering: "1. ", )
#show heading: it => [
  #set text(font: "BIZ UDPGothic")
  #counter(heading).display(
    it.numbering,
     ) 
  #emph(it.body)
]

// 箇条書きの設定 問題の中の小問に使います。
#set enum(numbering: "(1)",)


// 直線の設定
#set line(stroke: (thickness:.3pt)) //線の太さ.3pt

// 長方形の設定(解答欄の枠)
#set rect(stroke: (thickness:.3pt)) //線の太さ.3pt

// 表の設定(小問)
#set table(stroke: (thickness:.3pt)) //線の太さ.3pt

// 下線の設定(表題)
#set underline(stroke: (thickness:.7pt)) //線の太さ.7pt

 

//カラフル・ボックスパッケージをインポート 
#import "@preview/colorful-boxes:1.2.0": *

//ローレルパッケージのインポート
#import "@preview/roremu:0.1.0": roremu



//関数の登録

//試験名(問題のみ・利用していません)
#let dai(n) = text(font: "BIZ UDPGothic",size: 18pt)[ #underline(stroke:1.5pt,offset:5pt,)[*#n*]]

//日本語・太字
#let bf(n) = text(font: "BIZ UDPGothic")[*#n*]

//日本語・標準字
#let nm(n) = text(font: "BIZ UDPMincho",size: 10pt)[#n]


#text(font: "BIZ UDPGothic",size: 12pt)[ #underline(offset:5pt,)[*2024年度 第2学期 期末考査 高校1年 数学B 解答用紙  3年    組    番  名前 (                     )*]]

#counter(heading).update(0) //節の番号を振り直す

= 
  #table(
  columns: (6cm,6cm,6cm,6cm),
  inset: 10pt,
  table.header(
    [(1)#h(5cm)#v(1cm)], [(2)],[(3)],[(4)],))


= 
  #table(
    columns: (6cm,6cm),
    inset: 10pt,
    table.header(
      [(1)#h(5cm)#v(1cm)], [(2)],))


= 
  #table(
    columns: (6cm,6cm),
    inset: 10pt,
    table.header(
      [(1)#h(5cm)#v(1cm)], [(2)],))


#columns(2,)[

#counter(heading).update(3) //節の番号を振り直す


#rect(width:12cm,height:23cm)[
= #h(10.5cm)#v(13.5cm)
]

#rect(width:12cm,height:23cm)[
= #h(10.5cm)#v(13.5cm)
]

#colbreak()

#v(-3mm)
#rect(width:12cm,height:17cm)[
= #h(10.5cm)#v(13.5cm)
]

#rect(width:12cm,height:17cm)[
= #h(10.5cm)#v(13.5cm)
]

#colbreak()


#v(-3mm)
#rect(width:12cm,height:17cm)[
= #h(10.5cm)#v(13.5cm)
]

#rect(width:12cm,height:17cm)[
= #h(10.5cm)#v(13.5cm)
]

]

#pagebreak()


// 解答
#counter(heading).update(0)

#text(font: "BIZ UDPGothic",size: 12pt)[ #underline(offset:5pt,)[*2024年度 第2学期 期末考査 高校1年 数学B 解答用紙  3年    組    番  名前 (                     )*]]




= 
  #table(
  columns: (6cm,6cm,6cm,6cm),
  inset: 10pt,
  table.header(
    [(1)#h(5cm)#v(1cm)], [(2)],[(3)],[(4)],))


#v(-15mm)
#h(20mm)#text(size:18pt)[$display(bold(10111_((2))))$]
#h(35mm)#text(size:18pt)[$display(bold(31223_((4))))$]
#h(38mm)#text(size:18pt ,font:"BIZ UDPGothic")[$display(bold(49))$]
#h(53mm)#text(size:18pt ,font:"BIZ UDPGothic")[$display(bold(55))$]
#v(5mm)
= 
  #table(
    columns: (6cm,6cm),
    inset: 10pt,
    table.header(
      [(1)#h(5cm)#v(1cm)], [(2)],))



#v(-15mm)
#h(18mm)#text(size:18pt)[$display(bold(100010_((2))))$]
#h(26mm)#text(size:18pt)[$display(bold(11111101_((2))))$]
#v(5mm)

= 
  #table(
    columns: (6cm,6cm),
    inset: 10pt,
    table.header(
      [(1)#h(5cm)#v(1cm)], [(2)],))



#v(-15mm)
#h(15mm)#text(size:18pt ,font:"BIZ UDPGothic")[$display(bold((-4","2","-3)))$]
#h(35mm)#text(size:18pt ,font:"BIZ UDPGothic")[$display(bold(sqrt(29)))$]
#v(5mm)


#columns(2,)[

#counter(heading).update(3)


#rect(width:12cm,height:23cm)[
= #h(10.5cm)

+ ユークリッドの互除法を適用し,

  $ 3007 &= 1 times  1649 + 1358\
    1649 &= 1 times 1358 + 291\
    1358 &= 4 times  291 + 194\
    291 &= 1 times  194 + 97\
    194 &= 2 times  97 $

    よって,最大公約数は $bold(97)$

  #v(3mm)
  <別の書き方>
  $ gcd(3007 , 1649)& = gcd(1358 , 1649 )\
   &=gcd(291,1649)\
   &=gcd(291,194)\
   &= gcd(97,194)\
   &=bold(97) $
    #v(5mm)


+ ユークリッドの互除法を適用し,

  $ 2n+1 &= 1 times  (n+1) + n\
    n+1 &= 1 times n + 1 $

    よって,$2n+1$ と $n+1$ の最大公約数は $bold(1)$ 

  #v(3mm)
  <別の書き方>
  $ gcd(2n+1 , n+1)& = gcd(n , n+1 )\
  & =gcd(n,1)\
  &= 1 $

  よって,$2n+1$ と $n+1$ の最大公約数は $bold(1)$ 
    #v(5mm)
    


]

#rect(width:12cm,height:23cm)[
= #h(10.5cm)

+ 
  $ 7(-2)-5(-3)=-14+15=1 $
  $ therefore bold((x","y) = (-2"," -3)) $

+ $ 7x-5y=1#h(1mm)dots.c #h(1mm)"①"$

  $ 7(-2)-5(-3)=1#h(1mm)dots.c #h(1mm)"②"$

  $"①"-"②"$ より,

  $ 7(x+2)-5(y+3)=0  $
  $ therefore 7(x+2)=5(y+3)#h(1mm)dots.c #h(1mm)"③"  $

  $7$ と $5$ 
  は互いに素より, $k$ を整数として,

  $ x+2=5k #h(5mm)   $

  とおける。③へ代入して,

  $ 7 dot 5k = 5(y+3)  $

  $ therefore y+3=7k  $

  $ therefore bold(x=5k-2","y=7k-3 #h(2mm) (k in ZZ)) $
]

#colbreak()

#v(-3mm)
#rect(width:12cm,height:17cm)[
= #h(10.5cm)

- 求める数を $n$ とすると,
  $ n = 29x + 20 = 37y + 21#h(3mm)(x","y"は整数") $

  $ therefore 29x -37y = 1#h(1mm)dots.c #h(1mm)"①" $

- $29$ と $37$ で互除法を実行し,

  $1 &= 5(-3) + 8 dot 2\
      &= (29 - 24)(-3) + 8 dot 2\
      &= 8(9 + 2) + 29(-3)\
      &= (37 - 29) dot 11 + 29(-3)\
      &= 29(-14) + 37 dot 11\ $


  $ therefore 29(-14) - 37(-11) = 1#h(1mm)dots.c #h(1mm)"②" $

- $"①"-"②"$ より,

  $ 29(x + 14) - 37(y + 11) = 0 $
  $ therefore  29(x + 14) = 37(y + 11) $
  $29$ と $37$ は互いに素より,
  $ x + 14 = 37k#h(3mm)(k "は整数") $
  とおける。

  $ therefore x = 37k - 14 $
  $ therefore n = 29(37k - 14) + 20 $

- 最小の自然数 $n$ は $k = 1$ のときより,

  $ n = 29(37 - 14) + 20 = bold(687) $


]

#rect(width:12cm,height:17cm)[
= #h(10.5cm)

- $ x^2-3 x y +2y^2=12 $
  $ (x-y)(x-2y)=12 $

-  $x-y-(x-2y)=y>0$より,
  $ x-2y < x-y  $
  $ therefore vec(x-y,x-2y)=vec(-1,-12)vec(-2,-6)vec(-3,-4)vec(4,3)vec(6,2)vec(12,1) $
  $ therefore vec(x,y)=vec(10,11)vec(2,4)vec(-2,1)
  vec(5,1)vec(10,4)vec(23,11) $

- $x lt.equiv 0$であるものを除いて,

  $ bold(vec(x,y)=vec(10,11)vec(2,4)
  vec(5,1)vec(10,4)vec(23,11)) $


  

]

#colbreak()

// #line(start:(105%, 0%) , end: (105%, 100%)) 
// #v(-995pt)

#v(-3mm)
#rect(width:12cm,height:17cm)[
= #h(10.5cm)

- $0<p lt.equiv q lt.equiv r$ より,
  $ 1=1/p+1/q+1/r lt.equiv 1/p+1/p+1/p =3/p #h(3mm) therefore p lt.equiv 3 $



- $p=1$ のとき,
  $ 1/1+1/q+1/r=1  #h(3mm) therefore 1/q+1/r=0  $
  この等式を満たす自然数 $q$ , $r$ は存在しない。
  
- $p=2$ のとき,
  $ 1/2+1/q+1/r=1  #h(3mm) therefore 1/q+1/r=1/2  $
  $ 1/2=1/q+1/r lt.equiv 1/q+1/q=2/q #h(3mm) therefore q lt.equiv 4 $
  - $q = 2 "のとき," r"は存在しない" $
  - $q = 3 "のとき," r=6 $
  - $q = 4 "のとき," r=4 $
  
- $p=3$ のとき,
  $ 1/3+1/q+1/r=1  #h(3mm) therefore 1/q+1/r=2/3  $
  $ 2/3=1/q+1/r lt.equiv 1/q+1/q=2/q #h(3mm) therefore q lt.equiv 3 $
  - $q = 3 "のとき," r=3 $

以上より,
$ bold((p,q,r)=(2,3,6)","(2,4,4) "," (3,3,3)) $

]

#rect(width:12cm,height:17cm)[
= 
#bf([ABC組】]) #h(5.5cm)

- $ 0< a lt.equiv b lt.equiv  c$ として,$a b c  =a+b +c lt.equiv c+c+c =3c $
  $ therefore a b lt.equiv 3 $
  $ #h(5mm) therefore (a,b)=(1,1),(1,2),(1,3) $
  - $(a,b)=(1,1)$ のとき, $1+1+c = c $ この式を満たす $c$ は存在しない。
  - $(a,b)=(1,2)$ のとき, $1+2+c = 2c #h(3mm) therefore  c=3$ 。
  - $(a,b)=(1,3)$ のとき, $1+3+c = 3c #h(3mm) therefore  c=2$だが,$c<b$となり不適 。

  $ therefore (a,b,c)=(1,2,3) $

- $a","b","c$ の大小を入れ替えて( $1","2","3$ を一列に並べて)


$ 3! =bold(6#h(3mm)"(組)") $


#bf([DEF組】]) #h(5.5cm)

- $ 0< a lt.equiv b lt.equiv c lt.equiv d$ として,$a b c d =a+b+c+d lt.equiv d+d+d+d =4d $
$ therefore a b c lt.equiv 4 $
$ therefore (a,b,c) = (1,1,1),(1,1,2)(1,1,3),(1,1,4),(1,2,2) $

- この5通りを検討する。
  - $1+1+1+d = d $ この式を満たす $d$ は存在しない。
  - $1+1+2+d = 2d #h(3mm) therefore  d=4$ 。
  - $1+1+3+d = 3d #h(3mm) therefore  d=5/2$ となり不適。
  - $1+1+4+d = 4d #h(3mm) therefore  d=3$となるが, $c>d $ となり不適。
  
  - $1+2+2+d = 4d #h(3mm) therefore  d=5/3$ となり不適。

$ therefore (a,b,c,d)=(1,1,2,4) $

- $a","b","c","d$ の大小を入れ替えて( $1","1","2","4$ を一列に並べて)

$ (4!)/(2!)=bold(12#h(3mm)"(組)") $
]

]

Discussion