Vai al contenuto principale
Ricetta numero 170

Ricettario · Capitolo 12 · Libri di testo

Operazioni in colonna come le scrive ogni paese

Una scheda di calcolo le cui operazioni sono righe - 864 ÷ 4 del Markdown, cifra per cifra nei quadretti, e la divisione come la fanno le scuole di ogni paese.

In questa pagina
Livello
Avanzato
Postext
Provata con Postext 1.59.0
Richiede ≥ 1.59.0 · postext-pdf ≥ 1.59.0
Licenza
Aggiornata il 24 ott 2026
Codice MIT · Testo CC BY 4.0
  • Esempio in inglese: non c’è ancora un’edizione italiana
  • Formato 210 × 297 mm
  • 1 colonna
  • Fira Sans 12/18
  • Lexend
  • 4 pagine
  • Livello
  • Postext 1.59.0
  • Impaginato in 55 ms
  • 118 righe di codice

In breve

Una pagina di conti per bambini di nove anni in spagnolo, inglese, francese e tedesco. Ogni paese scrive la divisione a modo suo e la scheda lo segue; un interruttore mostra la copia dell’insegnante con tutte le risposte.

Che cosa comporrai

L’unità 3 di un quaderno di calcolo di quarta elementare, Le quattro operazioni, in quattro edizioni. Una fila di calcoli a mente in tre colonne, poi addizioni, sottrazioni e moltiplicazioni in colonna, una cifra per quadretto e una fila di quadretti per il risultato, infine le divisioni e un problema su carta a quadretti. È nella divisione che le edizioni si separano: la scheda inglese mette il divisore fuori dalla parentesi ⟌ e il quoziente sopra; quella spagnola e quella francese mettono il divisore in una L a destra del dividendo e il quoziente sotto, come si fa anche nelle scuole italiane; quella tedesca scrive 864 : 4 = su una riga, con lo spazio sotto per i passaggi, e i prodotti con un punto. Anche la virgola o il punto decimale del calcolo a mente segue la lingua. Un interruttore sopra le pagine trasforma la scheda dell’alunno nella copia dell’insegnante, con ogni risposta stampata in arancione nel suo quadretto.

Questa ricetta risponde a

  • Come compongo la divisione in colonna come la scrivono le scuole di ogni paese?
  • Come ricavo la guida per l'insegnante, con le risposte al loro posto, dal libro dell'alunno?

La risposta breve

script.js · righe 26–42nel codice completo
// `- 864 : 4` in the Markdown is one operation; the style sets it digit by digit in squares
// of 7.2 mm, a cell for each figure of the answer. Long division follows the country: the
// divisor in an L right of the dividend in Spain and France (potence), `864 : 4 =` on one
// line in Germany, the bracket ⟌ in English-speaking schools.
const calculo = {
  id: 'calculo',
  number: { shape: 'disc', background: col('accent'), fontFamily: LABEL, fontWeight: 700 },
  instruction: { bold: true, color: col('ink') },
  grid: { cell: mm(9), fontFamily: TEXT, fontSize: pt(15), rule: col('rule'),
    color: col('ink') },
  arithmetic: { columns: 4,
    division: t({ es: 'potence', fr: 'potence', de: 'inline', en: 'bracket' }) },
  blank: { look: 'box', width: em(3.2), color: col('rule'), weight: pt(0.8) },
  area: { kind: 'grid', spacing: mm(5), color: col('rule'), weight: pt(0.4) },
  answers: { color: col('accent'), fontFamily: LABEL }, // the teacher's copy, in the accent
  marginTop: mm(7), marginBottom: mm(2), itemSpacing: em(0.5),
};

Ingredienti

Tipo
Fira Sans, Lexend (SIL OFL 1.1)
Risorse
Nessuna: ogni immagine è disegnata nel codice

Preparazione

#1 · Scrivi le operazioni come righe del Markdown

script.js · righe 26–42nel codice completo
// `- 864 : 4` in the Markdown is one operation; the style sets it digit by digit in squares
// of 7.2 mm, a cell for each figure of the answer. Long division follows the country: the
// divisor in an L right of the dividend in Spain and France (potence), `864 : 4 =` on one
// line in Germany, the bracket ⟌ in English-speaking schools.
const calculo = {
  id: 'calculo',
  number: { shape: 'disc', background: col('accent'), fontFamily: LABEL, fontWeight: 700 },
  instruction: { bold: true, color: col('ink') },
  grid: { cell: mm(9), fontFamily: TEXT, fontSize: pt(15), rule: col('rule'),
    color: col('ink') },
  arithmetic: { columns: 4,
    division: t({ es: 'potence', fr: 'potence', de: 'inline', en: 'bracket' }) },
  blank: { look: 'box', width: em(3.2), color: col('rule'), weight: pt(0.8) },
  area: { kind: 'grid', spacing: mm(5), color: col('rule'), weight: pt(0.4) },
  answers: { color: col('accent'), fontFamily: LABEL }, // the teacher's copy, in the accent
  marginTop: mm(7), marginBottom: mm(2), itemSpacing: em(0.5),
};

Un :::exercise{type="arithmetic"} prende un’operazione per voce di elenco, - 864 ÷ 4, con i segni che usa il suo paese (÷, :, ×, ·). Il motore calcola il risultato, il quoziente e il resto, e lo stile decide come si disegna l’operazione: quadretti di 7,2 mm e una arithmetic.division scelta per edizione con t(). Una fila di calcoli a mente è un normale esercizio a completamento la cui lista sta in un gruppo :::columns{count=3}, e ogni [[70]] è un riquadro largo quanto gli altri.

#2 · Componi l’intestazione della scheda

script.js · righe 46–67nel codice completo
const at = (to, edge, x = 0, y = 0, size) => ({ anchor: { to, edge },
  offset: { x: mm(x), y: mm(y) }, ...(size && { size }) });
const field = (id, attr, x, width) => [
  { kind: 'text', id, content: `{attr.${attr}}`, fontFamily: LABEL, fontSize: pt(9.5),
    fontWeight: 600, color: col('muted'), align: 'left',
    placement: at('container', 'top-left', x, 26) },
  { kind: 'rule', id: `${id}-line`, direction: 'horizontal', thickness: pt(0.75),
    color: col('rule'), placement: at('container', 'top-left', x + 17, 31, { width: mm(width) }) },
];
const head = { enabled: true, minHeight: mm(36), slot: { elements: [
  { kind: 'box', id: 'band', style: { backgroundColor: col('accent'), borderRadius: mm(3) },
    placement: at('container', 'top-left', 0, 0, { width: 'fill', height: mm(19) }) },
  { kind: 'text', id: 'unit', content: '{attr.unidad}', fontFamily: LABEL, fontSize: pt(9),
    fontWeight: 700, color: col('accent'), align: 'center', verticalAlign: 'middle',
    textTransform: 'uppercase', letterSpacing: pt(1.2), lineHeight: 1.1,
    box: { backgroundColor: col('paper'), borderRadius: mm(3.5) },
    placement: at('container', 'top-left', 5, 5, { width: mm(26), height: mm(9) }) },
  { kind: 'text', id: 'title', content: '{titleText}', fontFamily: LABEL, fontSize: pt(21),
    fontWeight: 700, color: col('paper'), align: 'left', lineHeight: 1.1,
    placement: at('container', 'top-left', 37, 5.2) },
  ...field('name', 'nombre', 0, 100), ...field('date', 'fecha', 124, 38),
] } };

Il titolo di livello 1 dell’unità disegna la fascia arancione, la pillola e il titolo, e i campi per il nome e la data a partire dai suoi attributi (nombre="Name" fecha="Date"), così ogni edizione li etichetta nella sua lingua.

#3 · Passa dalla scheda dell’alunno alla copia dell’insegnante

script.js · righe 180–194nel codice completo
const form = document.getElementById('controls');
const labels = t({ es: ['Alumno', 'Profesor'], en: ['Pupil', 'Teacher'],
  fr: ['Élève', 'Enseignant'], de: ['Schüler', 'Lehrkraft'] });
form.querySelectorAll('label span').forEach((span, k) => { span.textContent = labels[k]; });
function render() {
  // The same config, edited in place: the next build sees the edition the form asks for.
  config.exercises.edition = form.elements.edition.value;
  const doc = buildDocument({ markdown }, config); // the faces are loaded by now
  showPages(doc, { title });
  document.querySelectorAll('#pt-actions a, [data-postext-pdf]').forEach((old) => old.remove());
  offerPdf(() => renderToPdf(doc, { fontProvider: fontsourceProvider }),
    `${RECIPE}-${LANG}-${config.exercises.edition}.pdf`);
}
form.addEventListener('change', render);
render();

exercises.edition: 'teacher' stampa ogni risposta al suo posto nel colore indicato da answers.color, qui quello d’accento: i riquadri dei calcoli a mente, le cifre di ogni risultato, il quoziente e il resto, la risposta modello del problema. Il modulo sopra le pagine modifica la configurazione sul posto e ricompone; i font sono già caricati, quindi basta il semplice buildDocument. La cattura compone prima entrambe le schede, perciò le pagine pubblicate mostrano quella dell’alunno e poi quella dell’insegnante.

La ricetta completa

Sandbox
// ═══ Postext Cookbook · Nº 170 · Column arithmetic as each country writes it ═══════
// https://postext.dev/en/cookbook/column-arithmetic-by-country
// Code: MIT · Text: original (CC BY 4.0) · Pictures: none
// Fonts: Fira Sans, Lexend (SIL OFL 1.1) · Needs postext ≥ 1.59.0
import { buildDocumentWithFonts, buildDocument, renderPageToCanvas } from 'https://esm.sh/postext';
import { renderToPdf, decompressWoff2 } from 'https://esm.sh/postext-pdf';

const LANG = 'en'; // @lang: the language of the worksheet ('es' | 'en' | 'fr' | 'de')
const RECIPE = 'column-arithmetic-by-country';

// ─── 1 · Design ─────────────────────────────────────────────────────────────
// #region palette: ink, one orange accent, a pale tint, the grey of squared paper
const palette = {
  ink: '#1f2328', accent: '#c4511c', tint: '#fbeee6', rule: '#b9c0c8', muted: '#5f6670',
  paper: '#ffffff',
};
const col = (id) => ({ hex: palette[id], model: 'hex', paletteId: id });
const colorPalette = [
  ...Object.entries(palette).map(([id, hex]) => ({ id, name: id, value: { hex, model: 'hex' } })),
  { id: 'main-color', name: 'accent (defaults)', value: { hex: palette.accent, model: 'hex' } },
];
// #endregion
const [TEXT, LABEL] = ['Fira Sans', 'Lexend'];

// #region answer: operations in squares, long division as the edition's schools set it
// `- 864 : 4` in the Markdown is one operation; the style sets it digit by digit in squares
// of 7.2 mm, a cell for each figure of the answer. Long division follows the country: the
// divisor in an L right of the dividend in Spain and France (potence), `864 : 4 =` on one
// line in Germany, the bracket ⟌ in English-speaking schools.
const calculo = {
  id: 'calculo',
  number: { shape: 'disc', background: col('accent'), fontFamily: LABEL, fontWeight: 700 },
  instruction: { bold: true, color: col('ink') },
  grid: { cell: mm(9), fontFamily: TEXT, fontSize: pt(15), rule: col('rule'),
    color: col('ink') },
  arithmetic: { columns: 4,
    division: t({ es: 'potence', fr: 'potence', de: 'inline', en: 'bracket' }) },
  blank: { look: 'box', width: em(3.2), color: col('rule'), weight: pt(0.8) },
  area: { kind: 'grid', spacing: mm(5), color: col('rule'), weight: pt(0.4) },
  answers: { color: col('accent'), fontFamily: LABEL }, // the teacher's copy, in the accent
  marginTop: mm(7), marginBottom: mm(2), itemSpacing: em(0.5),
};
// #endregion

// #region head: the unit pill, the title and the lines for a name and a date
const at = (to, edge, x = 0, y = 0, size) => ({ anchor: { to, edge },
  offset: { x: mm(x), y: mm(y) }, ...(size && { size }) });
const field = (id, attr, x, width) => [

Lo script.js composto funziona così com’è: incollalo nello script modulo di qualsiasi pagina, oppure apri la ricetta su CodePen. Cartella della ricetta su GitHub ↗ (si apre in una nuova scheda)

Varianti

#Metti le soluzioni capovolte a piè di pagina

Un’abitudine dei libri di giochi: la chiave di ogni esercizio, ruotata di 180° sotto l’esercizio stesso.

-  exercises: { edition: 'student' }, // the switch above the pages sets 'teacher'
+  exercises: { edition: 'student', solutions: { placement: 'inverted', layout: 'key' } },

#Dividi sotto la parentesi in tutte le edizioni

Anche le scuole giapponesi e cinesi usano la parentesi; una lingua che non elenchi tiene la propria impostazione predefinita.

-    division: t({ es: 'potence', fr: 'potence', de: 'inline', en: 'bracket' }) },
+    division: 'bracket' },

Errori frequenti

  • Le operazioni accettano solo numeri interi: un’operazione con decimali come 12,5 + 3,75 non viene letta e si stampa così com’è scritta. Lascia i decimali negli spazi dei calcoli a mente, dove la risposta è testo.

Crediti

Testo
Testo originale, CC BY 4.0
Font
Fira Sans (SIL OFL 1.1) · Lexend (SIL OFL 1.1)
SandboxPDF