/** * Wie dick wird das Dokument? – die Schätzung, die vor dem Speichern dasteht. * * ## Warum das überhaupt nötig ist * * Der schlimmste gemessene Fall sind **982 Seiten**: 486 Fragen mit voller * Begründung im Großdruck. Wer das ohne Vorwarnung an einen Drucker schickt, * hat ein Problem. Die Zahl muss deshalb dastehen, bevor der Speicherdialog * aufgeht. * * ## Warum die Stützstellen gemessen sind und nicht gerechnet * * Der erste Anlauf schätzte über eine Faustregel („rund 3000 Zeichen je * A4-Seite“). Nachgemessen an wirklich gedruckten PDF lag sie um **Faktor * 1,7 bis 2,8 zu niedrig** – die Fragenliste über den ganzen Katalog wurde * mit 55 Seiten angekündigt und hatte 162. Eine Anzeige, die zugunsten des * Nutzers irrt, ist genauso falsch wie eine, die gegen ihn irrt. * * Die Werte unten stammen deshalb aus Dokumenten, die mit demselben * Stylesheet gebaut und mit echtem Chromium gedruckt wurden. Gezählt wurden * die Seitenobjekte im PDF, nicht der erste Knoten des Seitenbaums – dieser * Griff liefert bei jedem Dokument über acht Seiten die Zahl 8. * * ## Was die Zahl nicht ist * * Eine Zusage. Die Länge hängt daran, welche Fragen es trifft; eine Frage mit * Abbildung und langer Begründung braucht ein Mehrfaches einer Ja/Nein-Frage. * Die Oberfläche sagt deshalb „geschätzt etwa“ und nennt keine Nachkommastelle. */ import type { Schriftgroesse } from './stil'; /** * Gemessene Stützstellen, Seiten je Frage bei Schriftgröße „normal“. * * | Dokument | gemessen | Seiten | * |---|---|---| * | Fehlerprotokoll, Kurzerklärung | 150 Fragen | 70 | * | Fehlerprotokoll, volle Begründung | 150 Fragen | 169 | * | Fehlerprotokoll, volle Begründung | 486 Fragen | 539 | * | Fragenliste | 575 Fragen | 162 | * | Fragenliste mit Lösungsanhang | 575 Fragen | 185 | */ const JE_FRAGE = Object.freeze({ fehlerKurz: 0.47, fehlerVoll: 1.1, fragenliste: 0.28, /** Der Lösungsanhang kostet zusätzlich – 23 Seiten auf 575 Fragen. */ loesungsanhang: 0.04, }); /** Vorspann, Quellenblock und Überschriften – unabhängig von der Fragenzahl. */ const GRUNDLAST = 2; /** * Großdruck gegen Normalgröße, gemessen. * * 162 gegen 279 Seiten bei derselben Fragenliste; beim Fehlerprotokoll mit * voller Begründung 508 gegen 982. Der Faktor schwankt zwischen 1,7 und 1,9; * genommen wird der obere Wert, damit die Schätzung eher zu hoch als zu * niedrig ausfällt. */ const GROSSDRUCK = 1.9; function runden(seiten: number): number { return Math.max(1, Math.round(seiten)); } /** Geschätzte Seitenzahl des Fehlerprotokolls. */ export function seitenFehlerprotokoll( fragen: number, tiefe: 'kurz' | 'voll', schriftgroesse: Schriftgroesse, ): number { if (fragen === 0) { return 1; } const roh = GRUNDLAST + fragen * (tiefe === 'voll' ? JE_FRAGE.fehlerVoll : JE_FRAGE.fehlerKurz); return runden(schriftgroesse === 'gross' ? roh * GROSSDRUCK : roh); } /** Geschätzte Seitenzahl der Fragenliste. */ export function seitenFragenliste( fragen: number, mitLoesungen: boolean, schriftgroesse: Schriftgroesse, ): number { if (fragen === 0) { return 1; } const roh = GRUNDLAST + fragen * (JE_FRAGE.fragenliste + (mitLoesungen ? JE_FRAGE.loesungsanhang : 0)); return runden(schriftgroesse === 'gross' ? roh * GROSSDRUCK : roh); } /** * Der Satz, der vor dem Speichern dasteht. * * Nennt Blatt **und** Seiten: Wer druckt, denkt in Blättern, und beidseitig * ist die Hälfte. 982 Seiten sind 491 Blatt – erst diese Zahl macht klar, * worum es geht. */ export function umfangssatz(seiten: number): string { const blatt = Math.ceil(seiten / 2); if (seiten === 1) { return 'Geschätzt eine Seite.'; } return ( `Geschätzt etwa ${String(seiten)} Seiten – beidseitig gedruckt rund ${String(blatt)} Blatt. ` + 'Die genaue Länge hängt davon ab, welche Fragen es trifft.' ); }