Pular para o conteúdo principal
Receita número 170

Receitas · Capítulo 12 · Livros didáticos

Contas armadas do jeito de cada país

Uma folha de exercícios cujas contas são linhas - 864 ÷ 4 do Markdown, algarismo por algarismo em quadradinhos, com a divisão armada como em cada país.

Nesta página
Nível
Avançado
Postext
Testada com o Postext 1.59.0
Requer ≥ 1.59.0 · postext-pdf ≥ 1.59.0
Licença
Atualizada em 24 de out. de 2026
Código MIT · Texto CC BY 4.0
  • Amostra em inglês: ainda sem edição em português
  • Refile 210 × 297 mm
  • 1 coluna
  • Fira Sans 12/18
  • Lexend
  • 4 páginas
  • Nível
  • Postext 1.59.0
  • Diagramado em 55 ms
  • 118 linhas de código

Em poucas palavras

Uma página de contas para crianças de nove anos em espanhol, inglês, francês e alemão. Cada país arma a divisão do seu jeito e a folha acompanha; um botão mostra a cópia do professor com todas as respostas.

O que você vai compor

A unidade 3 de um caderno de cálculo do 4º ano, As quatro operações, em quatro edições. Uma fileira de cálculo mental em três colunas, depois contas armadas de somar, subtrair e multiplicar, um algarismo por quadradinho e uma fileira de quadradinhos para o resultado, e por fim divisões e um problema em papel quadriculado. É na divisão que as edições se separam: a folha inglesa põe o divisor do lado de fora do colchete ⟌ e o quociente em cima; a espanhola e a francesa põem o divisor numa chave à direita do dividendo e o quociente embaixo, como no método da chave das escolas brasileiras; a alemã escreve 864 : 4 = numa linha, com espaço embaixo para as contas, e os produtos com um ponto. A vírgula ou o ponto decimal do cálculo mental também segue o idioma. Um botão acima das páginas transforma a folha do aluno na cópia do professor, com cada resposta impressa em laranja no seu quadradinho.

Esta receita responde a

  • Como componho a divisão longa do jeito que as escolas de cada país a escrevem?
  • Como faço o livro do professor, com as respostas impressas no lugar, a partir do livro do aluno?

A resposta curta

script.js · linhas 26–42no código completo
// `- 864 : 4` in the Markdown is one operation; the style sets it digit by digit in squares
// of 7.2 mm, a cell for each figure of the answer. Long division follows the country: the
// divisor in an L right of the dividend in Spain and France (potence), `864 : 4 =` on one
// line in Germany, the bracket ⟌ in English-speaking schools.
const calculo = {
  id: 'calculo',
  number: { shape: 'disc', background: col('accent'), fontFamily: LABEL, fontWeight: 700 },
  instruction: { bold: true, color: col('ink') },
  grid: { cell: mm(9), fontFamily: TEXT, fontSize: pt(15), rule: col('rule'),
    color: col('ink') },
  arithmetic: { columns: 4,
    division: t({ es: 'potence', fr: 'potence', de: 'inline', en: 'bracket' }) },
  blank: { look: 'box', width: em(3.2), color: col('rule'), weight: pt(0.8) },
  area: { kind: 'grid', spacing: mm(5), color: col('rule'), weight: pt(0.4) },
  answers: { color: col('accent'), fontFamily: LABEL }, // the teacher's copy, in the accent
  marginTop: mm(7), marginBottom: mm(2), itemSpacing: em(0.5),
};

Ingredientes

Tipografia
Fira Sans, Lexend (SIL OFL 1.1)
Materiais
Nenhum: todas as imagens são desenhadas em código

Preparo

#1 · Escreva as contas como linhas do Markdown

script.js · linhas 26–42no código completo
// `- 864 : 4` in the Markdown is one operation; the style sets it digit by digit in squares
// of 7.2 mm, a cell for each figure of the answer. Long division follows the country: the
// divisor in an L right of the dividend in Spain and France (potence), `864 : 4 =` on one
// line in Germany, the bracket ⟌ in English-speaking schools.
const calculo = {
  id: 'calculo',
  number: { shape: 'disc', background: col('accent'), fontFamily: LABEL, fontWeight: 700 },
  instruction: { bold: true, color: col('ink') },
  grid: { cell: mm(9), fontFamily: TEXT, fontSize: pt(15), rule: col('rule'),
    color: col('ink') },
  arithmetic: { columns: 4,
    division: t({ es: 'potence', fr: 'potence', de: 'inline', en: 'bracket' }) },
  blank: { look: 'box', width: em(3.2), color: col('rule'), weight: pt(0.8) },
  area: { kind: 'grid', spacing: mm(5), color: col('rule'), weight: pt(0.4) },
  answers: { color: col('accent'), fontFamily: LABEL }, // the teacher's copy, in the accent
  marginTop: mm(7), marginBottom: mm(2), itemSpacing: em(0.5),
};

Um :::exercise{type="arithmetic"} recebe uma operação por item de lista, - 864 ÷ 4, com os sinais que o seu país escreve (÷, :, ×, ·). O motor calcula o resultado, o quociente e o resto, e o estilo decide como a conta é desenhada: quadradinhos de 7,2 mm e uma arithmetic.division escolhida por edição com t(). Uma fileira de cálculo mental é um exercício de lacunas comum cuja lista fica num grupo :::columns{count=3}, e cada [[70]] vira um quadradinho da mesma largura que os outros.

#2 · Monte o cabeçalho da folha

script.js · linhas 46–67no código completo
const at = (to, edge, x = 0, y = 0, size) => ({ anchor: { to, edge },
  offset: { x: mm(x), y: mm(y) }, ...(size && { size }) });
const field = (id, attr, x, width) => [
  { kind: 'text', id, content: `{attr.${attr}}`, fontFamily: LABEL, fontSize: pt(9.5),
    fontWeight: 600, color: col('muted'), align: 'left',
    placement: at('container', 'top-left', x, 26) },
  { kind: 'rule', id: `${id}-line`, direction: 'horizontal', thickness: pt(0.75),
    color: col('rule'), placement: at('container', 'top-left', x + 17, 31, { width: mm(width) }) },
];
const head = { enabled: true, minHeight: mm(36), slot: { elements: [
  { kind: 'box', id: 'band', style: { backgroundColor: col('accent'), borderRadius: mm(3) },
    placement: at('container', 'top-left', 0, 0, { width: 'fill', height: mm(19) }) },
  { kind: 'text', id: 'unit', content: '{attr.unidad}', fontFamily: LABEL, fontSize: pt(9),
    fontWeight: 700, color: col('accent'), align: 'center', verticalAlign: 'middle',
    textTransform: 'uppercase', letterSpacing: pt(1.2), lineHeight: 1.1,
    box: { backgroundColor: col('paper'), borderRadius: mm(3.5) },
    placement: at('container', 'top-left', 5, 5, { width: mm(26), height: mm(9) }) },
  { kind: 'text', id: 'title', content: '{titleText}', fontFamily: LABEL, fontSize: pt(21),
    fontWeight: 700, color: col('paper'), align: 'left', lineHeight: 1.1,
    placement: at('container', 'top-left', 37, 5.2) },
  ...field('name', 'nombre', 0, 100), ...field('date', 'fecha', 124, 38),
] } };

O título de nível 1 da unidade desenha a faixa laranja, a pílula e o título, e também os campos de nome e data a partir dos seus atributos (nombre="Name" fecha="Date"), então cada edição os rotula no próprio idioma.

#3 · Alterne entre a folha do aluno e a cópia do professor

script.js · linhas 180–194no código completo
const form = document.getElementById('controls');
const labels = t({ es: ['Alumno', 'Profesor'], en: ['Pupil', 'Teacher'],
  fr: ['Élève', 'Enseignant'], de: ['Schüler', 'Lehrkraft'] });
form.querySelectorAll('label span').forEach((span, k) => { span.textContent = labels[k]; });
function render() {
  // The same config, edited in place: the next build sees the edition the form asks for.
  config.exercises.edition = form.elements.edition.value;
  const doc = buildDocument({ markdown }, config); // the faces are loaded by now
  showPages(doc, { title });
  document.querySelectorAll('#pt-actions a, [data-postext-pdf]').forEach((old) => old.remove());
  offerPdf(() => renderToPdf(doc, { fontProvider: fontsourceProvider }),
    `${RECIPE}-${LANG}-${config.exercises.edition}.pdf`);
}
form.addEventListener('change', render);
render();

exercises.edition: 'teacher' imprime cada resposta no seu lugar com a cor de answers.color, aqui a de destaque: os quadradinhos do cálculo mental, os algarismos de cada resultado, o quociente e o resto, a resposta modelo do problema. O formulário acima das páginas altera a configuração ali mesmo e compõe de novo; as fontes já estão carregadas, então basta o buildDocument simples. A captura compõe antes as duas folhas, por isso as páginas publicadas mostram a do aluno e depois a do professor.

A receita completa

Sandbox
// ═══ Postext Cookbook · Nº 170 · Column arithmetic as each country writes it ═══════
// https://postext.dev/en/cookbook/column-arithmetic-by-country
// Code: MIT · Text: original (CC BY 4.0) · Pictures: none
// Fonts: Fira Sans, Lexend (SIL OFL 1.1) · Needs postext ≥ 1.59.0
import { buildDocumentWithFonts, buildDocument, renderPageToCanvas } from 'https://esm.sh/postext';
import { renderToPdf, decompressWoff2 } from 'https://esm.sh/postext-pdf';

const LANG = 'en'; // @lang: the language of the worksheet ('es' | 'en' | 'fr' | 'de')
const RECIPE = 'column-arithmetic-by-country';

// ─── 1 · Design ─────────────────────────────────────────────────────────────
// #region palette: ink, one orange accent, a pale tint, the grey of squared paper
const palette = {
  ink: '#1f2328', accent: '#c4511c', tint: '#fbeee6', rule: '#b9c0c8', muted: '#5f6670',
  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.accent, model: 'hex' } },
];
// #endregion
const [TEXT, LABEL] = ['Fira Sans', 'Lexend'];

// #region answer: operations in squares, long division as the edition's schools set it
// `- 864 : 4` in the Markdown is one operation; the style sets it digit by digit in squares
// of 7.2 mm, a cell for each figure of the answer. Long division follows the country: the
// divisor in an L right of the dividend in Spain and France (potence), `864 : 4 =` on one
// line in Germany, the bracket ⟌ in English-speaking schools.
const calculo = {
  id: 'calculo',
  number: { shape: 'disc', background: col('accent'), fontFamily: LABEL, fontWeight: 700 },
  instruction: { bold: true, color: col('ink') },
  grid: { cell: mm(9), fontFamily: TEXT, fontSize: pt(15), rule: col('rule'),
    color: col('ink') },
  arithmetic: { columns: 4,
    division: t({ es: 'potence', fr: 'potence', de: 'inline', en: 'bracket' }) },
  blank: { look: 'box', width: em(3.2), color: col('rule'), weight: pt(0.8) },
  area: { kind: 'grid', spacing: mm(5), color: col('rule'), weight: pt(0.4) },
  answers: { color: col('accent'), fontFamily: LABEL }, // the teacher's copy, in the accent
  marginTop: mm(7), marginBottom: mm(2), itemSpacing: em(0.5),
};
// #endregion

// #region head: the unit pill, the title and the lines for a name and a date
const at = (to, edge, x = 0, y = 0, size) => ({ anchor: { to, edge },
  offset: { x: mm(x), y: mm(y) }, ...(size && { size }) });
const field = (id, attr, x, width) => [

O script.js montado funciona como está: cole-o como script de módulo em qualquer página ou abra a receita no CodePen. Pasta da receita no GitHub ↗ (abre em uma nova aba)

Variações

#Ponha as respostas de cabeça para baixo no pé

Um costume das revistas de passatempos: o gabarito de cada exercício, girado 180° logo abaixo dele.

-  exercises: { edition: 'student' }, // the switch above the pages sets 'teacher'
+  exercises: { edition: 'student', solutions: { placement: 'inverted', layout: 'key' } },

#Divida sob o colchete em todas as edições

As escolas japonesas e chinesas também usam o colchete; um idioma que você não lista fica com a disposição que já é a dele.

-    division: t({ es: 'potence', fr: 'potence', de: 'inline', en: 'bracket' }) },
+    division: 'bracket' },

Erros comuns

  • As operações só aceitam números inteiros: uma conta com decimais como 12,5 + 3,75 não é lida e sai impressa como está escrita. Deixe os decimais nas lacunas do cálculo mental, onde a resposta é texto.

Créditos

Texto
Texto original, CC BY 4.0
Fontes
Fira Sans (SIL OFL 1.1) · Lexend (SIL OFL 1.1)
SandboxPDF