Aller au contenu principal
Recette numéro 174

Recettes · Chapitre 12 · Manuels scolaires

Une page de jeux avec les solutions à l’envers

La page de jeux d’un magazine pour enfants : mots croisés, mots mêlés, devinette et histoire à remettre en ordre, sur des cartes aux solutions à l’envers.

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
  • Exemple en anglais : pas encore d’édition française
  • Format 210 × 280 mm
  • 2 colonnes, Gouttière de 7 mm
  • Nunito 10,5/15
  • Baloo 2
  • Fredoka
  • 2 pages
  • Niveau
  • Postext 1.59.0
  • Mis en page en 71 ms
  • 129 lignes de code

En bref

La page de jeux d’un magazine pour enfants consacré à la mer. Chaque jeu a sa carte, et ses solutions sont imprimées à l’envers dessous : les lecteurs retournent le magazine pour vérifier.

Ce que vous allez composer

La page de jeux de Splash!, un magazine pour enfants consacré à la mer, sur deux pages au format A4 en deux colonnes. Une peinture du récif remplit le haut de la première page, et le titre se pose sur l’eau libre. Dessous, chaque jeu occupe une carte crème avec un numéro corail : des mots croisés construits avec six animaux marins et leurs définitions, une grille de mots mêlés qui cache huit mots à l’horizontale, à la verticale, en diagonale et à rebours, une devinette avec trois réponses à entourer, la vie d’une tortue à remettre dans l’ordre, une phrase en désordre à reconstituer et des bébés animaux à relier à leur nom. Sous chaque jeu, dans sa carte, les solutions sont imprimées à l’envers en petits caractères gris, comme les magazines de jeux les ont toujours cachées.

Cette recette répond à

  • Comment faire des mots mêlés ou des mots croisés à partir d'une liste de mots ?
  • Comment imprimer les réponses à l'envers au pied d'un exercice ?

La réponse courte

script.js · lignes 33–59dans le code complet
// placement 'inverted' sets each puzzle's key after it in a box turned 180°, inside the
// puzzle's card, so a page break never parts a puzzle from its answers. The key is made
// from the puzzle: the crossword's words by number, the ringed option, the right order.
const puzzle = {
  id: 'puzzle',
  box: 'card', // the card each puzzle sits on (a calloutStyles id)
  number: { shape: 'disc', fontFamily: DISPLAY, background: col('coral') },
  instruction: { fontFamily: TEXT, bold: false },
  options: { marker: 'circle', labels: 'none' }, // a ring to colour in, no letters
  grid: { fontFamily: LABEL, rule: col('sea'), cell: em(1.45) },
  match: { color: col('sea') },
  area: { kind: 'lines', color: col('sea') },
  answers: { color: col('coral'), fontFamily: LABEL },
  solutions: { placement: 'inverted', box: 'turned' },
  marginTop: mm(0), marginBottom: mm(0),
};
const card = { id: 'card', title: '', background: col('card'), borderRadius: mm(4),
  padding: { top: mm(3.5), right: mm(4), bottom: mm(3), left: mm(4) },
  titleStyle: { fontFamily: DISPLAY, fontSize: pt(15), fontWeight: 700, color: col('ink') },
  body: { fontFamily: TEXT, fontSize: pt(10.5), lineHeight: pt(15), color: col('ink'),
    firstLineIndent: pt(0) },
  marginTop: mm(0), marginBottom: mm(5), keepTogether: true };
const turned = { id: 'turned', title: '', backgroundEnabled: false, border: { enabled: false },
  padding: { top: pt(0), right: pt(0), bottom: pt(0), left: pt(0) },
  body: { fontFamily: LABEL, fontSize: pt(8.5), lineHeight: pt(11), color: col('muted'),
    firstLineIndent: pt(0) },
  marginTop: mm(2), marginBottom: mm(0) };

Ingrédients

Typographie
Baloo 2, Nunito, Fredoka (SIL OFL 1.1)
Ressources
  • hatchling-600.jpg
  • reef-1600x792.jpg
  • A coral reef with a smiling sea turtle, an octopus, a clownfish, a pufferfish and a seahorse under sunbeams. (Generated With Diffusion Models, original)
  • A baby sea turtle hatching from its egg on the sand. (Generated With Diffusion Models, original)

Préparation

#1 · Chaque jeu sur sa carte, ses solutions retournées

Le code est dans la réponse courte plus haut. Le box du style d’exercice nomme un style d’encadré : chaque jeu est donc composé sur une carte, avec son numéro dans une pastille et son titre en première ligne de la consigne. placement: 'inverted' place les solutions après chaque jeu dans un encadré tourné de 180°, à l’intérieur de la carte, si bien que le jeu et ses solutions ne tombent jamais sur deux pages différentes ; les grilles et la ligne d’écriture restent dans la marge intérieure de la carte.

#2 · Laissez le moteur construire les grilles

Le Markdown ne contient que les mots : - OCTOPUS: Eight arms and three hearts pour les mots croisés, - SHELL pour les mots mêlés. Le moteur dispose les mots croisés de sorte que chaque mot en croise un autre et numérote les débuts dans l’ordre de lecture. Il cache les mots de la grille de mots mêlés dans les directions que nomme la directive (directions="across down diagonal backwards") et remplit le reste avec les lettres de ces mêmes mots. Les deux grilles partent d’une graine fixe : elles sont identiques à chaque composition et dans chaque sortie, et l’édition espagnole construit sa propre grille à partir de ses propres mots.

#3 · Un récif sur les deux colonnes

script.js · lignes 63–82dans le code complet
const BAND = 104; // mm from the top edge: the painting's height at the page's width
const opener = { enabled: true, minHeight: mm(BAND - 16 + 6), slot: { elements: [
  { kind: 'image', id: 'reef', resourceId: 'reef', decorative: true, reserve: false,
    placement: { anchor: { to: 'page', edge: 'top-left' },
      size: { width: mm(210), height: mm(BAND) } } },
  { kind: 'text', id: 'kicker', content: '{attr.kicker}', fontFamily: LABEL, fontSize: pt(11),
    fontWeight: 600, color: col('paper'), textTransform: 'uppercase', letterSpacing: pt(2),
    box: { backgroundColor: col('coral'), borderRadius: mm(2),
      padding: { top: mm(0.8), bottom: mm(0.8), left: mm(2.4), right: mm(2.2) } },
    placement: { anchor: { to: 'page', edge: 'top-left' }, offset: { x: mm(16), y: mm(14) } } },
  { kind: 'text', id: 'title', content: '{titleText}', fontFamily: DISPLAY, fontSize: pt(56),
    fontWeight: 800, lineHeight: 1, color: col('paper'),
    placement: { anchor: { to: '#kicker', edge: 'below' }, offset: { x: mm(0), y: mm(3) } } },
  { kind: 'text', id: 'sub', content: '{attr.sub}', fontFamily: TEXT, fontSize: pt(12),
    fontWeight: 700, color: col('paper'), overflow: 'wrap', align: 'left',
    box: { backgroundColor: col('ink'), borderRadius: mm(2),
      padding: { top: mm(1.5), bottom: mm(1.5), left: mm(3), right: mm(3) } },
    placement: { anchor: { to: '#title', edge: 'below' }, offset: { x: mm(0), y: mm(2) },
      size: { width: mm(110) } } },
] } };

L’ouverture s’étend sur les deux colonnes (span: 'page') : les jeux commencent donc sous la peinture dans chaque colonne. L’image est recadrée aux proportions du bandeau et ancrée à la page, si bien qu’elle part en fond perdu en haut et sur les côtés ; le chapeau est dans un encadré sombre pour rester lisible sur l’eau.

La recette complète

Sandbox
// ═══ Postext Cookbook · Nº 174 · A puzzle page with the answers upside down ═══════
// https://postext.dev/en/cookbook/puzzle-page-upside-down-answers
// Code: MIT · Text: original (CC BY 4.0) · Pictures: generated with diffusion models
// Fonts: Baloo 2, Nunito, Fredoka (SIL OFL 1.1) · Needs postext ≥ 1.59.0
import {
  buildDocumentWithFonts, renderPageToCanvas, registerResourceImage,
} from 'https://esm.sh/postext';
import { renderToPdf, decompressWoff2 } from 'https://esm.sh/postext-pdf';

const LANG = 'en'; // @lang: the language of the sample document ('en' | 'es')
const RECIPE = 'puzzle-page-upside-down-answers';

// ─── 1 · Design ─────────────────────────────────────────────────────────────
// #region palette: reef colours: deep blue ink, coral, sea green, a sandy paper
const palette = {
  ink: '#16324a', // text: a deep sea blue
  coral: '#e8573f', // the accent: puzzle numbers, the title kicker
  sea: '#0f8b8d', // the second: crossword and word-search rules, the riddle's rings
  sun: '#ffc93c', // the turtle card's badge
  card: '#fff4e0', // the puzzle cards
  muted: '#5d7180', // answers, colophon, folio
  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.coral, model: 'hex' } },
];
// #endregion
const [DISPLAY, TEXT, LABEL] = ['Baloo 2', 'Nunito', 'Fredoka'];

// #region answer: every puzzle on a card, its answers turned upside down under it
// placement 'inverted' sets each puzzle's key after it in a box turned 180°, inside the
// puzzle's card, so a page break never parts a puzzle from its answers. The key is made
// from the puzzle: the crossword's words by number, the ringed option, the right order.
const puzzle = {
  id: 'puzzle',
  box: 'card', // the card each puzzle sits on (a calloutStyles id)
  number: { shape: 'disc', fontFamily: DISPLAY, background: col('coral') },
  instruction: { fontFamily: TEXT, bold: false },
  options: { marker: 'circle', labels: 'none' }, // a ring to colour in, no letters
  grid: { fontFamily: LABEL, rule: col('sea'), cell: em(1.45) },
  match: { color: col('sea') },
  area: { kind: 'lines', color: col('sea') },
  answers: { color: col('coral'), fontFamily: LABEL },
  solutions: { placement: 'inverted', box: 'turned' },
  marginTop: mm(0), marginBottom: mm(0),
};

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

#Masquez la liste de mots

Une grille de mots mêlés plus difficile n’imprime que la grille : ajoutez hidden à la directive.

-:::exercise{type=wordsearch size=9 directions="across down diagonal backwards"}
+:::exercise{type=wordsearch size=9 directions="across down diagonal backwards" hidden}

#Imprimez les solutions à la fin du magazine

chapterEnd rassemble toutes les solutions à la fin au lieu de retourner chacune d’elles.

-  solutions: { placement: 'inverted', box: 'turned' },
+  solutions: { placement: 'chapterEnd' },

Erreurs fréquentes

  • Un mot des mots croisés qui ne croise aucun autre mot est laissé de côté et signalé par exerciseWordUnplaced. Choisissez des mots qui partagent des lettres, ou ajoutez-en un qui relie deux groupes.
  • Une carte de jeu reste d’un seul tenant : des mots croisés trop hauts passent donc à la colonne suivante quand ils ne tiennent pas. Vérifiez l’édition espagnole, dont les mots sont plus longs.

Crédits

Texte
Texte original, CC BY 4.0
Images
  • A coral reef with a smiling sea turtle, an octopus, a clownfish, a pufferfish and a seahorse under sunbeams. · Generated With Diffusion Models · original
  • A baby sea turtle hatching from its egg on the sand. · Generated With Diffusion Models · original
Polices
Baloo 2 (SIL OFL 1.1) · Nunito (SIL OFL 1.1) · Fredoka (SIL OFL 1.1)
Sandbox