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
// 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
- Funcions
- Estils d'exerciciOperacions en columnaElecció i vertader o falsExercicisBuits i bancs de paraulesUnir i classificarPreguntes obertes i zones d'escripturaObertures dissenyadesAtributs de títolPaleta de color semànticaFonts xineses, japoneses i coreanesFonts àrabsLlibres enquadernats per la dretaText de dreta a esquerraPartició de mots i llengua del documentPàgines en un canvasExportació a PDF
- També fa servir
- SolucionsEstils de paràgrafFonts incrustades al PDF
- 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
// 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
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
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
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
// ═══ 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
boldFontWeightamb 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
- Recepta
- Ignacio Ferro
- 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)
- Codi
- MIT, com Postext
Editar aquest text ↗ (s'obre en una pestanya nova)Carpeta de la recepta a GitHub ↗ (s'obre en una pestanya nova)


