Saltar al contingut principal
Recepta número 174

Receptari · Capítol 12 · Llibres de text

Una pàgina de passatemps amb les solucions del revés

La pàgina de passatemps d’una revista infantil: mots encreuats, sopa de lletres, endevinalla i història per ordenar, en targetes amb les solucions del revés.

En aquesta pàgina
Sortida
Canvas · PDF
Nivell
Intermedi
Postext
Provada amb Postext 1.59.0
Requereix ≥ 1.59.0 · postext-pdf ≥ 1.59.0
Llicència
Actualitzada el 24 d’oct. del 2026
Codi MIT · Text CC BY 4.0
  • Mostra en castellà: encara no hi ha edició en català
  • Format 210 × 280 mm
  • 2 columnes, espai entre columnes de 7 mm
  • Nunito 10,5/15
  • Baloo 2
  • Fredoka
  • 2 pàgines
  • Nivell
  • Postext 1.59.0
  • Compost en 85 ms
  • 129 línies de codi

En poques paraules

La pàgina de passatemps d’una revista infantil sobre el mar. Cada passatemps va en la seva targeta, amb les solucions impreses del revés a sota, perquè els lectors girin la revista i les comprovin.

Què compondràs

La pàgina de passatemps de ¡Chapuzón!, una revista infantil sobre el mar, en dues pàgines de mida A4 a dues columnes. Una pintura de l’escull omple la part de dalt de la primera pàgina, amb el títol sobre l’aigua oberta. A sota, cada passatemps va en una targeta crema amb el número en corall: uns mots encreuats fets amb sis animals marins i les seves pistes, una sopa de lletres que amaga vuit paraules en horitzontal, en vertical, en diagonal i del revés, una endevinalla amb tres opcions per encerclar, la vida d’una tortuga per ordenar, una dada remenada i cries d’animals per unir amb el seu nom. Sota cada passatemps, dins la seva targeta, les solucions van del revés en lletra grisa petita, com les han amagat sempre les revistes de passatemps.

Aquesta recepta respon a

  • Com faig una sopa de lletres o uns mots encreuats a partir d'una llista de paraules?
  • Com imprimeixo les solucions cap per avall al peu d'un exercici?

La resposta curta

script.js · línies 33–59al codi 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) };

Ingredients

Tipografia
Baloo 2, Nunito, Fredoka (SIL OFL 1.1)
Recursos
  • 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)

Elaboració

#1 · Cada passatemps en la seva targeta, amb les solucions girades

El codi és la resposta curta de més amunt. El box de l’estil d’exercici anomena un estil de requadre, així que cada passatemps va en una targeta, amb el número en un cercle i el títol com a primera línia de l’enunciat. placement: 'inverted' posa les solucions després de cada passatemps en un requadre girat 180°, dins la targeta, de manera que el passatemps i les solucions mai no cauen en pàgines diferents; les quadrícules i la línia d’escriptura queden dins del marge interior de la targeta.

#2 · Deixa que el motor construeixi les quadrícules

El Markdown només porta les paraules: - PULPO: Ocho brazos y tres corazones per als mots encreuats i - CONCHA per a la sopa de lletres. El motor col·loca els mots encreuats de manera que cada paraula es creui amb una altra i numera els inicis en ordre de lectura. Les paraules de la sopa, les amaga en les direccions que demana l’obertura (directions="across down diagonal backwards") i omple la resta amb lletres de les mateixes paraules. Totes dues fan servir una llavor, així que la quadrícula és la mateixa en cada composició i en cada sortida, i l’edició anglesa construeix la seva amb les seves pròpies paraules.

#3 · Un escull a l’ample de les dues columnes

script.js · línies 63–82al codi 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’obertura ocupa les dues columnes (span: 'page'), així que els passatemps comencen sota la pintura a cada columna. La imatge està retallada a la proporció de la franja i ancorada a la pàgina, de manera que surt a sang per dalt i pels costats; l’entradeta va en una caixa fosca perquè es llegeixi sobre l’aigua.

La recepta 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 = 'es'; // @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),
};

L'script.js compost funciona tal com és: enganxa'l com a script de mòdul en qualsevol pàgina o obre la recepta a CodePen. Carpeta de la recepta a GitHub ↗ (s'obre en una pestanya nova)

Variants

#Amaga la llista de paraules

Una sopa de lletres més difícil imprimeix només la quadrícula: afegeix hidden a l’obertura.

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

#Imprimeix les solucions al final de la revista

chapterEnd reuneix totes les solucions al final en lloc de girar-les una per una.

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

Errors freqüents

  • Una paraula dels mots encreuats que no es creua amb cap altra queda fora i s’avisa amb exerciseWordUnplaced. Tria paraules que comparteixin lletres o afegeix-ne una que uneixi dos grups.
  • Una targeta de passatemps es manté sencera, així que uns mots encreuats alts passen a la columna següent si no hi caben: revisa l’edició espanyola, de paraules més llargues.

Crèdits

Text
Text original, CC BY 4.0
Imatges
  • 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
Fonts
Baloo 2 (SIL OFL 1.1) · Nunito (SIL OFL 1.1) · Fredoka (SIL OFL 1.1)
Sandbox