Vai al contenuto principale
Ricetta numero 169

Ricettario · Capitolo 12 · Libri di testo

Una scheda in dieci tradizioni scolastiche

Gli stessi sette blocchi :::exercise in dieci lingue, ogni edizione stampata con uno stile di esercizio che segue i libri di scuola del suo paese.

In questa pagina
Output
Canvas · PDF
Livello
Intermedio
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
  • Formato 210 × 297 mm
  • 1 colonna
  • Nunito 12/18
  • Baloo 2
  • 2 pagine
  • Livello
  • Postext 1.59.0
  • Impaginato in 102 ms
  • 154 righe di codice

In breve

Una scheda di scienze e matematica di due pagine sul ciclo dell’acqua, fatta dieci volte. Le domande sono le stesse; i numeri, le caselle, le righe e la divisione hanno l’aspetto dei libri di scuola di ogni paese.

Che cosa comporrai

La scheda 7 di un corso di scienze e matematica di classe quarta, Il viaggio dell’acqua, in dieci edizioni. Le domande sono le stesse in tutte le lingue: scegliere una risposta, segnare vero o falso, completare con le parole di un elenco, collegare le parole al loro significato, cerchiare una parola, dividere l’acqua di una cisterna, spiegare perché va risparmiata. Ogni edizione le stampa come fanno le sue scuole. Le schede spagnola e catalana mettono il numero in un cerchio, fanno segnare V o F e dividono con il divisore in una L a destra del dividendo. La francese usa quadrati, cases à cocher, spazi a puntini e carta Seyès per la risposta. La tedesca scrive R e F, Lückentext e 864 : 4 = su una riga, con il punto per la moltiplicazione. La brasiliana chiede V o F tra parentesi. L’inglese divide sotto la parentesi ⟌. La cinese numera le sezioni 一、二、, mette ( ) dopo ogni consegna con A. B. C. in fila, chiede √ o × e finisce con 看拼音,写词语 nei quadretti 田字格. La giapponese propone ア イ ウ e ○ ×, l’araba va da destra a sinistra con أ ب ج e صح o خطأ.

Questa ricetta risponde a

  • Come compongo la stessa scheda come i libri scolastici di ogni paese compongono gli esercizi?
  • Come compongo la divisione in colonna come la scrivono le scuole di ogni paese?
  • Come compongo domande d'esame cinesi: una parentesi ( ) dopo la domanda e le opzioni A. B. C. D. in fila?

La risposta breve

script.js · righe 36–69nel codice completo
// The Markdown of every edition has the same seven exercises. What changes is this table:
// how the number prints, how options are labelled and answered, how true/false reads, where
// a blank is written, the paper of the open answer and the layout of long division.
const disc = { shape: 'disc' };
const square = { shape: 'square' };
const bare = { shape: 'none', suffix: '.' };
const TRADITIONS = {
  es: { number: disc, options: { marker: 'none' }, trueFalse: { look: 'boxes' },
    blank: { look: 'line' }, area: { kind: 'lines' }, arithmetic: { division: 'potence' } },
  fr: { number: square, options: { marker: 'box' }, trueFalse: { look: 'boxes' },
    blank: { look: 'dots' }, area: { kind: 'seyes', spacing: mm(8) },
    arithmetic: { division: 'potence' } },
  de: { number: square, options: { marker: 'box' }, trueFalse: { look: 'boxes' },
    blank: { look: 'line' }, area: { kind: 'lines' }, arithmetic: { division: 'inline' } },
  it: { number: { shape: 'rounded' }, options: { marker: 'box' }, trueFalse: { look: 'boxes' },
    blank: { look: 'dots' }, area: { kind: 'lines' }, arithmetic: { division: 'potence' } },
  pt: { number: bare, options: { marker: 'none' }, trueFalse: { look: 'bracket' },
    blank: { look: 'line' }, area: { kind: 'lines' }, arithmetic: { division: 'potence' } },
  en: { number: bare, options: { marker: 'none' }, trueFalse: { look: 'boxes' },
    blank: { look: 'line' }, area: { kind: 'lines' }, arithmetic: { division: 'bracket' } },
  // 一、二、 sections; ( ) after the stem and A. B. C. in a row; √ × in a bracket; 田字格.
  zh: { number: { shape: 'none', format: 'simp-chinese-informal', suffix: '、' },
    options: { labels: 'alpha-upper', suffix: '.', layout: 'row', bracket: true },
    trueFalse: { look: 'bracket' }, blank: { look: 'line' },
    area: { kind: 'tianzige', spacing: mm(13), lines: 1 }, arithmetic: { division: 'bracket' } },
  // ア イ ウ in a row with ( ), ○ × in a bracket, the number in a square.
  ja: { number: square, options: { labels: 'katakana', suffix: '', layout: 'row', bracket: true },
    trueFalse: { look: 'bracket' }, blank: { look: 'line' }, area: { kind: 'lines' },
    arithmetic: { division: 'bracket' } },
  ar: { number: disc, options: { marker: 'none', prefix: '(', suffix: ')' },
    trueFalse: { look: 'boxes' },
    blank: { look: 'dots' }, area: { kind: 'lines' }, arithmetic: { division: 'bracket' } },
};
TRADITIONS.ca = TRADITIONS.es; // Catalan schools set exercises as Spanish ones do

Ingredienti

Tipo
Nunito, Baloo 2, Noto Serif SC, Noto Sans SC, Klee One, Noto Sans JP, Noto Naskh Arabic, Baloo Bhaijaan 2 (SIL OFL 1.1)
Risorse
Nessuna: ogni immagine è disegnata nel codice

Preparazione

#1 · Metti ogni tradizione in una tabella

script.js · righe 36–69nel codice completo
// The Markdown of every edition has the same seven exercises. What changes is this table:
// how the number prints, how options are labelled and answered, how true/false reads, where
// a blank is written, the paper of the open answer and the layout of long division.
const disc = { shape: 'disc' };
const square = { shape: 'square' };
const bare = { shape: 'none', suffix: '.' };
const TRADITIONS = {
  es: { number: disc, options: { marker: 'none' }, trueFalse: { look: 'boxes' },
    blank: { look: 'line' }, area: { kind: 'lines' }, arithmetic: { division: 'potence' } },
  fr: { number: square, options: { marker: 'box' }, trueFalse: { look: 'boxes' },
    blank: { look: 'dots' }, area: { kind: 'seyes', spacing: mm(8) },
    arithmetic: { division: 'potence' } },
  de: { number: square, options: { marker: 'box' }, trueFalse: { look: 'boxes' },
    blank: { look: 'line' }, area: { kind: 'lines' }, arithmetic: { division: 'inline' } },
  it: { number: { shape: 'rounded' }, options: { marker: 'box' }, trueFalse: { look: 'boxes' },
    blank: { look: 'dots' }, area: { kind: 'lines' }, arithmetic: { division: 'potence' } },
  pt: { number: bare, options: { marker: 'none' }, trueFalse: { look: 'bracket' },
    blank: { look: 'line' }, area: { kind: 'lines' }, arithmetic: { division: 'potence' } },
  en: { number: bare, options: { marker: 'none' }, trueFalse: { look: 'boxes' },
    blank: { look: 'line' }, area: { kind: 'lines' }, arithmetic: { division: 'bracket' } },
  // 一、二、 sections; ( ) after the stem and A. B. C. in a row; √ × in a bracket; 田字格.
  zh: { number: { shape: 'none', format: 'simp-chinese-informal', suffix: '、' },
    options: { labels: 'alpha-upper', suffix: '.', layout: 'row', bracket: true },
    trueFalse: { look: 'bracket' }, blank: { look: 'line' },
    area: { kind: 'tianzige', spacing: mm(13), lines: 1 }, arithmetic: { division: 'bracket' } },
  // ア イ ウ in a row with ( ), ○ × in a bracket, the number in a square.
  ja: { number: square, options: { labels: 'katakana', suffix: '', layout: 'row', bracket: true },
    trueFalse: { look: 'bracket' }, blank: { look: 'line' }, area: { kind: 'lines' },
    arithmetic: { division: 'bracket' } },
  ar: { number: disc, options: { marker: 'none', prefix: '(', suffix: ')' },
    trueFalse: { look: 'boxes' },
    blank: { look: 'dots' }, area: { kind: 'lines' }, arithmetic: { division: 'bracket' } },
};
TRADITIONS.ca = TRADITIONS.es; // Catalan schools set exercises as Spanish ones do

Tutte le edizioni hanno lo stesso Markdown: sette blocchi :::exercise con le risposte nel testo (- [x], [[vapore]], - Evaporazione -> L'acqua diventa vapore, - 864 : 4). Ciò che cambia da un paese all’altro è la forma, quindi sta in questa tabella e in nessun altro posto: la figura e le cifre del numero, le lettere delle opzioni e se l’alunno barra una casella o cerchia una lettera, l’aspetto del vero o falso, quello degli spazi da completare, l’area di scrittura e la disposizione della divisione in colonna. Il catalano prende la riga dello spagnolo così com’è.

#2 · Stendi la tradizione sopra lo stile della casa

script.js · righe 73–87nel codice completo
const T = TRADITIONS[LANG];
const ficha = {
  id: 'ficha', ...T,
  number: { background: col('accent'), color: T.number.shape === 'none' ? col('accent')
    : col('paper'), fontFamily: LABEL, fontWeight: 700, ...T.number },
  // Chinese and Japanese sheets set the instructions in the gothic (黑体, ゴシック).
  instruction: { bold: true, color: col('ink'), ...(LANG === 'zh' || LANG === 'ja'
    ? { fontFamily: LABEL } : {}) },
  blank: { color: col('ink'), weight: pt(0.7), ...T.blank },
  match: { look: 'dots', gap: em(5), color: col('accent') },
  bank: { order: 'alpha' },
  area: { color: col('rule'), spacing: mm(9), weight: pt(0.6), ...T.area },
  grid: { cell: mm(8.5), fontFamily: TEXT, rule: col('rule'), color: col('ink') },
  marginTop: mm(7), marginBottom: mm(1), itemSpacing: em(0.4),
};

Un solo stile di esercizio, ficha, porta ciò che le dieci schede hanno in comune (il blu dei numeri, i filetti grigi, lo spazio tra gli esercizi), e la riga dell’edizione ci si stende sopra. Ciò che la riga non dice viene dalla lingua: T F, V F, R F, √ ×, ○ × e صح خطأ sono parole del motore stesso, come a) b) c), A. B. C., ア イ ウ e أ ب ج, perciò nessuna edizione le scrive.

#3 · Dai a ogni scrittura i suoi font

script.js · righe 27–32nel codice completo
const FACES = {
  zh: { text: 'Noto Serif SC', label: 'Noto Sans SC' },
  ja: { text: 'Klee One', label: 'Noto Sans JP' },
  ar: { text: 'Noto Naskh Arabic', label: 'Baloo Bhaijaan 2' },
}[LANG] ?? { text: 'Nunito', label: 'Baloo 2' };
const [TEXT, LABEL] = [FACES.text, FACES.label];

Le edizioni in alfabeto latino condividono Nunito e Baloo 2. La scheda cinese compone il testo in Song e le consegne in Hei; quella giapponese il testo in Klee One, un carattere da libro di testo, e le consegne in un bastoni giapponese (gothic); quella araba usa Noto Naskh Arabic. Il peso più nero di Klee One è il 600, quindi l’edizione giapponese mette il suo grassetto a 600 (boldFontWeight): un 700 lo disegnerebbe il browser e la cattura fallirebbe.

#4 · Apri la scheda con le righe per il nome

script.js · righe 91–110nel 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(10),
    fontWeight: 700, color: col('muted'), align: 'left', placement: at('container', 'top-left',
      x, 28) },
  { kind: 'rule', id: `${id}-line`, direction: 'horizontal', thickness: pt(0.75),
    color: col('rule'), placement: at('container', 'top-left', x + 16, 33, { width: mm(width) }) },
];
const head = { enabled: true, minHeight: mm(38), slot: { elements: [
  { kind: 'box', id: 'band', style: { backgroundColor: col('accent'), borderRadius: mm(3) },
    placement: at('container', 'top-left', 0, 0, { width: 'fill', height: mm(21) }) },
  { kind: 'text', id: 'kicker', content: '{title} · {subtitle}', fontFamily: LABEL,
    fontSize: pt(8.5), fontWeight: 700, color: col('tint'), align: 'left',
    placement: at('container', 'top-left', 6, 3.5) },
  { kind: 'text', id: 'title', content: '{titleText}', fontFamily: LABEL, fontSize: pt(22),
    fontWeight: 700, color: col('paper'), align: 'left', lineHeight: 1.1,
    placement: at('container', 'top-left', 6, 9.5) },
  ...field('name', 'nombre', 0, 96), ...field('date', 'fecha', 120, 40),
] } };

Il titolo di livello 1 disegna la fascia, il corso preso dal frontmatter e il titolo, più due campi con una riga le cui parole vengono dagli attributi del titolo (nombre="Nome" fecha="Data"). Così la scheda tedesca dice Datum e quella giapponese 名前 senza una stringa nel codice.

La ricetta completa

Sandbox
// ═══ Postext Cookbook · Nº 169 · One worksheet in ten school traditions ═════════
// https://postext.dev/en/cookbook/school-traditions-worksheet
// Code: MIT · Text: original (CC BY 4.0) · Pictures: none
// Fonts: Nunito, Baloo 2, Klee One, Noto Naskh Arabic and others (SIL OFL) · Needs postext ≥ 1.59.0
import {
  buildDocument, withLoadedFonts, renderPageToCanvas,
} from 'https://esm.sh/postext';
import { renderToPdf, decompressWoff2 } from 'https://esm.sh/postext-pdf';

const LANG = 'it'; // @lang: the language of the worksheet (en es ca fr de it pt zh ja ar)
const RECIPE = 'school-traditions-worksheet';

// ─── 1 · Design ─────────────────────────────────────────────────────────────
// #region palette: a blue-black ink, one blue accent, a pale tint, grey rules
const palette = {
  ink: '#1d2633', accent: '#2a5d9f', tint: '#e8f0fa', rule: '#a9b6c6', muted: '#5d6878',
  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

// #region faces: Latin editions share two faces; Chinese, Japanese and Arabic their own
const FACES = {
  zh: { text: 'Noto Serif SC', label: 'Noto Sans SC' },
  ja: { text: 'Klee One', label: 'Noto Sans JP' },
  ar: { text: 'Noto Naskh Arabic', label: 'Baloo Bhaijaan 2' },
}[LANG] ?? { text: 'Nunito', label: 'Baloo 2' };
const [TEXT, LABEL] = [FACES.text, FACES.label];
// #endregion

// #region answer: the form of the exercises, as each country's school books set them
// The Markdown of every edition has the same seven exercises. What changes is this table:
// how the number prints, how options are labelled and answered, how true/false reads, where
// a blank is written, the paper of the open answer and the layout of long division.
const disc = { shape: 'disc' };
const square = { shape: 'square' };
const bare = { shape: 'none', suffix: '.' };
const TRADITIONS = {
  es: { number: disc, options: { marker: 'none' }, trueFalse: { look: 'boxes' },
    blank: { look: 'line' }, area: { kind: 'lines' }, arithmetic: { division: 'potence' } },
  fr: { number: square, options: { marker: 'box' }, trueFalse: { look: 'boxes' },
    blank: { look: 'dots' }, area: { kind: 'seyes', spacing: mm(8) },
    arithmetic: { division: 'potence' } },
  de: { number: square, options: { marker: 'box' }, trueFalse: { look: 'boxes' },

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

#Stampa la copia dell’insegnante

Ogni risposta va al suo posto in magenta: le parentesi, le caselle, gli spazi e il quoziente.

   exerciseStyles: [ficha],
+  exercises: { edition: 'teacher' },

#Raccogli le soluzioni in fondo alla scheda

placement: 'after' mette la chiave di ogni esercizio sotto di esso; 'inverted' la capovolge, come nelle pagine di enigmistica.

+  exercises: { solutions: { placement: 'inverted', layout: 'key' } },

Errori frequenti

  • Un font senza peso 700 rende sintetico il grassetto dei numeri delle consegne. Dai a quel font di testo un boldFontWeight con un peso che possiede.
  • Il ○ delle consegne giapponesi e il √ di quelle cinesi esistono solo nei font CJK: mettili in una frase del testo CJK, non in un’etichetta latina.

Crediti

Testo
Testo originale, CC BY 4.0
Font
Nunito (SIL OFL 1.1) · Baloo 2 (SIL OFL 1.1) · Noto Serif SC (SIL OFL 1.1) · Noto Sans SC (SIL OFL 1.1) · Klee One (SIL OFL 1.1) · Noto Sans JP (SIL OFL 1.1) · Noto Naskh Arabic (SIL OFL 1.1) · Baloo Bhaijaan 2 (SIL OFL 1.1)
SandboxPDF