Vai al contenuto principale
Ricetta numero 174

Ricettario · Capitolo 12 · Libri di testo

Una pagina di giochi con le soluzioni capovolte

La pagina di giochi di una rivista per bambini: cruciverba, crucipuzzle, indovinello, storia da riordinare e altro, su schede con le soluzioni capovolte.

In questa pagina
Output
Canvas · PDF
Livello
Intermedio
Postext
Provata con Postext 1.59.0
Richiede ≥ 1.59.0 · postext-pdf ≥ 1.59.0
Licenza
Aggiornata il 24 ott 2026
Codice MIT · Testo CC BY 4.0
  • Esempio in inglese: non c’è ancora un’edizione italiana
  • Formato 210 × 280 mm
  • 2 colonne, Intercolonna di 7 mm
  • Nunito 10,5/15
  • Baloo 2
  • Fredoka
  • 2 pagine
  • Livello
  • Postext 1.59.0
  • Impaginato in 71 ms
  • 129 righe di codice

In breve

La pagina di giochi di una rivista per bambini sul mare. Ogni gioco sta nella sua scheda e le soluzioni sono stampate capovolte sotto: per controllarle, i lettori girano la rivista.

Che cosa comporrai

La pagina di giochi di Splash!, una rivista per bambini sul mare, su due pagine di formato A4 a due colonne. Un dipinto della barriera corallina riempie la parte alta della prima pagina, con il titolo sull’acqua libera. Sotto, ogni gioco sta in una scheda color crema con un numero corallo: un cruciverba costruito con sei animali marini e le loro definizioni, un crucipuzzle che nasconde otto parole in orizzontale, in verticale, in diagonale e al contrario, un indovinello con tre risposte da cerchiare, la vita di una tartaruga da riordinare, una frase in disordine da ricomporre e cuccioli di animali da collegare al loro nome. Sotto ogni gioco, dentro la sua scheda, le soluzioni sono stampate capovolte in piccoli caratteri grigi, come le hanno sempre nascoste le riviste di enigmistica.

Questa ricetta risponde a

  • Come faccio un crucipuzzle o un cruciverba da un elenco di parole?
  • Come stampo le soluzioni capovolte in fondo a un esercizio?

La risposta breve

script.js · righe 33–59nel codice completo
// 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) };

Ingredienti

Tipo
Baloo 2, Nunito, Fredoka (SIL OFL 1.1)
Risorse
  • 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, originale)
  • A baby sea turtle hatching from its egg on the sand. (Generated With Diffusion Models, originale)

Preparazione

#1 · Ogni gioco nella sua scheda, con le soluzioni girate

Il codice è la risposta breve qui sopra. Il box dello stile di esercizio nomina uno stile di riquadro, quindi ogni gioco è composto su una scheda, con il numero in un cerchio e il titolo come prima riga della consegna. placement: 'inverted' mette le soluzioni dopo ogni gioco in un riquadro ruotato di 180°, dentro la scheda, così gioco e soluzioni non finiscono mai su pagine diverse; le griglie e la riga per scrivere restano dentro il margine interno della scheda.

#2 · Lascia che il motore costruisca le griglie

Il Markdown contiene solo le parole: - OCTOPUS: Eight arms and three hearts per il cruciverba, - SHELL per il crucipuzzle. Il motore dispone il cruciverba in modo che ogni parola ne incroci un’altra e numera gli inizi in ordine di lettura. Nasconde le parole del crucipuzzle nelle direzioni indicate dalla direttiva (directions="across down diagonal backwards") e riempie il resto con le lettere delle stesse parole. Entrambe le griglie partono da un seme fisso, quindi sono le stesse a ogni composizione e in ogni output, e l’edizione spagnola costruisce la propria griglia con le proprie parole.

#3 · Una barriera corallina su entrambe le colonne

script.js · righe 63–82nel codice completo
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’apertura occupa entrambe le colonne (span: 'page'), quindi i giochi cominciano sotto il dipinto in ogni colonna. L’immagine è ritagliata sulle proporzioni della fascia e ancorata alla pagina, così esce al vivo in alto e ai lati; il sommario sta in un riquadro scuro per leggersi sopra l’acqua.

La ricetta completa

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),
};

Lo script.js composto funziona così com’è: incollalo nello script modulo di qualsiasi pagina, oppure apri la ricetta su CodePen. Cartella della ricetta su GitHub ↗ (si apre in una nuova scheda)

Varianti

#Nascondi l’elenco di parole

Un crucipuzzle più difficile stampa solo la griglia: aggiungi hidden alla direttiva.

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

#Stampa le soluzioni alla fine della rivista

chapterEnd raccoglie tutte le soluzioni alla fine invece di capovolgerle una per una.

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

Errori frequenti

  • Una parola del cruciverba che non ne incrocia nessun’altra resta fuori e viene segnalata con exerciseWordUnplaced. Scegli parole che abbiano lettere in comune, o aggiungine una che colleghi due gruppi.
  • Una scheda di gioco resta intera, quindi un cruciverba alto passa alla colonna successiva quando non ci sta: controlla l’edizione spagnola, che ha parole più lunghe.

Crediti

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