En poques paraules
Pàgines d’un quadern àrab per a infants sobre un hort escolar: triar la resposta, unir columnes, omplir buits, marcar vertader o fals, ordenar paraules i trobar-les en una sopa de lletres.
Què compondràs
Una unitat d’un quadern d’àrab de segon en una pàgina de 17 × 24 cm, sobre un hort escolar. S’obre amb una franja d’aquarel·la, la pestanya i el títol de la unitat i una línia de punts per al nom, la classe i la data. Després venen els exercicis que imprimeix un llibre de primària àrab: triar la resposta correcta, amb أ) ب) ج) de tres en tres; unir les dues columnes; omplir els buits amb un requadre de paraules; marcar صح o خطأ; ordenar les paraules i escriure la frase a la línia; trobar set paraules de l’hort en una sopa de lletres. Les solucions tanquen la unitat. El mateix text es compon dues vegades: l’edició del Màixriq ho numera tot amb xifres arabicoíndiques, ١ ٢ ٣, i la del Magrib amb xifres europees. Totes dues es llegeixen des de la dreta i s’enquadernen per la dreta.
Aquesta recepta respon a
- Com componc un quadern d'exercicis àrab de dreta a esquerra: columnes per unir, un requadre de paraules, una sopa de lletres i xifres aràbigues orientals?
- Com componc una pàgina de quadern d'activitats: números en cercles, banc de paraules, vertader o fals, uneix amb fletxes?
- Com faig una sopa de lletres o uns mots encreuats a partir d'una llista de paraules?
La resposta curta
// The locale sets the direction, the binding and the digits: 'ar' writes the exercise
// numbers, the items and the key in Arabic-Indic digits (١ ٢ ٣), 'ar-MA' in European ones.
// Options take the abjad letters (أ ب ج), true/false the words صح / خطأ, both from the
// language. Nothing below names a side: the engine sets every part from the right.
const tamrin = {
id: 'tamrin',
number: { shape: 'disc', fontFamily: LABEL, background: col('accent') },
instruction: { fontFamily: LABEL, bold: false, color: col('ink') },
options: { layout: 'row' }, // أ) ب) ج) side by side, three to a row (columns=3)
blank: { look: 'dots', color: col('muted') }, // a dotted line, as Arab workbooks print it
match: { color: col('accent') },
bank: { box: 'sunduq', order: 'shuffle' },
area: { kind: 'lines', color: col('rule') },
grid: { fontFamily: TEXT, rule: col('leaf'), uppercase: false }, // Arabic has no capitals
answers: { color: col('leaf'), fontFamily: TEXT },
solutions: { box: 'hulul' },
marginTop: em(1.1), marginBottom: em(0.5),
};
// The solutions where :::solutions stands: at the end of the unit.
const exercises = { solutions: { placement: 'directive' } };
Ingredients
- Funcions
- ExercicisText de dreta a esquerraXifres dels números generatsEstils d'exerciciElecció i vertader o falsBuits i bancs de paraulesUnir i classificarOrdenarSopes de lletres i mots encreuatsSolucionsFonts àrabsEstils de numeració àrabsLlibres enquadernats per la dretaChips en líniaRequadresObertures dissenyadesAtributs de títolImatges als dissenys de pàginaPaleta de color semànticaExportació a PDF
- També fa servir
- Requadres que es parteixen o noEquilibri de columnesPreguntes obertes i zones d'escripturaCapçaleres segons el tipus de pàginaEstils de paràgrafFonts incrustades al PDFFigures i taules com a recursos
- Tipografia
- Noto Naskh Arabic, Baloo Bhaijaan 2 (SIL OFL 1.1)
- Recursos
garden-1600.jpg- A school garden in an Arab town: date palms, a fountain, lemon trees, a girl watering plants and a boy carrying a pot of mint. (Generated With Diffusion Models, original)
Elaboració
#1 · No anomenis cap costat
El codi és a la resposta curta. locale: 'ar' posa el text de dreta a esquerra, enquaderna el llibre per la dreta i tria les xifres; l’estil d’exercici pren de la llengua les lletres abjad de les opcions i صح i خطأ per al vertader o fals. Les columnes per unir, el requadre de paraules, la sopa de lletres i les línies d’escriptura es dibuixen com a dissenys de requadre, que una pàgina de dreta a esquerra reflecteix: la primera columna queda a la dreta, una paraula horitzontal de la sopa es llegeix de dreta a esquerra i els punts d’unir es miren al centre.
#2 · L’obertura de l’hort
const BAND = 170 / 2.4; // mm: the painting's height at the page's width
const opener = { enabled: true, minHeight: mm(BAND - 20 + 21), slot: { elements: [
{ kind: 'image', id: 'picture', resourceId: '{attr.pic}', decorative: true, reserve: false,
placement: { anchor: { to: 'page', edge: 'top-left' },
size: { width: mm(170), height: mm(BAND) } } },
// In the flow of a right-to-left page 'left' is the start of the line: the right.
{ kind: 'text', id: 'unit', content: '{attr.kicker}', fontFamily: LABEL, fontSize: pt(11),
fontWeight: 700, color: col('paper'), align: 'left',
box: { backgroundColor: col('accent'), borderRadius: mm(1.5),
padding: { top: mm(0.6), bottom: mm(0.4), left: mm(2.4), right: mm(2.4) } },
placement: { anchor: { to: 'container', edge: 'top-left' },
offset: { x: mm(0), y: mm(BAND - 20 + 3) } } },
{ kind: 'text', id: 'title', content: '{titleText}', fontFamily: LABEL, fontSize: pt(30),
fontWeight: 700, color: col('ink'), align: 'left',
placement: { anchor: { to: '#unit', edge: 'right-of' }, offset: { x: mm(4), y: mm(-5) } } },
] } };
La pintura s’ancora a la pàgina i conserva el seu lloc. La pestanya i el títol es col·loquen en el flux de la pàgina, on left és el començament de la línia, de manera que queden a la dreta sense coordenades pròpies. Els folis, com les capçaleres, són físics i anomenen cada costat.
#3 · Dues edicions, dos jocs de xifres
// Both are bound on the right and read from the right; only the locale changes.
const build = () => withLoadedFonts(() => buildDocument({ markdown, resources }, config()),
{ ...kitFonts(FONTS), text: markdown });
const mashriq = await build();
edition = { locale: 'ar-MA' }; // the same book for Morocco: European digits, still right to left
const docs = [mashriq, await build()];
La configuració és una funció, així que cada composició rep el seu propi objecte, i la segona només canvia la llengua. ar-MA escriu amb xifres europees els números dels exercicis, dels apartats, de les solucions i dels folis, i deixa tota la resta com era: la direcció, l’enquadernació, les lletres abjad i les paraules de les solucions.
La recepta completa
// ═══ Postext Cookbook · Nº 173 · An Arabic workbook, right to left ═══════════════
// https://postext.dev/en/cookbook/arabic-workbook-rtl
// Code: MIT · Text: original (CC BY 4.0) · Pictures: generated with diffusion models
// Fonts: Noto Naskh Arabic, Baloo Bhaijaan 2 (SIL OFL 1.1) · Needs postext ≥ 1.59.0
import {
buildDocument, withLoadedFonts, renderPageToCanvas, registerResourceImage,
} from 'https://esm.sh/postext';
import { renderToPdf, decompressWoff2 } from 'https://esm.sh/postext-pdf';
const LANG = 'ar'; // @lang: the language of the frame; the workbook is Arabic in all
const RECIPE = 'arabic-workbook-rtl';
// ─── 1 · Design ─────────────────────────────────────────────────────────────
// #region palette: a garden workbook: ink, a terracotta accent, a leaf green, sand
const palette = {
ink: '#22282e', // text
accent: '#b9542a', // the one accent: exercise numbers, the unit tab, the word bank
leaf: '#4f7d3a', // the second: rules and the word search's ruling
sand: '#f8eedf', // the bank's ground, the answers box
rule: '#c8b49b', // writing lines
muted: '#6f655c', // folios, the name line, the colophon
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
// Naskh for the text, a rounded Arabic for the labels a child reads first.
const [TEXT, LABEL] = ['Noto Naskh Arabic', 'Baloo Bhaijaan 2'];
// #region answer: one exercise style read right to left, in the edition's digits
// The locale sets the direction, the binding and the digits: 'ar' writes the exercise
// numbers, the items and the key in Arabic-Indic digits (١ ٢ ٣), 'ar-MA' in European ones.
// Options take the abjad letters (أ ب ج), true/false the words صح / خطأ, both from the
// language. Nothing below names a side: the engine sets every part from the right.
const tamrin = {
id: 'tamrin',
number: { shape: 'disc', fontFamily: LABEL, background: col('accent') },
instruction: { fontFamily: LABEL, bold: false, color: col('ink') },
options: { layout: 'row' }, // أ) ب) ج) side by side, three to a row (columns=3)
blank: { look: 'dots', color: col('muted') }, // a dotted line, as Arab workbooks print it
match: { color: col('accent') },
bank: { box: 'sunduq', order: 'shuffle' },
area: { kind: 'lines', color: col('rule') },
grid: { fontFamily: TEXT, rule: col('leaf'), uppercase: false }, // Arabic has no capitals
answers: { color: col('leaf'), fontFamily: TEXT },
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 el llibre del professor
Les respostes s’imprimeixen llavors al seu lloc, amb el color d’answers: els punts units, les paraules als seus buits, les caselles correctes plenes i les paraules encerclades a la sopa.
-const exercises = { solutions: { placement: 'directive' } };
+const exercises = { edition: 'teacher', solutions: { placement: 'none' } };#Escriu els exercicis en xinès
El quadern d’exercicis xinès compon els mateixos tipus d’exercici amb els seus propis parèntesis i numerals.
Errors freqüents
Error freqüent
Etiqueta un llibre àrab 'ar', no amb LANG
Les edicions d'una recepta són en i es, però una mostra àrab és àrab en totes dues: `locale: LANG` la compondria d'esquerra a dreta, l'enquadernaria per l'esquerra, numeraria les seves pàgines 1 2 3 i anomenaria Figure o Figura les seves figures. Des de postext 1.30 l'etiqueta és a més la llengua en què es compon el text (en què es mesura, es pinta i s'incrusta), de manera que sota una etiqueta anglesa o castellana una font com Markazi Text no dibuixa les formes àrabs de les cometes angulars i dels punts, i les línies es parteixen per un altre lloc. Escriu tu l'etiqueta: 'ar' (xifres aràbigo-índiques, la convenció del Màixriq), una regió com 'ar-EG' o 'ar-SA', o 'ar-MA', 'ar-DZ' o 'ar-TN' per a una edició magribina amb xifres europees. Una pàgina llatina que només cita àrab conserva el seu propi locale. Text de dreta a esquerra →
Error freqüent
Les fonts àrabs necessiten el seu fitxer arabic, amb el bloc arabic
Fontsource serveix Amiri, Noto Naskh Arabic o Scheherazade New en un fitxer per subconjunt, i les lletres àrabs són al fitxer arabic. loadFonts només baixa latin (i latin-ext), de manera que a la pantalla l'àrab surt d'una font del sistema i es mesura malament, i fontsourceProvider lliura al PDF aquell fitxer latin, que imprimeix caixes buides. Afegeix el bloc arabic del kit, crida loadArabicFonts(FONTS, markdown) després de loadFonts, amb tots els pesos que les pàgines fan servir en àrab llistats a FONTS, i passa a renderToPdf fontProvider: arabicPdfProvider. Fonts àrabs →
- La majoria de les lletres àrabs no tenen ✓ ni ✗: les paraules de vertader o fals són صح i خطأ, i l’enunciat demana una marca a la casella.
- La sopa de lletres omple les caselles buides amb lletres de les seves pròpies paraules, en la forma aïllada. Tria paraules de lletres variades o la quadrícula s’omplirà de ة.
Crèdits
- Recepta
- Ignacio Ferro
- Text
- Text original, CC BY 4.0
- Imatges
- A school garden in an Arab town: date palms, a fountain, lemon trees, a girl watering plants and a boy carrying a pot of mint. · Generated With Diffusion Models · original
- Fonts
- 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)


