Saltar al contingut principal
Recepta número 169

Receptari · Capítol 12 · Llibres de text

Una fitxa en deu tradicions escolars

Les mateixes set tanques :::exercise en deu llengües, cada edició impresa amb un estil d’exercici que segueix els llibres escolars del seu país.

En aquesta pàgina
Sortida
Canvas · PDF
Nivell
Intermedi
Postext
Provada amb Postext 1.59.0
Requereix ≥ 1.59.0 · postext-pdf ≥ 1.59.0
Llicència
Actualitzada el 24 d’oct. del 2026
Codi MIT · Text CC BY 4.0
  • Format 210 × 297 mm
  • 1 columna
  • Nunito 12/18
  • Baloo 2
  • 2 pàgines
  • Nivell
  • Postext 1.59.0
  • Compost en 92 ms
  • 154 línies de codi

En poques paraules

Una fitxa de Ciències i Matemàtiques de dues pàgines sobre el cicle de l’aigua, feta deu vegades. Les preguntes són les mateixes; els números, les caselles, les ratlles i la divisió es veuen com als llibres de cada país.

Què compondràs

La fitxa 7 d’un curs de Ciències i Matemàtiques de 4t de Primària, L’aigua, de viatge, en deu edicions. Les preguntes són les mateixes en totes les llengües: triar una resposta, marcar vertader o fals, completar amb un banc de paraules, unir paraules amb el seu significat, encerclar una paraula, repartir l’aigua d’un dipòsit i explicar per què cal estalviar-la. Cada edició les imprimeix com ho fan les seves escoles. Les fitxes catalana i castellana posen el número dins d’un cercle, marquen V o F i divideixen amb el divisor en una caixa a la dreta del dividend. La francesa fa servir quadrats, cases à cocher, buits de punts i paper Seyès per a la resposta. L’alemanya escriu R i F, Lückentext i 864 : 4 = en una línia, amb la multiplicació amb punt. La brasilera demana V o F entre parèntesis. L’anglesa divideix sota la caseta ⟌. La xinesa numera les seccions 一、二、, posa ( ) després de cada enunciat amb A. B. C. en fila, demana √ o × i acaba amb 看拼音,写词语 en quadres 田字格. La japonesa ofereix ア イ ウ i ○ ×, i l’àrab va de dreta a esquerra amb أ ب ج i صح o خطأ.

Aquesta recepta respon a

  • Com componc la mateixa fitxa tal com els llibres escolars de cada país componen els exercicis?
  • Com componc la divisió llarga tal com l'escriuen les escoles de cada país?
  • Com componc preguntes d'examen xinès: un parèntesi ( ) després de l'enunciat i les opcions A. B. C. D. en una fila?

La resposta curta

script.js · línies 36–69al codi complet
// 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

Ingredients

Tipografia
Nunito, Baloo 2, Noto Serif SC, Noto Sans SC, Klee One, Noto Sans JP, Noto Naskh Arabic, Baloo Bhaijaan 2 (SIL OFL 1.1)
Recursos
Cap: totes les imatges es dibuixen en codi

Elaboració

#1 · Posa cada tradició en una taula

script.js · línies 36–69al codi complet
// 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

Totes les edicions tenen el mateix Markdown: set tanques :::exercise amb les respostes al text (- [x], [[vapor]], - Evaporació -> L'aigua es converteix en vapor, - 864 : 4). El que canvia d’un país a l’altre és la forma, i per això viu en aquesta taula i enlloc més: la figura i les xifres del número, les lletres de les opcions i si l’alumne marca una casella o encercla una lletra, l’aspecte del vertader o fals, el dels buits, la zona d’escriptura i la disposició de la divisió. El català pren la fila del castellà tal com és.

#2 · Posa la tradició sobre l’estil de la casa

script.js · línies 73–87al codi complet
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 sol estil d’exercici, ficha, porta el que comparteixen les deu fitxes (el blau dels números, els filets grisos, l’aire entre exercicis), i la fila de l’edició s’hi estén al damunt. El que la fila no diu ve de la llengua: T F, V F, R F, √ ×, ○ × i صح خطأ són paraules del mateix motor, igual que a) b) c), A. B. C., ア イ ウ i أ ب ج, de manera que cap edició les escriu.

#3 · Dona a cada escriptura les seves fonts

script.js · línies 27–32al codi complet
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];

Les edicions llatines comparteixen Nunito i Baloo 2. La fitxa xinesa compon el text en Song i els enunciats en Hei; la japonesa, el text en Klee One, una lletra de llibre de text, i els enunciats en una gòtica; l’àrab fa servir Noto Naskh Arabic. El tall més gruixut de Klee One és el 600, així que l’edició japonesa posa la negreta a 600 (boldFontWeight): un 700 el dibuixaria el navegador i la captura fallaria.

#4 · Encapçala la fitxa amb ratlles per al nom

script.js · línies 91–110al codi complet
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),
] } };

El títol de nivell 1 dibuixa la banda, el curs pres del frontmatter i el títol, i dos camps amb ratlla les paraules dels quals surten dels atributs del títol (nombre="Nom" fecha="Data"). Per això la fitxa alemanya diu Datum i la japonesa 名前 sense cap cadena al codi.

La recepta 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 = 'ca'; // @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' },

L'script.js compost funciona tal com és: enganxa'l com a script de mòdul en qualsevol pàgina o obre la recepta a CodePen. Carpeta de la recepta a GitHub ↗ (s'obre en una pestanya nova)

Variants

#Imprimeix la còpia del mestre

Cada resposta va al seu lloc en magenta: els parèntesis, les caselles, els buits i el quocient.

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

#Aplega les solucions al peu de la fitxa

placement: 'after' posa la clau de cada exercici a sota seu; 'inverted' la gira de cap per avall, com a les pàgines de passatemps.

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

Errors freqüents

  • Una font sense tall 700 fa sintètica la negreta dels números dels enunciats. Dona a aquesta font de text un boldFontWeight amb un pes que tingui.
  • El ○ dels enunciats japonesos i el √ dels xinesos només són a les fonts CJK: posa’ls en una frase del text CJK, no en una etiqueta llatina.

Crèdits

Text
Text original, CC BY 4.0
Fonts
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