Available question types¶
Each type has one section here, in alphabetical order, holding everything
there is to say about it: the shapes it can ask, the sources a line must give
it, what steps has it show, the options it reads on top of the common ones,
and whatever else is worth knowing. The three sections below come first
because they belong to no type in particular — the options every type reads,
steps, and the wording variant the operation types share.
Options every type reads¶
Written on the line, behind its -- separator (see Question
specs). Every type reads these five; what a type
adds to them is listed in its own section, and an option no type reads at all
is refused by check qspec as well as at render time.
| Option | What it does |
|---|---|
answer_layout |
inline for an answer taking the place of the ?, below for one written underneath, side for one written beside the wording |
note_layout |
below or right — where the note of the question, where there is one, is written |
steps |
how much of the calculation the answer key writes out — 0, the default, is the result alone |
transduration |
seconds a slide gives the question, overriding the default of the type |
variant |
which of the shapes a type offers is asked — its own table lists them; see Selecting variants |
The steps option¶
Every question type reads steps the same way: a level from 0 — the answer
alone, and the default everywhere — up to the highest one the type knows how
to show. steps=true and steps=false are accepted too, and mean 1 and 0.
Above 0 the answer spells the calculation out.
The option shapes the sheet. A correction slide always answers at level
0, whatever the line asked for: a slide is read from the back of the room,
in the seconds before the next one, so it shows the result and leaves the
detail to the help button.
Types that show steps, all at level 1:
| Type | steps=1 shows |
|---|---|
expand_simple |
the distribution, then the reduced form |
multi_expand |
the expansion, its two products, then the result |
order_of_2ops |
the intermediate expression, then the result |
multi_direct and multi_vocab, with scale |
the table fact, the zeros, then the result |
the four operation types with variant=wording |
the operation the sentence names, then its result |
square_of and cube_of |
the power, the multiplication it stands for, then the result |
A level above what a type can show is capped, not refused: asking for more
detail than a type has is asking for all of it. So steps=3 on
expand_simple means steps=1, and multi_direct 2-9×2-9 -- steps=1 asks
for nothing at all — 6 × 7 has nothing to explain that its answer does not
already say. That is what lets a mixed block carry the option for the types
that use it, without the others turning it down. Only what is not a level at
all is refused — a negative, a word — by check qspec as well as at render
time.
Two of those rows depend on the line rather than on the type alone:
scale gives multi_direct zeros to explain, and variant=wording gives the
four operation types the operation their sentence names. The same steps=1
that asks for nothing on a plain product then has something to spell out.
square_of and cube_of are the exception among the worded types: their step
belongs to the type, and is there on the plain form too.
Leaving steps at 0¶
Leave it at 0 on a mental-calculation sheet. On the live page
(render html --interactive) the answer key then carries a small ⓘ button
next to each such answer, opening the whole calculation in a modal: the
printed sheet keeps the bare result the exercise asks for, and the reasoning
is one click away for whoever wants it. Raising steps puts those very
lines in the answer itself, and the button disappears — there is nothing left
to show. The button never prints, and the static page has none.
A slideshow does the same, from its own controls: a correction slide whose
type has steps carries a discreet Steps button at the bottom right, opening
the same chain in a panel (see slideshows). A slide
answers at level 0 whatever steps asked for — it is read from the back of
the room, in the seconds before the next one — so the button is there on every
correction of a type that has steps.
The wording variant¶
The four operation types can ask their question as a sentence rather than
as an expression, with -- variant=wording:
| Spec | What is asked |
|---|---|
addi_direct 10-99 10-99 -- variant=wording |
Sum of 27 and 48? |
addi_direct 2-9 2-9 2-9 -- variant=wording |
Sum of 3, 5 and 8? |
subtr_direct 10-99×10-99 -- variant=wording |
Difference between 52 and 37? |
multi_direct 2-9×2-9 -- variant=wording |
Product of 6 by 7? |
multi_direct 2-9×2-9×2-9 -- variant=wording |
Product of 2 by 3 and by 5? |
divi_direct 2-9×2-9 -- variant=wording |
Quotient of 42 by 7? |
Same operation, same numbers, same answer — only the way the question is put
changes. That is what distinguishes it from multi_vocab and divi_vocab,
where the word replaces an operand (double 7, a third of 21) and the
source has to supply the 2, 3 or 4 the word stands for. square_of and
cube_of offer the same variant — What is the square of 8? — and follow
everything below; what is specific to them is described under
square_of.
subtr_direct words the same subtraction two further ways, as the
complement it computes: variant=to_reach — What number must be added to
37 to make 100? — and variant=complement — What is the hundreds complement
of 37? Both are sentences like the rest and follow everything below, except
that they imply result=positive; what is specific to them is described under
subtr_direct.
addi_direct tells its addition a further way, as a mini-problem:
variant=story — Our neighbours have 47 sheep. We have 28 more sheep than
they do. How many sheep do we have? It is described under
addi_direct.
A line can mix the two forms: multi_direct 2-9×2-9 -- variant={default|wording}
draws the form of each of its questions independently.
What the variant changes¶
The answer goes underneath. A sentence has no ? for the answer to take
the place of, so answer_layout defaults to below instead of inline. An
explicit answer_layout=inline on the line still wins.
The question is given more time, since a sentence is read through before it is computed:
| Type | Plain | Worded |
|---|---|---|
addi_direct |
20 s | 24 s |
subtr_direct |
20 s | 24 s |
multi_direct |
20 s | 24 s |
divi_direct |
20 s | 24 s |
An explicit transduration= still wins, and an option that already asked for
more time is not added to — multi_direct 2-9×2-9 -- variant=wording
scale=1-3 stays at 24 s, the longer of what the zeros and the sentence are
worth.
The question gains a step. A worded question can show the operation its sentence names, which is the whole of what it was testing:
At steps=0 — the default — the answer key shows 56 alone and keeps the
line above behind its ⓘ button, a correction slide behind its Steps
button. steps=1 puts it in the answer itself. The plain form has no such
step: its wording already is the operation.
Where the answer is drawn rather than written — the fraction of divi_direct
fractions — the step draws it the same way: Quotient de 3 par 4 ? opens on
3 ÷ 4 = 3/4 (ou 0,75). square_of and cube_of go one level further, and
have their step on the plain form too — see square_of.
A worded multi_direct carrying scale keeps the longer chain of the zeros,
which already opens on the multiplication.
Everything else is untouched: the sources, carry, result, min_result,
max_result, shuffle and scale behave as they do without the variant. So
subtr_direct still orients its pair at random, and the sentence names the two
terms in that order — Difference between 52 and 37? is 52 − 37. Where
negative differences are not wanted, say so with result=positive or
min_result=, exactly as for the plain form.
A misspelt variant is refused by check qspec and at
render time: it would otherwise fall back silently on the default form, and the
mistake would only show on the printed sheet.
Three terms and more: the preposition comes back¶
Past two terms, the sentence repeats the preposition of the operation before each of them rather than listing them behind a single one:
Somme de 4, de 5 et de 9 ? not: Somme de 4, 5 et 9 ?
Produit de 4 par 5 et par 9 ? not: Produit de 4, 5 et 9 ?
The reason is the decimal comma. Somme de 4, 5 et 9 ? is read by a pupil as
the sum of 4,5 and 9, and answered 13,5 — a right answer to the wrong
question. The repeated de / par makes the reading impossible.
Two terms keep the shorter sentence — Somme de 14 et 18 ?, Produit de 6 par 7 ? — since with nothing between the numbers but the conjunction there is no list to read wrong, and a shorter question is a question read faster.
Which word comes back is part of the translation, not of the code: the two templates a list is folded with are translated strings, so a language whose decimals need no such precaution can join its terms plainly.
addi_direct¶
Addition.
| Variant | Example |
|---|---|
| (default) | 27 + 48 = ? |
wording |
Sum of 27 and 48? |
story |
Emma has 27 marbles. Jack has 48 more marbles than Emma. How many marbles does Jack have? |
Sources — one source per term, or a product range giving several at once — 10-99 10-99, 2-9 2-9 2-9, 10-99×10-99; or one time range per term — 8h-17h30[5min] 10min-2h[5min]; or clocktimes alone, a departure and a duration drawn in a frame.
Steps — none on the plain form; one level under variant=wording, on the operation the sentence names.
Options — these, on top of the ones every type reads:
| Option | What it does |
|---|---|
carry |
false draws an addition no column carries, true one where at least one does |
max_result |
the largest sum the draw may land on |
min_result |
the smallest sum the draw may land on |
result |
positive, negative, or the sums allowed, written as a numrange — 300-1000[100] |
shuffle |
false keeps the terms in the order the sources are written — the default on a line of times; with variant=story, the first source gives the first number the story tells |
step |
with clocktimes, the minutes the times move by — 5 by default, 1 for any minute |
units |
on a line of times, the units the answer is typed in — h_min, min_s, h_min_s (or one unit alone); by default, from the largest unit the sources write to the finest their values need |
What follows holds for subtr_direct as well: the two types
read their sources, frame their result and count their carries the same way,
and are described here together.
Both read their numbers from the sources in the order they are written, one source giving as many terms as its width:
| Spec | What is drawn |
|---|---|
addi_direct 10-99 10-99 |
two terms, from two independent ranges |
addi_direct 2-9 2-9 2-9 |
three terms |
addi_direct 10-99×10-99 |
two terms, drawn as one pair |
subtr_direct 100-999 10-99 |
the minuend, then the subtrahend |
An addition adds up between two and six terms — six is a hexagon's perimeter,
past which the sides are equal and the sum is a product. A subtraction takes
exactly two numbers, and check qspec says so when the sources give anything
else.
Two independent sources are usually the better choice: each term gets its own
range, and no pair is ever spent — a product range never draws the same pair
twice, which is a constraint a sum does not need. What a product range brings
instead is the anti-repeat tracking of the pairs table, shared with the
neighbouring multi_direct questions. Two singleton ranges share the
singletons table the same way.
With a single pair range, the two values are oriented at random, and by
the constraints when there are any: a pair range holds (38, 47) and never
(47, 38), so a subtraction reading it as it comes would forever take the
larger from the smaller.
carry — with or without a carry¶
carry=false draws an operation no column carries, carry=true one where at
least one column does. For a subtraction, that carry is the borrow.
(6) addi_direct 10-99 10-99 -- carry=false
→ 42 + 37 = ?
(6) addi_direct 10-99 10-99 -- carry=true
→ 46 + 29 = ?
(6) subtr_direct 10-99 10-99 -- result=positive carry=true
→ 95 − 76 = ?
The columns are read on the digits, as they are written by hand, and decimals
are aligned on the finest precision among the terms first: 0.1-9.9 0.1-9.9
-- carry=false draws 8,2 + 1,3 and never 7,7 + 2,5, whose tenths carry.
The option works the same across three terms or six: a column carries when
its digits sum above nine.
Left out, the option constrains nothing and both kinds come up.
result, min_result and max_result — framing the answer¶
result=positive and result=negative say what they say in order_of_2ops,
and result=positive is exactly min_result=0 — a null difference is a
legitimate subtraction. Nothing constrains the result by default, so
subtr_direct 10-99 10-99 draws 33 − 91 as readily as 56 − 16; for the
grades where negative numbers are not taught yet, say so:
min_result and max_result frame it more closely, and both work on the
addition too:
(6) addi_direct 10-99 10-99 -- max_result=100 stay under a hundred
(6) subtr_direct 10-99 10-99 -- min_result=10 a two-digit answer
carry=false and result=negative are refused together: taking a number from
a smaller one always borrows somewhere.
result — naming the answers outright¶
Written as a numrange rather than as a sign, result
names the results allowed and no others. That is how a target which varies
from question to question is said, the complement to a round hundred above
all:
(10) addi_direct 10-990[10][^100] 10-990[10][^100] -- result=300-1000[100]
→ 140 + 660 = ? 530 + 170 = ? 320 + 680 = ?
Each question lands on one of the eight round hundreds from 300 to 1000, and
the [^100] keeps a term from being one of them — 300 + 400 is not the
exercise. A single value is the short way to pin it: result=1000 says
min_result=1000 max_result=1000.
The numrange must draw single numbers, one result being what an operation
comes out at, and it may list at most a hundred of them. Past that it is an
interval, which min_result and max_result state exactly:
addi_direct 10-99 10-99 -- result=1-500
→ result=1-500 lists 500 results; past 100 it is an interval, which
min_result= and max_result= state exactly.
A bound written beside the set narrows it rather than overriding it, and one that leaves nothing is refused like any other contradiction.
What the constraints do to the draw¶
They bear on the combination, not on any single number, so they cannot be
pushed down into a source. Each draw is instead narrowed to the values the
remaining sources can still complete: nothing is ever produced outside a
declared range, and a first term never corners the draw — addi_direct 2-9 2-9
2-9 -- carry=false will not open on a 9, which no two terms above 2 could
follow.
A constraint no combination satisfies is an error, and
automath check qspec reports it before anything is
rendered:
subtr_direct 2-9 2-9 -- min_result=10
→ no combination of '2-9', '2-9' satisfies min_result=10.
Widen a source, or relax the constraint.
One that leaves very little is a warning instead — the sheet would keep asking the same few questions. Beyond a hundred thousand combinations the spec is reported without a feasibility verdict, and an impossible one then raises while rendering, with the same message.
A source that is not a numrange — a content table, an alternator — cannot be narrowed, so the constraints refuse it. Without them it draws as usual.
Times — durations and times of day¶
Sources written with units are time ranges, and the two types then add and subtract times instead of numbers:
| Spec | What is asked |
|---|---|
addi_direct 8h-17h30[5min] 10min-2h[5min] |
a time of day, plus a duration — 9 h 35 min + 1 h 10 min = ? |
addi_direct 1h-3h[5min] 10min-50min[5min] |
two durations |
subtr_direct 13h-18h[5min] 8h-12h[5min] |
the time elapsed between two times of day |
subtr_direct 8h-17h30[5min] 10min-2h[5min] |
a time of day, some duration earlier |
addi_direct 1min-5min[1s] 10s-50s[5s] |
in minutes and seconds — 1 min 40 s + 15 s = ? |
A time of day and a duration are not told apart: they add and subtract alike, so nothing in the line has to say which is which. Every source of the line must be a time range — one mixing times and numbers is refused.
Values are written as a clock writes them: every unit after the first on two
digits, and the units holding nothing left out at both ends — 8 h 05 min,
45 min, 2 h.
The answer is typed one unit at a time, in a box per unit: … h … min.
The boxes run from the largest unit the sources write down to the finest one
their values need, and every one of them is drawn, the hours included
where the answer has none — leaving a box out would give the answer away, and
a box per unit is what makes the pupil answer in the units asked for. A box
left empty counts as zero; a number of minutes or seconds past 59 is refused,
the unit above being there to hold it. units names another span — h_min,
min_s, h_min_s, or a single unit:
(6) addi_direct 30min-50min[5min] 30min-50min[5min] → … min
(6) addi_direct 30min-50min[5min] 30min-50min[5min] -- units=h_min → … h … min
A span may start higher or lower than the sources; it may not stop above the finest unit a value needs, which could then not be answered in it.
The options read the same way, in time:
carry=trueasks for sixty minutes to be made into an hour — or, for a subtraction, an hour to be borrowed as sixty minutes; sixty seconds and a minute likewise. A span starting at the minutes has no hour to carry into:40 min + 35 minis then a plain75 min.min_result,max_resultandresultare written as times —max_result=12h,result=1h-3h[15min]— andresult=negativeis refused: no time is.- No result crosses midnight: a time stays under 24 h unless
max_resultlets it go further, so22 h 40 min + 3 h 20 minis never drawn by default. A difference is never negative.
clocktimes — times drawn in a frame¶
clocktimes, written alone where the sources go, frames the draw for you: it
draws a departure and an arrival that belong together, and the
addition asks the departure plus the duration, the subtraction the arrival
less the departure.
(5) addi_direct clocktimes → 14 h 35 min + 1 h 50 min = ?
(5) subtr_direct clocktimes → 11 h 15 min − 8 h 40 min = ?
The departure is never on the hour, and the arrival never has the minutes of
the departure — the duration would be a whole number of hours. And the
operation carries by default: the minutes of the arrival are drawn below
those of the departure, so that the addition makes sixty minutes into an hour
and the subtraction borrows one. carry=false asks the other way round.
The times are drawn in a broad frame of the day — a departure from 5 h to
22 h 30 min, a duration from 9 min to 8 h 30 min, an arrival before
23 h 59 min — every step minutes: 5 by default, which keeps the
calculation within reach of mental work, and 1 for any minute. The step
must divide the hour: 1, 2, 3, 4, 5, 6, 10, 12, 15, 20 or
30. The same times told as a story — a film, a bus journey, a cake in the
oven — are mini_pb_time.
The frame is what bounds the draw, so result, min_result, max_result
and units are refused beside clocktimes — the answer is in hours and
minutes — and so is any other source: write time ranges to frame the draw
yourself.
Shuffling, and the rest¶
addi_direct shuffles its terms, so addi_direct 100-999 2-9 asks 7 + 342
as well as 342 + 7; -- shuffle=false keeps the order of the sources. On a
line of times the order of the sources is kept by default — the time of day
first, the duration added to it after — and -- shuffle=true shuffles them.
subtr_direct has no such option, its order being what the question means.
Neither type has steps to show, both answer inline, and both default to 20 s
per question — 30 s on a line of times, sum or difference alike — see The wording variant for what
variant=wording changes to the last two.
variant=story — the addition told as a mini-problem¶
addi_direct can also tell its addition as a short story, with
-- variant=story:
(4) addi_direct 11-99 11-99 -- variant=story
→ Nos voisins ont 47 moutons. Nous avons 28 moutons de plus qu'eux.
Combien de moutons avons-nous ?
→ Jules a lu 23 pages de son livre ce matin, et 35 de plus cet
après-midi. Combien de pages a-t-il lues aujourd'hui ?
The operation is still an addition of two numbers drawn from the sources, and
the answer is still their sum: the story only dresses it up. Finding which
operation a story calls for is another exercise, the one
mini_pb_time sets with times.
Each story has its own bounds. Eggs laid in a day are counted in tens, a
gardener's lettuces in tens too, a number of marbles may run into the
hundreds. The story is taken first, among those the ranges of the line can
tell, and the two numbers are then drawn inside both the ranges and the
story's bounds. So addi_direct 2-99 2-99 -- variant=story tells the gardener
planting 12 and 7 lettuces as well as the neighbours' 85 sheep, but never 85
lettuces. The ranges keep deciding how hard the addition is, the story keeps
it plausible.
Lines that tell well. Any pair of numranges will do as long as some story fits them, but a few lines suit mental arithmetic and leave the sheet many stories to choose from:
| Line | Numbers | Stories |
|---|---|---|
2-9 2-9 |
single digits | counts and measures alike, in every theme |
11-99 11-99 |
two-digit numbers | the most stories |
100-1000[5] 100-1000[5] |
three digits, multiples of five | fewer stories, but a sum still within reach of mental work |
1.1-9.9[^1] 1.1-9.9[^1] |
both decimal, one decimal place | measures only — kg, km, L — a dozen or so stories |
10.0-100.0[0.5][^1] 10.0-100.0[0.5][^1] |
both decimal, by halves: 39,5 + 24,5 | measures only, about ten stories |
1.00-9.95[0.05][^1] 1.00-9.95[0.05][^1] |
small prices, by five cents: 3,45 € + 6,80 € | prices, and measures when both numbers have a single decimal |
10.00-50.00[0.50][^1] 1.00-9.95[0.05][^1] |
a larger price and a small one: 24,50 € + 6,85 € | prices mostly |
[^1] keeps whole numbers out of a decimal range: without it, 1.1-9.9
also draws 4 or 7, and the sheet mixes counts in among the measures. By
halves, [0.5], an elephant drinks 39,5 L, not 39,6 L: precise enough to
practise, and plausible. Better not mix sizes in one range: 11-1000[5] draws
two numbers under 100 often enough to make many of the sums too easy —
write two lines instead.
The stories come in turn, a theme at a time. They are grouped in broad themes — animals, cooking, everyday life, family and friends, fantasy, harvest, leisure, space, sports — and a sheet goes through the themes before coming back to one, then through the stories of each theme: a wizard is not followed by a dragon, nor two stories of a theme told one after the other, and a story just told keeps clear of the next eight questions — as long as the line can tell enough others. Some stories are told in several versions, the one told last time never coming again at once: the baker bakes croissants, baguettes, loaves or brioches, it rains on two days of the week that follow each other, the squirrel hid hazelnuts, walnuts or acorns.
Two numbers, from numranges. A story tells exactly two numbers, and its
bounds can only be compared with numranges: three sources, a content table, or
time ranges are refused — a story about times is
mini_pb_time. A story about a measure has its answer typed
with the unit printed beside the box. Only some of them are told with
decimals, and with no more decimal places than they make sense with: a hike
of 12,5 km, a bag of 3,8 kg, a height of 1,39 m — but no ride of
47,3 km, a precision nobody tells. Most of these are told with whole
numbers too, a height in metres only with decimals — 1.00-1.70 0.01-0.12
is the line it needs. A story about money writes its prices to the cent —
3,60 €, never 3,6 € — and a whole price without any: une tarte à 12 €;
12 + 3,60 = 15,60 mixes both, as a shop does. A pupil who types 15,6
has the right answer all the same. A price finer than the cent (8,208 €)
is rounded with a warning, or otherwise as the prices.finer_than_cent
setting says (see the configuration). A story about a
count never gets a decimal number, and says what it counts in small grey
words under the box —
(billes), (œufs), (glands) — the word following the version told. A
slide, which has no box, writes the word after the number: 75 billes.
Some stories only take multiples of a number, as they are in real life:
a cake's flour, sugar and butter are weighed by fives of grams. Whatever the
line starts at, the numbers are then multiples of five —
addi_direct 11-99 11-99 -- variant=story mixes 15, 20 or 85 g of flour,
never 11, 16 or 99.
The other options still apply, on top of the story: carry=true,
max_result=100 and the rest constrain the draw as they do without it. By
default either source can give either number of the story; shuffle=false
gives the first source to the first number the story tells.
When no story fits the line, automath check qspec says
so before anything is rendered. When only one or two fit, it warns that the
sheet will keep telling them:
addi_direct 2000-3000 2-9 -- variant=story
→ no story can be told with the numbers of '2000-3000', '2-9'. Choose other
ranges, e.g. "addi_direct 2-20 2-20 -- variant=story".
Like the wording variant, a story writes its answer underneath. It gets 30 s
on a slide, and one step: steps=1 (or the ⓘ button) writes out the
addition, 47 + 28 = 75. The first names it uses follow the language of the
render, and in French a story elides before the names that call for it:
plus qu'Emma, le chat d'Hugo, but plus que Léa. A story never leaves
its question mark alone at the start of a line (French sets a narrow
no-break space before it), nor a number apart from its unit — 23 mL stays
on one line.
addi_hole¶
Addition with a missing term.
| Variant | Example |
|---|---|
| (default) | ? + 48 = 75 |
Sources — one source per term, or a product range giving several at once — 10-99 10-99, 2-9 2-9 2-9, 10-99×10-99; the sum is worked out from them.
Steps — one level: steps=1 writes out the subtraction the missing term is recovered by.
Options — these, on top of the ones every type reads:
| Option | What it does |
|---|---|
carry |
false draws an addition no column carries, true one where at least one does |
hidden |
which term the hole falls on, counted from 0 in the order the terms are displayed; drawn afresh for each question where the option is left out |
max_result |
the largest sum the draw may land on |
min_result |
the smallest sum the draw may land on |
result |
positive, negative, or the sums allowed, written as a numrange — 300-1000[100] |
shuffle |
false keeps the terms in the order the sources are written — the default on a line of times; with variant=story, the first source gives the first number the story tells |
step is refused here: a hole is not asked on times: its sources are numbers.
units is refused here: a hole is not asked on times: its sources are numbers.
What follows holds for subtr_hole as well: the two types draw
their numbers, place their hole and frame their result the same way, and are
described here together.
What the sources give, and what is worked out¶
The sources give the terms of the operation, exactly as they do for
addi_direct and subtr_direct — same
notation, same number of them, same anti-repeat tracking. What the question
shows after the = is then worked out from them, and the hole takes the
place of one of the terms:
| Spec | What is asked |
|---|---|
addi_hole 10-99 10-99 |
? + 48 = 75, or 27 + ? = 75 |
addi_hole 2-9 2-9 2-9 |
9 + ? + 8 = 22 — one hole, whatever the number of terms |
subtr_hole 100-999 10-99 |
? − 63 = 495, or 558 − ? = 495 |
subtr_hole 10-99×10-99 |
the pair oriented at random, then holed |
The consequence worth keeping in mind: the hidden number is always one of
the numbers a source drew, never the one that was worked out. addi_hole
10-99 10-99 asks for a two-digit number and nothing else, and the kind of
numbers in play — whole, decimal, multiples of 5 — is settled by the sources
alone: addi_hole 0.1-9.9 0.1-9.9 asks ? + 7,9 = 13,6.
hidden — which number the hole falls on¶
Left out, the hole is drawn afresh for each question. Given, it is fixed:
addi_hole counts the terms from 0 in the order they are displayed
(after the shuffle), subtr_hole names them.
(6) addi_hole 27 48 -- shuffle=false hidden=0
→ ? + 48 = 75
(6) subtr_hole 100-999 10-99 -- hidden=minuend
→ ? − 63 = 495
(6) subtr_hole 100-999 10-99 -- hidden=subtrahend
→ 558 − ? = 495
For subtr_hole the choice is not cosmetic: a missing minuend is found by an
addition, a missing subtrahend by a subtraction. Leaving hidden out
mixes the two, which is usually what a mental-calculation sheet wants.
What the constraints frame¶
carry, result, min_result and max_result say exactly what they say on
addi_direct and subtr_direct, and they
bear on the operation between the drawn terms — so min_result and
max_result frame the number the question shows after the =, not the answer
expected. The answer needs no framing: it is drawn, so its own source already
frames it.
carry is the report of that same operation, which is also what the pupil
runs into: 27 + 48 carries in the units exactly where 75 − 48 borrows, so
carry=false gives a sheet nothing is carried on, hole or no hole.
Every number of the line positive¶
Since the hidden number is a drawn one, the only number that can come out
negative is the difference subtr_hole shows — 29 − ? = −26 is what
10-99 10-99 draws when the subtrahend outgrows the minuend. result=positive
is therefore all it takes for every number of the line to be positive,
whichever term the hole falls on:
addi_hole needs nothing of the sort: a sum of positive terms is positive, and
so is each of its terms.
Written out, negative numbers keep the reading a hand would give them: a
number taken away carries its own sign into brackets, 37 − (−15) = 52.
steps — the operation that fills the hole¶
steps=1 writes the calculation the missing number comes out of, which is the
whole of what these questions test:
addi_hole 27 48 -- hidden=0 → 75 − 48 = 27
addi_hole 2 3 4 -- hidden=1 → 9 − 2 − 4 = 3
subtr_hole 52 37 -- hidden=minuend → 15 + 37 = 52
subtr_hole 52 37 -- hidden=subtrahend → 52 − 15 = 37
Left at 0 — what mental calculation asks for — the answer key shows the
number alone and keeps that calculation one click away, behind its ⓘ
button.
The rest¶
Both answer inline, in place of the ?, and both take 20 s on a slide.
addi_hole shuffles its terms like addi_direct, and -- shuffle=false keeps
the order of the sources; subtr_hole has no such option, the order of a
subtraction being what the question means. Neither type has a variant:
variant=wording belongs to the direct forms.
area_rectangle¶
Area of a rectangle, its length and its width written on the figure.
| Variant | Example |
|---|---|
| (default) | Area of a 7 cm × 4 cm rectangle? |
Sources — one product range of two unequal values — 2-9×2-9; the bigger of them is the length.
Steps — one level, the product written out with its units.
Options — these, on top of the ones every type reads:
| Option | What it does |
|---|---|
carry |
false draws two dimensions whose product no column carries, true two whose product carries somewhere |
decimals |
the number of ranks the point of a dimension moves left — decimals=1 draws 0,4 cm × 6 cm for the fact 4 × 6, decimals=1×1 draws 0,4 cm × 0,6 cm |
scale |
the number of zeros the dimensions gain between them — scale=1 draws 40 cm × 6 cm for the fact 4 × 6, scale=1×1 draws 40 cm × 60 cm |
unit |
the metric length both dimensions are given in, cm by default — {cm|m|mm} draws one per question |
area_rectangle asks for the area of a rectangle whose two dimensions are
written on the figure:
The wording is the figure: a rectangle drawn with rect{}, its four right
angles coded, its length written above it and its width to its right. Where
the sentence goes is the one thing the two documents disagree on — beside the
figure in a worksheet grid, where a line of height is a line the eleven other
questions lose, above it on a slide, where the figure has the screen to
itself.
The source gives the two dimensions¶
One source, a product range — the same kind multi_direct multiplies:
(8) area_rectangle 2-9×2-9 from the times tables
(8) area_rectangle 2-12×2-12 -- unit=m
(8) area_rectangle 10-90[10]×2-9 -- unit=cm a round dimension and a small one
The bigger of the two values drawn is the length, so the side that looks longer is the one carrying the bigger number. The figure is not drawn to scale — how big it is drawn is a matter of layout, see Polygons — but it is not to be read against either.
Pairs of equal values are left out of the draw: a square is a rectangle,
yet the figure cannot say so, since a grid figure is drawn lying down whatever
it is labelled — 6 cm × 6 cm on a shape twice as wide as it is tall would be
read as a mistake. A source holding nothing else (5×5) is refused by
check qspec.
unit — the same length for both dimensions¶
unit is the unit both dimensions are given in, cm by default. Any unit of
the metric length ladder is accepted (mm … km), and the group notation
draws one per question:
The area is then asked for in the square of that unit — no trap: a rectangle measured in cm has its area asked in cm².
carry, scale and decimals — which multiplication it is¶
Under the figure there is a multiplication, and the three options that say
which multiplication on multi_direct say it here too, read
exactly as they are read there — on the two values the source draws.
carry narrows the draw to the dimensions whose product carries, or to those
whose product does not:
scale and decimals lay powers of ten on the dimensions — the zeros of the
one, the ranks of the other — so that a table fact becomes a rectangle of
another size, measured in the same unit:
(8) area_rectangle 2-9×2-9 -- scale=1 → [40 cm × 6 cm] answer: 240 cm²
(8) area_rectangle 2-9×2-9 -- decimals=1 → [0,4 cm × 6 cm] answer: 2,4 cm²
(8) area_rectangle 2-9×2-9 -- decimals=1×1 → [0,4 cm × 0,6 cm] answer: 0,24 cm²
(8) area_rectangle 2-9×2-9 -- unit=m scale=1 decimals=1
→ [40 m × 0,6 m] answer: 24 m²
Everything the two options accept elsewhere they accept here — a count, a span
(scale=1-3), a split spelled out (scale=1×1) — and everything they refuse
they refuse here: a rectangle has two sides, so a split spelled over three
of them, or budgets asking for a power of ten on more sides than there are, is
refused by check qspec. A side takes zeros or ranks, never both.
One thing is the figure's own. A shift may land so as to make the two
dimensions equal — 4 and 40 under scale=1, as soon as the zero goes on
the 4 — and a square is what this figure cannot carry. The two powers of ten
are then swapped rather than the draw refused: giving each dimension the
other's power always separates them again, and the line keeps drawing.
The unit is untouched by all this: scale and decimals change how long the
sides are, not what they are measured in — 40 cm × 6 cm, never 40 cm ×
6 mm. A conversion is another exercise, and units_conversion is where it is
asked.
The unit of the answer is written beside the box¶
The answer is the number alone: the unit the area is expected in is printed inside the answer box, against its right edge, on the question sheet as on a mail-merge template. It is part of the question — an area asked in cm² is not the same question as one asked in m² — and it locks the answer down: no number is right in two units at once.
On the answer key the same unit follows the result, which is why the key reads
28 cm² while the pupil only ever types 28. On a slide, where there is no
box, the unit is written into the answer itself.
Any question type can do the same by returning its unit from answer_unit();
snapshots carry it in the answer_unit field of a grid entry (see
atmxs).
steps — the product, units included¶
steps=0 is the default: the area alone. steps=1 writes the product out,
units and all, because multiplying them is what makes the result an area:
That is the one level, whatever scale and decimals say: unlike
multi_direct, whose step sets the power of ten aside from the table fact, the
product written here is the one the figure shows — 40 cm × 6 cm = 240 cm² —
because the numbers a step would set aside are lengths, and a length divided
out of a product is no longer a side of anything.
Whatever steps says, the info button of the answer key — and the Steps
button of a slideshow — opens on that product and on the same rectangle
with its area written at its centre. The two drawings of the figure are seeded
from the question itself, so the shape shown behind the button is the shape of
the wording, down to the pixel.
On a slide¶
The centre of the rectangle carries the Q{} the correction fills in green:
the area is written where it is measured, inside the figure, rather than on a
line below it.
The sentence stands above the figure, written smaller than the rest of the
slide: what the pupil reads is the rectangle, the sentence only says what to
do with it, and the height it gives up is height the figure gains. The slide
also lifts its content block a little (raise, see atmxs), since a
wording standing above a figure would otherwise leave the whole of it low on
the screen.
compare_signed¶
Comparing two signed numbers, one at least of them negative.
| Variant | Example |
|---|---|
| (default) | True or false? −150 < 4 → false |
compare |
Compare: −4 … 150 → < |
Sources — one or two plain ranges of positive numbers, the distances to zero — 1-20, 25-500[25] 1.0-9.9; with one range both numbers are drawn from it, with two one from each.
Steps — none: the comparison is the whole answer; the rule it applies is said behind the info button.
Options — these, on top of the ones every type reads:
| Option | What it does |
|---|---|
cases |
which of the three cases are asked, separated by commas — two_negatives, negative_further (the negative further from zero than the positive), negative_closer; left out, all three, in the proportions 5, 3 and 2 |
tricks |
the probability that the second number is built from the first to bait a mistake — close to it, its digits swapped, its opposite — 0.5 by default |
Two signed numbers are compared, one at least of them negative: the cases worth asking are the ones where the signs and the distances to zero pull apart.
The sources are distances to zero¶
The sources give positive numbers; the signs are the question's to give. With one range both numbers are drawn from it; with two, one from each — which is how a whole number is compared with a decimal:
compare_signed 1-20 → −7 and −12, −15 and 4, −3 and 10…
compare_signed 25-500[25] 1.0-9.9 → −300 and 3,7, −1,9 and −125…
compare_signed 0-10 → 0 may come out, and is then compared
with a negative: −4 < 0
A 0 drawn stays unsigned — there is no −0 — and the other number is then the negative. Two numbers equal in every way are never compared: there would be nothing to find.
The three cases¶
| Case | Example | The smaller |
|---|---|---|
two_negatives |
−8,9 and −9,8 | the one further from zero |
negative_further |
−150 and 4 | the negative, though further from zero than the positive |
negative_closer |
−3 and 10 | the negative, closer to zero than the positive |
They come round in packs of ten — five comparisons between two negatives,
three and two of the others — so that any ten questions in a row hold them in
that proportion, not merely on average. cases keeps some of them only, the
proportions between those left standing:
compare_signed 1-20 -- cases=two_negatives
compare_signed 1-20 -- cases=negative_further,negative_closer
A source that cannot give one of the cases asked is refused when the line is
checked: compare_signed 5 has no two different negatives to compare.
Tricks¶
With the probability tricks — 0.5 by default — the second number is not
drawn but built from the first, to bait the usual mistakes:
- a number close to it, a tenth to nine tenths or a quarter away: −6 and −6,5;
- its digits the other way round, the point left in place: −8,9 and −9,8;
- in the cases mixing the signs, its opposite: −6 and 6.
Built from a number close to the first, a case mixing the signs gives nearly
opposites, −6 and 5,75, where comparing the distances to zero gives the wrong
answer. A line with two sources leaves the second aside for those questions.
tricks=0 draws every number; tricks=1 builds every second one.
The two variants¶
true_false (the default) writes the comparison and asks whether it holds.
It is written one of four ways — the smaller number on the left or on the
right, with the sign that holds or the other one — −150 < 4, 4 > −150,
−150 > 4, 4 < −150; these too come round in packs, so that a sheet asks as
many true as false. The pupil answers with the word or its initial, case
and spaces aside: vrai, V, Faux, f in French. The syntax help of
the page — the ⓘ button — says so, in the words of its locale.
compare asks for the sign: on a sheet the box stands between the two
numbers, on a slide the sign takes the place of the ?. The pupil types <
or >; the answer key writes the whole comparison, −4 < 150.
The answer key's info button gives the comparison that holds, and the rule it applies, in one sentence.
cube_of¶
Cube of a number.
| Variant | Example |
|---|---|
| (default) | 10³ = ? |
wording |
What is the cube of 10? |
Sources — one singleton range, or a triplet range narrowed to its equal triplets — 2-10, 4-9×4-9×4-9.
Steps — one level, the power written out and its first two factors multiplied — 3³ = 3 × 3 × 3 = 9 × 3 = 27.
Options — the ones every type reads only.
The cube takes its sources, its variant=wording and its step the way the
square does, and the two are described together under
square_of: why a product range is usually the better
source — a triplet range
here, narrowed to its equal triplets — and what
steps writes out.
Two things are its own. Its chain pauses once more, on the product of the
first two factors: 3³ = 3 × 3 × 3 = 9 × 3 = 27, since three factors are not
multiplied in one go. And it is given 30 s throughout, where a square starts
at 20 s.
digitplace_count¶
Whole number of a given place a decimal number holds.
| Variant | Example |
|---|---|
| (default) | Whole number of tenths in 43.571? → 435 |
Sources — one digit place: the digitplaces, digitplaces_big or digitplaces_small alternator, or a single place written as a power of ten — 0.001.
Steps — none: the answer is the whole of it, so the answer key draws no ⓘ button.
Options — these, on top of the ones every type reads:
| Option | What it does |
|---|---|
max_place |
the highest place the number may carry a digit at, as a power of ten — 10000000 caps it at eight digits |
min_place |
the lowest place the number may carry a digit at, as a power of ten — 1 keeps it a whole number |
width |
how many digits the number carries, 3-5 by default — a number, or a range one is drawn from per question |
The place is drawn, and the number built around it, exactly as for
digitplace_digit — same sources, same width, same
rule of digits without repetition. What follows is what this type alone asks
of that number.
Counting whole places¶
digitplace_count asks the same number one step further: not the digit at
the place, but every digit from that place upwards, read as one number.
43.571 holds 435 whole tenths — and 4357 whole hundredths, and 43 whole
units.
digitplace_count digitplaces → Whole number of tenths in 43.571? 435
digitplace_count digitplaces_big → Whole number of millions in 725,910,000? 725
Nothing is rounded: what sits below the place is dropped, which is what
whole says — 43.571 holds 435 whole tenths, not 436. The digit asked for by
digitplace_digit is the last digit of that count, which is the tie between
the two questions and the reason they share a source.
Where the place drawn happens to be the leftmost digit of the numeral, the
count is that digit — whole number of tenths in 0.357 is 3. That is not a
degenerate case to avoid but the easiest way in, and a width of 2 or 3 is
how a first sheet stays there:
The answer is a number, so it is compared as one: the page writes it with the
locale's thousands separator (43 571), and a pupil typing 43571 is right.
Transduration¶
30 s: the time to read several digits as one number and, on paper, to write it down.
digitplace_digit¶
Digit sitting at a given place of a decimal number.
| Variant | Example |
|---|---|
| (default) | Digit of tenths in 43.571? → 5 |
Sources — one digit place: the digitplaces, digitplaces_big or digitplaces_small alternator, or a single place written as a power of ten — 0.001.
Steps — none: the answer is the whole of it, so the answer key draws no ⓘ button.
Options — these, on top of the ones every type reads:
| Option | What it does |
|---|---|
max_place |
the highest place the number may carry a digit at, as a power of ten — 10000000 caps it at eight digits |
min_place |
the lowest place the number may carry a digit at, as a power of ten — 1 keeps it a whole number |
width |
how many digits the number carries, 3-5 by default — a number, or a range one is drawn from per question |
The same knowledge, asked three ways: what digit sits at a given place, at which place a given digit sits, and how many whole units of a place the number holds.
(4) digitplace_digit digitplaces
→ Digit of hundredths in 43.571? answer: 7
(4) digitplace_name digitplaces
→ Position of the digit 7 in 43.571? answer: hundredths
(4) digitplace_count digitplaces
→ Whole number of hundredths in 43.571? answer: 4357
What follows holds for the three of them: they draw their place from the same
sources and build the same numeral around it.
digitplace_name and
digitplace_count then add what is theirs alone.
The source draws the place¶
The source of these questions is not the number — it is the place the question is about. Three alternators are registered for it:
| Source | Places drawn |
|---|---|
digitplaces |
thousands, hundreds, tens, units, tenths, hundredths, thousandths |
digitplaces_big |
tens of thousands, hundreds of thousands, millions, tens of millions, hundreds of millions, billions |
digitplaces_small |
tenths, hundredths, thousandths |
Being alternators, they run through their places once per cycle and never twice in a row, so a sheet spreads over all of them instead of asking the hundredths three times.
The split into keys is what doses the large places. They belong to the syllabus, but naming the hundreds of millions is not what a mental-calculation belt should hinge on, so a sheet asks for them only as often as it says:
A single place can also be asked for directly, by writing it as a power of ten — useful for a sheet drilling one place:
Anything else is refused by check qspec: a source drawing 7, or 0.5, is
not drawing a digit place.
The number is built around the place¶
The number is not drawn — it is built so that the question can be asked at all. Its digits are taken from 1 to 9 without repetition, filling consecutive places around the one drawn. So:
- the place asked about always carries a digit, never an implicit zero;
- the digit shown by
digitplace_nameappears once and only once, which is what makes position of the digit 7 a question with one answer.
Where the number may extend depends on the place drawn. A place from the
thousands down to the thousandths keeps the number under ten thousand; a
large place gives a whole number, the way large places are read at school. So
digitplaces never produces a number in the millions, and digitplaces_big
never produces a decimal part.
width sets how many digits the number carries — a number, or a range from
which one is drawn per question (the default is 3-5):
digitplace_digit digitplaces -- width=2 → Digit of hundredths in 0.72?
digitplace_digit digitplaces -- width=3-5 → three to five digits
It may not go below 1 nor past 9 (there are only nine non-zero digits to choose from), and a width wider than the places available is narrowed to them rather than refused.
min_place and max_place — where the number may reach¶
width counts the digits; it says nothing about how high they sit. A
five-digit number built around the tens of thousands may come out as 64 519
or as 3 692 800 000, both carrying five significant digits. min_place and
max_place say where the numeral is allowed to run, each written the way a
source writes a place — as a power of ten:
(10) digitplace_digit 1,10,100,1000,10000,100000,1000000
-- width=5-8 min_place=1 max_place=10000000
→ Digit of hundreds in 982 167? Digit of millions in 45 962 000?
That is a sheet on the places of a big whole number: min_place=1 keeps
the units the lowest place written, so nothing below the decimal point; and
max_place=10000000 caps the numeral at eight digits. Either may stand
alone — the other end then stays where the catalogue ends.
Which is what the default span cannot give: the hundreds are a core place, so
without min_place they come with a decimal part — Digit of hundreds in
8 597.42? — and the large places come without any ceiling.
The two are the span itself, so the source has to draw inside them. A place they leave out is refused rather than skipped:
digitplace_digit 0.001 -- min_place=1
→ the number is confined to the places from 1 to 1000000000, which
leaves out the place 0.001 a source draws.
With an alternator the same refusal comes at render time, its places being
unknown until one is drawn: pair a narrowed span with the places you mean —
1,10,100,1000 rather than digitplaces, whose thousandths it excludes.
Transduration¶
digitplace_digit defaults to 20 s — reading off a digit is quick once the
places are known. Its two siblings, which have a word or a number to write,
are given 30 s.
digitplace_name¶
Place a given digit sits at in a decimal number.
| Variant | Example |
|---|---|
| (default) | Position of the digit 7 in 43.571? → hundredths |
Sources — one digit place: the digitplaces, digitplaces_big or digitplaces_small alternator, or a single place written as a power of ten — 0.001.
Steps — none: the answer is the whole of it, so the answer key draws no ⓘ button.
Options — these, on top of the ones every type reads:
| Option | What it does |
|---|---|
max_place |
the highest place the number may carry a digit at, as a power of ten — 10000000 caps it at eight digits |
min_place |
the lowest place the number may carry a digit at, as a power of ten — 1 keeps it a whole number |
width |
how many digits the number carries, 3-5 by default — a number, or a range one is drawn from per question |
The place is drawn, and the number built around it, exactly as for
digitplace_digit — same sources, same width, same
rule of digits without repetition, which is what makes the digit shown appear
once and only once. What follows is what this type alone asks of that number.
Answering with a word¶
digitplace_name is answered in words — hundredths, tens. Both the
plural and the singular are accepted, and the comparison ignores spaces, case
and accents: for the French dixièmes, a pupil typing Dixième or dixiemes
is right.
Transduration¶
30 s: the time to name a place and, on paper, to write the word.
divi_direct¶
Division.
| Variant | Example |
|---|---|
| (default) | 42 ÷ 7 = ? |
one_nth_times |
1/7 × 42 = ? |
one_nth_of |
1/7 of 42? |
how_many_times |
How many times 7 in 42? |
wording |
Quotient of 42 by 7? |
Sources — one product range of exactly two factors, or the fractions table — 2-9×2-9, fractions.
Steps — none on the plain form; one level under variant=wording, on the operation the sentence names.
Options — these, on top of the ones every type reads:
| Option | What it does |
|---|---|
hidden |
over the fractions table, which of the two is asked — fraction for 3 ÷ 4, integer for 3 ÷ 3/4 |
shuffle |
false keeps the factors in the order the source drew them; which one is hidden is still drawn |
Drawing from the fractions table¶
divi_direct fractions -- variant=wording asks Quotient of 3 by 4?, whose
answer is the fraction 3/4 — with its decimal form beside it, 3/4 (or
0.75), whenever the quotient falls in three decimals or fewer. Both spellings
are accepted from the pupil. 7/3 and 5/11 get no such hint: their decimal
form does not end.
The fractions drawn are irreducible¶
The table holds every n/d with n and d from 1 to 12, 6/9 and 12/12
included. divi_direct filters it to the irreducible rows by default: the
question asks whether the pupil sees that a quotient can be written as a
fraction at all, not whether they can simplify one. Drawn 6/9, a pupil
writes 2/3 and loses the point on something the question was not about.
The line lifts the filter when it wants to:
| Written | Drawn |
|---|---|
| (nothing) | the irreducible fractions |
irreducible=true |
the same, said out loud |
irreducible=false |
the reducible ones instead |
irreducible=any |
the whole table |
any exists because a column filter has no absent state once a type gives
it a default — true and false each keep half the table, and neither means
either. Any other value is refused by check qspec and at render time,
rather than reaching the database as a filter nothing matches.
This is a default of divi_direct alone. multi_hole fractions is untouched
and still draws from the whole table unless the line filters it.
hidden — which of the two is asked¶
hidden=fraction hides the fraction and shows 3 ÷ 4; hidden=integer hides
the denominator and shows 3 ÷ 3/4 — a division by a fraction. Left to
itself the plain form draws either, so a line meant for a grade where dividing
by a fraction is not taught yet has to say so:
The worded form settles it on its own, having no sentence for a division by a
fraction: it always hides the fraction, and hidden=integer written alongside
it is refused.
divi_euclidean¶
Euclidean division.
| Variant | Example |
|---|---|
| (default) | Euclidean division of 45 by 7? → example answer: 6 r 3 |
Sources — one product range of exactly two factors — 2-9×2-9; the remainder is drawn on top of their product.
Steps — none: the answer is the whole of it, so the answer key draws no ⓘ button.
Options — these, on top of the ones every type reads:
| Option | What it does |
|---|---|
hidden |
there is no fraction to hide here: the quotient is what the question asks for |
shuffle |
false keeps the source order, which decides which of the two factors is the divisor |
divi_vocab¶
Half, third or quarter of a natural number.
| Variant | Example |
|---|---|
| (default) | How much is half of 42? or: a third of 9?... |
Sources — one product range of exactly two values, one of which is 2, 3 or 4 — the word names it — 2-4×2-9.
Steps — none: the answer is the whole of it, so the answer key draws no ⓘ button.
Options — these, on top of the ones every type reads:
| Option | What it does |
|---|---|
hidden |
the word names the divisor, so it already says where the hole falls |
shuffle |
nothing to shuffle here: the wording shows the dividend alone |
expand_simple¶
Expand and reduce a factor times a binomial.
| Variant | Example |
|---|---|
ax(bx+c) |
n° 1 — 4x(6x − 9) = ? — drawn by default |
(bx+c)ax |
n° 2 — (6x − 9)×4x = ? |
a(bx+c) |
n° 3 — 4(6x − 9) = ? — drawn by default |
(bx+c)a |
n° 4 — (6x − 9)×4 = ? |
Sources — one product range, drawn twice as a linked pair sharing the distributed factor — 3-9×3-9.
Steps — one level, the distribution written before the reduced form.
Options — the ones every type reads only.
expand_simple asks to expand and reduce a factor times a binomial:
On a sheet the instruction is part of every question, read once per line in
passing. A slide shows one question at a time, so it leads with the
expression and drops the instruction underneath (see On a slide). The
factor is on the left unless variant says otherwise (see below).
One source, two linked products¶
Expanding 4x(6x − 9) needs two products, 4 × 6 and 4 × 9, sharing the
distributed factor. They come from one product range, drawn as a linked
pair: the first product is drawn as usual, then the second is drawn among
those carrying one of its factors.
Two independent sources would not work: nothing would make the second range share a factor with what the first one drew.
The range must therefore hold two products sharing a factor other than 0 or
1 — 1×2-9 does not, and check qspec says so before anything is rendered.
Both products are recorded in the pairs table, like multi_direct, so an
expansion and a multiplication on the same sheet cannot ask the same fact
twice.
A shared factor of 1 (or 0) is never chosen — 1(6x − 9) expands to itself —
but a range holding 1 stays perfectly usable: the 1 simply ends up inside the
binomial, as in 6x(6x + 1).
On a slide¶
A slide gives the instruction the same height as the expression, which pushes
the expression off-centre and buries the = ? the correction is about to
fill. So on a slide the question leads with the expression and the
instruction becomes the note underneath:
The correction slide is the same slide with the red ? replaced by the
answer in green — the expression and the note do not move.
That holds whatever steps says: like every type, expand_simple answers a
slide at level 0 — the reduced form — and leaves the distribution to the
sheet and to the help button. See The steps option.
variant — where the factor sits, and whether it carries the unknown¶
Four shapes, selectable by name, by number, by alias (monomial, number,
left, right, all) or by ^ exclusion:
(4) expand_simple 3-9×3-9 4x(6x − 9), 4(6x − 9)
(4) expand_simple 3-9×3-9 -- variant=all the four shapes
(4) expand_simple 3-9×3-9 -- variant=monomial 4x(6x − 9), (6x − 9)×4x
(4) expand_simple 3-9×3-9 -- variant=number 4(6x − 9), (6x − 9)×4
(4) expand_simple 3-9×3-9 -- variant=right (6x − 9)×4x, (6x − 9)×4
A factor written after the binomial keeps its × — (6x − 9)×4x, where
4x(6x − 9) needs none.
Without a variant, only the two shapes holding the factor on the left
are drawn — the way an expansion is first written and read. The mirrored
forms, useful once the rule is acquired, come with variant=all,
variant=right, or by naming them.
The sign inside the binomial is drawn at random and is not part of the variant.
steps — showing the distribution¶
The reduced form is the answer, not a step: steps=0 (the default) gives it
alone, and steps=1 shows the distribution first.
steps=true and steps=false are accepted too, and mean 1 and 0. At
steps=0, the distribution is still one click away on the live page — see
The steps option.
As everywhere, the option shapes the sheet: a slide answers with the reduced form either way (see On a slide).
Typing the answer¶
In an interactive page the pupil types the reduced form. Neither ² nor ^
is within easy reach of every keyboard, so a bare 2 behind the unknown is
read as the square, and both orders of the two terms are accepted, each
keeping its own sign:
(the sign typed is the keyboard hyphen, not the typographic minus the page displays)
Spaces are ignored, wherever they are — as they are in every question of an interactive page, along with case and accents.
expr_eval¶
Replace the letter by its value, and compute.
| Variant | Example |
|---|---|
x+b |
n° 1 — x + 3 — linear, 1 operation, 1 letter |
x-b |
n° 2 — x − 3 — linear, 1 operation, 1 letter |
b-x |
n° 3 — 3 − x — linear, 1 operation, 1 letter |
ax |
n° 4 — 3x — linear, 1 operation, 1 letter |
xy |
n° 5 — xy — linear, 1 operation, 2 letters |
ax+b |
n° 30 — 3x + 12 — linear, 2 operations, 1 letter |
ax-b |
n° 31 — 3x − 12 — linear, 2 operations, 1 letter |
b+ax |
n° 32 — 12 + 3x — linear, 2 operations, 1 letter |
b-ax |
n° 33 — 12 − 3x — linear, 2 operations, 1 letter |
a(x+b) |
n° 34 — 3(x + 12) — linear, 2 operations, 1 letter |
a(x-b) |
n° 35 — 3(x − 12) — linear, 2 operations, 1 letter |
a(b-x) |
n° 36 — 3(12 − x) — linear, 2 operations, 1 letter |
b+xy |
n° 37 — 3 + xy — linear, 2 operations, 2 letters |
xy-b |
n° 38 — xy − 3 — linear, 2 operations, 2 letters |
x+ay |
n° 39 — x + 3y — linear, 2 operations, 2 letters |
ax+y |
n° 40 — 3x + y — linear, 2 operations, 2 letters |
x-ay |
n° 42 — x − 3y — linear, 2 operations, 2 letters |
ax-y |
n° 43 — 3x − y — linear, 2 operations, 2 letters |
ax+by |
n° 80 — 3x + 12y — linear, 3 operations, 2 letters |
ax-by |
n° 81 — 3x − 12y — linear, 3 operations, 2 letters |
x/a |
n° 101 — x/3 — quotient, 1 operation, 1 letter |
a/x |
n° 102 — 3/x — quotient, 1 operation, 1 letter |
x/y |
n° 103 — x/y — quotient, 1 operation, 2 letters |
x/a+b |
n° 130 — x/3 + 12 — quotient, 2 operations, 1 letter |
x/a-b |
n° 131 — x/3 − 12 — quotient, 2 operations, 1 letter |
b+x/a |
n° 132 — 12 + x/3 — quotient, 2 operations, 1 letter |
b-x/a |
n° 133 — 12 − x/3 — quotient, 2 operations, 1 letter |
a/x+b |
n° 134 — 3/x + 12 — quotient, 2 operations, 1 letter |
a/x-b |
n° 135 — 3/x − 12 — quotient, 2 operations, 1 letter |
b+a/x |
n° 136 — 12 + 3/x — quotient, 2 operations, 1 letter |
b-a/x |
n° 137 — 12 − 3/x — quotient, 2 operations, 1 letter |
(x+b)/a |
n° 138 — (x + 12)/3 — quotient, 2 operations, 1 letter |
(x-b)/a |
n° 139 — (x − 12)/3 — quotient, 2 operations, 1 letter |
(b-x)/a |
n° 140 — (12 − x)/3 — quotient, 2 operations, 1 letter |
a/(x+b) |
n° 141 — 3/(x + 12) — quotient, 2 operations, 1 letter |
a/(x-b) |
n° 142 — 3/(x − 12) — quotient, 2 operations, 1 letter |
a/(b-x) |
n° 143 — 3/(12 − x) — quotient, 2 operations, 1 letter |
x+a/y |
n° 146 — x + 3/y — quotient, 2 operations, 2 letters |
x-a/y |
n° 147 — x − 3/y — quotient, 2 operations, 2 letters |
a/x+y |
n° 148 — 3/x + y — quotient, 2 operations, 2 letters |
a/x-y |
n° 149 — 3/x − y — quotient, 2 operations, 2 letters |
ax+y/b |
n° 180 — 3x + y/12 — quotient, 3 operations, 2 letters |
x/a+by |
n° 181 — x/3 + 12y — quotient, 3 operations, 2 letters |
x/a+y/b |
n° 182 — x/3 + y/12 — quotient, 3 operations, 2 letters |
x² |
n° 201 — x² — square, 1 operation, 1 letter |
x²+b |
n° 230 — x² + 3 — square, 2 operations, 1 letter |
x²-b |
n° 231 — x² − 3 — square, 2 operations, 1 letter |
b+x² |
n° 232 — 3 + x² — square, 2 operations, 1 letter |
b-x² |
n° 233 — 3 − x² — square, 2 operations, 1 letter |
ax² |
n° 234 — 3x² — square, 2 operations, 1 letter |
x²+x |
n° 235 — x² + x — square, 2 operations, 1 letter |
x²-x |
n° 236 — x² − x — square, 2 operations, 1 letter |
x²/a |
n° 237 — x²/3 — square, 2 operations, 1 letter |
a/x² |
n° 238 — 3/x² — square, 2 operations, 1 letter |
x²+y |
n° 239 — x² + y — square, 2 operations, 2 letters |
x+x² |
n° 240 — x + x² — square, 2 operations, 1 letter |
x²+ax |
n° 280 — x² + 3x — square, 3 operations, 1 letter |
Sources — a range for the values of the letters and a second for the numbers of the expression — 2-9 2-12, one range serving for both where only one is written — and, to draw the products and the quotients as multi_direct and divi_direct draw theirs, a product range: 2-9×2-9 2-12.
Steps — one level, the expression with its letters replaced, then each stage of the reduction.
Options — these, on top of the ones every type reads:
| Option | What it does |
|---|---|
carry |
false draws an expression whose multiplication carries no column, true one where it does — read as multi_direct reads it, and only where the expression holds a product; on x + b, x − b and b − x, whether the sum carries or the difference borrows |
decimals |
the number of ranks the point of the product moves left — decimals=1 asks 0,8x for the pair 8 × 7, or 8x for x = 0,7; needs a product range |
family |
which families of expression are asked — linear, quotient, square, several of them separated by commas, or any |
letters |
how many letters the expression is written with — 1 or 2, or both separated by a comma |
ops |
how many operations the expression asks for — 1, 2, 3, or several separated by commas |
result |
positive — for the grades where negative numbers are not taught yet, and which also keeps them out of the intermediate steps — or negative, or the bounds the result is to fall between, result=11-30 |
scale |
the number of zeros the product gains — scale=1 asks 80x for the pair 8 × 7; needs a product range |
The pupil replaces the letter by its value and computes:
Calculer la valeur de l'expression A = 5x − 1, où x = 4. → 19
Calculer la valeur de l'expression E = 6 + ab, où a = 3 et b = 4. → 18
Calculer la valeur de l'expression P = 24 − t², où t = 3. → 15
The name of the expression — the A, the E, the P — is drawn from an
alphabet of its own and set in the text font, where the unknown inside is set
in the math one. That is how the two are told apart on the page, and it is
the usual typography: a capital naming the whole expression stands upright,
a letter standing for a number leans.
The sources¶
Up to three, bound by position, and in this order:
expr_eval <product range> <letters> <numbers>
↑ ↑ ↑
the products and what a letter the numbers
quotients, as a may be worth written in
pair, or `auto` the expression
(optional)
(5) expr_eval 2-9 2-12 -- result=positive letters 2-9, numbers 2-12
(5) expr_eval 2-9×2-9 2-9 2-99 -- result=positive all three
(5) expr_eval 2-9×2-9 2-20 -- result=positive one range for both
Position is all there is to tell a product range from a plain one, and
the two plain ones from each other — 2-9×2-9 carries its ×, so it is
recognised wherever it stands, but 2-9 2-12 says which is which by order
alone. The last may be left out, and one plain range then serves for both:
write both whenever you want them to differ, which with a product range in
front is easy to forget.
Neither is ever drawn from freely (see Landing right below), but neither is ever stepped outside either: whatever comes out of a draw is a value the range declared.
Drawing the product, and the quotient, as their own questions draw them¶
Wherever the expression holds a product or a quotient joining a number and a
letter — ax, xy, x/a, a/x — that operation is exactly what
multi_direct and divi_direct draw. So it can be drawn the same way, from a
product range, written alongside the others:
(4) expr_eval 2-9×2-9 2-12 -- variant=ax-b result=positive
→ 7x − 5, where x = 8 the pair is 7 × 8
(2) expr_eval 2.5×4-20[2] 2-12 -- variant=ax-b result=positive
→ 4x − 7, where x = 2,5 or 2,5x − 7, where x = 4
(2) expr_eval 11×11-99 2-99 -- variant=ax+b result=positive
→ 11x + 20, where x = 63
(4) expr_eval 2-9×2-9 2-20 -- family=quotient result=positive
→ x/7 + 5, where x = 63
Two things follow, and the first matters more than it looks:
- the tracking is shared. Deduplication happens per table, and a product
range feeds the same one
multi_directdraws from. A sheet carrying both will therefore not ask7 × 8and then7xforx = 8— which two ranges drawn apart cannot prevent, since neither knows what the other drew; - a quotient comes out exact by construction. The pair gives the divisor
and the dividend is their product, as in
divi_direct, sox/7forx = 63needs nothing sifted for it. The quotients, which two plain ranges leave the most cramped of all the families, are the ones a product range serves best.
Which of the pair is the letter is drawn: 2.5×4-20[2] asks 4x − 7 for
x = 2,5 as readily as 2,5x − 7 for x = 4, and a sheet gains by mixing
the two.
auto — the multiplications a pupil has already met¶
A range is a set of values. What an author wants is rarely a set of values:
it is a kind of calculation. auto is the union of the kinds a pupil
starting on literal expressions has already worked through, written in the
product range's place:
Written alone, auto draws its letters from 2-12 and its numbers from
2-30 — the ranges nearly every line wrote out anyway. auto speaks of the
products and the quotients and of nothing else, so the letter of x − b and
the term of x² + b would otherwise have nothing to come from; a shape that
knows better about one of its slots already says so itself (see A shape may
draw a slot itself below). Write one range beside auto and it serves for
both, as it always did:
(10) expr_eval auto -- result=positive letters 2-12, numbers 2-30
(10) expr_eval auto 2-9 -- result=positive letters and numbers 2-9
x + b, x − b and b − x take two-figure numbers instead, 11-99 both:
between 2-12 and 2-30 the whole question would be 5 − 4, and between
two-figure numbers carry decides whether a column carries or borrows (see
below).
| recipe | what it is | share | may divide |
|---|---|---|---|
3-10×3-10 |
the tables | 43 | yes |
11×11, 12×12 |
learnt with them, and nothing else of their size | 3, 3 | yes |
11×11-99, no carry |
a two-figure number by 11 | 10 | no |
15×3-6, 25×3-6 |
the tables of 15 and of 25 | 6, 6 | yes |
15×7-8, 25×7-8 |
their far end | 2, 2 | no |
1.5×2-20, 2.5×2-20 |
a whole number up to 20 by 1,5 or by 2,5 | 13, 12 | no |
The shares are declared, and they add up to a hundred so that each reads
as the percentage it is. They have to be declared: read off how many
questions each recipe offers instead, and the mix is nobody's choice — every
recipe wide enough to reach the search's ceiling counts the same, which had
1,5 × and 2,5 × taking nearly half the products of ax + b. A recipe no
plan can people drops out, and the rest share its place.
Dividing by 15 or by 25 stops at 6 where multiplying goes to 8: 90 ÷ 15 is
a question worth asking, 120 ÷ 15 is one a good many pupils give up on.
Splitting a range in two is how a recipe says that one end of it is not the
other.
Every one is a line multi_direct already poses at that grade, and auto
draws them into the same tracking table, so a sheet holding both does not
put the same product twice.
They are recipes for multiplying, and each says whether it may also fill
a quotient — because the two do not follow one another. Knowing 12 × 12 is
knowing 144 ÷ 12; knowing 11 × 80 is not knowing 880 ÷ 11, which is
nobody's lesson. The tables of 15 and of 25 divide too, 120 ÷ 15 being
harder and still a question; 2,5 × 6 read backwards is 15 ÷ 6 = 2,5,
which is not.
A recipe that does not divide is simply not offered to a shape that
does — refusing its quotients one at a time would leave 880 ÷ 11 standing,
whose divisor and quotient are both small enough to pass the tables rule.
The whole numbers start at 3. Multiplying by 2 is not a question at that
grade, and a recipe is read backwards as well as forwards: 2 × 5 posed as a
quotient is 10 ÷ 2. Weighing a small end down is not enough where nearly
half of what it holds is of that size, so 2 is left out once, for products
and quotients alike. It survives where it means something else — 1,5 × 2 is
a recipe about 1,5.
Notice that each recipe carries the options that make it what it is — a
two-figure number by 11 is a mental calculation only as long as nothing
carries. That is why auto is not a wider range: no range can say that.
Which recipe a question draws from is settled once the shape is known,
since 1,5 × 18 peoples ax + b and no quotient at all. The recipes that
fit then share the draw by their declared shares, renormalised over
themselves — so before a shape that divides, where 11 × 63 and the two
decimal recipes drop out, the tables take seven draws in ten rather than
four.
A shape holding two products lets one of them lead, and keeps it
company. Three operations asked at once are three operations asked with
nothing written down — the pupil has replaced the letters themselves, so
7 × 8 + 6 × 9 is held entirely in their head. That is not a harder
question; it is a question most of a class does not attempt. And a recipe
built round a fixed factor fills every product it is asked for with that
same factor, so ax − by came out 26m − 11a, one multiplication by 11
twice over.
So whichever recipe was drawn fills one group, and one of two plain
ranges fills the rest — the tables of 2 to 5 three times out of four, and
2×10,15,25 the fourth, which is still nothing to work out with a little
more to look at:
expr_eval auto 2-12 2-30 -- variant=ax+by,ax-by result=positive
→ 2k + 54y, where k = 10 and y = 11 54 × 11 beside 2 × 10
→ 25n − 4t, where n = 6 and t = 4 25 × 6 beside 4 × 4
→ 3k + 9u, where k = 4 and u = 6 9 × 6 beside 3 × 4
→ 11v − 2y, where v = 34 and y = 15 11 × 34 beside 2 × 15
The 2 the recipes left out comes back in that company, and may: what made it
a poor recipe was 2 × 5 read backwards as 10 ÷ 2, and neither companion
range divides.
A quotient keeps company of its own, for that very reason: 3-5×3-5,
either member dividing — 12 ÷ 3, 20 ÷ 5, 16 ÷ 4 — which is as plain as
a division gets without becoming a halving. So ax + y/b and x/a + by may
lead with either operation, and x/a + y/b with either quotient:
expr_eval auto 2-12 2-30 -- variant=ax+y/b,x/a+by,x/a+y/b result=positive
→ 10v + q/5, where v = 8 and q = 15 10 × 8 beside 15 ÷ 5
→ 2p + t/12, where p = 3 and t = 144 144 ÷ 12 beside 2 × 3
→ n/15 + d/5, where n = 90 and d = 25 90 ÷ 15 beside 25 ÷ 5
The leading recipe's share is split over the positions it may take and over
the company it may keep, so arranging changes where a recipe lands and
never how often it is drawn.
And what a recipe fixes, it fixes for its own group: 40 × 11 carries in no
column because that is what makes it that recipe, while the 3 × 3 beside it
answers for itself. Only a power of ten is settled for the question as a
whole, since it moves the whole expression.
A shape may ask for a different mix. a(x + b) has the pair fill the
factor and the sum, so under the tables x + b never passes 10 — and an
unknown being 2 at the very least, b is cramped between 2 and 8, which
writes 4(q + 2) over and over. The recipes with a big fixed factor put a
real number inside the parentheses, so that shape asks for fewer tables and
gets 11(p + 30), 8(c + 16), 2,5(b + 18). Nothing is excluded; the mix
is weighed, shape by shape.
scale and decimals apply where they mean something. A power of ten
lands on the tables recipe and on no other: laying a rank on 1,5 × 18 would
ask for 0,15 × 18, and laying one on 15 × 3 only writes 1,5 × 3, which
is a recipe of its own. So the options are honoured where they were meant
and ignored where they were not, rather than refused:
expr_eval auto 2-12 2-99 -- variant=ax+b,ax-b result=positive decimals=1
→ 0,7y + 82, where y = 6 the tables, with a rank laid on
→ 0,4q + 81, where q = 2 the same
→ 19p − 6, where p = 1,5 a recipe of its own, left alone
→ 25k − 91, where k = 7 likewise
carry follows the same rule: a recipe that fixes the columns keeps its own
answer, and a line's carry reaches the ones that do not.
One auto to a line — it is a union, and two would mean nothing. It fills a
product or a quotient, so a line whose shapes hold neither is told that
nothing comes of it. The letters and the numbers keep their own ranges: write
2-12 for the letters and the squares land on 2 to 12, which is the same
list the recipes hold.
A product range is also how a recipe is written — a kind of calculation you want a whole line of, rather than a range you want values from. Pinning one member and letting the other run is what says it:
(10) expr_eval 10×0.1-9.9 2-12 2-99 -- variant=b-ax result=positive
→ 99 − 10y, where y = 8,5 → 44 − 3,8b, where b = 10
→ 40 − 10q, where q = 0,6 → 36 − 0,9y, where y = 10
Ten questions that are all the same calculation — a tenth multiplied by ten,
taken from a number that is larger — which is what a line of a worksheet
usually wants. Name the shape with variant and the recipe is exact; leave
it out and the range serves whatever shape is drawn.
A product range fills a product or a quotient and nothing else, so a line
holding one alone leaves whatever sits outside it — the term of ax + b, the
letter of x + b — with nothing to come from. Write the range it needs beside
it; check qspec says which is missing, and for which shape.
A computed member is drawn from the pair too. Where the operation joins
a slot and something the expression works out — a(x + b), a/(x + b),
(x + b)/a — one member of the pair fills the slot and the other is what the
computed side has to come out at:
(4) expr_eval 2-9×2-9 2-99 -- variant=a(x-b),a/(x-b) result=positive
→ 7(m − 9), where m = 17 the pair is 7 × 8
→ 72/(t − 83), where t = 91 the pair is 8 × 9: 8 divides, 72 is 8 × 9
This is where a pair earns the most. Looked for at random, an exact division
in the tables is rare — a/(x + b) over 2-99 has 551 combinations that
suit out of 941 192 — so a plain range leaves those three shapes a handful
and check qspec says so. Drawn from a pair they come out right every time.
A square is the exception, and stays drawn from plain ranges: it takes
square values and no others, so a pair has next to nothing to offer it —
with 2-9×2-9, ax² would be left the two bases 2 and 3. The tables rule
above holds its base small, which is the whole of what a square needs.
carry, scale and decimals — the product's own options¶
A product inside an expression is the same product multi_direct poses, so it
answers to the same three options, read by the same code and spelt the same
way:
expr_eval 2-9×2-9 2-12 -- variant=ax-b carry=false → 2x − 7, where x = 4
expr_eval 2-9×2-9 0.1-9.9 -- variant=ax-b decimals=1 → 0,8a − 0,1, where a = 3
→ 8u + 9, where u = 0,7
expr_eval 2-9×2-9 2-99 -- variant=ax+b scale=1 → 7p + 86, where p = 20
decimals and scale move the whole expression, and say how far, not
which number takes the zeros: the same calculation at another size, which is
a lesson of its own.
drawn: 4 × 6 + 15
scale=1 → 4x + 150, where x = 60 390
decimals=1 → 4x + 1,5, where x = 0,6 3,9
decimals=2 → 0,4x + 0,15, where x = 0,6 0,39
The value keeps its digits and only the point moves. Which slot carries the
zeros is the shape's affair, and the thriftiest move is the one made:
4000x + 150 for x = 0,06 lands one rank up as surely and is nobody's
question.
Some shapes cannot move at all — x² + x would have its two halves move at
different speeds, the square going twice as fast as the letter beside it —
and a square moves in twos, so x² + b takes scale=2 and ignores
scale=1. A shape that cannot make the move asked for simply does not make
it. scale=1-2 draws one rank or two; decimals=1×1 spends one rank on each
of two factors, which is two ranks down in all.
carry needs nothing: 8x for x = 7 carries wherever its numbers came
from, so it reads on the values whatever drew them, product range or not.
It reads on a sum or a difference too, where the expression is nothing
else — x + b, x − b, b − x — the way addi_direct and subtr_direct
read them: carry=true asks for a column that carries, or for one that
borrows. A sum with a computed member, the + of ax + b, adds the pupil's
own product, and carry says nothing of it.
expr_eval auto -- variant=x+b,x-b,b-x result=positive carry=true
→ b + 86, where b = 42
→ 62 − x, where x = 47
They need a product range: a shift transforms a drawn pair, where a range
drawn one value at a time is simply the range you wrote (0.2-1.2 rather
than 2-12 shifted). With auto, only the recipes that have digits to
spare carry one — laying a rank on 1,5 × 18 would ask for 0,15 × 18.
The powers of ten are laid before the expression is sifted, never after,
so what was tested for landing right is what the page shows. An option a drawn
shape has no use for is harmless — check qspec remarks on it and renders
all the same.
Choosing the expression — one selector and three filters¶
variant picks shapes the way it does everywhere else: by name (ax+b), by
number, by range, by ^ exclusion — see
Selecting variants.
Beside it, three filters, which intersect where the terms of a variant
unite:
| Filter | Values | Default |
|---|---|---|
family |
linear, quotient, square, several separated by commas, or any |
any |
ops |
1, 2, 3, or several separated by commas |
1,2 |
letters |
1, 2, or both |
1 |
(carry, scale and decimals are options of the product, not filters: see
above.)
expr_eval 2-9 2-12 -- family=quotient ops=2 # the quotients of two operations
expr_eval 2-9 2-12 -- ops=1 # the first rung: x + 7, 3x, t²
expr_eval 2-12 2-12 -- letters=2 # 6 + ab, 3a + 2b
That intersection is the reason they are options of their own rather than
aliases of variant: variant=quotient,plain would be a union, and
"quotient and one operation" could not be written at all.
ops is not the grade level — it counts the operations the expression asks
for, the square counting for one: x + 7 and x/4 ask one, 3x + 7 and
t² − 5 ask two, x² + 3x asks three. It is read off the expression itself,
so it can never disagree with it.
A line that names variant explicitly drops the three defaults: asking
for variant=80 is asking for it, and a default filter silently emptying the
selection would be a trap rather than a convenience. Filters written next to
a variant still apply.
A shape may name its own ranges where the line wrote auto, in place of
the recipes. x² + ax does: its product keeps the square company rather than
doubling the work — the same thing two products of one expression do for each
other — so it draws from 2-5×2-12, 1.5×2-12 and 2.5×2-12, six draws in
ten for the first. The 2 the recipes left out comes back in that company, as
it does in any: what made it a poor recipe was 2 × 5 read backwards as
10 ÷ 2, and a product keeping company is never read backwards.
expr_eval auto 2-12 2-30 -- variant=x²+ax result=positive
→ b² + 2b, b = 12 → u² + 5u, u = 12
→ x² + 2x, x = 11 → t² + 2,5t, t = 9
A line that writes its product range out is left alone: what the author wrote is what they meant, and the shape's ceiling on the coefficient (5, above) is enough there.
Three shapes carry a table of their own instead of being weighed by the
tables rule: ax², x²/a and a/x². The rule asks of every operation
whether a pupil can carry it out, and answers by the size of the operands
— nothing beyond twelve, its zeros and its point set aside. That answer is
right almost everywhere and wrong wherever a square is an operand, because a
square is not free to be small: 2 × 144 is a question a 5e pupil answers and
64 ÷ 32 is another, while 64 ÷ 16 is not, and no rule about size tells the
three apart. A table does. Keyed by the value of the unknown, it gives what
the number beside it may be, and the shape then vouches for the operation
the way a product range vouches for what it drew:
expr_eval auto 2-12 2-30 -- variant=ax²,x²/a,a/x² result=positive
→ 2y², y = 12 2 × 144 → q²/18, q = 6 36 ÷ 18
→ 8x², x = 4 8 × 16 → x²/4, x = 8 64 ÷ 4
→ 12p², p = 10 12 × 100 → n²/64, n = 8 64 ÷ 64 = 1
→ 1000/q², q = 10 1000 ÷ 100 → 63/b², b = 3 63 ÷ 9
Dividing the square by itself is in the table deliberately: it is simple, and it is exactly where a class hesitates. It is the one place the engine's own refusal of a division that divides nothing steps aside, and it does so only because a table said which of the two it meant.
The base of the square is weighed all the same — that is the one thing a rule
about size had right about squares — and the line's range for the letters
still applies, so a table is a ceiling and never a floor: expr_eval auto 2-9
never reaches the rows for 10, 11 and 12. The draw takes the unknown first, so
the base comes out evenly across the table's keys and the number is chosen
from the row it opened.
A table may weigh a base, or a value inside a row. An even draw puts a row holding one question on the page as often as a row holding eight, and puts a value sitting in every row on a third of the lines:
a/x²weighs its row for 4 down —32 ÷ 16is all that row holds, and five bases drawn evenly put it on one line in five;x²/aweighs the division of the square by itself down to a share, which takes it from 38 % of the line to 8 %;ax²gives 10 and 100 two fifths of a share each, because multiplying by ten and by a hundred is one and the same asking and both sit in every row — between them they took a third of the line, and now a fifth. The 2 then takes four fifths, the short rows holding little else once the zeros have given up their place.
A share is a draw-time weight like a recipe's: it changes how often a question
comes up and never whether it may, so check qspec --report, which counts
what a line can pose, reads the same either way.
A shape may also draw a slot itself, where the line's range describes
something else. A line's ranges say what a pupil is given, and most slots
are given: the x of ax + b is a value chosen for them, and 2-12 says
what it may be. A few are not. The b of b − x² is not a free term — under
result=positive it is a square plus the answer — so a range stopping at 30
stops the base at 5 and the shape poses 66 questions out of a possible 1265.
The x of (x − b)/a is not a free value either: it is the dividend plus
b, and the dividend is a product of the tables, so a range stopping at 12
leaves it four questions. Nor is the x of x − ay, which has to be worth
more than the product it loses: it reaches as far as the b of b − x².
expr_eval auto 2-12 2-30 -- variant=(x-b)/a result=positive
→ (b − 5)/7, b = 68 63 ÷ 7
→ (a − 24)/3, a = 69 45 ÷ 3
→ (c − 21)/15, c = 81 60 ÷ 15
expr_eval auto 2-12 2-30 -- variant=b-x² result=1-30
→ 76 − x², x = 8 76 − 64
→ 32 − k², k = 2 32 − 4
This is what the dividend of a/x has always done — it is the pair's product,
and no range of the line's ever held it — said for a slot the shape names
instead of for one a group fills. The draw still takes the slots in turn, so
the base of b − x² comes out evenly across 2 to 12 rather than piling up
where the term left room; and result is where to say how big the answer may
get.
A shape may hold one of its slots down to a size of its own, whatever
range the line gives it: the term of x² + b stops at 20, and the a of
x² + ax at 5, so the product keeps the square company rather than doubling
the work. A ceiling is read on the value as it was drawn, before any power of
ten, so a line moving the whole expression never runs into one. It is
declared and not read off the tree, because it is not in the tree to read:
x² + b is a perfectly good expression for any b, and that a term of 26
beside a square is more to carry than one of 12 is a teacher's judgement.
A shape may write itself either way round where writing it both ways is
not a second question: a(x+b) comes out 7(t + 3) or 7(3 + t), at
random, because the sum inside the parentheses commutes and the exercise is
the same one — and so do (x+b)/a and a/(x+b). That is not so of ax+b
and b+ax, which are two shapes of the catalogue: there the coefficient
changes side, and a pupil reads the expression differently. Nor of x²+x
and x+x²: the second is where a pupil adds before squaring. Everything a shape derives — its groups, its slots,
what may carry the zeros — is read off the one writing; only the drawn tree
is mirrored.
In the tables¶
82 ÷ 41 is exact. 28 × 17 is whole. 69² is positive. Not one of the
three is a question a 5e pupil is asked to answer without writing anything
down — and arithmetic alone cannot say so, which is why there is a second
rule beside Landing right below:
- a product wants both its factors in the tables;
- a quotient wants its divisor and its quotient in the tables — the table read backwards, so the dividend is free to be 81;
- a square wants a base a pupil knows.
"In the tables" is read on the digits, zeros and point set aside: 40, 0,4
and 12 000 are all as simple as 4, which is exactly what scale is for.
The ceiling is 12 — 11 × 11 and 12 × 12 are learnt with the rest. A
square is held to the plain reading instead: scaling a product costs one
count of zeros, scaling a square costs it twice, and 8 100 is not the mental
calculation 8 × 100 is.
82/(t + 25), t = 16 ✗ 82 ÷ 41
81/(t + 5), t = 4 → 81 ÷ 9, and a question
28(m − 20), m = 37 ✗ 28 × 17
7(m − 9), m = 17 → 7 × 8
a² − a, a = 69 ✗ and exact, and positive
8r + 53, r = 6 → a sum is not weighed: nothing about the sizes a
range offers makes a sum something other than a sum
A product range is the author's own judgement, not the sift's — about
what a line will multiply. A multiplication drawn from one is exempt:
writing 11×11-99 is asking for 11 × 63, and 9×1.5 is asking for
9 × 1,5. That is also why a coefficient written as 2,5 reaches the page
through a product range and not through a plain one.
A division built out of the same pair is exempt from nothing, and that
is the whole of the difference. 11 × 71 read backwards is 781 ÷ 11,
which nobody described and no pupil recognises; 2,5 × 6 backwards is
15 ÷ 6 = 2,5. A pair says what a line will multiply; what it may divide
the rule decides, which is why 2-9×2-9 divides freely — every quotient it
can make is a table — and 1.5×2-20 does not divide at all.
One consequence worth knowing when writing a line: a slot that is itself
a factor or a divisor is narrowed where it stands, before any combination is
tried. On 2-99 that leaves a coefficient 19 values — 2 to 12, then 20, 30,
… 90 — where the term beside it keeps all 98. It is the same rule read one
slot at a time, and it is what keeps the search from hunting a handful of
survivors through a hundred thousand combinations.
Landing right¶
An expression that passes through a negative number is not a 5e question, and a division that does not fall right is not a question at all. Both are settled the same way: every combination the sources allow is tried on the expression, reduced the way a pupil reduces it, and only those that come out clean are offered to the draw.
- a division must stop within the precision the line works at — the digits
of the most precise value its ranges offer. With whole ranges that is exact
integer division; with
0.1-9.9on the line, a quotient may need a tenth; - a division that divides nothing is refused:
9 ÷ (9 − 8),12 ÷ 12— and so is a product that multiplies nothing,70(93 − b)forb = 92; - a coefficient is never 1 (
1xis not written), an unknown is never 0 or 1, and two letters are never given the same value.
Nothing else needs a rule, and that is worth knowing when writing a line: a sum, a difference, a product and a square never need more digits than their operands bring. So the answer is whole exactly when the sources are, with no option to set — and a range holding a decimal makes a decimal answer natural rather than forbidden:
expr_eval 9×1.5 2-12 -- variant=ax+b → 9x + 2, where x = 1,5 → 15,5
expr_eval 2.5×4-20[2] 2-12 -- variant=ax-b result=positive
→ 4x − 7, where x = 2,5 → 3
With result=positive — what a 5e line writes nearly always, negative numbers
being taught late in the year at the earliest — no negative number appears
anywhere in the reduction, not merely in the result:
expr_eval 2-9 2-12 -- variant=b-ax result=positive
→ 12 − 2x, where x = 4 12 − 8 = 4
✗ 5 − 2x, where x = 4 a pupil meets 5 − 8 on the way
result=negative asks for the opposite result. Left out, neither applies and
an expression is free to pass through a negative number.
Asking for a question of a certain size¶
result also takes bounds, and they carry the positive reading with
them — a result between 11 and 30 is a positive result, negative numbers
staying out of the steps just the same:
(6) expr_eval 2-9×2-9 2-9 2-99 -- variant=ax+b,b+ax,ax-b result=20-60
→ 9m − 35, where m = 8 → 37
→ 34 + 3t, where t = 3 → 43
(4) expr_eval 2-9×2-9 2-12 2-99 -- family=square ops=2 result=20-99
→ n²/5, where n = 10 → 20
→ 47 + t², where t = 5 → 72
This is what an author reaches for when they want a question of a certain
size and find themselves narrowing a source instead — which does not work,
because the size of a term is not the size of a question: 8r + b wants a
small b where b − x² wants a large one, and both are terms of the same
kind. The result is the thing actually being asked about, so it is the thing
to bound.
A bound is a filter and never a source: the values still come from the
ranges the line declared, and none is invented to reach one. So bounds can
empty a shape the way any constraint can, and check qspec says which.
result=12 bounds the result to exactly 12.
What to give it¶
A product range, wherever the expression divides. Drawn from two plain
ranges, the quotient family is the demanding one: x/a needs the value of
the letter to be a multiple of the number, and a/(x + b) needs a division
that is exact and in the tables, with nothing to aim at. A pair settles
both by construction. Failing that, room:
(4) expr_eval 2-9×2-9 2-20 -- family=quotient result=positive
(4) expr_eval 2-20 2-12 -- family=quotient result=positive
A line of plain ranges spanning the whole catalogue will draw a warning or
two on a/(x + b) and a/x² however wide it is. That is the warning doing
its job: give those a product range, or exclude them with variant=^141.
automath check qspec says so before anything is rendered — it refuses a
shape no combination can people, naming every such shape of the line at
once rather than the first of them, and warns about one left with 25 questions
or fewer where a wider range would help. x² holds eleven questions and
cannot hold more, its base being capped at 12 by the tables rule, so nothing
is said about it: a remark an author cannot act on is noise.
See Validating specs.
Seeing what a line will give¶
Ranges and a catalogue of shapes do not add up to something an author can foresee, and the questions worth knowing about are the ones at the edge. So ask:
expr_eval: shapes selected: 1. Questions they can draw: 4000.
expr_eval: the result falls between 125 and 1 185.
expr_eval: it multiplies within the tables, the most it asks being 12 × 11,
in 12x + 88, x = 11.
expr_eval: it multiplies beyond the tables, the most it asks being 11 × 99,
in 11x + 21, x = 99.
Every question the line can draw is weighed, not a sample of five: the sift
has already enumerated them, so the extremes are the real ones. Difficulty is
read as a demand rather than a size — 1000 × 7 is a shift, 79 × 3 is
not — and the bands are listed lowest first, so the most trivial question a
line can ask shows as plainly as the hardest. A recipe reports as one band:
expr_eval 10×0.1-9.9 2-12 2-99 -- variant=b-ax result=positive
expr_eval: it multiplies by a power of ten, the most it asks being
10 × 9,8, in 99 − 10x, x = 9,8.
expr_vocab¶
A worded expression to write in letters.
| Variant | Example |
|---|---|
| (default) | Sum of x and 3? → x + 3 |
Sources — the lexicon the word is drawn from — expr_operations, expr_multiples, expr_powers, expr_opposite or expr_words — and, for the words taking two operands, a range for the number: expr_operations 2-9.
Steps — none: the answer is the whole of it, so the answer key draws no ⓘ button.
Options — these, on top of the ones every type reads:
| Option | What it does |
|---|---|
letters |
how many letters the expression is written with — 1 (the default), the second operand of a binary word being a number, or 2 for a second letter, which then needs no range |
expr_vocab words an expression and asks for it in letters:
(8) expr_vocab expr_words 2-9
→ Sum of x and 3? answer: x + 3
→ Square of t? answer: t²
→ Quotient of 12 by n? answer: 12/n
It is the vocabulary the other question types ask the value of — the four
operations of the variant=wording forms, the double and the third of
multi_vocab and divi_vocab, the square and
the cube of square_of and cube_of — asked here
of a letter, so that nothing is left to compute and the reading of the word
is the whole of the question.
The lexicon is the source, and it is how a sheet avoids repeating itself¶
The word comes from the source, and the source names one of five lexicons:
| source | words |
|---|---|
expr_operations |
sum, difference, product, quotient |
expr_multiples |
double, half, triple, third, quadruple, quarter |
expr_powers |
square, cube |
expr_opposite |
opposite |
expr_words |
the three first taken together |
That is what keeps a worksheet from asking the same word twice. A sheet
already carrying a multi_direct 2-9×2-9 -- variant=wording — which has no
choice but to say product — asks for its expression elsewhere:
(4) multi_direct 2-9×2-9 -- variant=wording Product of 7 by 8?
(4) expr_vocab expr_powers Square of t?
Nothing does this automatically, and deliberately so: a question drawn before another cannot know what that other will ask, and every word of this vocabulary is already in use by some other type. The author, who sees the whole sheet, is the one who can choose — and a lexicon named on the line is a choice that renders the same way every time.
expr_opposite stands alone rather than inside expr_words because the
opposite of y says nothing before the relative numbers are taught: a sheet
gets it by naming it, and never stumbles on it.
One source or two¶
The words of expr_operations take a second operand; the others bear on the
letter alone. So a lexicon holding any of the four needs a range to draw that
number from, and the others take no range at all:
(4) expr_vocab expr_operations 2-9 Sum of x and 3?
(4) expr_vocab expr_powers Square of t?
(4) expr_vocab expr_words 2-9 either, and the range waits its turn
A range that could draw 0 or 1 is remarked on by check qspec: the sum of x
and 0 is a question with nothing left to write.
letters=2 writes the second operand with a second letter instead, and then
no range is needed:
A range stated where a given question does not need it is not an error — it is simply never drawn from. That is what lets a line mix the two:
Each alternative is validated on its own, and the one writing two letters leaves the range alone, as does every question that happens to draw a square. The only thing refused is the reverse — a word that needs a number to be written, with nothing to draw it from:
Which operand comes first is drawn¶
Quotient of x by 3? and Quotient of 12 by x? are both asked, and answered
x/3 and 12/x respectively. It matters: neither the difference nor the
quotient is commutative, and reading the order off the sentence is half of
what the question teaches. Difference between x and 3 is x − 3, the same
reading subtr_direct gives it in words.
Every writing of the answer is accepted¶
An expression has no single spelling, so the answer is not compared as a string: what is checked is whether what the pupil typed is the expected expression, however written.
| asked | typed | |
|---|---|---|
| Double of x? | 2x, x*2, 2×x, x+x, 4x/2 |
accepted |
| Square of t? | t², t^2, t*t, tt, t2 |
accepted |
| Half of x? | x/2, x:2, x÷2, 0,5x, 1/2*x |
accepted |
| Sum of x and 3? | x+3, 3+x, (x+3) |
accepted |
| Opposite of y? | -y, 0-y, (-1)*y |
accepted |
| Difference between x and 3? | 3-x |
refused |
| Double of x? | x2 — a digit behind a letter is an exponent |
refused |
| Quotient of 12 by x? | 12x/x² |
accepted |
| Double of x? | 2x²/x — undefined at 0, where 2x is not |
refused |
Spaces, case and the various signs are folded: × and * are the same
multiplication, ÷, : and / the same division, the comma and the point
the same decimal separator. The letter x is never read as a
multiplication sign — it is a letter.
Two conventions are worth knowing, both positional:
- a number before a letter is a coefficient,
4xbeing4 × x; - a number after a letter is its exponent,
x2beingx²— the readingexpand_simplealready gives24x2.
A pupil is never forced to reach for ²: the syntax help of the page —
the ⓘ button, beside the writing of a multiplication and of a fraction — says
that x² may be written x2 or x^2. It is said there and not under the
question: a note reading x² may also be written x*x beneath Square of x?
would hand the answer over.
An expression that merely happens to be equal is accepted too —
4x² − 4x² + 2x is the double of x, and refusing it would mean drawing a
line no rule can draw. What is not accepted is an expression defined
elsewhere than the expected one: 2x²/x is 2x everywhere except at 0,
which makes it another expression, not another writing of the same one.
frac_decimal¶
A fraction and its decimal writing, one asked from the other.
| Variant | Example |
|---|---|
| (default) | 78/100 = ? → 0,78 · 1,3 = ? → 13/10 · 0,25 = ? → ¼ |
Sources — one decimal place — digitplaces_small, or a power of ten from 0.1 to 0.001 — or the usual_fractions table, whose fractions are drawn whole.
Steps — none: the answer is the whole of it, so the answer key draws no ⓘ button.
Options — these, on top of the ones every type reads:
| Option | What it does |
|---|---|
series |
which list of usual fractions a table draws from — basic, extended, or any (the default, both); over a table, never over a place |
to |
which writing the answer is in — alternate (the default), random, decimal or fraction |
width |
how many digits the numerator has, 1-3 by default; over a place, never over a table |
A decimal fraction is a fraction over ten, a hundred or a thousand, and it
is the same number as its decimal writing. frac_decimal asks for one
writing given the other, either way round:
(10) frac_decimal digitplaces_small
→ 78/100 = ? answer: 0,78 (as a decimal number)
→ 1,3 = ? answer: 13/10 (as a decimal fraction)
The source draws the place, hence the denominator¶
As for digitplace_*, the source is not the number: it is the place the
number goes down to — which is the denominator said the other way round. A
number whose last digit sits at the hundredths is a number of hundredths,
i.e. a fraction over 100.
| Source | Places drawn | Denominators |
|---|---|---|
digitplaces_small |
tenths, hundredths, thousandths | 10, 100, 1000 |
0.1, 0.01, 0.001 |
the one written | 10, 100, 1000 |
digitplaces_small is an alternator: it runs through the three places once
per cycle and never twice in a row, so a sheet spreads over the three
denominators instead of camping on one. A numrange pins the places a line
wants instead — which is how a first sheet stays on the tenths:
(10) frac_decimal 0.1 → always tenths, always /10
(10) frac_decimal 0.010,0.001 → hundredths and thousandths
Note the padding in the last one: a numrange takes its step from the
precision of its bounds, so the places of a list must be written with the
same number of decimals — 0.1,0.01 is refused, 0.100,0.010 is not. For a
mix of all three, digitplaces_small says it better anyway.
Anything else is refused by check qspec: 10 is a digit place, but not one
a decimal fraction is written on.
The number is drawn from the place upwards¶
width is how many digits the numerator has — a number, or a range from
which one is drawn per question (the default is 1-3):
frac_decimal 0.01 → 0,09 · 0,47 · 2,47
frac_decimal 0.001 -- width=1-2 → 0,003 · 0,043
frac_decimal 0.1 -- width=4 → 473,9
The digits grow leftwards from the place drawn, and the last of them is never a zero. That single rule is what the whole type rests on:
- the number has exactly as many decimals as the place asks for, so
0,70never comes up where70/100was meant; - it is therefore never a whole number, in either direction;
- and its decimal fraction is unique, which is what makes 1,3 as a decimal fraction a question with one shortest answer.
A width the places cannot hold is narrowed rather than refused: the number
and its numerator stay inside the thousandths-to-thousands window, so
width=7 on the tenths gives a five-digit numerator, not a number in the
millions.
The usual fractions, in two series¶
A content table source draws the fraction whole instead of building a
number over a place: usual_fractions holds the ones whose decimal writing
is learnt by heart, in the two series a class meets one after the other.
series |
Fractions drawn |
|---|---|
basic |
1/2, 1/4, 3/4, 1/5, 1/10, 1/100 |
extended |
3/2, 5/2, 5/4, 2/5, 3/5, 4/5 |
any |
(the default) both, indifferently |
(6) frac_decimal usual_fractions -- series=basic → 0,25 = ? · 1/10 = ?
(6) frac_decimal usual_fractions -- series=extended → 2,5 = ? · 4/5 = ?
(6) frac_decimal usual_fractions → either list
series is a row filter on the table's own column, so it belongs to a
table source alone: written on a line drawing over a place, it is refused
rather than ignored — as width is over a table. Being an option group like
any other, series={basic|extended} draws one of the two lists per question,
which balances a block the way to=alternate balances the directions.
What changes for the pupil, over a table, is the fraction asked back: the one
the list holds and no other. 0,5 is 1/2, not 5/10 — so the note says
(as a simplified fraction), and the rule accepting any equal decimal
fraction (below) is deliberately not applied here. The extended series also
brings in fractions above 1, whose decimal writing has a whole part: 3/2 is
1,5.
to — which writing is asked for¶
to |
The answer is |
|---|---|
alternate |
(the default) one then the other, from an alternator |
random |
drawn independently at each question |
decimal |
the decimal writing — 78/100 = ? → 0,78 |
fraction |
the decimal fraction — 1,3 = ? → 13/10 |
alternate is the default because the two directions are the same knowledge
and a sheet should ask both. Being an alternator, it never asks the same way
twice running — within a block, questions are shuffled afterwards, so what it
guarantees is the balance, not the printed order. random gives up that
balance; decimal and fraction pin the direction for a sheet drilling one
of them.
The note says which writing is expected¶
1,3 = ? alone would take either writing, and the ? of 78/100 = ? could
be filled with 39/50 by a pupil who reduces. So each question carries a
note — (as a decimal fraction), (as a decimal number) — which is the
instruction a printed sheet would put in its title, moved into the question
so that both directions can sit in the same block.
Any equal decimal fraction is accepted¶
13/10, 130/100, 1400/10000 are all correct for 1,3, and there is no
end to them. So where a fraction is asked for, the interactive page does not
compare against a list: it brings whatever was typed back to the shortest
writing and compares that. What passes:
| Typed | |
|---|---|
13/10, 130/100, 13 / 10, 013/10 |
accepted |
1,3 — the writing the question gives |
refused |
13/1, 1/4, 13/20 — denominators that are not powers of ten |
refused |
A decimal answer is compared as it is written, 0,78: a decimal writing is
unique, and there is nothing to bring back to anything.
No steps, and 25 s¶
The type shows no steps, and offers no info button on the answer key:
writing a number the other way round is what the pupil is expected to do at
sight, and spelling it out step by step would only restate the question. A
line carrying steps=1 for the other types of a mixed block is not turned
down — the level simply comes back down to 0, as it does everywhere a type
has no step.
The default transduration is 25 s, the time to read the number, count its
decimals and write it the other way round.
frac_equal¶
Equality of two fractions with one of its four terms missing.
| Variant | Example |
|---|---|
| (default) | ?/24 = ⅔ |
Sources — two sources, bound by arity and not by position: a product range for the base fraction and a singleton range for the multiplier — 2-9×2-9 2-9.
Steps — one level, what was done to both terms of the complete fraction.
Options — these, on top of the ones every type reads:
| Option | What it does |
|---|---|
hidden |
which of the four terms the hole falls on, 0 to 3, numerator first; left out, it goes round them |
order |
which fraction is written first — alternate (the default), random, ascending or descending |
frac_equal asks an equality of two fractions with one of its four terms
missing:
The two fractions are equal because one is the other with both terms
multiplied by the same whole number: 16/24 is 2/3 with 8 everywhere. The
pupil goes from the complete fraction to the other one by multiplying or by
dividing — whichever way the hole faces — or, later on, by a cross product.
Two sources, bound by arity¶
One product range for the two terms of the base fraction, one singleton range for the number they are multiplied by:
(6) frac_equal 2-9×2-9 2-9 the pair 2-9×2-9, the multiplier 2-9
(6) frac_equal 2-9 2-9×2-9 exactly the same thing
Position is ignored: the sources are told apart by their width, as in
order_of_2ops. The base fraction is recorded in
the pairs table and the multiplier in singletons, so neither comes back
before the others have been used.
What the ranges decide¶
Everything. The question type imposes no bound of its own — only that the
multiplier be a whole number of 2 or more (1 would write the same fraction
twice) and that the base fraction not be 1 (3/3 = 12/12 asks nothing):
(6) frac_equal 2-9×2-9 2-9 ?/24 = 2/3
(6) frac_equal 20-90[10]×20-90[10] 2-9 20/30 = ?/240
(6) frac_equal 2-9×2-9 2-12 past the tables, for the drill
The base fraction is not required to be irreducible: 4/6 = 12/18 is a
sound question, since what the pupil does is go from one fraction to the
other, not simplify either of them. What the model does guarantee is that
this step is always a whole number — 20/16 = 15/12 is a true equality, but
its step is ¾, and no draw here can produce it.
The terms of a fraction being whole numbers, a range of decimals is refused
outright, and check qspec says so before anything is rendered — as it does
for a range holding no usable pair (5×5) or no multiplier (1).
Where the hole falls¶
The four terms are numbered by fraction, numerator first:
Left to itself the hole moves from question to question, covering the four
terms once each before any comes back — so a sheet asks as many
multiplications as divisions instead of repeating the same shape. hidden
pins it:
A line that pins its hole draws nothing from that rotation, and so leaves the lines around it where they were.
Which fraction is written first¶
order decides which side the base fraction — the smaller one — is written
on:
| Value | Effect |
|---|---|
alternate |
changes side at every question (the default) |
random |
drawn independently for each question |
ascending |
the base fraction first: 2/3 = ?/24 |
descending |
the multiplied one first: ?/24 = 2/3 |
steps — showing what was done to both terms¶
steps=0 is the default, as everywhere in mental calculation: the answer is
the missing number alone, and the reasoning stays behind the info button of
the answer key. steps=1 writes it out, from the complete fraction to the
one missing a term — multiplying or dividing, depending on where the hole
fell:
steps=0: ?/24 = 2/3 → 16
steps=1: ?/24 = 2/3 → 2/3 = (2 × 8)/(3 × 8) = 16/24
16/24 = ?/3 → 16/24 = (16 ÷ 8)/(24 ÷ 8) = 2/3
In the middle member the operation is written in red on both terms, its sign included — what that member is there to show is that one and the same thing was done above and below the bar.
Only the missing number is ever accepted as an answer, with or without steps.
frac_of_quantity¶
Calculate a fraction of a quantity given with its unit.
| Variant | Example |
|---|---|
| (default) | How much are ⅘ of 20 L? |
Sources — one product range, its fractions drawn in turn, then two of its products sharing a factor — 2-10×2-10.
Steps — one level, the quantity divided by the denominator then multiplied by the numerator.
Options — these, on top of the ones every type reads:
| Option | What it does |
|---|---|
proper |
true (the default) for proper fractions, false for improper ones, any for either, drawn per question |
unit |
the unit the quantity is given in — a unit of length, mass or capacity (km … mm, kg … mg, hL … mL), or length, mass, capacity to draw among the units of one; drawn among all of them by default |
frac_of_quantity asks for a fraction of a quantity given with its unit:
The fraction is always irreducible: simplifying a fraction is another
exercise, and is not mixed into this one. It is proper unless proper says
otherwise (see below). The quantity is always a multiple of the denominator,
so both the division and the multiplication fall right, inside the tables.
One source: a fraction, then two products¶
The three numbers come from one product range, as two products sharing a
factor, a × b and a × c. The fraction is b/c, the quantity a × c and
the answer a × b:
They are drawn in two steps, each with its own tracking:
- The fraction first, among those the range allows: two coprime values
of the range, with some factor of the range — other than 0 or 1 — making
a product with each.
2-10×2-10allows 22 fractions, from2/3to9/10. They are recorded in a tracking table of their own, so a sheet goes through all of them before asking one again — a range allows only a few dozen fractions, and chance alone would ask the same one several times in a row, whatever the quantity. - Then the two products
a × banda × c, drawn around the fraction. They are recorded in thepairstable, likemulti_direct, so a fraction of a quantity and a multiplication on the same sheet do not ask the same fact twice: no7/9 of 72right after7 × 8.
The range decides which fractions can come up. 2-10×2-10 keeps the
denominators at 10 and leaves out the fractions of numerator 1; 1-10×1-10
brings 1/2 … 1/10 in. A shared factor of 1 is never chosen —
1 × 4 and 1 × 5 would ask for 4/5 of 5, which is the numerator
itself — but a range holding 1 stays usable: the 1 ends up in the fraction,
as in 1/3 of 21 g.
The range must hold at least one such fraction — 1×2-9 does not, nor does
3×2-8[2], all of whose fractions are fractions of two even numbers.
check qspec says so before anything is rendered.
proper — proper or improper fractions¶
| Written | Drawn |
|---|---|
| (nothing) | proper fractions, 4/5 of 20 L |
proper=true |
the same, said out loud |
proper=false |
improper ones, 5/4 of 20 L = 25 L |
proper=any |
either, drawn per question |
An improper fraction is a proper one turned over, so proper=false draws
from the same fractions of the range, the ones of numerator 1 aside — turned
over, 1/7 would be 7/1, a whole number. With proper=any they stay
proper.
unit — the unit of the quantity¶
Without unit, the quantity is given in any unit of the length, mass and
capacity ladders, drawn per question: km … mm, kg … mg, hL … mL.
All of them, the rarer ones included, so that the pupils meet them too — but
for the kilolitre, which nothing is measured in.
unit narrows that choice, to one unit or to the units of one quantity:
(8) frac_of_quantity 2-10×2-10 -- unit=mass kg … mg
(8) frac_of_quantity 2-10×2-10 -- unit=cL always cL
(8) frac_of_quantity 2-10×2-10 -- unit={kg|g} one of the two per question
The answer is counted in the unit of the quantity. That unit is printed inside the answer box, against its right edge, and the pupil types the number alone. On a slide, which has no box, the correction writes it after the number.
steps — divide, then multiply¶
steps=0 (the default) gives the result alone; steps=1 writes the
calculation out — the quantity divided by the denominator, then multiplied by
the numerator:
At steps=0, the calculation is still one click away on the live page — see
The steps option.
The wording agrees with the numerator¶
In French the verb agrees with the fraction — Combien vaut ⅕ de 20 L ?, Combien valent ⅘ de 20 L ? — so the question is written with one of two sentences, depending on whether the numerator is 1. Each is translated as a whole.
frac_simplify¶
A fraction to simplify, whose terms share a whole divisor by design.
| Variant | Example |
|---|---|
| (default) | Simplify 18/24 |
Sources — two sources, bound by arity and not by position: a product range for the base fraction and a singleton range for the number both its terms are multiplied by — 2-9×2-9 2-9.
Steps — one level, both terms divided by their common divisor.
Options — these, on top of the ones every type reads:
| Option | What it does |
|---|---|
irreducible |
whether the base fraction has a divisor of its own — true (the default), so that the fraction comes down by the multiplier alone, false for a base that comes down further, any for both |
frac_simplify shows one fraction and asks for it simplified:
The fraction is the one frac_equal writes on its multiplied
side: a base fraction with both terms multiplied by the same whole number.
The multiplier being 2 or more, the fraction shown always comes down — the
pupil never meets one that is already irreducible.
The base fraction is drawn irreducible, so that what brings the fraction
all the way down is the multiplier and nothing else: the range that draws the
multiplier is what a sheet's difficulty rests on, and 2-9 keeps it within
what is done in the head. The irreducible option, below, says otherwise
where a harder fraction is the point.
Two sources, bound by arity¶
One product range for the two terms of the base fraction, one singleton range
for the number they are multiplied by — the sources of frac_equal, read the
same way:
(6) frac_simplify 2-9×2-9 2-9 the pair 2-9×2-9, the multiplier 2-9
(6) frac_simplify 2-9 2-9×2-9 exactly the same thing
Position is ignored: the sources are told apart by their width, as in
order_of_2ops. The base fraction is recorded in the
pairs table and the multiplier in singletons, so neither comes back
before the others have been used.
What the ranges decide¶
How big the terms grow, and how far the fraction has to come down:
(6) frac_simplify 2-9×2-9 2-9 Simplify 18/24
(6) frac_simplify 2-9×2-9 2-4 one small divisor to find
(6) frac_simplify 2-9×2-9 6,8,9 the divisor is never small
The terms of a fraction being whole numbers, a range of decimals is refused
outright, and check qspec says so before anything is rendered — as it does
for a range holding no usable pair (5×5), no multiplier (1) or no pair on
the side irreducible asks for (2-8[2]×2-8[2], two even numbers every
time).
irreducible — how far the fraction has to come down¶
The three values of the fractions table column of the same name, read the
same way — divi_direct reads them too:
| Value | Effect |
|---|---|
true |
the base fraction has no divisor of its own (the default) |
false |
the base fraction comes down too |
any |
both kinds |
A reducible base compounds: 4/6 multiplied by 9 gives 36/54, which comes
down by 18 — past what a 5e does in his head, though the multiplier drawn was
a perfectly reasonable 9. irreducible=true rules that out, and pins the
divisor of the fraction shown to the multiplier itself:
irreducible=any is also what a range with no irreducible pair to offer asks
for — a range of round numbers, typically:
Every simplification is accepted¶
The answer key gives the irreducible fraction, and an interactive page accepts it — but it also accepts the fraction stopped on the way down:
which is the 5e reading of the instruction: simplify, not make
irreducible. What is refused is a fraction merely equal to the one shown:
36/48 is 18/24 multiplied, not simplified, and answers nothing.
A sheet marked by hand is a different matter — the answer key shows the irreducible fraction alone, and what a half-simplified answer is worth is for whoever marks it to decide.
steps — showing the division¶
steps=0 is the default, as everywhere in mental calculation: the answer is
the simplified fraction alone, and the reasoning stays behind the info button
of the answer key. steps=1 writes the division out:
The division is written in red on both terms, its sign included — what that middle member is there to show is that one and the same thing was done above and below the bar.
Where the divisor is not prime, the info button offers the other way beside it: dividing one prime factor at a time, each member carrying its own division —
(18 ÷ 2)/(24 ÷ 2) = (9 ÷ 3)/(12 ÷ 3) = 3/4
(24 ÷ 2)/(72 ÷ 2) = (12 ÷ 2)/(36 ÷ 2) = (6 ÷ 2)/(18 ÷ 2) = (3 ÷ 3)/(9 ÷ 3) = 1/3
which is how a pupil who does not see the 6 at once gets there, and which passes through the answers he may stop on. The division being in red on the black fraction it bears on, the fraction it lands on is the next member: only the last one, the result, carries no division.
fraction_of_a_rectangle¶
Which fraction of a ruled rectangle is coloured.
| Variant | Example |
|---|---|
| (default) | Which fraction of the figure is greyed? (beside a 3×4 grid, 6 of its cells greyed) |
Sources — a product range for the fraction, with an optional singleton range for the number of rows — 1-10×1-10 2-4 — or two product ranges, the grid and its coloured part — 2-5×2-5 2-5×2-5.
Steps — one level, the fraction simplified where it can be; the number of cells counted is behind the info button.
Options — the ones every type reads only.
fraction_of_a_rectangle draws a ruled rectangle with some of its cells
coloured, and asks which fraction of the figure they are:
(4) fraction_of_a_rectangle 1-10×1-10 2-4
→ [a 3×5 grid, two columns greyed] Which fraction of the figure is greyed?
answer: 6/15
The figure is a rectgrid{}, drawn beside the sentence on a
worksheet and under it on a slide, its coloured cells starting from a corner
drawn at random.
Greyed or coloured¶
The colour of the cells depends on the kind of page, as the
configuration sets it for every grid
(rendering.rectgrids.fill_color and its fill_color_grid, fill_color_page,
fill_color_slide variants): grey on a worksheet, since an assessment is
printed in black and white, and a colour drawn at random from
fill_palette on a slide.
The sentence follows the colour actually drawn. A grey figure asks Which fraction of the figure is greyed? — "coloured", on a grey figure printed in black and white, leaves many pupils asking which part is meant to be coloured — and any other asks about its coloured part. The explanation behind the info button says it the same way. The colour is written into the question, so a snapshot keeps both the colour and the word that goes with it.
Two ways of drawing the figure¶
The sources are told apart by their width, never by their position, as for
frac_equal:
(4) fraction_of_a_rectangle 1-10×1-10 a fraction, over one row
(4) fraction_of_a_rectangle 1-10×1-10 2-4 a fraction, over 2 to 4 rows
(4) fraction_of_a_rectangle 2-5×2-5 2-5×2-5 two rectangles
A fraction. The product range is the fraction itself, the smaller value
over the bigger one: 3/7 is a strip of seven cells, three of them coloured.
The singleton range, when there is one, is the number of rows it is spread
over, which multiplies both of its terms: 2/5 over three rows is a 3×5
grid with two full columns coloured — 6/15 counted cell by cell, 2/5 read
column by column. Without a singleton range, one row.
The fraction is drawn irreducible, and proper: a pair of equal values, a
0, or two values sharing a divisor (2×4) is left out of the draw. Enlarging
the fraction is what the rows are for.
Two rectangles. One is the grid, the other the coloured area — the bigger of the two is the grid, and they are never drawn with the same area. The coloured area is a number of cells, which the figure arranges into whatever fits (see What the fill descriptor says): ten cells coloured in a 3×4 grid are the grid coloured whole but for a white 1×2 in a corner. Those figures cannot be read by columns: the cells have to be counted.
These reproduce the four sources mathmaker used for this question:
| mathmaker | automathics |
|---|---|
properfraction_1to10 |
fraction_of_a_rectangle 1-10×1-10 |
properfraction_2to4×1to10 |
fraction_of_a_rectangle 1-10×1-10 2-4 |
properfraction_3to6×3to6 |
fraction_of_a_rectangle 3-6×3-6 3-6 |
intpairs_2to5;;intpairs_2to5 |
fraction_of_a_rectangle 2-5×2-5 2-5×2-5 |
check qspec refuses a range of decimals (a grid is made of whole cells), a
product range holding no usable fraction, a singleton range holding no
number of rows, and two product ranges that can only give one area.
The answer¶
The answer key gives the fraction the cells count — coloured cells over all of them — followed, when it can be simplified, by its biggest simpler writing, an ellipsis saying when there are more:
— so that whoever corrects a printed sheet does not take 9/15 for a
mistake. Every fraction equal to it is accepted: 2/5, 4/10, 6/10…
steps=1 simplifies it instead, dividing both terms by their greatest
common divisor, written in red on both:
Behind the info button, that simplification comes after a sentence saying
what was counted — 18 cells out of 30 are greyed. — and, where the fraction
has more than one simpler writing, beside a second chain listing them all,
from the biggest down (Or else: 18/30 = 9/15 = 6/10 = 3/5): each of them
is a right answer.
Size of the figure¶
Each cell has the side the configuration sets for the
kind of page (rendering.rectgrids.cell_size_ratio and its
cell_size_ratio_grid, cell_size_ratio_page, cell_size_ratio_slide
variants), so a grid of more columns is a wider figure. It is only drawn with
smaller cells when it would outgrow its room: at most about 6 em by 3 em on a
worksheet, beside its sentence, so a 6×6 grid does not stretch its row of
the sheet to twice the height of the others; 9 em by 5 em on a plain page;
15 em by 9 em on a slide, where the grid is alone and its cells are counted
from the back of the room.
On a slide the answer is written beside the figure
(answer_layout=side), not under it, which would take its height from the
cells; answer_layout=below on the line puts it back underneath.
The time a slide gives the question grows with the number of cells to count: 20 s up to 25 cells, 25 s up to 40, 30 s beyond.
mini_pb_time¶
Time mini-problem.
| Variant | Example |
|---|---|
| (default) | I am going to see a film that starts at 20 h 30 min and lasts 1 h 40 min. What time does it end? |
Sources — clocktimes alone: a departure and an arrival drawn in the frame of the context.
Steps — one level, the operation the story calls for.
Options — these, on top of the ones every type reads:
| Option | What it does |
|---|---|
ask |
which time the story asks for — end, duration or start; alternate (the default) takes them in turn, random draws one |
carry |
true (the default) draws minutes the calculation carries or borrows over, false minutes it does not |
context |
the story the times are drawn in — a transport (train, bus, underground, coach, plane, ferry), an everyday activity (cinema, oven, homework, car, hike, bike, training), or any of them, taken in turn (the default) |
step |
the minutes the times move by at least — 10 for round times; by default, the precision of the context |
A story gives two of three times — the start, the duration, the end — and asks for the third. The operation is not written: finding which one the story calls for is half of the exercise.
ask |
What is given | What is done | Example |
|---|---|---|---|
end |
the start and the duration | an addition | I am going to see a film that starts at 20 h 30 min and lasts 1 h 40 min. What time does it end? |
duration |
the start and the end | a subtraction | I saw a film from 20 h 30 min to 22 h 10 min. How long did it last? |
start |
the end and the duration | a subtraction of a duration from a time of day | I saw a film that ended at 22 h 10 min and lasted 1 h 40 min. What time had it started? |
ask=alternate, the default, takes the three in turn, so that a sheet never
asks the same thing twice running; ask=random draws one each time.
The times are drawn by the clocktimes
source — the only one this type reads — and carry by default whatever is
asked: the minutes are drawn so that the addition makes sixty minutes into an
hour and both subtractions borrow one. carry=false asks the other way
round.
context — the story, and how closely its times are told¶
context names the story, which sets both the frame of the times and how
closely they are told: a timetable gives them to the minute, a film showing
to five minutes, and nobody sets out on a hike at 8 h 37 min. context=any,
the default, takes the contexts in turn.
| Context | Start | Duration | End | Precision |
|---|---|---|---|---|
train |
5 h → 21 h 30 min | 11 min → 8 h 30 min | 5 h 11 min → 23 h 59 min | 1 min |
bus |
5 h → 22 h 30 min | 9 min → 55 min | 5 h 09 min → 23 h 59 min | 1 min |
underground |
5 h 30 min → 21 h 30 min | 9 min → 55 min | 5 h 09 min → 23 h 59 min | 1 min |
coach |
5 h → 22 h 30 min | 55 min → 12 h | 5 h 55 min → 23 h 59 min | 1 min |
plane |
5 h → 21 h 30 min | 1 h 11 min → 8 h 30 min | 5 h 11 min → 23 h 59 min | 5 min |
cinema |
10 h → 22 h | 1 h 20 min → 3 h | 11 h 20 min → 23 h 59 min | 5 min |
oven |
8 h → 20 h | 10 min → 1 h 30 min | 8 h 10 min → 21 h 30 min | 5 min |
homework |
16 h 30 min → 19 h 30 min | 15 min → 1 h 30 min | 16 h 45 min → 21 h | 5 min |
ferry |
6 h → 21 h | 30 min → 9 h | 6 h 30 min → 23 h 59 min | 10 min |
car |
6 h → 20 h | 15 min → 9 h | 6 h 15 min → 23 h 59 min | 10 min |
hike |
8 h → 15 h | 30 min → 6 h | 8 h 30 min → 21 h | 10 min |
bike |
8 h → 19 h | 20 min → 4 h | 8 h 20 min → 21 h | 10 min |
training |
9 h → 20 h | 45 min → 2 h | 9 h 45 min → 22 h | 10 min |
The start leaves room for the shortest duration, and the end stays within reach of the start and inside its own bounds. The contexts told to five or ten minutes come first in a progression; the timetables, to the minute, are harder.
step, in minutes, can only make the times rounder: context=train
step=10 draws a timetable to ten minutes, while context=hike step=1 still
draws its times to ten. Where the step and the precision do not divide each
other, the times move by both: context=hike step=4 draws them every twenty
minutes.
Answer and steps¶
The answer is typed in hours and minutes, … h … min, the hours drawn even
where there are none. steps=1 writes out the operation the story called
for — 20 h 30 min + 1 h 40 min = 22 h 10 min — and the ⓘ button of the
answer key shows it otherwise. A story is given 40 s.
multi_direct¶
Multiplication.
| Variant | Example |
|---|---|
| (default) | 6 × 7 = ? |
wording |
Product of 6 by 7? |
Sources — one product range, of two factors or more — 2-9×2-9.
Steps — none on a plain product, which its answer says whole; one level under scale or decimals — the fact, the power of ten, the result — or under variant=wording.
Options — these, on top of the ones every type reads:
| Option | What it does |
|---|---|
carry |
false draws a multiplication no column carries, true one where at least one does |
decimals |
the number of ranks the point of the result moves left — decimals=1 asks 0,4 × 6 for the fact 4 × 6, decimals=1×1 asks 0,4 × 0,6 |
scale |
the number of zeros the result gains — scale=1-3 asks 40 × 600 for the fact 4 × 6, scale=2×1 asks 400 × 60 |
shuffle |
false keeps the factors in the order the source drew them |
multi_direct 2-9×2-9 asks the times table as it is learnt. Three options
change what it draws: scale puts zeros on the factors, decimals moves
their point left, and carry says whether the multiplication may carry.
scale — the same table, followed by zeros¶
scale asks the same table followed by zeros:
(10) multi_direct 2-9×2-9 -- scale=1-3
→ 40 × 600 = ? answer: 24 000
→ 4 × 6000 = ? answer: 24 000
→ 7 × 80 = ? answer: 560
The value is the number of zeros the result gains — one to three above,
scale=2 for exactly two — which is how the calculation is done: the fact,
then the zeros. Where they land is drawn for each question, every split being
as likely as the others, so one factor carrying them all comes up as readily
as a balanced pair. Writing the split out instead — scale=2×1, one number
per factor — pins the form, as decimals does below.
Left out, the option changes nothing: multi_direct 2-9×2-9 stays the plain
table. scale=false says the same thing explicitly, which is what a line of a
mixed block writes to stay out of it; and -- scale={default|1-3} mixes plain
and scaled questions on one line, each question drawing its own.
decimals — the same table, with the point moved¶
decimals is scale the other way round: instead of zeros the result gains,
it counts the ranks its point moves left.
(10) multi_direct 2-9×2-9 -- decimals=1
→ 0,4 × 6 = ? answer: 2,4
→ 8 × 0,7 = ? answer: 5,6
(10) multi_direct 2-9×2-9 -- decimals=2
→ 0,7 × 0,3 = ? answer: 0,21
→ 4 × 0,06 = ? answer: 0,24
Everything scale promises holds here, the direction aside: the numbers still
come from the table the line names, decimals=false opts a line out,
-- decimals={default|1} mixes whole and decimal questions, and steps=1
shows the calculation as it is done — the digits multiplied, then the point
placed.
What the option promises is exactly that the point moves that many ranks,
not that the result shows that many decimals: 0,5 × 4 is 2, and 0,2 × 0,5
is 0,1. A fact whose product ends in a zero loses it on the way, which is
arithmetic rather than a miscount — and 0,5 × 4 = 2 is worth asking.
The split spelled out¶
Written as a single number, decimals=2 lets the draw choose which factor
takes the ranks: 0,7 × 0,3 and 4 × 0,06 both come up. Those are two
different exercises, and a progression usually wants them one belt apart. So
the value may spell the split instead, one number per factor:
(10) multi_direct 2-9×2-9 -- decimals=1×1 → 0,7 × 0,3 (one rank each)
(10) multi_direct 2-9×2-9 -- decimals=2×0 → 4 × 0,06 (both on one)
(10) multi_direct 2-9×2-9×2-9 -- decimals=1×1×0
The × echoes the shape of the source — one member per factor, zeros
included — and * is accepted for it as the numranges accept it. The split is
read as a set: the factors are shuffled, so 2×0 and 0×2 name the same
line, and which factor ends up with the ranks is drawn.
A belt meeting the two first forms and nothing else writes them as alternatives, each question drawing its own:
scale reads the same spelling: scale=2×1 is 400 × 60, where scale=3
would also have given 4 × 6000.
scale and decimals together — 40 × 0,6¶
The two options are not rivals: they are two budgets of powers of ten, and a factor takes at most one of them. Asked together, they land on distinct factors — one gains zeros, the other loses ranks:
Their displacements compensate, so the result is the table fact itself — which
is the whole point of those products, and what steps=1 shows:
Nothing forces them to compensate: scale=2 decimals=1 moves the result one
rank up, and the chain then reads 4 × 6 × 10 = 24 × 10 = 240.
Both budgets need a factor of their own, so a pair of factors carries at most
one of each. Ask for more than the drawn factors can hold — two ranks on
separate factors and a zero besides, on a product of two — and the line is
refused, by check qspec where the source says how many factors it draws, and
by the draw otherwise.
Why not a range of multiples of ten, or of decimals¶
Because 20-90[10]×20-90[10] and 0.2-0.9×0.2-0.9 would be a different
exercise. The numbers a shifted question shows are still drawn from the range
the line names, and the powers of ten are laid on afterwards: the pupil
recognises 4 × 6 under 40 × 600 and under 0,4 × 0,6, and the anti-repeat
tracking of the pairs table sees the same thing — the fact is spent for the
sheet, whatever coat it came in. Draw the shifted numbers directly and the same
table fact can come back three times, because 4 × 6, 40 × 60 and
0,4 × 0,6 are three unrelated pairs.
How far the powers of ten go¶
scale=1-3 is what a mental-calculation sheet usually wants: three zeros on
top of 9 × 9 still reads as 81 000. Nothing caps it, though — scale=1-5
is a legitimate exercise for a class that has just met the millions.
check qspec only warns past six zeros, where counting them starts being
the exercise instead of the multiplication, and the line renders all the same.
decimals is warned about sooner, past three ranks: a decimal part is read
digit by digit, and past the thousandths it is no longer held in the head.
decimals=1-2 is the usual ask.
Both are counted from 1: scale=0 and decimals=0 are refused rather than
read as a plain product, which the option's absence already says. A split
laying nothing anywhere — decimals=0×0 — is refused for the same reason.
Steps, and the pace it sets¶
A power of ten is what gives multi_direct something to explain, so scale
and decimals open level 1 of steps:
(5) multi_direct 2-9×2-9 -- scale=3 steps=1
→ 40 × 600 = ?
answer: 4 × 6 × 1 000 = 24 × 1 000 = 24 000
(5) multi_direct 2-9×2-9 -- decimals=1×1 steps=1
→ 0,4 × 0,6 = ?
answer: 4 × 6 ÷ 100 = 24 ÷ 100 = 0,24
The chain is the calculation as it is done: the digits multiplied as a table
fact, then the point placed — to the right for the zeros of scale, to the
left for the ranks of decimals. Where the two compensate it stops at the
fact, 40 × 0,6 = 4 × 6 = 24, a third member repeating the second.
Wherever a factor is written with a point, the ⓘ button also carries the rule in words, under the chain, reaching the result without any power of ten:
0,4 × 6 → In other words: work out 4 × 6 = 24, then put one digit
after the point: 2,4.
400 × 0,6 → In other words: work out 400 × 6 = 2 400, then put one digit
after the point: 240,0, that is 240.
It is read on the factors as they are shown — what the pupil multiplies in
400 × 0,6 is 400 by 6 — where the chain reads the table fact behind them. The
two are the same reasoning, and a pupil reads one or the other; the sentence is
therefore still offered at steps=1, where the chain is already on the page.
A product drawn decimal by its source, with neither option on, gets it too.
At steps=0 — the default — the answer key shows the result alone and keeps
that chain behind its ⓘ button, and a correction slide behind its Steps
button.
A shifted question is also given longer: 24 s instead of the 20 s a plain
table fact gets, the fact being recalled and pointed. It stays a
default — -- transduration=20 on the line wins.
A factor that is a power of ten — the rule that names the displacement¶
multi_direct 0.001-10.000×10,100,1000 is not a table fact under a coat of
zeros: the × 1 000 is the exercise, and it is done by the rule that names
the displacement rather than by multiplying and pointing afterwards. So where
one of the two factors drawn is a power of ten, that is the sentence the ⓘ
button carries instead of the one above:
5,265 × 1000 → In other words: multiplying by 1 000 moves the point three
ranks to the right: 5,265 → 5 265.
2,5 × 1000 → In other words: multiplying by 1 000 moves the point three
ranks to the right, the empty ranks filled with zeros:
2,5 → 2 500.
0,1 × 52,65 → In other words: multiplying by 0,1 moves the point one rank
to the left: 52,65 → 5,265.
The general rule holds there too — 5,265 × 1 000 is 5 265 × 1 000 pointed
three ranks in — but it reaches the result the long way round, and reads
5 265,000, that is 5 265 at the end of it. A sheet asking for the
thousandfold is asking for the displacement, so the displacement is what the
sentence says.
Nothing on the line asks for this: the draw decides, and the same line may show one rule or the other from one question to the next. The condition is that the displacement be the whole of the calculation:
- two factors, one of them a power of ten. Past that,
0,5 × 3 × 100is not something one rule finishes, and the general sentence comes back. Both of them being one —0,1 × 100, which a range of decimals may well draw against a100— the whole one is the multiplier the pupil reads. - a point somewhere: under
× 0,1the power of ten carries it itself. Without it the question is a whole-number table fact, and10 × 7is left with no sentence at all — the rule has nothing to say there that the answer does not, and a times-table sheet is not improved by an ⓘ button on every one of its answers.
Where the point runs past the last digit written — 2,5 × 1000, 7 × 0,01 —
the sentence says the zeros that fill the ranks it leaves behind, that being
exactly where the pupil stops.
The rule is read on the factors as they are shown, like the general one:
scale and decimals lay their powers of ten on the factors of a table fact,
never as a factor, so a line carrying them keeps the general sentence —
400 × 0,6 is 400 multiplied by 6 and pointed, not a displacement.
multi_vocab is left out of it altogether: its word stands for the
multiplication, so the triple of 0,1 is three tenths and not a point moved
one rank left by a factor the question never shows.
The types that read them too¶
multi_vocab and multi_expand derive from multi_direct, and take both
options in the way their own question allows:
(6) multi_vocab 2-4×2-9 -- scale=1-3
→ How much is double 400? → How much is triple 8000?
(6) multi_vocab 2-4×2-9 -- decimals=1
→ How much is double 0,4? → How much is triple 0,9?
(6) multi_expand 2-9×2-9 -- scale=1-2
→ 230 × 5 = ? answer, at steps=1: 200 × 5 + 30 × 5 = 1000 + 150 = 1150
(6) multi_expand 2-9×2-9 -- decimals=1
→ 2,3 × 5 = ? answer, at steps=1: 2 × 5 + 0,3 × 5 = 10 + 1,5 = 11,5
For multi_vocab the power of ten always goes on the operand: the word
names the other factor, and there is no double of 20, nor of 0,2. When both
drawn factors could name the word — a 3 and a 4 — the one it spares is the
one the word takes. It gains the same steps=1 chain as multi_direct, on the
multiplication behind the word: 8000 × 3 = 8 × 3 × 1000 = 24 × 1000 =
24 000. Only one factor being within reach, a line asking for two — a split
decimals=1×1, or scale and decimals at once — is refused.
For multi_expand they land on the number, on the lone factor, or one on
each, and the expansion follows: 230 is split into 200 + 30, and 2,3 into
2 + 0,3, exactly as 23 is split into 20 + 3. The type already shows its
calculation at steps=1, so neither option adds a level there; and it keeps
its 30 s, a shifted expansion being no quicker than a plain one.
area_rectangle reads them too, without deriving from
multi_direct: its two dimensions are a product, and the options lay their
powers of ten on them — 40 cm × 6 cm, 0,4 cm × 0,6 cm. Two dimensions is
all it has to spend them on, and a shift that would make them equal has them
swapped rather than drawing a square.
carry — a multiplication that carries nowhere¶
carry=false draws a multiplication no column carries, carry=true one where
at least one does — the same word, and the same promise, as on
addi_direct and subtr_direct.
What it is mostly there for is the eleven-times table, whose trick only works while the two digits stay under ten — 27 × 11 is 2, then 2 + 7, then 7:
(10) multi_direct 11×11-99 -- carry=false
→ 11 × 27 = ? → 45 × 11 = ? → 11 × 71 = ?
(10) multi_direct 11×11-99 -- carry=true
→ 11 × 39 = ? → 88 × 11 = ? → 11 × 57 = ?
The columns are read the way the multiplication is written by hand: each digit
of one factor against the whole of the other, the partial products then added
up. A column of that sum holds the digit products that land in it, so one
reading covers both stages — a partial product that carries puts its column
above nine too. It follows that the option is symmetric (11 × 27 and
27 × 11 carry alike), that the point of a decimal is set aside (0.4 × 0.2
carries no more than 4 × 2), and that on the plain times table carry=false
is exactly a product under ten: 2-9×2-9 -- carry=false leaves four
products, which check qspec warns about.
scale and decimals are no obstacle: a power of ten only shifts the columns,
so 40 × 600 and 0,4 × 0,6 carry exactly where 4 × 6 does, and the option
judges the factors as the source drew them. multi_vocab and
area_rectangle read carry the same way.
multi_expand refuses it rather than ignore it: its two products are drawn as a linked pair — one
sharing a factor with the other — which no constraint narrows.
The draw is narrowed exactly as the operation types' constraints are, and an impossible or a tight spec is reported the same way — see What the constraints do to the draw.
multi_expand¶
Multiplication of a two-digit number, to be expanded to be done.
| Variant | Example |
|---|---|
| (default) | 23 × 5 = ? |
Sources — one product range, drawn twice as a linked pair sharing the factor — 2-9×2-9.
Steps — one level, and there is no other: the expansion, the two products it yields, then the result.
Options — these, on top of the ones every type reads:
| Option | What it does |
|---|---|
decimals |
the number of ranks the point of the result moves left — decimals=1 asks 0,4 × 6 for the fact 4 × 6, decimals=1×1 asks 0,4 × 0,6 |
scale |
the number of zeros the result gains — scale=1-3 asks 40 × 600 for the fact 4 × 6, scale=2×1 asks 400 × 60 |
shuffle |
false keeps the lone factor in front — 5 × 23 rather than 23 × 5 |
carry is refused here: its two products are drawn as a linked pair, which no constraint narrows.
multi_expand asks a plain multiplication — but one that has to be expanded
to be done in one's head:
Nothing on the page says how to proceed: finding the decomposition is the
exercise. To multiply 23 by 5 the pupil splits 23 into 20 + 3 and adds the two
products, 5 × 20 and 5 × 3 — the first step towards the literal expansion
expand_simple asks for later on.
One source, two linked products¶
The two products the pupil performs are exactly the two the question draws,
as a linked pair sharing the factor: 5 × 2 and 5 × 3 for 23 × 5. They
come from one product range, the ordinary multiplication-table one:
The two factors that are not the shared one are the digits of the number:
2 and 3 make 23. Both products are recorded in the pairs table, like
multi_direct, so a sheet asking 23 × 5 cannot ask 5 × 3 on its own a few
questions later.
The range therefore decides which multiplications the expansion calls for:
(6) multi_expand 2-9×2-9 digits and factor within the tables
(6) multi_expand 1-9×1-9 the ×1 cases too — 91 × 7, done as 7 × 90 + 7 × 1
(6) multi_expand 3-9×3-9 nothing below 3 anywhere
A shared factor of 0 or 1 is never chosen — 1 × 23 leaves nothing to expand
— but a range holding 1 stays perfectly usable: the 1 becomes a digit, as
above. A product carrying a 0 never reaches the draw either, so the number is
never a multiple of ten: 30 × 6 needs no expanding.
Repeated digits¶
22 × 5 and 44 × 7 are worth asking, and they are drawn: the question then
holds a single product, 5 × 2 done twice over, so a single pair is drawn
and recorded. It happens exactly as often as any other companion — one time in
k + 1, where k counts the other products carrying the shared factor, which
is one time in eight for 2-9×2-9.
steps — showing the whole calculation¶
Mental calculation asks for the result and nothing else, so steps=0 is the
default — and on the live page the whole calculation stays one click away, see
The steps option. On a written sheet, half an explanation
explains nothing: steps=1 shows the expansion, the two products it yields,
and the result, and there is no level above it.
The expansion keeps the factor on the side the question shows it, so the step reads as the calculation asked and not as its mirror:
Whichever comes first is drawn at random, as in multi_direct; shuffle=false
keeps the factor in front. Only the result is ever accepted as an answer, with
or without steps.
What the source may hold¶
The digits are digits: a range of decimals is refused outright, and a range
reaching past 9 is only warned about — 3 and 12 still give
42 = 30 + 12, and the answer stays right, but that is no longer the
decomposition the digits of 42 show. As for expand_simple, a range holding
no two products sharing a factor other than 1 cannot work at all, and
check qspec says so before anything is rendered.
multi_hole¶
Missing factor in a product.
| Variant | Example |
|---|---|
| (default) | ? × 7 = 42 |
Sources — one product range, of two factors or more, or the fractions table — 2-9×2-9, fractions.
Steps — none: the answer is the whole of it, so the answer key draws no ⓘ button.
Options — these, on top of the ones every type reads:
| Option | What it does |
|---|---|
hidden |
which of the two the hole falls on, over the fractions table — fraction or integer |
shuffle |
false keeps the factors in the order the source drew them; which one is hidden is still drawn |
multi_reversed¶
Product equal to a provided number.
| Variant | Example |
|---|---|
| (default) | ? × ? = 42 → example answer: 6 × 7 |
Sources — one product range of exactly two factors — 2-9×2-9; their product is what the question shows.
Steps — none: the answer is the whole of it, so the answer key draws no ⓘ button.
Options — the ones every type reads only.
multi_vocab¶
Double, triple or quadruple of a natural number.
| Variant | Example |
|---|---|
| (default) | Double of 14? or: Triple of 9?... |
Sources — one product range of exactly two values, one of which is 2, 3 or 4 — the word names it — 2-4×2-9.
Steps — none by itself; one level under scale or decimals, on the multiplication the word stands for.
Options — these, on top of the ones every type reads:
| Option | What it does |
|---|---|
carry |
false draws a multiplication no column carries, true one where at least one does |
decimals |
the number of ranks the point of the result moves left — decimals=1 asks 0,4 × 6 for the fact 4 × 6, decimals=1×1 asks 0,4 × 0,6 |
scale |
the number of zeros the result gains — scale=1-3 asks 40 × 600 for the fact 4 × 6, scale=2×1 asks 400 × 60 |
shuffle |
nothing to shuffle here: the word names one factor and the wording shows the other |
order_of_2ops¶
Order of operations, two operations.
| Variant | Example |
|---|---|
a+(bxc) |
n° 1 — 7 + (4 × 6) = ? |
a+(b:c) |
n° 2 — 7 + (24 ÷ 6) = ? |
(axb)+c |
n° 3 — (4 × 6) + 7 = ? |
(a:b)+c |
n° 4 — (24 ÷ 6) + 7 = ? |
a-(bxc) |
n° 5 — 31 − (4 × 6) = ? |
a-(b:c) |
n° 6 — 11 − (24 ÷ 6) = ? |
(axb)-c |
n° 7 — (4 × 6) − 7 = ? |
(a:b)-c |
n° 8 — (24 ÷ 6) − 3 = ? |
(a+b)xc |
n° 9 — (3 + 4) × 6 = ? |
(a+b):c |
n° 10 — (20 + 22) ÷ 6 = ? |
ax(b+c) |
n° 11 — 6 × (3 + 4) = ? |
a:(b+c) |
n° 12 — 42 ÷ (2 + 4) = ? |
(a-b)xc |
n° 13 — (10 − 3) × 6 = ? |
(a-b):c |
n° 14 — (50 − 8) ÷ 6 = ? |
ax(b-c) |
n° 15 — 6 × (10 − 3) = ? |
a:(b-c) |
n° 16 — 42 ÷ (10 − 4) = ? |
a+bxc |
n° 17 — 7 + 4 × 6 = ? |
a+b:c |
n° 18 — 7 + 24 ÷ 6 = ? |
axb+c |
n° 19 — 4 × 6 + 7 = ? |
a:b+c |
n° 20 — 24 ÷ 6 + 7 = ? |
a-bxc |
n° 21 — 31 − 4 × 6 = ? |
a-b:c |
n° 22 — 11 − 24 ÷ 6 = ? |
axb-c |
n° 23 — 4 × 6 − 7 = ? |
a:b-c |
n° 24 — 24 ÷ 6 − 3 = ? |
Sources — a product range for the ×/÷ block and a singleton range for the standalone term, bound by arity and not by position — 7-19 4-9×4-9; the split family (9-16) needs the product range alone.
Steps — one level, the intermediate expression written before the result.
Options — these, on top of the ones every type reads:
| Option | What it does |
|---|---|
decimals |
digits after the decimal point, 0 to 4: the scale of the terms, and the step of a split |
result |
positive — for the grades where negative numbers are not taught yet — or negative |
tricks |
the probability of baiting the precedence error, 0.5 by default |
The 24 shapes above form three families of eight, ordered by teaching sequence:
| Numbers | Family | Alias | Sources |
|---|---|---|---|
| 1-8 | redundant explicit parentheses — a + (b × c) |
parens |
singleton + product |
| 9-16 | parentheses that change the order — (a + b) × c |
split |
product |
| 17-24 | no parentheses — a + b × c |
plain |
singleton + product |
Within each family the order is the same: the four additive shapes, then the
four subtractive ones; in each half, the block on the right then on the left,
× before ÷. So n and n + 16 are the same shape, with and without its
redundant parentheses.
Family 9-16 is built differently from the other two. It does not draw three
independent numbers: it starts from a multiplication or division fact —
exactly what multi_direct and divi_direct draw — and rewrites one of its
operands as a sum or a difference. So it needs the product source only, and a
line selecting nothing else takes a single source:
(6) order_of_2ops 4-9×4-9 -- variant=split
→ (3 + 4) × 6 = ? (the fact is 7 × 6; 7 is decomposed)
→ 81 ÷ (13 − 4) = ? (the fact is 81 ÷ 9; the divisor is decomposed)
A selection spanning several families still needs both sources; check qspec
says so when one is missing, and warns when one goes unused.
See Selecting variants for the
variant selector syntax.
result — keeping numbers positive¶
By default no sign constraint applies, so 31 − 4 × 6 and 16 − 5 × 9 are
both drawable. result=positive (for grades where negative numbers are not
taught yet) and result=negative constrain the outcome.
The constraint is met in one of two ways, never by inventing a number outside a declared range:
- The standalone term must dominate the block (
a − b × c,a − b ÷ c, numbers 5, 6, 21, 22). It is then built asblock + result, which means the singleton range describes the result, not the first operand. With7-19 4-9×4-9you get31 − 4 × 6 = 7or56 − 6 × 7 = 14: the displayed minuend leaves the range on purpose, the result never does. - The standalone term is dominated by the block (
a × b − c,a ÷ b − c, numbers 7, 8, 23, 24). It stays a displayed operand and both draws are narrowed to the values that fit.
The second case can get tight: in a ÷ b − c the whole expression is worth at
most the quotient, so with 4-9×4-9 it never exceeds 9 and a singleton range
of 7-19 leaves only two usable values. automath check qspec reports this
before you render anything — see Validating specs.
tricks may set this convention aside; see below.
The split family (9-16) needs none of this: it decomposes a fact that is
already positive, so its parenthesis and its result always are too. For the
same reason result=negative is impossible there and is rejected.
decimals — one digit after the decimal point¶
For families 1-8 and 17-24, decimals=1 divides the standalone term and
one operand of the block by 10, so both additive terms are scaled alike.
Accepted values run from 0 to 4. Three consequences worth knowing:
- the sign of the expression is unchanged, so a
result=positivecombination stays valid after scaling; - for a quotient block it is the dividend that is scaled, so the divisor stays a whole number — a division by a decimal is never introduced;
- the draw itself still works on whole-number pairs, which keeps the benefit
of the anti-repeat tracking: drawing
6 × 8here still prevents the same pair coming up again in a neighbouringmulti_directquestion.
For the split family (9-16), decimals is instead the step of the
decomposition — the promise to the user is the same, the mechanism differs
because there is a single fact to decompose rather than two terms to scale:
There, the additive splits are the interesting ones. A subtractive split of
a whole target can never carry a borrow: x − y = n with n whole forces
frac(x) = frac(y), so (11,8 − 5,8) × 4 is a whole-number subtraction in
disguise. This is arithmetic, not a shortcoming of the generator — the cure is
a decimal target, which comes from the source:
The round factor is never the one decomposed: it is what makes the final multiplication easy.
tricks — baiting the precedence error¶
A pupil who gets the precedence wrong computes first the operation next to the standalone term. Whether that mistake is cheap or expensive is entirely in the generator's hands, and it changes the exercise:
22 − 4 × 3 = ? the error leads to 18 × 3 — a long detour for nothing
14 − 4 × 3 = ? the error leads to 10 × 3 — instant, and therefore tempting
tricks is the probability of deliberately setting that bait, where one is
reachable. It defaults to 0.5; tricks=1 baits whenever possible,
tricks=0 never does so deliberately — some baits still occur by chance,
there is no way to forbid them without distorting the draw.
One rule covers the eight shapes: the wrong first step must land on a value
that makes the second step cheap — a multiple of ten before a ×, an exact
division before a ÷.
| Variant | Wrong first step | Baited when |
|---|---|---|
17 a+bxc |
a + b |
it is a multiple of ten |
18 a+b:c |
a + b |
c divides it, i.e. a is a multiple of c |
19 axb+c |
b + c |
it is a multiple of ten |
20 a:b+c |
b + c |
it divides a |
21 a-bxc |
a − b |
it is a multiple of ten, i.e. a and b share a units digit |
22 a-b:c |
a − b |
c divides it, i.e. a is a multiple of c |
23 axb-c |
b − c |
it is a positive multiple of ten |
24 a:b-c |
b − c |
it is positive and divides a |
The choice is made before the pair is drawn, so the fact itself is steered towards one that admits a bait, and the display order of a product is settled the same way — which factor faces the standalone term decides whether the bait exists at all.
Two nuances worth knowing:
- when the bait is out of reach, a second tier applies: a wrong path that is
merely cheap rather than outright easy. This is what carries variant 23,
where
b − ccannot be a positive multiple of ten as long as the pair source only yields single-digit factors — with4-9×4-9you get7 × 9 − 7, so the error costs7 × 2and no more; - variant 22 is the one shape whose wrong path can divide exactly while being
negative (
12 − 16 ÷ 4). That is deliberately kept: a pupil who has not met negative numbers loses no time there either — they see at once that the path is closed, which is exactly what baiting is for.
tricks=1 narrows the draw to the combinations that bait, so variety drops:
on 4-9×4-9 with 6-19, variant 21 goes from 57 distinct questions per 60
draws down to 41. The default 0.5 keeps both. Variant 24 is narrow to begin
with — automath check qspec says so.
The range as a derogation¶
One shape cannot bait inside its own range at all: in a − b ÷ c the dividend
usually dwarfs the standalone term, so a − b can only dead-end on a negative
number. With ... − 32 ÷ 8 and a range of 6-19, no value sits above 32.
When baiting, the range is therefore also read as a distance above the
block operand facing the standalone term: the offsets 8 and 16 give
40 − 32 ÷ 8 and 48 − 32 ÷ 8, whose wrong path is 8 ÷ 8 and 16 ÷ 8.
The declared range still governs — it describes the offset instead of the
value.
Only a minuend derogates, that is a shape written a − …. A subtrahend
(… − c, variants 7, 8, 23, 24) never does: it only ever needs to be
smaller than the block, which its own range already allows, so shrinking it
below what was asked would be taking a liberty rather than lifting an
obstacle.
Both readings compete at equal bait quality, and the winner is drawn in proportion to how many values it offers, so the handful of in-range combinations cannot shut out the far larger derogated set.
This is a genuine derogation, and it is the one case where the range is left:
under result=positive, a − b ÷ c then puts its result outside the declared
range (about half the time at tricks=0.5, nearly always at tricks=1; never
at tricks=0). Everything else still holds — the sign constraint, and every
displayed operand staying positive. a − b × c can bait inside its range and
so never derogates in practice; nothing forces that, it falls out of the sign
constraint, which rejects a minuend built from a factor rather than from the
product.
Families 1-8 and 9-16 ignore the option: explicit parentheses leave no precedence to get wrong. Passing it alongside them is not an error — a selection spanning several families carries it for the shapes that use it.
steps — showing the intermediate expression¶
steps=1 (or steps=true) makes the correction show the stage a pupil is
meant to write down, instead of the bare result. It forces the answer layout
to below.
Without it, that stage is still one click away on the live page — see The steps option.
perimeter_polygon¶
Perimeter of a polygon, its sides given on the figure.
| Variant | Example |
|---|---|
| (default) | Perimeter of a polygon, 3 to 6 sides |
Sources — one length per batch of equal sides — one source drawn as many times as the figure asks (2-9), one source per batch (2-9 10-90[10]), or one product range holding them all (2-9×2-9×2-9).
Steps — two levels: 1 the calculation the perimeter comes from, 2 the step it goes through — the grouped form that shortens the addition, or the half-perimeter of a rectangle.
Options — these, on top of the ones every type reads:
| Option | What it does |
|---|---|
marks |
code the equal sides of a rectangle or a parallelogram, which are left uncoded — the shape says it. Ignored on every other figure, where the codings are what says it |
shape |
a figure by name — rhombus, parallelogram, kite, square, rectangle, isosceles_trapezoid, regular… — for what sides alone cannot tell apart |
sides |
the polygon's sides: how many (6), how they group into batches of equal ones (3_2_1), or one letter per side naming its batch (aaabbc) |
unit |
the metric length the sides are given in — alternate by default, one per question from the length_units alternator; cm pins it, {cm|m|mm} draws one at random |
perimeter_polygon asks for the perimeter of a polygon of three to six sides,
whose lengths are written on the figure:
(8) perimeter_polygon 2-9 -- sides=aaabbc
→ [a hexagon labelled 9 cm, 5 cm, 2 cm] Périmètre de cet hexagone ?
answer: 39 cm
The sentence names the family the figure is in — triangle, quadrilatère, pentagone, hexagone — and stops there. Whether the triangle is isosceles, whether the quadrilateral is a rhombus, is exactly what the codings are on the figure for the pupil to read. It goes further in one case only, the parallelogram, and only because there the figure carries no codings at all (see marks below).
It is an addition of three to six terms, dressed as a figure — and dressed is
the word: what makes it more than addi_direct is that the
terms have to be read off the drawing, tick marks included. Three sides
marked alike say 9 cm three times while writing it once, so the pupil counts
before adding.
sides — how many, and which of them are equal¶
One option describes the figure, in any of three notations, from the loosest to the tightest:
sides=6 six sides, nothing said about which are equal
sides=3_2_1 three equal, two equal, one on its own — any arrangement
sides=aaabbc the same, in that order round the figure
What a line leaves open is drawn, so sides=6 keeps giving different
hexagons without the script having to enumerate them; what it pins down is
honoured exactly.
The letter form gives the number of sides away (one letter per side), so it
never needs a count beside it — and it is the only one that can tell abab
(opposite sides equal: a rectangle) from aabb (adjacent ones: a kite), which
the partition 2_2 cannot.
Say nothing at all and the number of sides is drawn too — in turn, one
family after another. Left to chance it would not be: six sides can be
arranged 144 ways where three can be arranged one, so a pattern drawn
uniformly from everything a bare perimeter_polygon 2-9 allows is a hexagon
nineteen times out of twenty. The family is alternated instead, so a page of a
dozen questions asks about all four. A line that pins the family down leaves
that rotation where it was, for the lines around it.
The same skew sits one level down, and is levelled off the same way. Of the
nine four-sided patterns, three are abcd and one is aaaa: drawn from the
patterns, sides=4 would be scalene a third of the time and square once in
nine — and a figure with no two sides equal is the figure with nothing to
count, which is what the question is about. So the batching is drawn
first — 4, 3+1, 2+2, 2+1+1, 1+1+1+1, evenly — and the arrangement among the
ones that batching allows. Which is why sides=4 really is half squares,
rectangles, rhombi, parallelograms, kites and trapezoids. At three sides
there is nothing to level: one batching, one arrangement.
shape — the figures a pattern cannot tell apart¶
sides describes the sides; some figures differ from one another by their
angles, and no pattern of equal sides separates them: aaaa is a square
and a rhombus, abab is a rectangle and a parallelogram. That is what
shape is for:
shape=rhombus shape=parallelogram shape=kite
shape=square shape=rectangle shape=right_kite
shape=isosceles_trapezoid shape=regular
shape=equilateral shape=isosceles shape=scalene
shape=right_triangle
A name implies its pattern, so sides is redundant beside it — and the two
are checked against one another rather than one silently winning:
shape=rhombus sides=abab is refused by check qspec.
And the corollary: a line that says nothing about the shape is asking for either of them, so it gets both, in turn.
| Pattern | drawn as | or as |
|---|---|---|
aaaa |
the square | the rhombus |
abab |
the rectangle | the parallelogram |
aabb |
the right kite | the kite |
So sides=4 really does cover the six quadrilaterals it names, and not the
three inscribed ones alone. Every other pattern has a single figure — three
sides settle a triangle, aaab settles what it settles — and there the
rotation is left where it was.
shape=regular is the case worth knowing: every side equal makes the question
a multiplication, and the answer key leads with it (5 cm × 6 = 30 cm)
rather than with a six-term addition.
A name that promises a right angle — right_triangle, right_kite,
rectangle, square — narrows the numbers as well as the shape: the lengths
have to be close enough together to be drawn as they are. Squashed lengths
(see below) bend the angles, and the figure then loses the very codings that
say what it is. So a right kite is drawn from 9 cm and 4 cm and never from
9 cm and 2 cm, and it carries its two right angles on every draw.
The sources give one length per batch, not per side¶
The number of values a line has to draw is the number of batches of equal sides, since a batch writes its length once and its tick marks carry it to the others. Four spellings, all of them valid:
(8) perimeter_polygon 2-9 -- sides=aaabbc one source, drawn three times
(8) perimeter_polygon 2-9 2-9 2-9 -- sides=6 one source per batch
(8) perimeter_polygon 2-9×2-9×2-9 -- sides=6 one product range holding all
(8) perimeter_polygon 2-9 -- shape=regular sides=5 one value, ×5
A single source of one value is the short form: it is drawn as many times
as the figure asks. Anything else has to add up to exactly the number of
batches, and check qspec says so when it does not:
perimeter_polygon: '2-9×2-9' gives 2 value(s), i.e. 2 batch(es) of equal
sides, which sides=aaabbc cannot be split into.
Two conditions narrow the draw, both on the numbers and not on the drawing:
- the lengths are pairwise different — two batches worth the same are one batch, and the figure would carry two codings for one length;
- they close: the longest side is shorter than all the others laid end to end, or there is no such polygon. A hexagon labelled 2, 2, 2, 2, 2, 20 is not a hexagon, whatever it is drawn like.
A third narrows it for readability: no figure is drawn with a corner sharper than 25°, which is what keeps 2, 8 and 9 — a triangle eleven degrees thick — off the page.
What the figure promises, and what it does not¶
The figure is built from its lengths, so what it says about them is true:
- sides labelled alike are drawn alike, and marked with the same tick — bar the one figure whose shape already says it (marks, below);
- the order of the lengths survives — the figure never contradicts its labels;
- right angles are detected, never imposed. A triangle labelled 3, 4, 5
comes out of the construction with its right angle already there and gets it
coded; one labelled 3, 4, 6 does not, and is drawn without a coding rather
than with a false one. This is also why
shape=right_triangleneeds sources that can give a Pythagorean triple.
It is not to scale, though. Lengths more than three times apart are squashed towards each other before being drawn, so that a side labelled 24 cm beside one labelled 3 cm still leaves room for both labels. The squashing is affine and increasing, which is what keeps the three promises above; below that ratio nothing happens at all and the figure is to scale. Where it has been at work, the drawing no longer answers for the angles of what it is labelled, so no right angle is coded.
unit — the same length for every side, and for the answer¶
A perimeter is a length, so it is asked in the unit the sides are given in. That unit is printed inside the answer box, against its right edge, and the pupil types the number alone.
Say nothing and it alternates: mm, cm, dm, m, each in its turn, so a sheet meets the millimetre and the metre rather than four centimetres running. Nothing else in the question changes with it, which is what makes it free.
unit=cm pinned, wherever a level wants it pinned
unit=alternate the default, said out loud
unit={cm|m|mm} one of the three, drawn at random per question
The rotation behind it is length_units, its own and shared with any later
question needing a length to state — deliberately not the one the conversions
draw their unit pairs from. A line that pins its unit leaves that rotation
where it was, for the lines around it.
marks — the codings a shape makes needless¶
Sides drawn equal are coded with tick marks, one batch one tick, which is how a batch says its length once. With one exception: the rectangle and the parallelogram are drawn without any. That their opposite sides are equal is what a pupil is expected to know about them — it is the figure, not something a tick has to say — and a rectangle bristling with codings is the rectangle of no textbook. So they carry two labels on two adjacent sides, and the other two sides are read off them.
That leaves the figure to be recognised some other way, and the two are not recognised alike:
- the rectangle names itself: its four right angles are coded, and the sentence stays at the family — Périmètre de ce quadrilatère ?
- the parallelogram has nothing — no ticks, no right angles — so the sentence names it: Périmètre de ce parallélogramme ? This is the one place a wording goes past the family, and it goes there because otherwise nothing on the page says which sides are equal.
marks=true writes the codings anyway — and the sentence goes back to
quadrilatère, the figure having taken the saying back. Everywhere else the
option is ignored, silently: three equal sides on a hexagon are not a
property of any named figure — they are the question — so their codings are
what says them, and they are written whatever the line asks.
One aside worth knowing: sides=abab drawn as the rectangle normally keeps
its right angles, but a pair of lengths too far apart to be drawn to scale
loses their codings along with the rest (see above) — and the sentence then
says parallélogramme, which a rectangle is.
steps — the calculation, and the step it goes through¶
A perimeter is reached two ways here, both taught:
steps writes the first into the answer key: 0 (the default) the perimeter
alone, 1 the calculation and its result, 2 the step it goes through in
between — here the grouped form, which is what a pupil counting the tick marks
writes down before adding.
steps=1 9 cm + 9 cm + 9 cm + 5 cm + 5 cm + 2 cm = 39 cm
steps=2 9 cm + 9 cm + 9 cm + 5 cm + 5 cm + 2 cm = 9 cm × 3 + 5 cm × 2 + 2 cm = 39 cm
Two figures have a perimeter with a formula of their own, and there the calculation is that formula rather than the addition:
| Figure | leads with | or else |
|---|---|---|
every side equal (shape=regular) |
5 cm × 6 = 30 cm |
the six-term addition |
| opposite sides equal (the rectangle, the parallelogram) | (9 cm + 5 cm) × 2 = 14 cm × 2 = 28 cm |
9 cm × 2 + 5 cm × 2 = 18 cm + 10 cm = 28 cm |
The second row is the answer key
perimeter_rectangle writes, to the character: the
two types overlap whenever a line asks for that figure, and a pupil should not
be able to tell which one set the question. Writing 5 cm + 9 cm + 5 cm + 9 cm
there would be teaching the long way round a formula they have learnt.
Where every side is different there is only one: grouping 3 + 4 + 6
writes 3 + 4 + 6 again, a batch of one being written on its own rather than
multiplied by one. The second form is then dropped altogether rather than
shown twice — steps=2 reads exactly like steps=1, and the info button has
nothing left to add.
Otherwise, whatever steps says, the info button of the answer key — and the
Steps button of a slideshow — opens on both, set side by side and the
second introduced by Ou bien :, since two chains stacked read as one
calculation carried over two lines. Snapshots carry it in the steps_alt
field (see atmxs).
On a slide¶
The polygon carries nothing at its centre: a perimeter is measured along the
sides, and writing it in the middle of the figure would say it is what the
surface holds. The correction writes it under the wording instead
(answer_layout=below), with its unit, since a slide has no answer box.
The sentence stands above the figure and smaller than the rest of the slide,
and the content block is lifted, exactly as for
perimeter_rectangle.
Reviewing what the generator draws¶
Because the figures are computed rather than catalogued, what is worth looking at is the generator's whole output rather than one figure at a time. The polygon catalogue is exactly that: every side pattern of three to six sides and every named figure, drawn on one page, rebuilt with the documentation. Nothing a script can ask for is missing from it.
tools/polygons_contact_sheet.py is what writes it, and it takes
--layout grid to see the figures at the size a worksheet gives them.
One line, more than one figure¶
How a figure is set down is the most visible thing about it: two polygons in the same pose read as the same polygon however different their lengths are. So the pose is alternated rather than drawn — each presentation comes up in its turn, where chance would show the diamond four times running and then not once in six questions.
A figure of no particular name is set down on one of its broad sides — those within reach of its longest, since a polygon stood on a short side is a tall figure, and a tall figure is a small one once fitted into a line — and turned over, or not. The named ones have poses of their own:
| Figure | Poses |
|---|---|
| rhombus | on its long diagonal — the diamond, the flattest of the three — or on a side, leaning either way |
| parallelogram | either of its two sides along the bottom, leaning either way |
| kite, right kite | its axis upright or across, pointing either way along it — and on a side, like any other figure |
A kite has an axis of symmetry, so it has four positions no other quadrilateral has: the axis brought square to the page, pointing up, down, left or right. They come on top of the sides it can rest on, not instead of them — a pupil who only ever meets the upright kite comes to read the pose rather than the figure.
What stays random is the rest — how far a parallelogram leans, how wide a kite opens. Those vary a figure without naming a presentation anybody could meet twice.
perimeter_rectangle¶
Perimeter of a rectangle, its length and its width on the figure.
| Variant | Example |
|---|---|
| (default) | Perimeter of a 7 cm × 4 cm rectangle? |
Sources — one product range of two unequal values, or two sources of one value each, the second drawn away from the first — 2-9×2-9, 2-20 2-20.
Steps — two levels: 1 the operation the perimeter comes from, 2 the half-perimeter it goes through.
Options — these, on top of the ones every type reads:
| Option | What it does |
|---|---|
unit |
the metric length both dimensions are given in, cm by default — {cm|m|mm} draws one per question |
perimeter_rectangle asks for the perimeter of a rectangle whose two
dimensions are written on the figure:
(8) perimeter_rectangle 2-9×2-9
→ [a 7 cm × 4 cm rectangle] Périmètre de ce rectangle ? answer: 22 cm
It is the figure of area_rectangle, down to the
seed that keeps the wording and the answer key drawing the same shape: a
rectangle with its four right angles coded, its length above it, its width to
its right, and the sentence beside it in a worksheet grid, above it on a
slide. What changes is what is asked — and what the answer is counted in.
The sources give the two dimensions¶
Either one product range, as area_rectangle takes it, or two sources
of one value each, which lets the two dimensions be drawn from ranges that
have nothing to do with each other:
(8) perimeter_rectangle 2-9×2-9 from the times tables
(8) perimeter_rectangle 2-20 2-20 -- unit=m
(8) perimeter_rectangle 10-90[10] 2-9 a round length and a small width
The bigger of the two values drawn is the length, so the side that looks longer carries the bigger number.
Two equal dimensions would label a square, which the figure cannot show:
it is drawn lying down whatever it is labelled (see
area_rectangle). With one product range, the
equal-valued pairs are simply left out of the draw; with two sources, the
second one is drawn away from the value the first gave — 2-20 2-20 never
labels a square, without the line having to say so. Only sources that can
never differ (5 5) are refused, by check qspec.
unit — the same length for both dimensions, and for the answer¶
unit works as it does for an area (any unit of the metric length ladder,
cm by default, {cm|m|mm} to draw one per question), with one difference:
a perimeter is a length, so it is asked in that unit itself and not in its
square. It is printed inside the answer box, against its right edge, and the
pupil types the number alone.
steps — the calculation, and the step it goes through¶
A perimeter is reached two ways, both taught:
steps writes the first of them into the answer key, since one of the two
has to be picked for a line that has room for one: 0 (the default) the
perimeter alone, 1 the operation and its result, 2 the half-perimeter in
between — the step a pupil doing it in their head stops at.
Whatever steps says, the info button of the answer key — and the Steps
button of a slideshow — opens on both calculations, written out in full
and set side by side (stacked when the panel is too narrow). Neither is the
way: a pupil who has learnt one finds it there, and sees that the other lands
on the same number. Snapshots carry the second one in the steps_alt field
(see atmxs).
On a slide¶
The rectangle carries nothing at its centre: a perimeter is measured along the
sides, and writing it in the middle of the figure would say it is what the
surface holds. The correction writes it under the wording instead
(answer_layout=below), with its unit, since a slide has no answer box.
The sentence stands above the figure and smaller than the rest of the slide, and the content block is lifted, exactly as for an area.
read_abscissa¶
The abscissa of a point marked on a graduated axis.
| Variant | Example |
|---|---|
| (default) | Abscissa of M, marked on an axis in quarters? → M(7/4) |
Sources — one source of denominators, i.e. of how many parts the unit is divided into — 2-10, 2,4,5,10.
Steps — none: an abscissa is read, not calculated, so the answer is the whole of it — what there is to say about it is behind the ⓘ button of the answer key, whatever steps asks for.
Options — these, on top of the ones every type reads:
| Option | What it does |
|---|---|
origin |
whether the graduation 0 is on the picture — shown, hidden, or any (the default) |
proper |
whether the abscissa is below 1 — true, false, or any (the default) |
The pupil reads a number off a graduated line. What makes it a question is the graduation: the unit is divided into as many parts as the denominator says, and the abscissa is the number of those parts — which is exactly what a fraction counts.
The source gives the denominators¶
Not the abscissa: the denominator, i.e. into how many parts the unit is divided. That is where the difficulty of the figure lies — halves are read at sight, sevenths are counted — while the numerator only says how far along the point sits, and is drawn here.
read_abscissa 2-10 → an axis in halves, thirds, … tenths
read_abscissa 4 → always quarters
read_abscissa 2,4,5,10 → only abscissae that also have a decimal writing
read_abscissa 3,6,7,9 → only abscissae that have none
The last two are worth knowing: whether the answer can be written as a decimal number is settled entirely by the denominator (a denominator built of twos and fives has a decimal writing, anything else has not), so no option is needed to force one or the other — the source says it.
A denominator of 1 is refused: every abscissa over it is a whole number already
written under its graduation, which is nothing to ask. Past ten, check qspec
warns rather than refuses — eleven graduations to a unit is a comb, and whoever
writes it may know what they are after.
proper — either side of 1¶
proper |
The abscissa |
|---|---|
any |
(the default) below or above 1 |
true |
below 1 — 2/3, 7/10 |
false |
above 1 — 7/4, 8/3 |
An abscissa above 1 is never far above it — normally between 1 and 2, the point sitting in the second unit of the axis. A coarse graduation reaches further, and only because one unit leaves it too little to choose from: in halves there is a single improper abscissa below 2, and a line asking for six of them would ask for 3/2 six times. Never further than the width of the figure allows, though: counting thirty graduations is not a reading, it is an inventory.
origin — whether 0 is on the picture¶
origin |
The axis |
|---|---|
any |
(the default) either way |
shown |
starts at 0, which is written under its graduation |
hidden |
starts past 0, which is nowhere on the figure |
This is the second difficulty, and it is independent of the first. With the origin shown, the pupil counts graduations from 0 and the count is the numerator. With it hidden, the axis slides: only whole numbers further along are written, and the reading starts from one of them.
Hiding the origin does not require an abscissa above 1. The window may stop just above the point, which then falls in the graduations drawn before the first written one:
read_abscissa 3 -- proper=true origin=hidden
→ 1 and 2 written, two graduations drawn before the 1,
the point on the first of them: M(2/3)
read backwards from 1, with 0 nowhere on the axis. The one abscissa this cannot
be asked of is a unit fraction — 1/3, 1/10: an axis starting to the right
of 0 cannot also start to the left of a point one graduation from it, so those
are left out where the origin is hidden (and simply get a visible origin where
the line leaves it open).
One unit of axis, and the question beside it¶
The written range is the unit the point sits in, and no more: what is needed to read an abscissa is that unit, divided — the graduations of a second one are graduations to skip over. With the origin shown the range starts at 0 all the same, so it counts the units up to the point: 0 to 1 for a proper fraction, 0 to 2 for one between 1 and 2.
That is what leaves room for the sentence. The figure and Abscisse de M ? share one line of the sheet, the axis being drawn no wider than the wording column can hold beside the question — a grid is used for an assessment, where what is asked has to be on the paper in words, and a question taking two lines costs every other question a line too.
The axis itself is drawn no longer than its graduations need — the configuration holds them between a minimum and a maximum spacing — so a unit in halves takes about half the width of one in tenths, and a page of these questions looks like a page of figures rather than one figure redrawn. A denominator past ten overruns the width all the same, which is one more thing the warning about combs is warning about.
The sentence is not the same width in every font, nor in every language. So
the axis measures it when the page is drawn, in the font the page sets it in,
and takes only what it leaves of the line (the beside option of
axis{}): a wide font gets a shorter axis rather than a
sentence pushed onto a second line. This only works for a font the rendering
server has: a font asked for by name and missing on the computer displaying
the page is replaced by another one, which nothing measured.
The box is framed by M( )¶
The answer box carries the notation an abscissa is written in — M( before it
and ) after it — so the pupil types the number alone yet reads the notation
each time, and the answer key spells the whole of it: M(7/4). On a printed
sheet the two halves stand apart, the room between them being where the answer
goes; on the answer key they close up around the result.
Any question type can do the same by returning its two halves from
answer_frame(); snapshots carry them in the answer_frame field of a grid
entry (see atmxs).
Every correct writing is accepted¶
The abscissa has one shortest writing, and the answer key shows it — but a pupil who does not simplify is not wrong, and neither is one who answers in decimals where the number has a decimal writing:
Typed for M(7/4) |
|
|---|---|
7/4 — the irreducible fraction |
accepted |
14/8, 21/12, 007/004, 7 / 4 |
accepted |
1,75 — its decimal writing |
accepted |
1.75 — the same, in English notation |
refused |
4/7, 1,7 |
refused |
The English notation is refused on purpose: writing a decimal number the way the language writes it is part of what is being learnt.
No steps, and the ⓘ button all the same¶
An abscissa is read, not calculated, so the answer key writes the abscissa and
nothing else whatever steps asks for. The reasoning is still one click away,
behind the ⓘ button — and it reads forwards, the sentence first and the
counting under it:
What each graduation is worth is not a remark on a calculation already read, it is the step the calculation starts from, and the step a pupil misses.
The counting under it starts wherever the reading does. From the origin, the
count is the abscissa — 7 × 1/4 = 7/4, seven graduations of a quarter
apiece. From a written graduation, it is added to that graduation or taken off
it, and the step in the middle is the one worth showing: the whole number
written as a fraction of the same denominator, which is what makes the
addition possible.
The default transduration is 30 s: reading the figure, counting graduations
and writing a fraction is one operation more than naming a digit place.
On a slide¶
A slide has no answer box to carry the notation, so the correction writes the abscissa named in full, M(7/4). The sentence goes above the figure rather than beside it, a slide being as wide as it needs and read from the back of the room.
read_coordinates¶
The coordinates of a point marked in a coordinate system.
| Variant | Example |
|---|---|
| (default) | Coordinates of point W, marked in a coordinate system? → W(4 ; −2) |
Sources — one window, written as intervals — [-4;4] for both axes, [-6;6]×[-3;3] for the abscissas then the ordinates; the decimals of the bounds set the graduation, [-1.0;1.0] being divided in tenths.
Steps — none: coordinates are read, not calculated, so the answer is the whole of it.
Options — these, on top of the ones every type reads:
| Option | What it does |
|---|---|
notation |
how the answer is typed — given (the default), in two boxes between W(, ; and ), or written, in one box after W, where the pupil writes (4;-2) whole |
x_labels_step |
how often a value is written along the axis of abscissas — a whole number of graduations; left out, the figure chooses |
y_labels_step |
the same, along the axis of ordinates |
The pupil reads the coordinates of a point marked in a coordinate system, drawn on its grid. Nothing is calculated: what is kept alive is the reading itself, and the order the two numbers are written in — the abscissa, read on the horizontal axis, then the ordinate.
The source is the window¶
The source is the part of the coordinate system the figure shows, written as intervals — see Windows. The point is drawn among the nodes of its grid, and the figure shows that same window, one cell past each bound.
read_coordinates [-4;4] → whole coordinates from −4 to 4, on both axes
read_coordinates [-6;6]×[-3;3] → a wider figure than it is tall
read_coordinates [0;8]×[0;5] → the first quadrant only
read_coordinates [-1.0;1.0] → a grid of tenths
The decimals of the bounds set how finely each axis is graduated, which is
where the difficulty of a figure lies. [-4;4] is the mental-calculation
figure; a worksheet can afford finer grids, wider windows, larger numbers.
Points are tracked in the order they were drawn: (2; 3) and (3; 2) are two points, and one may follow the other on a sheet — which is exactly the confusion the question is there to catch.
notation — how the answer is typed¶
notation |
The answer box |
|---|---|
given |
(the default) two boxes, between W(, ; and ) — the pupil types each coordinate in its own |
written |
one box after W, where the pupil writes the coordinates whole: (4;-2) |
With written, the pupil has the notation to write as well as the numbers:
the parentheses, and the separator between the coordinates. The name of the
point stands before the box, so the question says plainly that it is not to be
written; a pupil typing it all the same — W(4;-2) — is not marked wrong for
it. Spaces do not count.
The separator is the one of the render locale: a semicolon where the comma
is the decimal mark — (0,5 ; 2) could not be read otherwise — and a comma
elsewhere, as English writes (0.5, 2), where a semicolon is accepted too. A
coordinate is written in the notation of the locale, 0,5 in French, and the
minus sign may be the hyphen a keyboard gives.
x_labels_step, y_labels_step — the values written along the axes¶
Handed to the figure as they are: how often a value is written along each axis, a whole number of graduations. Left out, the figure chooses — every graduation from −4 to 4, every 0.2 on a grid of tenths from −1 to 1 (see plot{}).
round_number¶
A number to round to a given place.
| Variant | Example |
|---|---|
| (default) | Round 43.571 to the nearest tenth. → 43.6 |
Sources — one digit place, the one to round to: the digitplaces, digitplaces_big or digitplaces_small alternator, or places written as powers of ten — 0.01, 1,10,100.
Steps — none: the answer is the whole of it, so the answer key draws no ⓘ button.
Options — these, on top of the ones every type reads:
| Option | What it does |
|---|---|
max_place |
the highest place the number may be rounded to, as a power of ten — 100 keeps digitplaces from asking for the thousands |
min_place |
the lowest place the number may be rounded to, as a power of ten — the source's places below it are passed over |
width |
how many digits the number carries, 3-5 by default — a number, or a range one is drawn from per question; at least 2, the place asked and one below it |
The place is named — ten, unit, tenth… — and the pupil writes the rounded number:
(6) round_number digitplaces -- max_place=100
→ Round 43.571 to the nearest tenth. answer: 43.6
→ Round 2,815 to the nearest hundred. answer: 2,800
The source draws the place to round to¶
As with digitplace_digit, the source is not the
number but the place: the same digitplaces, digitplaces_big and
digitplaces_small alternators (see there for the places each runs through),
or places written as powers of ten — 0.01, 1,10,100.
min_place and max_place narrow the places asked, each written as a
power of ten. A place the source hands back outside them is passed over, the
alternator's cycle going on, so the places kept still come round evenly.
That is how a sheet rounds from the hundreds down to the thousandths while
drawing from digitplaces, which also runs through the thousands:
round_number digitplaces -- max_place=100
round_number digitplaces -- min_place=1 → no rounding past the unit
A source none of whose places the bounds let through is refused by
check qspec — digitplaces_small -- min_place=1 has only decimal places to
offer.
Not the bounds of digitplace_*
There, min_place and max_place confine the numeral; here they
confine the place asked. How far the numeral runs is left to the place
drawn, as described below.
The number always reaches below the place¶
The number is built around the place drawn, like that of the digitplace_*
questions, but it always runs at least one place below it: there would
be nothing to round otherwise. So rounding to the thousandths gives a number
with a digit at the ten-thousandths, the one place a number is ever written
at without a question being able to ask about it.
Its first and last digits are never zero; the digits in between may be, and
may repeat — 3.05 is as good a number to round as any. When the number
stops one place under the place asked, that last digit is non-zero, so the
number never comes already rounded.
Whether the number rounds up or down is left to the draw: a sheet where
every number rounded down would be answered without looking. A 5 rounds up,
as at school — 43.5 to the unit gives 44.
width sets how many digits the number carries, place asked included — a
number, or a range from which one is drawn per question (the default is
3-5). It may not go below 2 — the place and one under it — nor past 9, and
a width wider than the places available is narrowed to them. With the
default width, a large place gives a whole number, and the hundreds may give
one too — 3,045 as well as 927.94.
The answer, and what is accepted¶
The answer key writes the rounded number in its shortest form: 3.96
rounded to the tenth is 4, not 4.0. On an interactive page, any
decimal writing equal to it is accepted — 4, 4.0, 4.000 — in the
notation of the locale (4,0 in French), as everywhere else. A fraction is
not: a rounding is asked for as a decimal number.
Transduration¶
25 s by default.
spreadsheet_formula¶
Enter a formula in a cell, and say what the cell will show.
| Variant | Example |
|---|---|
x+b |
n° 1 — x + 3 — linear, 1 operation, 1 letter |
x-b |
n° 2 — x − 3 — linear, 1 operation, 1 letter |
b-x |
n° 3 — 3 − x — linear, 1 operation, 1 letter |
ax |
n° 4 — 3x — linear, 1 operation, 1 letter |
xy |
n° 5 — xy — linear, 1 operation, 2 letters |
ax+b |
n° 30 — 3x + 12 — linear, 2 operations, 1 letter |
ax-b |
n° 31 — 3x − 12 — linear, 2 operations, 1 letter |
b+ax |
n° 32 — 12 + 3x — linear, 2 operations, 1 letter |
b-ax |
n° 33 — 12 − 3x — linear, 2 operations, 1 letter |
a(x+b) |
n° 34 — 3(x + 12) — linear, 2 operations, 1 letter |
a(x-b) |
n° 35 — 3(x − 12) — linear, 2 operations, 1 letter |
a(b-x) |
n° 36 — 3(12 − x) — linear, 2 operations, 1 letter |
b+xy |
n° 37 — 3 + xy — linear, 2 operations, 2 letters |
xy-b |
n° 38 — xy − 3 — linear, 2 operations, 2 letters |
x+ay |
n° 39 — x + 3y — linear, 2 operations, 2 letters |
ax+y |
n° 40 — 3x + y — linear, 2 operations, 2 letters |
x-ay |
n° 42 — x − 3y — linear, 2 operations, 2 letters |
ax-y |
n° 43 — 3x − y — linear, 2 operations, 2 letters |
ax+by |
n° 80 — 3x + 12y — linear, 3 operations, 2 letters |
ax-by |
n° 81 — 3x − 12y — linear, 3 operations, 2 letters |
x/a |
n° 101 — x/3 — quotient, 1 operation, 1 letter |
a/x |
n° 102 — 3/x — quotient, 1 operation, 1 letter |
x/y |
n° 103 — x/y — quotient, 1 operation, 2 letters |
x/a+b |
n° 130 — x/3 + 12 — quotient, 2 operations, 1 letter |
x/a-b |
n° 131 — x/3 − 12 — quotient, 2 operations, 1 letter |
b+x/a |
n° 132 — 12 + x/3 — quotient, 2 operations, 1 letter |
b-x/a |
n° 133 — 12 − x/3 — quotient, 2 operations, 1 letter |
a/x+b |
n° 134 — 3/x + 12 — quotient, 2 operations, 1 letter |
a/x-b |
n° 135 — 3/x − 12 — quotient, 2 operations, 1 letter |
b+a/x |
n° 136 — 12 + 3/x — quotient, 2 operations, 1 letter |
b-a/x |
n° 137 — 12 − 3/x — quotient, 2 operations, 1 letter |
(x+b)/a |
n° 138 — (x + 12)/3 — quotient, 2 operations, 1 letter |
(x-b)/a |
n° 139 — (x − 12)/3 — quotient, 2 operations, 1 letter |
(b-x)/a |
n° 140 — (12 − x)/3 — quotient, 2 operations, 1 letter |
a/(x+b) |
n° 141 — 3/(x + 12) — quotient, 2 operations, 1 letter |
a/(x-b) |
n° 142 — 3/(x − 12) — quotient, 2 operations, 1 letter |
a/(b-x) |
n° 143 — 3/(12 − x) — quotient, 2 operations, 1 letter |
x+a/y |
n° 146 — x + 3/y — quotient, 2 operations, 2 letters |
x-a/y |
n° 147 — x − 3/y — quotient, 2 operations, 2 letters |
a/x+y |
n° 148 — 3/x + y — quotient, 2 operations, 2 letters |
a/x-y |
n° 149 — 3/x − y — quotient, 2 operations, 2 letters |
ax+y/b |
n° 180 — 3x + y/12 — quotient, 3 operations, 2 letters |
x/a+by |
n° 181 — x/3 + 12y — quotient, 3 operations, 2 letters |
x/a+y/b |
n° 182 — x/3 + y/12 — quotient, 3 operations, 2 letters |
x² |
n° 201 — x² — square, 1 operation, 1 letter |
x²+b |
n° 230 — x² + 3 — square, 2 operations, 1 letter |
x²-b |
n° 231 — x² − 3 — square, 2 operations, 1 letter |
b+x² |
n° 232 — 3 + x² — square, 2 operations, 1 letter |
b-x² |
n° 233 — 3 − x² — square, 2 operations, 1 letter |
ax² |
n° 234 — 3x² — square, 2 operations, 1 letter |
x²+x |
n° 235 — x² + x — square, 2 operations, 1 letter |
x²-x |
n° 236 — x² − x — square, 2 operations, 1 letter |
x²/a |
n° 237 — x²/3 — square, 2 operations, 1 letter |
a/x² |
n° 238 — 3/x² — square, 2 operations, 1 letter |
x²+y |
n° 239 — x² + y — square, 2 operations, 2 letters |
x+x² |
n° 240 — x + x² — square, 2 operations, 1 letter |
x²+ax |
n° 280 — x² + 3x — square, 3 operations, 1 letter |
Sources — the sources of expr_eval, read the same way: a range for the values of the cells and a second for the numbers of the formula — 2-9 2-12 — a product range for its products and quotients, or auto.
Steps — one level, the formula with its cells replaced by their values, then each stage of the reduction.
Options — these, on top of the ones every type reads:
| Option | What it does |
|---|---|
carry |
false draws an expression whose multiplication carries no column, true one where it does — read as multi_direct reads it, and only where the expression holds a product; on x + b, x − b and b − x, whether the sum carries or the difference borrows |
decimals |
the number of ranks the point of the product moves left — decimals=1 asks 0,8x for the pair 8 × 7, or 8x for x = 0,7; needs a product range |
family |
which families of expression are asked — linear, quotient, square, several of them separated by commas, or any |
letters |
how many letters the expression is written with — 1 or 2, or both separated by a comma |
ops |
how many operations the expression asks for — 1, 2, 3, or several separated by commas |
result |
positive — for the grades where negative numbers are not taught yet, and which also keeps them out of the intermediate steps — or negative, or the bounds the result is to fall between, result=11-30 |
scale |
the number of zeros the product gains — scale=1 asks 80x for the pair 8 × 7; needs a product range |
square |
how a square is typed — power for =A2^2, the default, or product for =A2*A2, the writing a class meets before the power key |
spreadsheet_formula asks what a spreadsheet will show once a formula is
entered:
(8) spreadsheet_formula auto -- result=positive
→ En C2, on entre =5*A2-1.
[A2 shows 4, C2 a red ?]
Que va-t-il s'y afficher après avoir pressé Entrée ? answer: 19
It is expr_eval asked the way a spreadsheet asks it. The
expressions are the same ones, drawn the same way — the same catalogue of
shapes, variant and its three filters, the same sources, auto included,
result, carry, the tables rule, everything said in expr_eval's section.
A line moves from one type to the other by its identifier alone:
(8) expr_eval auto -- result=positive letters=2
(8) spreadsheet_formula auto -- result=positive letters=2
Only the writing differs.
The letters are cells¶
Each unknown is a cell whose value is read in the figure rather than
given in the sentence, and the formula is typed in another cell, which shows
a red ?. The figure stands somewhere between A1 and H9, so that a pupil
reads the references rather than meeting A1 and B1 every time, and the
formula is typed onward from a value, to its right or below it, the way
a sheet is filled. The cells the question does not fill are drawn empty.
Its shape depends on where the question is read:
- on a printed sheet, as flat as the cells allow, since height is what a page's questions share: a value and its formula side by side, and a square of two by two where two values and a formula need a third cell — with the question written beside the figure, on two lines, rather than under it;
- on a slide, a block of four contiguous cells — a square, a row of four or a column of four — the two values side by side or one above the other, and the question under it: the slide has the screen to itself.
The question is drawn once and written twice: the same expression and the same values, read on the cells each figure places them in.
On a slide the answer takes the place of the ? on the correction, as the
area of a rectangle takes its centre: answer_layout=inline is the default.
The formula is written as it is typed¶
The expression is written the way it is entered in a cell — = first,
every product written out with *, a division on the line with /, a
square with ^2, no space — and set in the font of source code with
code{}:
expr_eval |
spreadsheet_formula |
|---|---|
5x − 1 |
=5*A2-1 |
(x + 9)/3 |
=(A2+9)/3 |
24/(2 + x) |
=24/(2+A2) |
x² + 3x |
=A2^2+3*A2 |
1,5x + y |
=1,5*A2+B2 |
The parentheses a fraction bar made unnecessary come back, since a line of keys has no bar to hold its members together.
A square is typed with the power key unless the line says otherwise:
square=product writes it as the product it is, the writing a class meets
before the power key — and keeps it whole wherever it stands:
(6) spreadsheet_formula auto -- variant=x²+b,ax²,a/x² result=positive square=product
→ =D2*D2+5 =11*F8*F8 =64/(B3*B3)
A decimal takes the locale's point, as a spreadsheet set in that language reads it, and no thousands separator, which nobody types.
square_of¶
Square of a number.
| Variant | Example |
|---|---|
| (default) | 8² = ? |
wording |
What is the square of 8? |
Sources — one singleton range, or a pair range narrowed to its equal pairs — 2-12, 4-9×4-9.
Steps — one level, the power written out as the multiplication it stands for — 8² = 8 × 8 = 64.
Options — the ones every type reads only.
What follows holds for cube_of as well: the two types raise a
single drawn number, take the same shapes of source and show the same kind of
step, and are described here together.
Both accept two shapes of source:
| Source | Example | Drawn from |
|---|---|---|
| a singleton range | square_of 2-12, cube_of 2-10 |
the singletons table |
| a product range of the exponent's own width | square_of 4-9×4-9, cube_of 4-9×4-9×4-9 |
the pairs / triplets table |
Why a product range is usually the better source¶
A product range is narrowed to its equal tuples — the six (n, n) of
4-9×4-9 — so the question drawn is exactly the same. What changes is which
table it is drawn from, and therefore what the anti-repeat tracking can see.
Most of a mental-calculation sheet comes from product ranges, and the tracking only prevents a repeat within one table. So:
(4) multi_direct 4-9×4-9
(2) square_of 4-9 → 6 × 6 = ? followed by 6² = ? is possible
(2) square_of 4-9×4-9 → it is not: the pair (6,6) is already spent
With the product form, a 6 × 6 already asked by multi_direct cannot come
back as 6² a few questions later, and vice versa. Nothing else changes —
same wording, same answer.
A product range must be able to yield equal values: square_of 2×6-9 never
does, and check qspec says so. It must also have the right width — a pair
for a square, a triplet for a cube — which check qspec checks too.
The wording variant¶
variant=wording asks the same question as a sentence — What is the square
of 8? — and follows the rules of The wording
variant: the answer goes underneath, and
answer_layout=inline overrides that. Unlike the four operation types,
neither is given extra time by the variant: naming a square takes no longer to
read than writing it.
Steps — writing the power out¶
Both types have one level, and it belongs to the type, not to the variant:
At steps=0 — the default — the answer key shows 64 alone and keeps the
chain behind its ⓘ button; steps=1 puts it in the answer itself.
The chain reads the same whichever way the question was asked, and it always
opens on the power, even where the wording carries it already. Both halves
earn their place: 8² = 8 × 8 is what a pupil reading a square as a doubling
needs to see, and it is also what tells the one who was asked the square of
8 how that is written down.
A cube pauses once more, on the product of its first two factors — three of them are not multiplied in one go, and the chain stops where the pupil does:
3³ = ? → answer: 27
ⓘ 3³ = 3 × 3 × 3 = 9 × 3 = 27
10³ = ? → answer: 1 000
ⓘ 10³ = 10 × 10 × 10 = 100 × 10 = 1 000
Transduration¶
square_of defaults to 20 s, like multi_direct — a square up to 10² is a
times-table fact. From 11² on it has to be worked out, so the default rises
to 24 s on its own, per question. cube_of defaults to 30 s throughout. An
explicit transduration= on the line always wins.
Decimal ranges work: square_of 0.1-0.9 draws 0,3² = ? for 0,09.
subtr_direct¶
Subtraction.
| Variant | Example |
|---|---|
| (default) | 52 − 37 = ? |
wording |
Difference between 52 and 37? |
to_reach |
What number must be added to 37 to make 100? |
complement |
What is the hundreds complement of 37? |
Sources — exactly two numbers: two sources, the minuend then the subtrahend, or one pair range oriented at random — 100-999 10-99, 10-99×10-99; or two time ranges, the minuend then the subtrahend — 13h-18h[5min] 8h-12h[5min]; or clocktimes alone, a departure and an arrival drawn in a frame.
Steps — none on the plain form; one level under variant=wording, on the operation the sentence names.
Options — these, on top of the ones every type reads:
| Option | What it does |
|---|---|
carry |
false draws a subtraction no column borrows, true one where at least one does |
max_result |
the largest difference the draw may land on |
min_result |
the smallest difference the draw may land on |
result |
positive — the shorthand for min_result=0 — negative, or the differences allowed, written as a numrange — 100 |
step |
with clocktimes, the minutes the times move by — 5 by default, 1 for any minute |
units |
on a line of times, the units the answer is typed in — h_min, min_s, h_min_s (or one unit alone); by default, from the largest unit the sources write to the finest their values need |
The subtraction reads its sources, frames its difference and counts its
borrows exactly as the addition does, and the two are described together
under addi_direct: how many terms a source gives, how a
single pair range is oriented, what carry
promises, and what result, min_result and
max_result frame.
Two things are its own. It takes exactly two numbers, the minuend then
the subtrahend, and check qspec says so when the sources give anything
else. And it has no shuffle: the order of a subtraction is what the
question means.
to_reach and complement — the same subtraction, as a complement¶
A subtraction whose minuend is round is not read as a subtraction in class: it
is read as the complement of the other number to it. Two variants word it
that way, and both compute exactly what 100 − 37 computes:
| Spec | What is asked |
|---|---|
subtr_direct 100×1-99 -- variant=to_reach |
What number must be added to 37 to make 100? |
subtr_direct 100×1-99 -- variant=complement |
What is the hundreds complement of 37? |
to_reach puts the complement as the addition to make; complement names it.
Where the target is 10, 100 or 1000, the sentence uses the name the lesson
uses — the tens complement, the hundreds complement, the thousands
complement. Any other target is numbered instead: What is the complement to
400 of 140?
Both are sentences, so they follow the wording variant in everything else: the answer goes underneath, the question is given the same 24 s, and the subtraction it stands for waits behind the ⓘ button.
The two start from the subtrahend — it is the number completed, the
minuend being the target it is completed to — where wording names the
minuend first. Which is why they imply result=positive: there is
nothing to complete past the target, and a pair range oriented at random
would otherwise ask half of its questions the wrong way round. The line above
needs no result= of its own.
It only fills a silence. A result the line writes is honoured as written,
min_result included, and one letting the difference go negative is reported
rather than overruled:
subtr_direct 100×1-99 -- variant=complement result=negative
→ variant=complement asks what is missing to reach the first number,
which result=negative contradicts — a complement is never negative.
On a line of times, both variants keep
their meaning: to_reach asks how long must be added — How long must be
added to 8 h 40 min to make 11 h 15 min? — and complement names its target
as a time, What is the complement to 1 h of 35 min?
subtr_hole¶
Subtraction with a missing term.
| Variant | Example |
|---|---|
| (default) | 52 − ? = 15 |
Sources — exactly two numbers: two sources, the minuend then the subtrahend, or one pair range oriented at random — 100-999 10-99, 10-99×10-99; the difference is worked out from them.
Steps — one level: steps=1 writes out the operation the missing number is recovered by — an addition where the minuend is hidden, a subtraction where the subtrahend is.
Options — these, on top of the ones every type reads:
| Option | What it does |
|---|---|
carry |
false draws a subtraction no column borrows, true one where at least one does |
hidden |
which of the two the hole falls on — minuend or subtrahend; drawn afresh for each question where the option is left out |
max_result |
the largest difference the draw may land on |
min_result |
the smallest difference the draw may land on |
result |
positive — the shorthand for min_result=0 — negative, or the differences allowed, written as a numrange — 100 |
step is refused here: a hole is not asked on times: its sources are numbers.
units is refused here: a hole is not asked on times: its sources are numbers.
The subtraction with a hole draws its numbers, places its hole and frames its
difference exactly as the addition with a hole does, and the two are described
together under addi_hole: what the sources give and what is
worked out, where
hidden puts the hole, what the
constraints frame, and what
steps=1 writes out.
Two things are its own. The hole falls on the minuend or on the
subtrahend — never on the difference, which is subtr_direct
— and the two are not the same exercise: ? − 37 = 15 is answered by an
addition, 52 − ? = 15 by a subtraction.
And result=positive is what keeps every number of the line
positive: the hidden number is always one
of the numbers a source drew, so the only one that can go negative is the
difference the question shows.
units_conversion¶
Conversion between two units of the same quantity.
| Variant | Example |
|---|---|
| (default) | 9 dL = ? L |
Sources — the unit_pairs table, one row per direction, narrowed by its columns — quantity, level, gap, direction, everyday, unit1, unit2, dimension.
Steps — one level, the operation the conversion comes down to.
Options — these, on top of the ones every type reads:
| Option | What it does |
|---|---|
width |
how many significant digits the number drawn has, 1-3 by default |
units_conversion asks for the same quantity read in another unit:
The wording carries both units, so the answer is the number alone. The
pair of units is drawn from the unit_pairs content table; the number is
drawn against it, by the question type.
The unit asked for is written beside the box too¶
The unit the wording ends on is also printed inside the answer box, against its right edge, on the question sheet as on a mail-merge template: the wording states the equality, the box states what the number about to be written in it is counted in — under the eye, where it is written. The pupil still types the number alone.
On the answer key the same unit follows the result, which is why the key reads
0,9 L while the pupil only ever types 0,9. On a slide, where there is no
box, the answer takes the place of the ? and the wording supplies the unit
(9 dL = 0,9 L). This is the answer_unit() mechanism area_rectangle uses
as well; snapshots carry it in the answer_unit field of a grid entry (see
atmxs).
The source is always unit_pairs¶
There is one source, and it is the table of pairs. Its columns are the filters a line narrows it with:
| Filter | Selects |
|---|---|
quantity |
length, mass or capacity |
level |
the difficulty, 1 to 3 — see below |
gap |
the number of columns between the two units, 1 to 3 |
direction |
right (toward the smaller unit: it multiplies) or left |
everyday |
true for the handful of conversions of everyday life |
unit1, unit2 |
one named unit, on either side of the = |
dimension |
1, and only 1 so far (see the last section) |
Each pair is stored once per direction, so dL → L and L → dL are two
rows: asking for one direction only is a filter, and the anti-repeat tracking
of the table counts them apart.
The ladders run from km, kg and hL down to mm, mg and mL. The
kilolitre is deliberately left out — the symbol exists, and unit{3 kL} still
draws it, but nothing is measured in kilolitres, so no question converts one.
(10) units_conversion unit_pairs anything, level 1 to 3
(10) units_conversion unit_pairs -- quantity=capacity gap=1
(10) units_conversion unit_pairs -- level={1|2} a mix of both levels
(10) units_conversion unit_pairs -- everyday=true the everyday ones only
(10) units_conversion unit_pairs -- direction=right the ones that multiply
A filter that selects nothing (quantity=area) is refused by check qspec,
which lists the values available; one that leaves a pair or two
(unit1=dL unit2=L) is accepted, with a warning that every question of the
block will ask the same conversion.
level — the power of ten, not the number of columns¶
The difficulty of a conversion is the power of ten between the two units:
| Level | What it is | Examples |
|---|---|---|
| 1 | neighbouring columns, ×10 or ÷10 | dL → L, m → dm, cg → dg |
| 2 | two columns, ×100 or ÷100 | hL → L, dam → dm |
| 3 | three columns, ×1000 or ÷1000 | hm → dm, dag → cg |
with one deliberate exception: the conversions of everyday life are known rather than computed, so they count as level 1 whatever their gap —
m → km is three columns apart, and stays a level-1 question. Use gap where
what you want is the columns themselves, everyday=true where you want that
handful of pairs, and level — the usual choice — where you want a
difficulty.
width — the number drawn, and why it is always readable¶
width is how many digits are drawn, 1-3 by default, one width per
question. They are the significant digits: two digits landing on the
hundreds and the tens read 710.
Where the digits fall is not free. The number and its conversion both stay
inside the places a pupil reads — the thousandths to the thousands — and every
digit stays inside the ladder of the quantity, so that the conversion table
below can always be drawn. A question therefore never asks for 3 mm in
kilometres, and width=7 on a three-column pair is narrowed to what the pair
can hold rather than refused.
A whole number may end in zeros (30 dL = 3 L is worth asking); a decimal
one never does, since a trailing zero would simply not be printed.
steps — the operation the syllabus names¶
steps=0 is the default, as everywhere in mental calculation: the answer is
the converted number alone. steps=1 writes the operation out, in the answer
column of the answer key:
Multiplying when the unit asked for is the smaller one, dividing otherwise; the factor is the power of ten of the level — 10, 100 or 1000.
The info button shows both ways at once¶
Whatever steps says, the info button of the answer key — and the Steps
button of a slideshow — opens on two presentations of the same
conversion, side by side:
- the operation above, which is the form the syllabus states;
- the conversion table, the digits of the number laid out one per column.
Neither replaces the other: some pupils reason with the operation, others read
the columns. The table is columns and nothing else — no frame, no rule between
the units and the digits (borders=inner_cols), the separators themselves in
grey, and the units in a smaller size than the digits: they label the columns,
the digits are what is read.
One comma is written, and always: the one of the number as it is given, on
its units digit — 9, even when the number is whole, because the comma is how
that column is found. That digit, its comma and the unit of that column are in
red; the unit asked for is in green, the columns merely passed through in
grey, and every other digit in green — they are what the answer is read on,
and they do not move.
The table is only ever shown behind the button: an answer cell of a grid, and the answer of a correction slide, keep to the result alone.
Areas, volumes, and time¶
Not yet. An area column is two powers of ten and a volume column three, which
the dimension filter is there to carry — it is 1 everywhere for now, and a
line that says nothing about it gets one-dimensional pairs, so seeding areas
and volumes later will not change what today's scripts ask.
Conversions between the two systems of volumes (1 dm³ = 1 L) are a family of
their own, and time units — which are not decimal — will be a question type of
their own.