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
// `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
- Funzionalità
- SoluzioniStili di esercizioTesto verticaleEserciziOperazioni in colonnaSpazi vuoti e banche di paroleScelta e vero o falsoDomande aperte e spazi di scritturaKana, kanji e rōmajiFont cinesi, giapponesi e coreaniLinee laterali (bōsen)Libri rilegati a destraChip in lineaTre o più colonneAperture progettateAttributi dei titoliImmagini nei progetti di paginaAncoraggio degli elementi del progettoTavolozza di colori semanticaEsportazione in PDF
- Usa anche
- Colonne in un riquadro o nel testoRiquadri che si dividono o restano interiDivisione in righe del cineseBilanciamento delle colonneStili di paragrafoFont incorporati nel PDFFigure e tabelle come risorse
- Tipo
- Klee One, Zen Maru Gothic (SIL OFL 1.1)
- Risorse
kitsune-600.jpgtanuki-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
// 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
// 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
// ═══ 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: 600tiene ogni grassetto in un taglio che esiste, compresi i numeri delle domande e degli esercizi.
Crediti
- Ricetta
- Ignacio Ferro
- 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)
- Codice
- MIT, come Postext
Modifica questo testo ↗ (si apre in una nuova scheda)Cartella della ricetta su GitHub ↗ (si apre in una nuova scheda)


