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
// 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
- Fonctionnalités
- Mots mêlés et mots croisésCorrigésStyles d'exerciceExercicesChoix et vrai ou fauxRelier et classerRemettre dans l'ordreQuestions ouvertes et zones d'écritureEncadrésTrois colonnes ou plusOuvertures composéesAttributs de titreImages dans les maquettes de pageFigures et tableaux comme ressourcesPalette de couleurs sémantiqueExport PDF
- Utilise aussi
- Encadrés qui se coupent ou restent entiersÉquilibrage des colonnesDes figures exactement iciBandeau de chapitre sur toute la largeurTitres courants selon le rôle de la pageStyles de paragraphePolices intégrées au PDFTypes de ressource personnalisés
- Typographie
- Baloo 2, Nunito, Fredoka (SIL OFL 1.1)
- Ressources
hatchling-600.jpgreef-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
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
// ═══ 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
- Recette
- Ignacio Ferro
- 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)
Modifier ce texte ↗ (s’ouvre dans un nouvel onglet)Dossier de la recette sur GitHub ↗ (s’ouvre dans un nouvel onglet)


