Aller au contenu principal
Recette numéro 173

Recettes · Chapitre 12 · Manuels scolaires

Un cahier d’exercices arabe, de droite à gauche

Un cahier d’arabe du primaire composé de droite à gauche : choix أ ب ج, colonnes à relier, banque de mots, cases صح ou خطأ, mots mêlés et chiffres orientaux.

Sur cette page
Sortie
Canvas · PDF
Postext
Testé avec Postext 1.59.0
Nécessite ≥ 1.59.0 · postext-pdf ≥ 1.59.0
Licence
Mis à jour le 24 oct. 2026
Code MIT · Texte CC BY 4.0

p. ١ · 1 sur 8

  • Exemple en langue étrangère : pas encore d’édition française
  • Format 170 × 240 mm
  • 1 colonne
  • Noto Naskh Arabic 13/22
  • Baloo Bhaijaan 2
  • 8 pages
  • Niveau
  • Postext 1.59.0
  • Mis en page en 126 ms
  • 149 lignes de code

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

script.js · lignes 34–53dans le code complet
// 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

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

script.js · lignes 58–73dans le code complet
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

script.js · lignes 227–232dans le code complet
// 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

Sandbox
// ═══ 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

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)
Sandbox