En bref
Les pages d’un cahier d’arabe pour enfants sur un jardin d’école : choisir la réponse, relier les colonnes, compléter avec une boîte de mots, cocher vrai ou faux, remettre des mots en ordre, trouver des mots dans une grille.
Ce que vous allez composer
Une unité d’un cahier d’arabe de CE1 sur une page de 17 × 24 cm, autour d’un jardin d’école. Elle s’ouvre sur un bandeau d’aquarelle, avec l’onglet et le titre de l’unité et une ligne pointillée pour le nom, la classe et la date. Suivent les exercices qu’imprime un manuel arabe du primaire : choisir la bonne réponse, avec أ) ب) ج) par trois sur une ligne ; relier les deux colonnes ; compléter les trous à partir d’une banque de mots ; cocher صح ou خطأ ; remettre les mots en ordre et écrire la phrase sur la ligne ; trouver sept mots du jardin dans une grille de lettres. Les solutions ferment l’unité. Le même texte est composé deux fois : l’édition du Machrek numérote tout en chiffres arabes orientaux, ١ ٢ ٣, et celle du Maghreb en chiffres européens. Les deux se lisent depuis la droite et sont reliées à droite.
Cette recette répond à
- Comment composer un cahier d'exercices arabe de droite à gauche : colonnes à relier, banque de mots, mots mêlés et chiffres indo-arabes ?
- Comment composer une page de cahier d'activités : numéros en pastille, banque de mots, vrai ou faux, relie ?
- Comment faire des mots mêlés ou des mots croisés à partir d'une liste de mots ?
La réponse courte
// 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' } };
Ingrédients
- Fonctionnalités
- ExercicesTexte de droite à gaucheChiffres des nombres générésStyles d'exerciceChoix et vrai ou fauxTextes à trous et banques de motsRelier et classerRemettre dans l'ordreMots mêlés et mots croisésCorrigésPolices arabesStyles de numérotation arabesLivres reliés à droitePastilles dans le texteEncadrésOuvertures composéesAttributs de titreImages dans les maquettes de pagePalette de couleurs sémantiqueExport PDF
- Utilise aussi
- Encadrés qui se coupent ou restent entiersÉquilibrage des colonnesQuestions ouvertes et zones d'écritureTitres courants selon le rôle de la pageStyles de paragraphePolices intégrées au PDFFigures et tableaux comme ressources
- Typographie
- Noto Naskh Arabic, Baloo Bhaijaan 2 (SIL OFL 1.1)
- Ressources
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)
Préparation
#1 · Ne nommer aucun côté
Le code est dans la réponse courte plus haut. locale: 'ar' compose le texte de droite à gauche, relie le livre à droite et choisit les chiffres. Le style d’exercice prend dans la langue les lettres abjad des options, et صح et خطأ pour le vrai ou faux. Les colonnes à relier, la banque de mots, les mots mêlés et les lignes d’écriture sont dessinés comme des maquettes d’encadré, qu’une page de droite à gauche met en miroir : la première colonne se place à droite, un mot lu en travers de la grille va de droite à gauche, et les points à relier se font face au milieu.
#2 · L’ouverture du jardin
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 peinture est ancrée à la page et garde sa place. L’onglet et le titre sont posés dans le flux de la page, où left est le début de la ligne : ils se placent donc à droite sans coordonnée propre. Les folios restent physiques, comme les titres courants, et nomment chaque côté.
#3 · Deux éditions, deux jeux de chiffres
// 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 configuration est une fonction : chaque composition reçoit donc son propre objet, et la seconde ne change que la locale. ar-MA écrit en chiffres européens les numéros des exercices, les items, le corrigé et les folios, et laisse tout le reste en l’état : la direction, la reliure, les lettres abjad et les mots du corrigé.
La recette complète
// ═══ 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 },
Le script.js composé s’exécute tel quel : collez-le dans le script de module de n’importe quelle page, ou ouvrez la recette sur CodePen. Dossier de la recette sur GitHub ↗ (s’ouvre dans un nouvel onglet)
Variantes
#Imprimer le livre du maître
Les réponses s’impriment alors à leur place, dans la couleur de answers : les points reliés, les mots dans leurs trous, les bonnes cases remplies et les mots entourés dans la grille.
-const exercises = { solutions: { placement: 'directive' } };
+const exercises = { edition: 'teacher', solutions: { placement: 'none' } };#Écrire les exercices en chinois
Le cahier d’exercices chinois compose les mêmes types d’exercice avec ses propres parenthèses et ses chiffres chinois.
Erreurs fréquentes
Erreur fréquente
Balisez un livre arabe 'ar', pas avec LANG
Les éditions d’une recette sont en et es, mais un exemple arabe est en arabe dans les deux : `locale: LANG` le composerait de gauche à droite, le relierait à gauche, numéroterait ses pages 1 2 3 et légenderait ses figures Figure ou Figura. Depuis postext 1.30, la balise est aussi la langue dans laquelle le texte est mis en forme (mesuré, peint et incorporé) : sous une balise anglaise ou espagnole, une police comme Markazi Text ne dessine pas les formes arabes de ses guillemets et de ses points, et les lignes se coupent ailleurs. Écrivez la balise vous-même : 'ar' (chiffres arabes orientaux, convention du Machrek), une région comme 'ar-EG' ou 'ar-SA', ou 'ar-MA', 'ar-DZ' ou 'ar-TN' pour une édition maghrébine avec chiffres européens. Une page latine qui ne fait que citer de l’arabe garde sa propre langue. Texte de droite à gauche →
Erreur fréquente
Les polices arabes ont besoin de leur fichier arabic, avec le bloc arabic
Fontsource sert Amiri, Noto Naskh Arabic ou Scheherazade New sous la forme d’un fichier par sous-ensemble, et les lettres arabes se trouvent dans le fichier arabic. loadFonts ne récupère que latin (et latin-ext) : à l’écran, l’arabe vient d’une police système et est mal mesuré, et fontsourceProvider remet ce fichier latin au PDF, qui imprime des cases vides. Listez le bloc arabic du kit, appelez loadArabicFonts(FONTS, markdown) après loadFonts, avec dans FONTS chaque graisse que les pages composent en arabe, et donnez à renderToPdf fontProvider: arabicPdfProvider. Polices arabes →
- La plupart des polices arabes n’ont ni ✓ ni ✗ : le vrai et le faux s’écrivent صح et خطأ, et la consigne demande une marque dans la case.
- Les mots mêlés remplissent leurs cases vides avec les lettres de leurs propres mots, sous leur forme isolée. Choisissez des mots aux lettres variées, sinon la grille se remplit de ة.
Crédits
- Recette
- Ignacio Ferro
- Texte
- Texte original, CC BY 4.0
- Images
- 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
- Polices
- Noto Naskh Arabic (SIL OFL 1.1) · Baloo Bhaijaan 2 (SIL OFL 1.1)
Modifier ce texte ↗ (s’ouvre dans un nouvel onglet)Dossier de la recette sur GitHub ↗ (s’ouvre dans un nouvel onglet)


