En pocas palabras
Páginas de un cuaderno árabe infantil sobre un huerto escolar: elegir la respuesta, unir columnas, completar huecos, marcar verdadero o falso, ordenar palabras y buscarlas en una sopa de letras.
Lo que vas a componer
Una unidad de un cuaderno de árabe de segundo en una página de 17 × 24 cm, sobre un huerto escolar. Abre con una franja de acuarela, la pestaña y el título de la unidad y una línea de puntos para el nombre, la clase y la fecha. Luego vienen los ejercicios que imprime un libro de primaria árabe: elegir la respuesta correcta, con أ) ب) ج) de tres en tres; unir las dos columnas; completar los huecos con un recuadro de palabras; marcar صح o خطأ; ordenar las palabras y escribir la frase en la línea; buscar siete palabras del huerto en una sopa de letras. Las soluciones cierran la unidad. El mismo texto se compone dos veces: la edición del Máshrek numera todo con cifras arábigo-índicas, ١ ٢ ٣, y la del Magreb con cifras europeas. Las dos se leen desde la derecha y se encuadernan por la derecha.
Esta receta responde a
- ¿Cómo compongo un cuaderno de ejercicios árabe de derecha a izquierda: columnas para unir, un recuadro de palabras, una sopa de letras y cifras arábigo-índicas?
- ¿Cómo compongo una página de cuaderno de actividades: números en círculos, banco de palabras, verdadero o falso, une con flechas?
- ¿Cómo hago una sopa de letras o un crucigrama a partir de una lista de palabras?
La respuesta corta
// 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' } };
Ingredientes
- Funciones
- EjerciciosTexto de derecha a izquierdaCifras de los números generadosEstilos de ejercicioElección y verdadero o falsoHuecos y bancos de palabrasUnir y clasificarOrdenarSopas de letras y crucigramasSolucionesFuentes árabesEstilos de numeración árabesLibros encuadernados por la derechaChips en líneaRecuadrosAperturas diseñadasAtributos de títuloImágenes en los diseños de páginaPaleta de color semánticaExportación a PDF
- También usa
- Recuadros que se parten o noEquilibrado de columnasPreguntas abiertas y zonas de escrituraCabeceras según el tipo de páginaEstilos de párrafoFuentes incrustadas en el PDFFiguras y tablas como recursos
- Tipografía
- Noto Naskh Arabic, Baloo Bhaijaan 2 (SIL OFL 1.1)
- Recursos
garden-1600.jpg- Un huerto escolar en una ciudad árabe: palmeras, una fuente, limoneros, una niña que riega las plantas y un niño con una maceta de hierbabuena. (Generated With Diffusion Models, original)
Elaboración
#1 · No nombres ningún lado
El código está en la respuesta corta. locale: 'ar' pone el texto de derecha a izquierda, encuaderna el libro por la derecha y elige las cifras; el estilo de ejercicio toma de la lengua las letras abjad de las opciones y صح y خطأ para el verdadero o falso. Las columnas para unir, el recuadro de palabras, la sopa de letras y las líneas de escritura se dibujan como diseños de recuadro, que una página de derecha a izquierda refleja: la primera columna queda a la derecha, una palabra en horizontal en la sopa se lee de derecha a izquierda y los puntos de unir se miran en el centro.
#2 · La apertura del huerto
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 se ancla a la página y conserva su sitio; la pestaña y el título se colocan en el flujo de la página, donde left es el comienzo de la línea, así que quedan a la derecha sin coordenadas propias. Los folios, como las cabeceras, son físicos y nombran cada lado.
#3 · Dos ediciones, dos juegos de cifras
// 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ón es una función, así que cada composición recibe su propio objeto, y la segunda solo cambia la lengua. ar-MA escribe con cifras europeas los números de los ejercicios, de los apartados, de las soluciones y de los folios, y deja todo lo demás como estaba: la dirección, la encuadernación, las letras abjad y las palabras de las soluciones.
La receta 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 },
El script.js compuesto funciona tal cual: pégalo como script de módulo en cualquier página o abre la receta en CodePen. Carpeta de la receta en GitHub ↗ (se abre en una nueva pestaña)
Variantes
#Imprime el libro del profesor
Las respuestas se imprimen entonces en su sitio, con el color de answers: los puntos unidos, las palabras en sus huecos, las casillas correctas rellenas y las palabras rodeadas en la sopa.
-const exercises = { solutions: { placement: 'directive' } };
+const exercises = { edition: 'teacher', solutions: { placement: 'none' } };#Escribe los ejercicios en chino
El cuaderno de ejercicios chino compone los mismos tipos de ejercicio con sus propios paréntesis y numerales.
Errores frecuentes
Error frecuente
Etiqueta un libro árabe 'ar', no con LANG
Las ediciones de una receta son en y es, pero una muestra árabe es árabe en las dos: `locale: LANG` la compondría de izquierda a derecha, la encuadernaría por la izquierda, numeraría sus páginas 1 2 3 y llamaría Figure o Figura a sus figuras. Desde postext 1.30 la etiqueta es además el idioma en el que se compone el texto (en el que se mide, se pinta y se incrusta), así que bajo una etiqueta inglesa o española una fuente como Markazi Text no dibuja las formas árabes de sus comillas angulares y sus puntos, y las líneas se parten por otro sitio. Escribe tú la etiqueta: 'ar' (cifras arábigo-índicas, la convención del Mashriq), una región como 'ar-EG' o 'ar-SA', o 'ar-MA', 'ar-DZ' o 'ar-TN' para una edición magrebí con cifras europeas. Una página latina que solo cita árabe conserva su propio locale. Texto de derecha a izquierda →
Error frecuente
Las fuentes árabes necesitan su archivo arabic, con el bloque arabic
Fontsource sirve Amiri, Noto Naskh Arabic o Scheherazade New en un archivo por subconjunto, y las letras árabes están en el archivo arabic. loadFonts solo descarga latin (y latin-ext), así que en pantalla el árabe sale de una fuente del sistema y se mide mal, y fontsourceProvider entrega al PDF ese archivo latin, que imprime cajas vacías. Añade el bloque arabic del kit, llama a loadArabicFonts(FONTS, markdown) después de loadFonts, con todos los pesos que las páginas usan en árabe listados en FONTS, y pasa a renderToPdf fontProvider: arabicPdfProvider. Fuentes árabes →
- La mayoría de las letras árabes no tienen ✓ ni ✗: las palabras de verdadero o falso son صح y خطأ, y el enunciado pide una marca en la casilla.
- La sopa de letras rellena las casillas vacías con letras de sus propias palabras, en su forma aislada. Elige palabras de letras variadas o la cuadrícula se llenará de ة.
Créditos
- Receta
- Ignacio Ferro
- Texto
- Texto original, CC BY 4.0
- Imágenes
- Un huerto escolar en una ciudad árabe: palmeras, una fuente, limoneros, una niña que riega las plantas y un niño con una maceta de hierbabuena. · Generated With Diffusion Models · original
- Fuentes
- Noto Naskh Arabic (SIL OFL 1.1) · Baloo Bhaijaan 2 (SIL OFL 1.1)
- Código
- MIT, como Postext
Editar este texto ↗ (se abre en una nueva pestaña)Carpeta de la receta en GitHub ↗ (se abre en una nueva pestaña)


