本文へスキップ

章 11 · 部 II · 技法

練習問題

Postext が教科書やドリルの練習問題を組む方法::::exercise ブロック、選択問題から筆算までの12種類、Markdown に書く答え、番号、問題の直後・逆さま・章末・巻末に置く解答、教師用の赤刷り版、検査、HTML と EPUB の画面で解ける練習問題

更新日 2026-10-2416分enescadefritptzhjaar

かんたんな説明

このページでは、Postext の本に練習問題を書く方法を説明します。選択肢から選ぶ問題、○か×かを答える問題、穴埋め、線で結ぶ問題、マス目から言葉を探す問題、筆算などが書けます。問題と答えは章の本文に書き、Postext が番号、選択肢、書き込む線をそれぞれの形で印刷します。解答は問題のすぐ後、逆さま、章末に印刷するか、印刷しないかを選べます。同じ本文から、すべての答えを書き込んだ教師用の版も作れます。HTML ビューアーと EPUB の本では、読者が画面で問題に答えて答え合わせができます。

問いと答えは Markdown に書き、印刷の形は練習問題スタイルで決めます。

練習問題は、章の中で :::exercise と ::: の間に書くブロックです。この中に指示文、問い、選択肢、空欄とその答え、必要なら解き方を示した解答を書きます。Postext は本文から答えを読み取り、子どもが解く形(書き込む線、空の四角、並べ替えた項目)で問題を印刷し、答えの一覧を作り、本の設定に従って解答を置きます。番号のバッジ、選択肢の記号、空欄の見た目、書き込み欄の罫は exerciseStyles で、解答を置く場所と印刷する版は exercises で決まります。こうして一つの Markdown から、児童・生徒用の本、教師用の本、画面で解ける版ができます。

練習問題は普通の段落、チップ、図形でできた囲みとして組まれます。そのため、ほかの囲みと同じように配置され、段やページをまたいで分割され、アクセシブル PDF でタグ付けされ、どの出力でも描画されます。:::exercise のない本はこれまでどおり組まれます。

#練習問題のブロック

:::exercise
日本の首都を選びましょう。
 
- [ ] 大阪
- [x] 東京
- [ ] 京都
:::

練習問題の先頭から最初のリスト、空欄、語群までの段落が指示文です。指示文は問題番号の後に、スタイルの指示文の書式(既定では太字)で組まれます。その後に続くものが本体、つまり問題が求める内容です。

ブロックには次の属性を付けられます。

属性働き
type問題の種類(後述)。内容から分かるときは省略できます。タスクリストは choice、-> の組のリストは match、[[…]] のある文は gaps、それ以外は open です。ほかの綴りもいくつか読みます(mcq、tf、cloze、matchingなど)。
style練習問題スタイルの id。省略したときや未知の id のときは、exerciseStyles の最初のスタイルになります。
title番号の後に太字で印刷するタイトル。
#id囲みと同じアンカー::::exercise{#volcanoes}。
n固定の番号。既刊の版の番号に合わせるときに使います。後の問題はこの番号から続けて数えます。
level1からスタイルの上限(既定では3)までの難易度。番号の後に印で印刷されます。level=2 なら ●●○ です。
iconスタイルが定義した活動アイコンの id を空白で区切って並べます:icon="pencil pair"。
example最初の項目を答えを書き込んだ例として印刷し、問いからは外します。
columns選択問題:選択肢を横に並べ、1行に指定した数ずつ置きます。
select選択問題:画面で選べる選択肢の数。one または many。[x] が2つ以上あれば、それだけで many になります。
shuffle=false線で結ぶ問題と順序の問題:項目を並べ替えず、書いた順に印刷します。
bank穴埋め:答えを語群として印刷します。
lines、area記述問題:書き込む行数と、書き込み欄の罫。
mark印を付ける問題:答えの語に付ける印。circle(既定)、box、underline、highlight のいずれかです。
size、directions、hidden言葉さがし:マス目の一辺、語の向き、マス目の下に語の一覧を印刷しないこと。

練習問題の中に入れるブロックが2つあります。:::solution … ::: には、解き方や模範解答を任意の Markdown で書きます。これは問題の中には印刷されず、解答の置き場所に送られます。:::hint … ::: には、画面の版で読者が求めたときに出すヒントを書きます。印刷には含まれません。

#問題の種類

並べ替えには乱数の種があります。一つの問題は、キャンバス、PDF、HTML ビューアー、EPUB、答えの一覧のどこでも同じ順に並べ替えられます。テストの別の版を印刷するときは exercises.seed を変えます。

#選択問題と正誤問題

選択問題

正しい選択肢に印を付けたタスクリストで書きます。

:::exercise
太陽にいちばん近い惑星はどれですか。
 
- [ ] 金星
- [x] 水星
- [ ] 火星
:::

選択肢は1行に1つずつ、ア、イ、ウの記号を付けて印刷され、折り返した行は本文の頭にそろえて下げます。一つの練習問題に問いが複数あるときは、順序付きリストの各項目に問いを書き、その下に字下げしてタスクリストを置きます。問いには 1.、2. と番号が付き、選択肢はその下に組まれます。

:::exercise{columns=3}
正しいものを選び、記号で答えましょう。
 
1. 植物の根が土から取り入れるもの
   - [x] 水
   - [ ] 光
   - [ ] 種
2. 葉が養分をつくるのに使うもの
   - [ ] 土
   - [ ] 風
   - [x] 日光
:::

columns=3 は選択肢を1行に3つずつ並べます。記号とその後の約物は文書の言語に従います。英語とロマンス諸語では a)、中国語では A.、日本語ではア イ ウ(後に約物は付きません)、アラビア語では أ) ب) ج) です。スタイルで、選択肢の前に印を付ける四角や丸を加えたり(options.marker)、日本や中国のテストのように問いの末尾に記号を書き込む括弧( )を付けたり(options.bracket)できます。

正誤問題

:::exercise{type=truefalse}
正しいものには○、まちがっているものには×をつけましょう。
 
- [x] 太陽は自分で光を出している。
- [ ] 月は惑星である。
:::

文にはそれぞれ番号が付き、行末に2つの答えがそれぞれ四角付きで並びます:○ □ × □。印を付けた項目が正しい文です。記号は言語に従い、英語では T/F、スペイン語、カタルーニャ語、フランス語、イタリア語、ポルトガル語では V/F、ドイツ語では R/F、中国語では √/×、日本語では ○/×、アラビア語では صح/خطأ です。スタイルの trueFalse.look: 'bracket' を使うと、代わりに答えを書き込む空欄を1つ印刷します。日本のテストでよく見る形です。

#穴埋めと語群

[[答え]] は空欄で、書き込む線として印刷されます。

:::exercise{bank}
あてはまることばを語群から選んで書きましょう。
 
1. 根は土から[[水]]を取り入れる。
2. 葉は植物の[[養分]]をつくる。
3. 花は[[こん虫 | 虫]]を引きよせる。
 
::bank[石 | 風]
:::
  • [[子ども | 子供]]:正解が複数ある空欄。答えの一覧には最初のものが印刷されます。
  • [[が | (を) | に]]:文中の選択。選択肢が行の中に (が / を / に) と印刷され、括弧で囲んだものが正解です。読者はそれを○で囲みます。
  • [[行った]]{width=6}:幅6全角の空欄。
  • \| は答えの中の縦線そのもの、\[[ は角括弧2つそのものです。

一つの練習問題の空欄は、どれもいちばん長い答えに1.5全角を足した幅になるので、線の長さから答えが分かることはありません(blank.width で変えられます)。bank を付けると、答えを並べ替えて枠付きの語群にし、指示文の下に印刷します。::bank[石 | 風] の行を書くと、語群はその行の位置に印刷され、行の語がまぎらわしい語として加わります(この行だけでも語群が印刷されます)。[[…]] は練習問題の中でだけ読まれ、本のほかの場所の二重の角括弧は書いたまま残ります。

指示文ではなく本文から始まる練習問題では、番号が最初の段落の頭に追い込まれます。

:::exercise
1週間は[[7]]日、1年は[[12]]か月です。
:::

#線で結ぶ問題と分類

線で結ぶ

->(または →)で組を書きます。

:::exercise
生き物と、そのすみかを線で結びましょう。
 
- モグラ -> 土の中
- メダカ -> 小川
- ツバメ -> のき下
- クモ -> あみ
- -> 木のほら
:::

左の列は書いた順に、右の列は並べ替えて印刷され、各項目の横に線で結ぶための点が付きます。- -> 木のほら は、どれとも結ばない項目を右の列に加えます。match.look: 'letters' にすると右の列に記号が付き、左の各項目に記号を書き込む括弧が付きます。shuffle=false は右の列を書いた順のままにします。

分類

:::exercise{type=sort}
野菜を、食べている部分で分けましょう。
 
- 根:ニンジン、ダイコン
- 葉:キャベツ、ホウレンソウ
- 実:トマト、ナス
:::

項目はすべて並べ替えて語群に入れ、分類ごとに列(4つまで)を作って、名前とその下に罫線を印刷します。分類名の後は : でも : でもかまいません。項目はカンマ、セミコロン、、、,、، で区切れます。

#並べ替え

順序の並べ替え

:::exercise{type=order}
ヘチマが育つ順に番号を書きましょう。
 
1. 種から芽が出る。
2. つるがのびる。
3. 花がさく。
4. 実ができる。
:::

リストは正しい順に書きます。印刷では順番が入れ替わり、各項目に番号を書く四角が付きます。

語順の並べ替え

:::exercise{type=scramble}
ことばを正しい順にならべて、文を作りましょう。
 
- 水を / 植物は / 必要と / する
- 地面を / 太陽が / あたためる
:::

文はスラッシュで区切られ(スラッシュがなければ空白で区切られます)、区切った語句が並べ替えられてスラッシュをはさんで印刷されます。その下に文を書く線が付きます。日本語の文には空白がないので、区切りはスラッシュで書きます。

#印を付ける

:::exercise{type=mark}
動きを表すことばを○でかこみましょう。妹が花に水を[[やり]]、日光が土を[[あたためる]]。
:::

文はそのまま印刷され、[[…]] の語が印を付ける語です。答えでは○で囲まれます。ブロックに mark=box|underline|highlight を付けると四角で囲む、下線を引く、蛍光ペンで塗るのいずれかになり、[[やり]]{mark=underline} のように語ごとに変えることもできます。

#記述問題と解答欄

:::exercise{type=open lines=4}
植物に日光が必要なのはなぜですか。
 
:::solution
日光を使って、自分で養分をつくるから。
:::
:::

指示文の後に書き込む罫線が続きます。既定では3行、この例では lines=4 で4行です。本体がリストなら、項目ごとに罫線が付きます。area で罫の種類を変えられます:lines、dots、grid(方眼)、seyes(フランスの学校のセイエス罫)、tianzige(田字格。中国の子どもが漢字を書くマスで、十字の補助線が入ります)、box(絵をかく空の枠)、none。:::solution は模範解答で、解答とともに印刷され、教師用の版では罫線の上に書き込まれます。

#言葉さがしとクロスワード

言葉さがし

:::exercise{type=wordsearch size=8 directions="across down diagonal backwards"}
かくれている花の名前をさがしましょう。
 
- ヒマワリ
- アサガオ
- タンポポ
- コスモス
:::

語は文字のマス目の中に置かれ、マス目の下に一覧が印刷されます(hidden を付けると一覧は印刷されません)。マス目はいちばん長い語が入る大きさまで広がり、size で一辺を決められます。directions には across、down、diagonal、backwards を指定でき、既定は横、縦、斜めです。空いたマスには探す語の文字が入るので、かなのマス目もそのまま作れます。スタイルで指定しない限り、ラテン文字は大文字で組まれます。置けなかった語は報告されます。

クロスワード

:::exercise{type=crossword}
クロスワードをときましょう。
 
- ネッコ:土の中にある部分
- ハッパ:日光を受けて養分をつくる緑の部分
- ハナ:ミツバチを引きよせる
- タネ:まくと芽が出る
:::

各項目は語とそのカギです。エンジンがマス目を組み、各語の最初のマスに番号を振り、マス目の下に文書の言語の見出しを付けた2つの一覧でカギを印刷します(日本語ではヨコのカギとタテのカギ、英語では Across と Down、スペイン語では Horizontales と Verticales)。

#筆算

:::exercise{type=arithmetic}
筆算で計算しましょう。
 
- 345 + 278
- 902 − 456
- 124 × 3
- 864 ÷ 4
:::

各計算は、子どもがノートに書くようにマスに組まれます。数字は位ごとの列に、記号は左に置かれ、線の下に答えを書く空のマスが続きます。1行に4つまで並びます。右から左へ組むページでは、各計算の数字は左から右のまま、計算どうしは右から左へ並びます。読む記号は +、-、−、×、x、*、·、⋅、÷、:、/ で、数は整数です。わり算の筆算は文書の言語の学校の書き方に従い、arithmetic.division で別の書き方を選べます。

  • bracket:わる数を左に、わられる数を厂の形の線の下に、商をその上に書きます。日本語、英語、中国語、アラビア語の本。
  • potence:わられる数を左に、わる数を右の L 字の下に書き、商はわる数の下、余りはいちばん下に来ます。スペイン語、カタルーニャ語、フランス語、イタリア語、ポルトガル語の本。
  • inline:864 : 4 = と商のマスを同じ行に書き、途中の計算をその下に書きます。ドイツ語の本。

#例として答えた最初の項目

example を付けると、最初の項目が答えの色で解かれた状態で印刷されます。最初の空欄には答えが入り、最初の問いの正しい選択肢は○で囲まれ、最初の組は線で結ばれ、最初の文は書き写されます。この項目は画面では問われず、その答えは語群にも入りません。

#番号、参照、難易度

練習問題には章ごとに 1、2、3 と番号が付きます。それ以外はスタイルで決めます。番号を太字にして後にピリオドを付けるか(既定)、円、四角、角丸の四角の中に置くか(number.shape)、番号の前に文書の言語の語を置くか(number.label: true で「練習 3」)、数字の種類(number.format。中国語の 一、二、など)、章番号を加えるテンプレート('{h1}.{n}')、番号を振り直す単位(number.resetOn:章ごと、節ごと、振り直さない)。同じ number.counter を指定したスタイルは一つの番号を共有し、本の中で章から章へ番号を引き継ぎます。

ブロックに n=12 を付けるとその問題は12番になり、次の問題は13番から続きます。#id を付けると問題が :ref の参照先になり、参照は「練習 3」のような名前を印刷します(スタイルが number.label で語を決めていればその語、なければ文書の言語の語)。style=number は 3 を、style=title はブロックの title(なければ名前)を、style=page はページを印刷します。本のほかの章の問題も参照できます。level と icon は番号の後に、スタイルが定義した難易度の印と活動アイコンを印刷します。

#解答

#略解

採点できる問題には、答えから作った略解があります。正しい選択肢の記号と語(イ 水星)、空欄の答えを順に(1 水 · 2 養分 · 3 こん虫)、文ごとの ○ か ×、組、順序、文、番号付きのクロスワードの語、計算の答えです。full レイアウト(既定)では、略解の後にその問題の :::solution が続きます。記述問題には略解がなく、模範解答がそのまま解答になります。

#解答を印刷する場所

本全体については exercises.solutions.placement で決め、スタイルごとに自分の問題について変えることもできます。

置き場所印刷されるもの
none解答を印刷しません(既定)。画面の版には解答があります。
after問題のすぐ後に、小さい文字で解答を印刷します。
inverted同じ囲みを上下逆さまにして印刷します。パズルの本や子ども向けの雑誌の答えの載せ方です。
chapterEnd章の解答をまとめて章末に、文書の言語の見出し(解答、Solutions、Soluciones、Lösungen、参考答案など)の下に印刷します。各解答の前には問題番号が付きます。
directive章の中に :::solutions と書いた場所にだけ印刷します。

directive では、:::solutions の行が、それより前にあってまだ解答を印刷していない問題の解答を印刷します。見出しは title="…" で変えられます。本の最後の独立した章に :::solutions{scope="book"} を書くと、本のすべての問題の略解と解答が章ごとに印刷されます。

# 解答
 
:::solutions{scope="book"}

#教師用の赤刷り版

{ "exercises": { "edition": "teacher" } }

と設定すると、すべての答えがそれぞれの場所に、答えの色(スタイルの answers.color を指定しなければ赤紫)で印刷されます。空欄には答えが入り、正しい選択肢は○で囲まれるか四角が塗られ、○ か × の四角が塗られ、結ぶ線が引かれ、順序の四角に番号が入り、文と分類した語は罫線の上に、記述問題の模範解答も罫線の上に、クロスワードの語と計算の答えはマスの中に入ります。日本の教師用指導書の朱書きと同じ形です。

#検査

Sandbox の検査パネルと collectContentWarnings は、エンジンが読めないものを報告します。

  • exerciseUnknownType:12種類のどれでもない type。
  • exerciseUnknownStyle:どの練習問題スタイルにも当たらない style(最初のスタイルが使われます)。
  • exerciseNoAnswer:採点できるはずの問題に採点するものがない。正しい選択肢に印のない問い、[[…]] のない穴埋め、組のない線で結ぶ問題などです。
  • exerciseUnreadItem:その種類として読めないリスト項目。-> のない線で結ぶ項目や、2つの整数と記号になっていない計算などです。
  • exerciseWordUnplaced:言葉さがしやクロスワードで置けなかった語。
  • exerciseNested:ほかの練習問題の中にある練習問題。
  • solutionOutside:練習問題の外にある :::solution や :::hint。何も印刷されません。

#HTML と EPUB の練習問題

HTML ビューアーと EPUB の本では、練習問題に答えられます。読者は空欄に入力し、選択肢、文、結ぶ点、マス目のマスをクリックしてから、答え合わせをしたり、解答を見たり、やり直したりします。正解と不正解は色と印で示され(digital.correctColor、digital.wrongColor)、スクリーンリーダーにも読み上げられます。答えは本ごとにブラウザーに保存されるので、次に開いたときも残っています(exercises.digital.persist)。exercises.digital.check: 'instant' にすると答えるたびに答え合わせをし、exercises.digital.interactive: false にするとページは印刷と同じ形のままになります。EPUB には印刷での置き場所にかかわらず必ず略解が入るので、スクリプトを実行しないリーディングシステムでも答えを確かめられます。

画面の練習問題に独自の形を与えるには htmlViewer.overrides を使います。これは HTML ビューアーがレイアウトする前に本の設定の上にマージされ、印刷は元の設定のままです。

const config: PostextConfig = {
  exercises: { solutions: { placement: 'chapterEnd' } },
  htmlViewer: {
    overrides: {
      exercises: { solutions: { placement: 'none' } },
      exerciseStyles: [
        { id: 'exercise', blank: { minWidth: { value: 6, unit: 'em' } }, area: { kind: 'none' } },
      ],
    },
  },
};

#練習問題スタイル

const config: PostextConfig = {
  exerciseStyles: [
    {
      id: 'activity',
      number: { shape: 'disc', background: { hex: '#2a5ea8', model: 'hex' } },
      instruction: { fontFamily: 'Noto Sans JP' },
      options: { marker: 'circle', bracket: true },
      blank: { look: 'dots' },
    },
  ],
};

スタイルのすべての項目と、その型と既定値は設定:練習問題にあります。スタイルの枠は囲みスタイルから取る(box)ので、練習問題も本のほかの囲みと同じように、色付きの背景と帯の付いた囲みに入れられます。教科書やドリルの練習問題を移植するときは、postext-port スキルも同じ手順に従います。