Vai al contenuto principale
Ricetta numero 172

Ricettario · Capitolo 12 · Libri di testo

Esercizi giapponesi con le soluzioni capovolte

Due pagine di una serie di quaderni di esercizi giapponesi, l’aritmetica in orizzontale e i kanji in colonna, con le soluzioni capovolte sotto ogni esercizio.

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 lingua straniera: non c’è ancora un’edizione italiana
  • Formato 182 × 257 mm
  • 1 colonna
  • Klee One 12/22
  • Zen Maru Gothic
  • 4 pagine
  • Livello
  • Postext 1.59.0
  • Impaginato in 105 ms
  • 137 righe di codice

In breve

Un quaderno di esercizi giapponese: calcoli, caselle, scelte e vero o falso su una pagina, kanji e letture dall’alto in basso su un’altra. Sotto ogni esercizio le soluzioni sono capovolte: il bambino gira il quaderno per controllare.

Che cosa comporrai

Due pagine di una serie di quaderni di esercizi per la terza elementare, in formato B5. La pagina di aritmetica corre in orizzontale: una fascia azzurro chiaro con l’etichetta della materia, il titolo e un tanuki come mascotte, una riga per il nome e una casella per il punteggio, poi le ひっ算 (operazioni in colonna) con una casella per ogni cifra del risultato, caselle dopo sei calcoli, scelte ア イ ウ in fila, affermazioni ○× con una parentesi a fine riga e due problemi con le righe per scrivere i calcoli. La pagina dei kanji è composta come si stampa un quaderno di 国語, dall’alto in basso e da destra a sinistra: letture con una casella per il kanji, parole sottolineate di cui si scrive la lettura tra parentesi, risposte da cerchiare e un significato da scegliere. Sotto ogni esercizio le soluzioni sono stampate capovolte, in caratteri piccoli e grigi. Il bambino vede dove sono, non le legge con uno sguardo e gira il quaderno per controllare.

Questa ricetta risponde a

  • Come stampo le soluzioni capovolte in fondo a un esercizio?
  • Come compongo una pagina di esercizi giapponese in colonne verticali con lo stesso progetto di quella orizzontale?
  • Come compongo la divisione in colonna come la scrivono le scuole di ogni paese?

La risposta breve

script.js · righe 35–55nel codice completo
// `placement: 'inverted'` sets each exercise's key right after it in a box turned 180°: the
// pupil sees where the answers are without reading them, and turns the book to check. The
// key's words come from the exercise (the options' katakana, ○ and ×, the operations), so
// the Markdown holds nothing twice.
const drill = {
  id: 'drill',
  number: { shape: 'square', fontFamily: TEXT, fontWeight: 600, background: col('blue') },
  instruction: { fontFamily: ROUND, bold: false },
  options: { layout: 'row' }, // ア イ ウ side by side (the default labels in Japanese)
  trueFalse: { look: 'bracket' }, // ( ) for ○ or ×
  blank: { look: 'box', width: 'answer', color: col('rule') }, // □ to write in
  area: { kind: 'lines', color: col('rule') },
  grid: { rule: col('rule') },
  solutions: { placement: 'inverted', box: 'kotae' },
  marginTop: em(1.1), marginBottom: em(0.4),
};
const kotae = { id: 'kotae', title: '', backgroundEnabled: false, border: { enabled: false },
  padding: { top: pt(0), right: pt(0), bottom: pt(0), left: pt(0) },
  body: { fontFamily: ROUND, fontSize: pt(8), lineHeight: pt(12), color: col('muted'),
    firstLineIndent: pt(0) },
  marginTop: mm(1), marginBottom: mm(2), keepTogether: true };

Ingredienti

Tipo
Klee One, Zen Maru Gothic (SIL OFL 1.1)
Risorse
  • kitsune-600.jpg
  • tanuki-600.jpg
  • A young tanuki in a yellow school hat holding a big pencil. (Generated With Diffusion Models, originale)
  • A fox cub in a red scarf reading a book. (Generated With Diffusion Models, originale)

Preparazione

#1 · Capovolgi le soluzioni di ogni esercizio

Il codice è nella risposta breve qui sopra. placement: 'inverted' mette le soluzioni dopo ogni esercizio in un riquadro ruotato di 180°, e quel riquadro sta dentro il riquadro dell’esercizio stesso, così un salto di pagina non li separa mai. Le soluzioni nascono dall’esercizio: le operazioni con il risultato, il katakana della risposta giusta, ○ e ×, le parole delle lacune. Lo stile di riquadro delle soluzioni, kotae, si limita a comporre il testo piccolo e grigio.

#2 · Una fascia per la pagina orizzontale e per quella verticale

script.js · righe 59–76nel codice completo
// A heading design on a vertical page is laid along its column: x runs down the page and y
// to the left, so the same band stands at the right edge, from head to foot.
const BAND = 30; // mm: the band's depth (its height across, its width down)
const header = { enabled: true, minHeight: mm(BAND + 3), slot: { elements: [
  { kind: 'box', id: 'band', reserve: false, style: { backgroundColor: col('tint'),
    borderRadius: mm(4) }, placement: { anchor: { to: 'container', edge: 'top-left' },
    size: { width: 'fill', height: mm(BAND) } } },
  { kind: 'image', id: 'mascot', resourceId: '{attr.pic}', decorative: true, reserve: false,
    placement: { anchor: { to: 'container', edge: 'top-right' }, offset: { x: mm(-4), y: mm(1) },
      size: { width: mm(28), height: mm(28) } } },
  { kind: 'text', id: 'subject', content: '{attr.kicker}', fontFamily: ROUND, fontSize: pt(10),
    fontWeight: 700, color: col('ink'), box: { backgroundColor: col('sun'), borderRadius: mm(3),
      padding: { top: mm(0.6), bottom: mm(0.6), left: mm(2.4), right: mm(2.4) } },
    placement: { anchor: { to: 'container', edge: 'top-left' }, offset: { x: mm(5), y: mm(5) } } },
  { kind: 'text', id: 'title', content: '{titleText}', fontFamily: ROUND, fontSize: pt(20),
    fontWeight: 700, color: col('ink'),
    placement: { anchor: { to: '#subject', edge: 'below' }, offset: { x: mm(0), y: mm(2.5) } } },
] } };

Su una pagina verticale, il design di un titolo si dispone lungo la sua colonna: la x scende lungo la pagina e la y va verso sinistra. La fascia ancorata a top-left a tutta larghezza sta in cima alla pagina di aritmetica e lungo il bordo destro di quella dei kanji; la mascotte ancorata a top-right cade all’altro capo della fascia in entrambe. Nessun elemento del design nomina una direzione.

#3 · Due quaderni da un solo testo

script.js · righe 271–279nel codice completo
// Two drill books of one series: arithmetic across, bound on the left; kanji in columns,
// bound on the right (vertical text binds there by itself).
const [sansu, kokugo] = markdown.split(/(?=^# 春のことば)/m);
const build = (text) => withLoadedFonts(() => buildDocument({ markdown: text, resources },
  config()), { ...kitFonts(FONTS), text: markdown });
const across = await build(sansu);
// 国語 is set in columns, top to bottom, right to left: the same design, turned.
writingMode = 'vertical-rl';
const docs = [across, await build(kokugo)];

La configurazione è una funzione, quindi ogni composizione riceve il suo oggetto, e tra le due cambia solo writingMode. In verticale il quaderno di 国語 si rilega a destra da solo; showBook mette ogni quaderno dal suo lato del dorso. Il testo è composto in Klee One, un carattere da libro di scuola, e le etichette in Zen Maru Gothic; entrambi caricano la loro punteggiatura verticale per le parentesi della pagina dei kanji.

La ricetta completa

Sandbox
// ═══ Postext Cookbook · Nº 172 · A Japanese drill with the answers upside down ═══
// https://postext.dev/en/cookbook/japanese-drill-upside-down-answers
// Code: MIT · Text: original (CC BY 4.0) · Pictures: generated with diffusion models
// Fonts: Klee One, Zen Maru Gothic (SIL OFL 1.1) · Needs postext ≥ 1.59.0
import {
  buildDocument, withLoadedFonts, renderPageToCanvas, registerResourceImage,
  loadVerticalAlternates,
} from 'https://esm.sh/postext';
import { renderToPdf, decompressWoff2 } from 'https://esm.sh/postext-pdf';

const LANG = 'ja'; // @lang: the language of the frame; the drill is Japanese in all
const RECIPE = 'japanese-drill-upside-down-answers';

// ─── 1 · Design ─────────────────────────────────────────────────────────────
// #region palette: a drill book's blue, a warm yellow and a pale sky for the band
const palette = {
  ink: '#23272c', // text
  blue: '#2a6cb0', // the accent: exercise numbers, the title band's rule, the score box
  sun: '#f2c14e', // the subject badge
  tint: '#eaf2fb', // the title band
  rule: '#a8bfd8', // writing lines and boxes
  muted: '#69717b', // folios, the name line, the upside-down answers
  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.blue, model: 'hex' } },
];
// #endregion
// 教科書体 for the text a child copies from, a round gothic for the labels.
const [TEXT, ROUND] = ['Klee One', 'Zen Maru Gothic'];

// #region answer: the answers printed upside down under each exercise
// `placement: 'inverted'` sets each exercise's key right after it in a box turned 180°: the
// pupil sees where the answers are without reading them, and turns the book to check. The
// key's words come from the exercise (the options' katakana, ○ and ×, the operations), so
// the Markdown holds nothing twice.
const drill = {
  id: 'drill',
  number: { shape: 'square', fontFamily: TEXT, fontWeight: 600, background: col('blue') },
  instruction: { fontFamily: ROUND, bold: false },
  options: { layout: 'row' }, // ア イ ウ side by side (the default labels in Japanese)
  trueFalse: { look: 'bracket' }, // ( ) for ○ or ×
  blank: { look: 'box', width: 'answer', color: col('rule') }, // □ to write in
  area: { kind: 'lines', color: col('rule') },
  grid: { rule: col('rule') },
  solutions: { placement: 'inverted', box: 'kotae' },

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

#Raccogli le soluzioni alla fine

Un quaderno con il libretto delle soluzioni a parte tiene le risposte fuori dalle pagine: chapterEnd le elenca dopo l’ultimo esercizio.

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

#Componi una pagina di giochi

La pagina di giochi capovolge le soluzioni allo stesso modo, su schede a due colonne.

Errori frequenti

Errore frequente

I caratteri cinesi si caricano a fette, tramite il blocco cjk

Fontsource serve una famiglia cinese, giapponese o coreana come un centinaio di file per peso, ognuno dei quali copre un intervallo di caratteri. loadFonts scarica solo il file latin, così a schermo i caratteri Han vengono da un font di sistema e sono misurati male, e fontsourceProvider passa al PDF quel file latin, che li stampa come riquadri vuoti. Elenca il blocco cjk del kit, chiama loadCjkFonts(FONTS, markdown) dopo loadFonts (una volta per voce tipografica, con il testo che compone, quando il libro usa più caratteri CJK) e passa a renderToPdf fontProvider: cjkPdfProvider: entrambi prendono i file che contengono i caratteri del testo. Font cinesi, giapponesi e coreani →

Errore frequente

Assegna a un testo giapponese il tag 'ja', mai zh-Hans o LANG

Le edizioni di una ricetta sono en ed es, ma un esempio giapponese è giapponese in entrambe: `locale: LANG` gli darebbe il tag inglese o spagnolo, e un tag cinese lo comporrebbe con le regole cinesi (punteggiatura Kaiming, kana piccoli liberi di aprire una riga, 图 per 図, forme cinesi dei glifi nel PDF). Da postext 1.30 il tag è anche la lingua usata per lo shaping del testo (misura, disegno e incorporamento), quindi qualunque tag diverso da 'ja' dà forme dei glifi diverse da quelle giapponesi (quelle cinesi con un tag cinese) e altri a capo. Scrivi 'ja': sceglie la regione Giappone (divisione in righe e punteggiatura JLReq, segni d’enfasi a sesamo, spaziatura dei furigana, etichette 図 e 表) e disattiva la sillabazione. Il lint fa fallire un testo con kana sotto un tag zh o ko. Divisione in righe del giapponese (kinsoku) →

  • Una lettura non può ancora stare sopra uno spazio vuoto: un ruby dentro [[…]] fa parte della risposta nascosta. L’esercizio 漢字の書き取り mette ogni lettura su una riga a sé e la casella subito dopo, tre per fila in un gruppo :::columns; nella pagina verticale la lettura sta accanto alla casella, come i furigana.
  • Klee One ha solo i pesi 400 e 600: boldFontWeight: 600 tiene ogni grassetto in un taglio che esiste, compresi i numeri delle domande e degli esercizi.

Crediti

Testo
Testo originale, CC BY 4.0
Immagini
  • A young tanuki in a yellow school hat holding a big pencil. · Generated With Diffusion Models · originale
  • A fox cub in a red scarf reading a book. · Generated With Diffusion Models · originale
Font
Klee One (SIL OFL 1.1) · Zen Maru Gothic (SIL OFL 1.1)
Sandbox