Zum Hauptinhalt springen

Kapitel 14 · Teil II · Das Handwerk

Dokumentformat

Die Markdown-Teilmenge, die Postext einliest, und die Regeln für das Verfassen von Quelldokumenten

Aktualisiert 2026-10-0710 minenescadefritptzhjaar

Kurz gesagt

Diese Seite erklärt, wie Sie einen Text schreiben, den Postext setzen kann. Sie schreiben in Markdown, einer einfachen Schreibweise, in der ein paar Zeichen Überschriften, Listen, fette Wörter und Links kennzeichnen. Postext versteht außerdem einige zusätzliche Zeichen für Kästen, Fußnoten, Bilder, Tabellen und Formeln. Die Seite führt jedes Zeichen auf, das Postext annimmt, und jedes, das es übergeht. Am Ende stehen Ratschläge für Texte, die sich leicht lesen lassen.

Postext liest einen bewusst kleinen Markdown-Dialekt.

Der Parser ist ein von Hand geschriebener Tokenizer – keine vollständige CommonMark-Implementierung –, daher ist das Quellformat eng gefasst und vorhersehbar. Das Ziel ist ein doppeltes: Die Engine soll klein und schnell bleiben, und Dokumente sollen sich ohne Aufwand zwischen Postext und jedem anderen CommonMark-Leser (Obsidian, Pandoc, VS Code …) austauschen lassen. Alles, was auf dieser Seite nicht aufgeführt ist, wird entweder als einfacher Text behandelt oder aus dem Inline-Strom entfernt.

Wenn Sie ein Dokument programmatisch aufbauen, liefert Ihnen die Funktion parseMarkdown (siehe Konfiguration › Parsen) genau die Blockstruktur, die die Layout-Engine verarbeitet.

#Frontmatter

Ein Dokument kann mit einem optionalen YAML-Frontmatter-Block beginnen, der von ----Markierungen eingefasst ist:

---
title: Chapter One
author: Jane Doe
publishDate: 2026-04-15
---
 
# Chapter One
 
The story begins here…

Rufen Sie extractFrontmatter(source) auf, um das Frontmatter vom Hauptteil zu trennen. Das eingelesene Metadatenobjekt wird zusammen mit dem restlichen Markdown und dem Zeichenoffset zurückgegeben, an dem der Hauptteil beginnt – nützlich, wenn Sie Fehler oder Cursorpositionen auf die ursprüngliche Quelle zurückführen müssen.

Das Frontmatter wird mit gray-matter eingelesen, daher wird YAML jeder Form angenommen. Postext selbst beachtet nur title, subtitle, author und publishDate; weitere Schlüssel bleiben in PostextContent.metadata erhalten und stehen Ihnen zur freien Verwendung.

Ein Block, der kein gültiges YAML ist – ein nicht geschlossenes Anführungszeichen, Text nach einem Wert in Anführungszeichen –, hält den Satz nicht an: extractFrontmatter gibt keine Metadaten zurück, den Text nach dem schließenden --- als Hauptteil und die Begründung des Parsers in error. Das Dokument wird ohne seine Metadaten gesetzt, und der Build führt einen Eintrag invalidFrontmatter in contentWarnings (die Sandbox zeigt ihn als Ungültiges Frontmatter an).

YAML gibt seinen Werten Typen: 1984 ist eine Zahl, 2026-04-15 ein Datum, [Ana Gil, Luis Paz] eine Liste. Postext druckt jedes dieser vier Felder als Text, gleich welchen Typs es ist:

  • eine Zahl in ihrer einfachen Dezimalform und einen Wahrheitswert als true oder false (title: 1984 druckt 1984). YAML liest eine Zahl als Wert, nicht Ziffer für Ziffer: 1.50 druckt 1.5, 017 (oktal) 15, 1:30 (Basis 60) 90;
  • ein Datum als seinen Kalendertag, ausgeschrieben in der Sprache des Dokuments – der Einstellung locale, andernfalls dem Gebietsschema der Silbentrennung: publishDate: 2026-04-15 druckt auf Englisch April 15, 2026, auf Spanisch 15 de abril de 2026, auf Deutsch 15. April 2026. Arabische Daten verwenden den gregorianischen Kalender, sofern das Tag keinen anderen nennt (ar-u-ca-islamic druckt das Hidschra-Datum), mit den Ziffern, die das Tag vorgibt (ar-EG: ١٥ أبريل ٢٠٢٦; ar-u-nu-latn: 15 أبريل 2026). Ein Datum mit Uhrzeit druckt den Tag seiner UTC-Zeit und lässt die Uhrzeit weg: 2026-09-24T23:30:00-05:00 ist 04:30 UTC am 25. und druckt September 25, 2026;
  • eine Liste als ihre durch Kommas verbundenen Einträge (author: [Ana Gil, Luis Paz] druckt Ana Gil, Luis Paz).

Setzen Sie einen Wert in Anführungszeichen, damit er genau so gedruckt wird, wie er geschrieben ist – eine Zahl, die ihre Ziffern behalten muss, ein Datum, das seinen Tag behalten muss: publishDate: "15/04/2026", title: "1984". Der Text gelangt in doc.metadata, in die Platzhalter ({title}, {publishDate} …) und in Titel und Autor des PDFs. Eines der vier Felder ohne Textform – eine verschachtelte Map, ein leeres title: – fehlt in doc.metadata. extractFrontmatter gibt die Werte weiterhin so zurück, wie YAML sie typisiert hat; metadataText(value, locale) liefert den Text, den Postext für einen davon druckt.

#Blockelemente

Postext erkennt sieben Arten von Textblöcken und Code-Listings, dazu die Direktiven und eingebetteten Ressourcen, die weiter unten auf dieser Seite behandelt werden. Blöcke enden immer an einer Leerzeile oder am Beginn eines anderen Blocks.

Textblöcke auf einen BlickDie sieben Arten von Textblöcken, die Postext erkennt: Überschrift, Absatz, Zitat, ungeordnete Liste, geordnete Liste, Aufgabenliste und abgesetzte Formel, jeweils mit ihrer Markdown-Syntax. Direktiven und eingebettete Ressourcen werden gesondert behandelt.Überschrift# TitleAbsatzEinfache TextzeilenZitat> quoted textUngeordnete Liste- itemGeordnete Liste1. item1.2.3.Aufgabenliste- [x] doneAbgesetzte Formel$$ \int f(x) $$∫ f(x) dx(1)
Jede Art von Textblock und ihre Markdown-Schreibweise.
ElementSyntaxHinweise
Überschrift# Title … ###### H6Ein bis sechs #-Zeichen, gefolgt von einem Leerzeichen und dem Text der Überschrift. Die Ebenen 1–6 entsprechen direkt der Konfiguration headings.levels.
AbsatzEinfacher Text über eine oder mehrere ZeilenAufeinanderfolgende nicht leere Zeilen ohne besondere Bedeutung werden mit einem einzelnen Leerzeichen verbunden und als ein Absatz ausgegeben. Zwischen zwei chinesischen oder japanischen Zeichen (Ideogramme, Kana, Satzzeichen voller Breite sowie typografische Anführungszeichen, Striche oder Auslassungspunkte daneben) entfällt das Zeilenende stattdessen, wie in CSS, sodass ein chinesischer Absatz in der Quelle an beliebiger Stelle umbrochen werden darf. Zwischen zwei solchen Zeichen (“你好”⏎“再见”, 他说……⏎“好”) entscheiden die Zeichen dahinter: Das Zeilenende entfällt, wenn eines davon chinesisch oder japanisch ist, und “hello”⏎“bye” behält sein Leerzeichen. Koreanisch behält sein Leerzeichen. Ein in der Quelle getippter Zeilenumbruch bleibt nicht erhalten, es sei denn, die Zeile endet mit einem Backslash (ein erzwungener Zeilenumbruch, siehe Zeilenumbrüche); eine Leerzeile beginnt einen neuen Absatz. Ein im Text getippter Tabulator ist ebenfalls ein Wortzwischenraum, sofern das Format des Absatzes keine Tabstopps setzt; :tab ist immer ein Tabulator (siehe Tabulatoren und Tabstopps). Ein Gedicht, dessen Zeilen so bleiben müssen, wie sie geschrieben sind, gehört in einen Block :::verse.
Zitat> quoted textJede Zeile des Zitats muss mit > beginnen (danach ein optionales Leerzeichen). Aufeinanderfolgende Zitatzeilen verschmelzen zu einem einzigen Zitatblock und werden wie Absatzzeilen verbunden. Gesetzt wird er so, wie es bodyText.blockquote vorgibt: grau und kursiv mit dem Erstzeileneinzug des Fließtexts, sofern Sie nichts daran ändern (siehe Konfiguration › Zitate).
Ungeordnete Liste- item, * item, + itemJede der drei Aufzählungsmarken wird angenommen. Ein Eintrag wird unter dem Eintrag darüber verschachtelt, wenn seine Marke mindestens zwei Spalten weiter eingerückt ist als die Marke jenes Eintrags: zwei Leerzeichen unter -, zwei oder drei unter 1. (die Spalte seines Texts, wie in CommonMark), bis zu einer maximalen Tiefe von 5.
Geordnete Liste1. item, 2) itemZiffern, gefolgt von . oder ). Die Startnummer bleibt erhalten (eine Liste kann also bei 5 oder bei 0 beginnen). Das in der Ausgabe gesetzte Trennzeichen stammt aus orderedLists.separator, nicht aus der Quelle.
Aufgabenliste (GFM)- [ ] todo, - [x] doneEin ungeordneter Eintrag mit einem Kontrollkästchen in eckigen Klammern. Angenommen werden ein kleines x und ein großes X. Die Engine zeichnet das Kästchen, mit einem Häkchen, wenn die Aufgabe erledigt ist; ein in taskCheckboxChar / taskCheckedChar angegebenes Zeichen wird an seiner Stelle als Text gesetzt.
Abgesetzte Formel$$ … $$Eine LaTeX-Formel, als eigener Block gesetzt. Sie wird auf der Spalte zentriert, wie eine Überschrift am Grundlinienraster ausgerichtet und in der PDF-Ausgabe als Vektorgrafik beibehalten. Die einzeilige Form und die eingezäunte mehrzeilige Form sind unter Mathematische Formeln beschrieben.
Codeblockjs</code> … <code>, ~~~ … ~~~Ein Listing, so belassen, wie es geschrieben ist: jedes Leerzeichen, jeder Tabulator und jeder Zeilenumbruch, nichts wird als Markdown gelesen. Zeile für Zeile in der Code-Schrift in einem Kasten gesetzt. Siehe Codeblöcke.

Eine einzelne Leerzeile zwischen zwei Listeneinträgen wird toleriert – die Liste bleibt zusammen. Zwei oder mehr Leerzeilen beenden die Liste.

Listen verschiedener Art auf derselben Tiefe werden angenommen (Sie können mitten in einer Folge von ungeordnet zu geordnet wechseln), doch die Engine behandelt die Folgen für die Nummerierung als getrennt. In der Praxis bleiben Sie besser bei einer Art je Tiefe, sofern Sie keinen Grund zum Mischen haben.

Verschachtelungstiefe von ListenEin Listeneintrag wird unter dem Eintrag darüber verschachtelt, wenn er über dessen Marke hinaus eingerückt ist: zwei Leerzeichen unter einem Aufzählungszeichen, bis zu einer maximalen Tiefe von fünf. Jede Ebene ist weiter eingerückt und kann ein anderes Aufzählungszeichen verwenden.024681-Ebene 12-Ebene 2 – zwei Leerzeichen eingerückt3-Ebene 3 – vier Leerzeichen eingerückt4-···5-···Zwei Leerzeichen Einzug unter einem Aufzählungszeichen, drei unter 1. Maximale Tiefe: 5.
Zwei Leerzeichen je Ebene unter einem Aufzählungszeichen. Maximale Tiefe: fünf.

#Attribute von Überschriften

Eine Überschriftenzeile kann mit einem Attributblock in geschweiften Klammern enden – mit derselben Syntax key="value", die Direktiven verwenden:

# The Long Road {author="I. Zango Martín" year=1998}

Die Klammern und ihr Inhalt werden aus dem Text der Überschrift entfernt (der Titel oben erscheint als The Long Road) und an der Überschrift als attrs gespeichert. Gestaltungsfelder erhalten sie als Platzhalter {attr.<key>}: im erweiterten Gestaltungsfeld der Überschrift selbst sowie in Kopf- und Fußzeilen, wo sie aus der H1 des aktuellen Kapitels aufgelöst werden. Erkannt wird nur ein ausgewogener Block ohne innere Klammern ganz am Zeilenende, nach einem Leerzeichen oder, da chinesische Titel ohne Leerzeichen geschrieben werden, direkt nach einem chinesischen oder japanischen Zeichen (# 回目{style="x"}). Der Block wird nur übernommen, wenn die unten beschriebene Attributsyntax ihn vollständig liest: {x, y}, {紅樓|hóng lóu} und ein einzelnes {} bleiben im Titel, ebenso einzelne Schalter, die direkt am Titel kleben (# 第一回{draft}). Attribute werden durch Leerzeichen getrennt, daher bleiben auch ein Block mit Kommas ({a="1", b="2"}) und Pandocs {.class} im Titel. Pandocs Bezeichner {#id} wird gelesen: Er entspricht id="…" und benennt die Überschrift für Querverweise. Ein in einer anderen Schrift geschriebener Schlüssel wird gelesen und mit einer Warnung verworfen (siehe unten), sodass # 回目{style="x" 作者=曹雪芹} dennoch style übernimmt. Siehe Konfiguration → Kopf- und Fußzeilen.

Ein Wert, den ein Gestaltungstext druckt, kann sich über mehrere Zeilen erstrecken: Die beiden Zeichen \n beginnen dort eine neue Zeile, unabhängig vom overflow des Elements (to="Firma X\nStrasse 1\n10115 Berlin" druckt eine dreizeilige Anschrift). Mit inlineMarks am Element gelten auch Inline-Auszeichnungen im Wert: authors="Ana Ruiz^1^, Luis Gil^2^" setzt die Nummern der Affiliationen hochgestellt. Diese Escape-Sequenz gehört zu Attributwerten (und zu den eigenen Vorlagen der Gestaltung): Die Zeichen \n im Text einer Überschrift, etwa in einem Code-Span, werden so gedruckt, wie sie geschrieben sind.

Zwei Attribute haben eine eigene Bedeutung. style="<id>" wendet ein benanntes Überschriftenstil auf die Überschrift an – ein Vorwort oder eine Autorenliste mit eigener Auftaktgestaltung, eigenen Kolumnentiteln, eigener Seitengeometrie und eigener Typografie des Fließtexts und ohne Kapitelnummer, wenn das Format numbered: false angibt. toc="false" (oder "true") legt abweichend fest, ob :::toc die Überschrift aufführt:

# Preface {style="front-matter"}
 
# Contents {style="front-matter" toc="false"}

Zwei weitere ändern, was eine Überschrift druckt und wie sie zählt. hidden="true" (oder "false") überschreibt das hidden der Ebene oder des Formats der Überschrift: Eine verborgene Überschrift druckt nichts und nimmt keinen Platz ein – im Fluss wie in einem Kasten :::callout –, öffnet aber weiterhin ihre Seite, zählt mit und erscheint im Inhaltsverzeichnis, in den Kolumnentiteln {chapterTitle} und in den PDF-Lesezeichen. jidori=N verteilt eine einzeilige Überschrift gleichmäßig auf N ihrer eigenen Zeichen (字取り: # 序章 {jidori=3} druckt 序 章), und jidori=0 schaltet die gleichmäßige Verteilung ab, die ihre Ebene oder ihr Format setzt (siehe Konfiguration › Überschreibungen pro Ebene). indent=N rückt eine einzelne Überschrift um N Zeichen des Fließtexts vom Zeilenanfang ein (字下げ: ## 一 {indent=5}), vorrangig vor dem indent ihrer Ebene oder ihres Formats; eine bloße Zahl zählt Gevierte des Fließtexts, 0 setzt die Überschrift an den Zeilenanfang, und es wirkt in senkrechtem und waagerechtem Text gleich. firstLineIndent=N rückt nur die erste Zeile einer einzelnen Überschrift ein, vorrangig vor dem firstLineIndent ihrer Ebene oder ihres Formats, während ihre übrigen Zeilen dort beginnen, wo indent sie hinsetzt (die Überschriften nach GB/T 9704: ## 关于加强管理的通知 {firstLineIndent=2}); es liest Längen wie indent, und 0 hebt den Einzug der Ebene auf. startAt=N, eine positive ganze Zahl, setzt den Ebenenzähler der Überschrift auf N, statt ihn weiterzuzählen; die folgenden Überschriften zählen von dort aus weiter, auch in späteren Kapiteln, und die Ebenen darunter beginnen wie üblich unter ihr neu. Mit einem Überschriftenformat, das Anhänge mit Buchstaben zählt (numberingTemplate: 'Appendix {1:A}'), beginnt der erste Anhang die Zählung neu, sodass er Appendix A lautet, statt an die Kapitel anzuschließen:

# To my mother {hidden="true" toc="false"}
 
# Survey instrument {style="appendix" startAt=1}
 
# Raw data {style="appendix"}

#Initialen

Ein Absatz beginnt mit einer Initiale, wenn die Ebene oder das Format seiner Überschrift oder das Absatzformat seiner Gruppe :::paragraphs eine vorsieht (siehe Konfiguration › Initialen): Der erste Buchstabe wird groß neben die ersten Zeilen gesetzt, die um ihn herum verkürzt werden. Im Absatz selbst steht keine Auszeichnung; der Text wird wie gewohnt geschrieben, und der Buchstabe bleibt beim Kopieren, bei der Suche und in der Source-Map Teil seines Worts. Ein Attribut dropcap schaltet sie für ein Kapitel oder eine Gruppe um:

# Lost {dropcap=false}
 
# The mines {dropcap=2}
 
:::paragraphs{style="entry" dropcap}
The lamp of the first entry opens with an initial.
:::

In einer Überschriftenzeile lässt dropcap=false den Absatz nach dieser Überschrift ohne die Initiale, die ihre Ebene oder ihr Format vorsieht, dropcap=N setzt sie über N Zeilen, und ein bloßes dropcap gibt diesem Absatz eine Initiale (drei Zeilen, in der Schrift des Absatzes), wo die Ebene keine setzt. An einem Direktivenblock :::paragraphs bewirkt das Attribut dasselbe für den ersten Absatz der Gruppe oder für jeden Absatz, wenn das Format each: true angibt. Der Absatz nach einer Überschrift wird über Direktiven- und Codeblöcke, Direktiven, aus dem Fluss gelöste Kästen und gleitende Abbildungen hinweg gefunden; ein Absatz in einem Kasten, einem Listeneintrag, einem Zitat oder einem Gedicht erhält nie eine Initiale. Seit postext 1.23.

#Codeblöcke

Ein Listing steht in einem Codeblock zwischen zwei Zeilen aus drei oder mehr Backticks (oder drei oder mehr Tilden), jede für sich allein, um höchstens drei Leerzeichen eingerückt. Alles dazwischen bleibt so, wie es geschrieben ist: führende Leerzeichen und Folgen von Leerzeichen, Tabulatoren, Leerzeilen und Zeilen, die mit #, -, 1., >, $ oder ::: beginnen. Nichts darin wird als Markdown gelesen: keine Hervorhebung, kein :ref, keine Formeln, keine Chips, keine Direktiven, keine Überschriften. Die schließende Zeile verwendet das Zeichen der öffnenden und ist mindestens ebenso lang; ein Listing, das einen Codeblock zeigt, steht daher in einem längeren oder in Tilden:

```bash {title="backup.sh" lineNumbers start=12 highlight="3,5-7"}
#!/usr/bin/env bash
# Copy the photos to the backup disk
rsync -a --delete ~/Photos/ /Volumes/Backup/Photos/
echo "done: $(date)"
```

Die Info-Zeichenkette nach der öffnenden Zeile des Codeblocks nennt die Sprache (ihr erstes Wort: js, ts, python, bash, console, json …), und der Rest wird in der Attributsyntax als Attribute gelesen, in geschweiften Klammern oder ohne (title="app.js" lineNumbers). Alles andere nach der Sprache ist der Titel: ```console Terminal und ```python normalize.py drucken Terminal und normalize.py über dem Listing.

AttributWirkung
title="…"Ein Titel über dem Listing, in einer Titelzeile (oder in einem Etikett am Rand des Kastens, wenn codeStyle.label gesetzt ist).
label="…"Der Text des Etiketts am Kasten, wie bei einem :::callout (mit codeStyle.label).
lineNumbers, lineNumbers=falseNummeriert die Zeilen dieses Listings (oder nicht), unabhängig von codeStyle.lineNumbers. Die Nummern stehen in einer Randspalte vor dem Code und werden nicht mitkopiert.
start=NDie Nummer der ersten Zeile (nummeriert das Listing, wenn nichts anderes es tut).
highlight="3,5-7"Tönt die genannten Zeilen (gezählt ab der ersten Zeile des Listings, beginnend bei 1): einzelne Zeilen und Bereiche, durch Kommas getrennt.
span=pageAuf einer mehrspaltigen Seite erstreckt sich das Listing über alle Spalten.

Ein Codeblock beendet den Absatz darüber, ob mit oder ohne Leerzeile, und der Text nach seiner schließenden Zeile beginnt einen neuen Absatz. Ein offen gelassener Codeblock reicht bis zum Ende des Texts und wird gemeldet (unclosedCodeBlock). Ein Codeblock in einem :::callout ist ein darin verschachtelter Kasten; in :::paragraphs behält das Listing das Code-Format, nicht das Absatzformat. Postext kennt keine Fortsetzung von Listeneinträgen, daher schließt ein Codeblock nach einem Listeneintrag die Liste. Registermarken und Anker, die in einem Listing stehen, bleiben so, wie sie geschrieben sind.

Eingerückter Code (vier Leerzeichen oder ein Tabulator nach einer Leerzeile) wird nur dann als Listing gelesen, wenn codeStyle.indentedCode eingeschaltet ist: Postext-Texte rücken oft mit Leerzeichen ein, und verschachtelte Listeneinträge lesen führende Leerzeichen.

Wie ein Listing aussieht (seine Schrift, sein Kasten, die Tabulatorbreite, was mit einer Zeile geschieht, die breiter ist als der Kasten, Zeilennummern, die Farben seiner Token), legt codeStyle fest; siehe Konfiguration › Code-Listings. Inline-Code (`x`) bleibt in der Schrift des Texts, sofern codeStyle.inline ihm keine eigene gibt. Ein vor postext 1.23 gespeichertes Buch mit Codeblöcken im Text liest diese wie damals als Markdown (codeStyle.blocks: false). Seit postext 1.23.

#Direktiven

Direktiven sind einzeilige Steuerbefehle, die als :::name oder :::name{attrs} auf einer eigenen Zeile stehen. Sie erzeugen keine sichtbare Ausgabe – sie steuern die Platzierung und die Nummerierung.

SyntaxWirkung
:::pagebreakDer nächste Block beginnt auf einer neuen Seite.
:::pagebreak{parity="odd"}Ebenso, und die neue Seite ist zudem ungerade (rechte Seite). Fügt bei Bedarf eine leere Füllseite ein.
:::pagebreak{parity="even"}Ebenso, aber mit einer geraden (linken) Seite als Ziel.
:::pagebreak{parity="always-odd"}Garantiert mindestens eine verpflichtende leere Trennseite, bevor eine ungerade Seite erreicht wird. Die leere Trennseite gehört zum vorangehenden Inhalt, jede weitere Füllseite für die Parität zum folgenden. Nützlich, wenn jedes Kapitel auf einer neuen Doppelseite beginnen muss.
:::pagebreak{parity="always-even"}Ebenso, aber mit einer geraden Seite als Ziel.
:::numbering{format="decimal" startAt=1}Wechselt an der nächsten Seitengrenze die Folge der Seitenzahlen. Beide Attribute sind optional – ohne format bleibt das Format erhalten, ohne startAt zählt der Zähler weiter.
:::columnbreakBeendet die aktuelle Spalte an dieser Stelle: Der nächste Block beginnt in der nächsten Spalte derselben Seite (oder auf einer neuen Seite, wenn die Direktive in der letzten Spalte steht). In einer leeren Spalte wirkungslos, sodass nie eine leere Spalte oder Seite entsteht. Die beendete Spalte behält ihren Leerraum am Fuß – der Spaltenausgleich dehnt sie nicht.
:::spaceLässt an dieser Stelle eine leere Zeile des Grundtexts frei – der ausdrückliche Weg, zwischen zwei Blöcken etwas Luft zu schaffen. :::space{lines=2} lässt zwei frei (auch Bruchteile wie 0.5 sind möglich). Der Raum kommt zum Abstand zwischen den Blöcken hinzu und entfällt am Kopf einer Spalte oder Seite. Siehe unten.
:::tocSetzt hier das Inhaltsverzeichnis: ein Eintrag je Überschrift der aufgeführten Ebenen (Titel, Nummer, Seitenzahl, wahlweise die Autoren des Kapitels) und eine Zeile je Teiltitel, gesetzt nach der Konfiguration toc. Die Einträge folgen dem Dokument – wird ein Kapitel umbenannt, verschoben oder neu nummeriert, folgt das Verzeichnis.
:::indexSetzt hier das Register: jeden im Buch mit :index ausgezeichneten Begriff, sortiert und nach Buchstaben gruppiert, mit den Seiten, auf denen er vorkommt, gesetzt nach der Konfiguration index. :::index{index="names"} setzt ein benanntes Register. Siehe Register.
:::page{…} … :::Eine Comicseite: ihre Zeilen ::panel und deren Skriptzeilen, gesetzt als Panels und geletterte Sprechblasen auf einer eigenen Seite. Siehe Comics.
:::strip{…} … :::Ein Comicstrip im Textfluss, so breit wie eine Spalte oder eine Seite. Siehe :::strip.
:::verse … :::Ein Gedicht, Zeile für Zeile so gesetzt, wie es geschrieben ist (jede Zeile ein Vers, Leerzeilen zwischen den Strophen, führende Leerzeichen als Einzug), oder im klassischen arabischen Layout, wenn seine Zeilen die Halbverse mit || trennen. Siehe unten.

Attributwerte können in doppelten ("…") oder einfachen Anführungszeichen ('…') stehen oder ohne (startAt=17). Ein Schlüssel ohne = gilt als gesetztes, aber leeres Flag.

Derzeit werden nur pagebreak, numbering, columnbreak, space, toc und index als einzeilige Direktiven erkannt (und references, verse, page und strip als Direktivenblöcke) – jede andere Zeile :::name, die kein Container ist (siehe unten), wird als Absatz gelesen und löst in der Sandbox die Warnung Unbekannte Direktive aus. Auch die Engine vermerkt sie, als Eintrag unknownDirective in den contentWarnings des Dokuments (siehe Konfiguration › Warnungen im Dokument).

#Attributwerte

Dieselbe Syntax key="value" lesen Attribute von Überschriften, Direktivenblöcke von Direktiven und Containern (:::name{…}), Querverweise im Text (:ref{…}), Chips (:chip[…]{…}), Farbfelder (:swatch{…}) und Registermarken (:index[…]{…}). Es gelten folgende Regeln:

  • Schlüssel beginnen mit einem ASCII-Buchstaben oder _ und setzen sich mit ASCII-Buchstaben, Ziffern, _ oder - fort. Leerzeichen um = sind erlaubt, das vollbreite =, das eine chinesische Eingabemethode tippt, wirkt wie =, ein wiederholter Schlüssel behält seinen letzten Wert, und ein Schlüssel ohne = ist ein Flag mit leerem Wert. Ein Schlüssel in einer anderen Schrift (作者=曹雪芹) wird nicht gelesen und löst die Warnung attributeKeyInvalid aus; die übrigen Schlüssel des Blocks gelten weiterhin. Werte dürfen in jeder Schrift stehen.
  • Werte in Anführungszeichen. Ein Wert in doppelten Anführungszeichen darf alles außer " enthalten, einfache Anführungszeichen eingeschlossen; ein Wert in einfachen alles außer '. Ein Wert mit doppelten Anführungszeichen steht also in einfachen: lead='He said "hi"'. Escape-Sequenzen gibt es nicht – ein Backslash ist ein gewöhnliches Zeichen –, daher nimmt ein Wert, der beide ASCII-Anführungszeichen braucht, typografische (“…”, ’). Ein Wert darf auch mit dem typografischen “ oder der Eckklammer 「 beginnen, die eine chinesische Eingabemethode tippt, und reicht dann, Leerzeichen eingeschlossen, bis zum passenden ” bzw. 」: title=“甲戌本 眉批”, title=「脂批」.
  • Werte ohne Anführungszeichen (startAt=17, year=1998) reichen bis zum nächsten Leerzeichen: title=Hello world ergibt title="Hello" und dazu ein Flag world.
  • Keine geschweiften Klammern. { und } stehen nie in einem Wert. Die erste } beendet den Block: Ein Direktivenblock, dessen Wert eine enthält, ist keine Direktive mehr, sondern ein Absatz, und im Fließtext läuft der Rest des Werts in den Text über. In einer Überschrift bleibt bei einer Klammer in einem Wert der ganze Block im Titel: # Title {note="a {b"} wird so gesetzt, wie es geschrieben ist. (Bis postext 1.8 begann ein { nach einem Leerzeichen den Block neu, und b wurde als Flag gelesen.)
  • Dollarzeichen sind gewöhnlicher Text. Attribute werden vor den Formeln im Text gelesen, daher ist lead="from $5 to $6" einfach Text.
  • Eine Zeile. Ein Attributblock erstreckt sich nie über mehrere Zeilen.
# The Long Road {lead='A "road novel", they said' price="$18"}
 
:::callout{type="note" title='The "fast" path'}
…
:::

::resource{id="…"} ist strenger: die ID in doppelten Anführungszeichen und kein weiteres Attribut (siehe Ressourcen).

#Container

Ein Container fasst eine Folge von Blöcken in einem Direktivenblock zusammen: eine öffnende Zeile :::name oder :::name{attrs}, danach beliebiger gewöhnlicher Inhalt – Absätze, Überschriften, Listen, Zitate, Formeln, sogar weitere Direktiven – und eine schließende Zeile, die nur ::: enthält. Container lassen sich verschachteln; jedes schließende ::: schließt den innersten offenen.

:::callout{type="note"}
Keep the lantern lit **every** night.

- Check the wick.
- Trim it at dusk.
:::

Im Textfluss werden fünf Containernamen erkannt. Was jeder davon darstellt, legt ein eigener Abschnitt der Konfiguration fest:

SyntaxWirkung
:::callout{…} … :::Inhalt im Kasten – ein Hinweis, Tipp oder eine Warnung, vom Grundtext abgesetzt in einem umrandeten oder getönten Kasten.
:::paragraphs{…} … :::Eine Folge von Absätzen, die statt im Format des Grundtexts in einem benannten Absatzformat gesetzt werden (ein Vorspann, ein Motto, eine Reihe kleingedruckter Anmerkungen). align, indent und endIndent legen Ausrichtung und Einzüge fest, mit oder ohne Format: :::paragraphs{align=end endIndent=1} setzt ein Datum ein Zeichen vor dem Zeilenende (地から1字上げ). dropcap schaltet eine Initiale für den ersten Absatz ein.
:::part{…} … :::Der Auftakt eines Teils oder Abschnitts: Die eingeschlossene Überschrift und der Text bilden die Auftaktseite eines Hauptteils.
:::paper{…} … :::Eine Folge von Seiten, die auf einem anderen Papier gedruckt werden, etwa ein Bildteil auf Glanzpapier in einem Buch auf mattem Papier. Nur der Betrachter Folio zeigt das an.
:::columns{…} … :::Blöcke in eigenen Spalten: in einem Kasten, in der Textspalte oder über eine Seite mit mehreren Spalten hinweg. Siehe :::columns unten.

Welche Attribute jeder Container annimmt und wie er gestaltet wird, beschreibt die Konfiguration. Attributwerte folgen derselben Grammatik wie bei Direktiven. Ein Direktivenblock :::callout nimmt type (die ID eines konfigurierten Kastenformats – unbekannte oder fehlende Typen fallen auf das erste Format zurück), title (ersetzt den Standardtitel des Formats) sowie span / placement (column, page oder side; here, top, bottom oder fixed), um Ausdehnung und Position des Formats für diesen Kasten zu überschreiben:

:::callout{type="objectives" title="What you will learn" span="page" placement="top"}
- Name the parts of the lantern.
- Trim the wick without touching the glass.
:::

Ein gleitender Kasten (placement auto, top oder bottom) nimmt außerdem columns an, die Zahl der benachbarten Spalten, über die er sich auf einer mehrspaltigen Seite erstreckt, wie in :::callout{placement="top" columns="2"} (seit postext 1.18).

Ein Kasten kann den Text nach ihm auch neben sich laufen lassen: wrap (left, right, start oder end), width (sein Anteil an der Spalte, 0 bis 1; ohne Angabe layout.wrap.defaultWidth) und wrapGap (eine Länge wie 6pt), wie in :::callout{wrap="right" width=0.4} (siehe Textumfluss; seit postext 1.24).

Ein Kasten wird als Box gesetzt – ein optionaler Titel, danach der Inhalt in der Grundtext- und Listentypografie des Formats. Standardmäßig bleibt er zusammen und wandert als Ganzes in die nächste Spalte oder auf die nächste Seite, wenn er nicht passt (ein Kasten, der höher ist als eine ganze Spalte, wird trotzdem geteilt, statt überzulaufen); ein Format mit keepTogether: false erlaubt die Teilung zwischen seinen Blöcken oder zwischen Zeilen, wobei auf jeder Seite des Schnitts mindestens splitMinLines Textzeilen bleiben – oder eine Abbildung, eine Tabelle, eine abgesetzte Formel bzw. ein verschachtelter Kasten (ein Schnitt innerhalb eines Absatzes oder Listenpunkts lässt zudem auf jeder Seite mindestens layout.boxChildSplitMinLines seiner Zeilen stehen: standardmäßig zwei, splitMinLines, wenn dieser Wert kleiner ist; vor 1.5 gespeicherte Bücher, deren Kapitel einen Kasten enthalten, werden mit 1 gelesen, dem Schnitt von 1.4). Jeder Teil nach dem ersten beginnt ohne das Symbol, wobei sein Text die Spalte des Symbols beibehält, und ohne den Titel, sofern das Format ihn nicht wiederholt (repeatTitle: „Key points (cont.)“); ein Format kann außerdem unter jeden Teil, der weitergeht, einen Vermerk „Fortsetzung“ setzen (continuesMarkerEnabled) – siehe Hinweise an einem geteilten Kasten. Kästen über die ganze Seitenbreite (span="page") teilen die Seite in Spaltenbänder; Kästen mit span="side" verlassen den Fluss und wandern in die Randspalte eines anderthalbspaltigen Layouts, die nur Gleitobjekte aufnimmt (layout.sideColumnRole: 'floats'), gestapelt neben dem Text, den sie unterbrechen, und werden als Spaltenkästen gesetzt, wo es keine solche Spalte gibt; Kästen mit placement="fixed" verlassen den Fluss und werden an Seitenkoordinaten fixiert (etwa ein Selbsttest-Abzeichen in der unteren linken Ecke der letzten Seite eines Kapitels), wobei die überdeckten Spalten diesen Bereich freigeben; gleitende Kästen (placement="top" / "bottom") verlassen den Fluss an ihrer Stelle und belegen das erste freie Band nach dieser Position – den Fuß der Seite oder Kopf bzw. Fuß der nächsten –, während der Text nach ihnen die verlassene Seite füllt. Ein Format mit floatBarrier: true (typischerweise der abschließende Kasten „Key points“ eines Kapitels) macht den Kasten zu einer Gleitobjekt-Sperre: Jede vor ihm referenzierte Abbildung oder Tabelle wird vor ihm platziert – in den freien Plätzen der Seite oder auf Seiten, die vor dem Kasten geöffnet werden –, sodass kein Gleitobjekt über das Ende seines Kapitels hinausrutscht. Ein unbekannter Direktivenblock :::name ist kein Container – die Zeile wird als Text behandelt, genau wie eine unbekannte Direktive.

Ein Direktivenblock :::part nimmt number (so, wie die Nummer gedruckt werden soll – "I", "IV", "3"; sie wird zudem ausgewertet, damit die Gestaltung sie umformatieren kann) und title; beide sind optional. Ein drittes Attribut, palette="band=#hex" (mehrere Paare id=#hex, durch Kommas getrennt), färbt jede Gestaltungsfarbe um, die mit diesen Paletten-IDs verknüpft ist – Kolumnentitel, Auftaktband, Gestaltungen der Teile –, und die Farben des Textflusses mit demselben Grundwert (Überschriften, Fettes, Querverweise, Aufzählungszeichen, Legenden, Tabellen, Kästen, Chips), und zwar für den Teil und die folgenden Kapitel bis zum nächsten Teil; siehe Konfiguration › Teile. Der Container öffnet stets eine eigene Seite: davor ein Seitenumbruch mit der konfigurierten Parität, eine einzige Textspalte mit den Rändern parts.margins, die Auftaktgestaltung über die ganze Seite und nach der schließenden Zeile des Direktivenblocks ein weiterer Seitenumbruch. Der Inhalt – meist die Liste der Kapitel, die der Teil zusammenfasst, oder gar nichts – wird mit parts.bodyStyle gesetzt:

:::part{number="I" title="Foundations"}
1. The lantern and its parts
2. Trimming the wick
:::

# The lantern and its parts

Mit den Standardeinstellungen für Überschriften ergibt das die klassische Folge: Teiltitelseite rechts, leere linke Seite, Kapitel auf der nächsten rechten Seite. Die Seite wird als role: 'part' gemeldet, damit Kopf- und Fußzeilen sie auslassen können, und {partTitle} / {partNumber} lösen sich auf jeder folgenden Seite in den aktuellen Teil auf. Siehe Teile in der Konfigurationsreferenz.

Vor einem Direktivenblock braucht es keine Leerzeile: Eine öffnende oder schließende Zeile eines Direktivenblocks direkt unter einem Absatz, einer Liste oder einem Zitat beendet diesen Block. Ein Container, der am Ende des Dokuments noch offen ist, wird dort automatisch geschlossen, und die Sandbox meldet die Warnung Nicht geschlossener Container mit Verweis auf die öffnende Zeile. Ein einzelnes ::: ohne offenen Container bleibt als sichtbarer Absatz im Text, statt stillschweigend zu verschwinden.

#:::columns

Eine Gruppe :::columns{count=2} … ::: setzt die Blöcke innerhalb ihres Direktivenblocks in count gleich breiten Spalten (2 bis 6); der Text danach nimmt wieder die volle Breite ein. In einem :::callout teilen sich die Spalten die Innenbreite des Kastens, im Abstand columnGap des Formats, in der Grundtext- und Listentypografie des Kastens, und der Kasten wächst bis zur höchsten Spalte. Im laufenden Text (seit postext 1.25) teilen sie sich die Textspalte, eine Zeile des Grundtexts voneinander entfernt, und die Blöcke behalten die Typografie des Texts; mit span="page" auf einer mehrspaltigen Seite teilt die Gruppe die Seite in ein Band, wie es ein Kasten über die ganze Seitenbreite tut: Die Spalten darüber schließen auf gleicher Höhe, die Gruppe wird über die ganze Inhaltsbreite gesetzt (im Abstand des Spaltenabstands), und der Text läuft darunter in allen Spalten weiter. Auf einer einspaltigen Seite setzt span="page" sie in die Spalte. Überschriften in einer Gruppe behalten ihr Format, ihre Nummer und ihren Eintrag im Inhaltsverzeichnis, eine darin zitierte Fußnote kommt an den Fuß der Textspalte, und Abbildungen, auf die sie verweist, gleiten wie gewohnt.

AttributWirkung
countZahl der Spalten, 2 bis 6. Standard: 2.
gapDer Abstand zwischen den Spalten, eine Länge (12pt, 1em, 4mm). Standard: columnGap des Kastenformats in einem Kasten, eine Zeile des Grundtexts in der Textspalte, layout.gutterWidth über die Seite.
ruleZieht in jedem Zwischenraum eine Linie in Farbe und Stärke von layout.columnRule: :::columns{count=3 rule}.
breaksDie Blöcke, mit denen jede Spalte nach der ersten beginnt, statt auszugleichen: breaks="4" beginnt die zweite Spalte mit dem vierten Block der Gruppe (eine Liste mit Kommas für weitere Spalten). Wie gezählt wird, steht weiter unten.
flowWie eine Gruppe weiterläuft, die nicht passt: snake (Standard ohne breaks) oder parallel (Standard mit breaks). Siehe Eine Gruppe teilen.
spanNur im laufenden Text: column (Standard) oder page.
marginTopDer Abstand über der Gruppe, eine Länge wie bei gap. Er verschmilzt mit dem Abstand, der über der Gruppe ansteht; am Kopf einer Spalte oder wenn die Gruppe ihren Kasten eröffnet, entfällt er. Seit postext 1.28.
marginBottomDer Abstand unter der Gruppe, eine Länge; 0 verlangt keinen. Im laufenden Text tritt er an die Stelle des Absatzabstands des Grundtexts, in einem Kasten ist er der Abstand vor dem nächsten Block. Seit postext 1.28.

Eine Gruppe, die als Ganzes gesetzt wird, wird dort geschnitten, wo ihre Spalten am besten auf gleicher Höhe enden – zwischen Blöcken oder zwischen den Zeilen eines Absatzes oder Listenpunkts, dessen Rest am Kopf der nächsten Spalte ohne Aufzählungszeichen weiterläuft –, es sei denn, breaks legt die Spaltenanfänge fest, ohne Schnitt innerhalb eines Absatzes: eine Textspalte neben einer Abbildungsspalte.

Der Raum um eine Gruppe. Im laufenden Text folgt auf eine Gruppe der Absatzabstand des Grundtexts (eine Zeile bei bodyText.paragraphSpacing, ohne ihn keiner), in einem Kasten kein eigener Abstand. marginTop und marginBottom am Direktivenblock legen ihn fest: :::columns{count=3 span="page" marginBottom="0.75em"}. Jeder ist ein Mindestwert, der mit dem Abstand verschmilzt, den der benachbarte Block für sich beansprucht, wie es die Ränder eines Kastens tun. Im laufenden Text kehrt der Fluss unter der Gruppe zum Grundlinienraster zurück, sodass der Abstand in ganzen Zeilen ausfällt, und eine auf Spalten oder Seiten verteilte Gruppe behält den oberen Abstand für ihren ersten und den unteren für ihren letzten Teil. Ein em ist die Größe des Texts, in dem die Gruppe steht; ein Wert, der keine Länge ist, oder ein negativer Wert wird ignoriert.

:::callout{type="summary"}
:::columns{count=2}
- Every element is one kind of atom.
- Electrons live in orbitals.
- A bond shares or transfers electrons.
:::
:::

Wie breaks zählt. breaks nummeriert die Blöcke der Gruppe der Reihe nach – Absätze, Listenpunkte (jeder ein Block), abgesetzte Formeln, Abbildungen und Tabellen –, und ein verschachteltes :::callout zählt als ein Block, gleich wie viele es enthält. Direktiven sind keine Blöcke: Ein :::space zwischen zwei Strophen verschiebt die Zählung nicht. Eine Zahl unter 2, eine jenseits des letzten Blocks der Gruppe oder eine, die nicht nach dem vorigen Umbruch liegt, wird ignoriert. In einer Gruppe trennt :::space zwei Blöcke wie überall in einem Kasten und entfällt am Kopf der Gruppe und am Kopf jeder ihrer Spalten (an einer Position aus breaks oder einem Ausgleichsschnitt) – um die Gruppe tiefer beginnen zu lassen, setzen Sie den Raum vor den Direktivenblock :::columns. Zwei Spalten mit denselben Abständen stehen daher Strophe für Strophe auf gleicher Höhe:

:::callout{type="verse"}
:::columns{count=2 breaks="4"}
The lamp is lit at dusk,
 
and trimmed before the dawn.
 
:::space
 
The keeper sleeps by day.
 
La lámpara se enciende al anochecer,
 
y se despabila antes del alba.
 
:::space
 
El farero duerme de día.
:::
:::

Hier beginnt der vierte Block, „La lámpara…“, die zweite Spalte; die beiden Zeilen :::space werden nicht gezählt und lassen in beiden Spalten denselben Zwischenraum.

Eine Gruppe teilen

Seit postext 1.25 wird eine Gruppe, die nicht in den verfügbaren Raum passt – den Rest ihrer Spalte im laufenden Text oder den Teil eines Kastens, der geteilt wird (keepTogether: false oder ein Kasten, der höher ist als eine Spalte) –, zwischen ihren Spalten geschnitten und läuft in der nächsten Spalte oder auf der nächsten Seite weiter, bei einer Gruppe in einem Kasten in einem eigenen Kasten:

  • flow="snake", der Standard ohne breaks: Die Blöcke der Gruppe laufen als eine Fahne durch, wie der Text eines Zeitungsartikels. Ein fortgesetzter Teil füllt seine Spalten nacheinander, so gleich hoch, wie es die Schnitte erlauben, und schneidet zwischen Blöcken oder zwischen den Zeilen eines Absatzes oder Listenpunkts (mindestens layout.boxChildSplitMinLines seiner Zeilen auf jeder Seite, standardmäßig zwei); der letzte Teil wird ausgeglichen wie eine ganze Gruppe.
  • flow="parallel", der Standard mit breaks: Jeder Lauf, den die Umbrüche beginnen, ist ein Strom, der seine eigene Spalte behält. Ein Teil füllt jeden Strom bis zum verfügbaren Raum, und jeder läuft in derselben Spalte des nächsten Teils weiter, sodass ein Gedicht und seine nebeneinander gesetzte Übersetzung Strophe für Strophe auf gleicher Höhe bleiben. Eine parallele Gruppe ohne breaks läuft wie eine Snake-Gruppe als Fahne weiter.

Ein verschachtelter Kasten in einer Gruppe bleibt ganz und wandert in den nächsten Teil, und eine Gruppe in einem verschachtelten Kasten wird nie geschnitten. Eine Gruppe, die passt, wird genau wie bisher gesetzt. layout.flowColumns: false behält die Regeln von postext 1.24 bei: Ein Direktivenblock außerhalb eines Kastens wird ignoriert, und eine Gruppe wird nie geschnitten; vor 1.25 gespeicherte Bücher mit einer Gruppe :::columns werden so gelesen. Die Sandbox meldet einen unbekannten Wert für flow (Unbekannter Spaltenfluss) und Spalten, die schmaler sind als sechs Geviert ihres Texts (Spalten zu schmal).

## Briefs
 
:::columns{count=3 span="page" rule}
**Harbour.** The new pier opens on Monday…
 
**Market.** Stall rents stay as they are…
 
**Weather.** Rain from the west by the evening…
:::

Ein Direktivenblock :::callout nimmt außerdem label="…" an: den Text, den ein Format mit einem Reiter label an der oberen Ecke des Kastens druckt (:::callout{type="box" label="BOX 1-1" title="The octet rule"}).

Ein :::callout in einem anderen ist ein eigener Kasten – etwa eine Arbeitsblattkarte mit Antwortkästen. Er nimmt sein eigenes Format an (Hintergrund, Rahmen, Radius, Innenabstand, Titel, Symbol) in der vollen Innenbreite des äußeren Kastens und reiht sich zwischen dessen übrige Blöcke ein; seine Angaben span und placement werden ignoriert, da ein verschachtelter Kasten stets innerhalb seines Elternkastens fließt. Jede schließende Zeile eines Direktivenblocks schließt den innersten noch offenen Kasten:

:::callout{type="card"}
The statement of the exercise.
 
:::callout{type="answer"}
A white answer box with its own border and padding.
:::
 
:::callout{type="answer"}
A second answer box.
:::
:::

Wird der äußere Kasten auf Spalten oder Seiten verteilt (keepTogether: false oder höher als eine Spalte), wandert ein verschachtelter Kasten als Ganzes in das nächste Fragment, sofern sein eigenes Format nicht ebenfalls eine Teilung erlaubt; jedes Fragment zeichnet die Rahmen neu, die es enthält, und ein fortgesetzter verschachtelter Kasten verliert sein Symbol und seinen Titel, sofern sein Format ihn nicht wiederholt (repeatTitle).

#:::paper

Ein Buch kann für eine Folge von Seiten das Papier wechseln: ein Bildteil auf gestrichenem Glanzpapier in einem Buch auf ungestrichenem Werkdruckpapier, eine Karteneinlage, einige Blätter getöntes Papier. Fassen Sie diesen Inhalt in einen Container :::paper:

:::paper{type=coatedGloss grammage=130}
## Plates
::resource{id="plate-1"}
::resource{id="plate-2"}
:::

Ein Papier umfasst ganze Bogen, daher beginnt der Inhalt des Direktivenblocks auf einer neuen Seite, und was auf das schließende ::: folgt, ebenfalls. Ein Lauf am Ende des Dokuments hinterlässt danach keine leere Seite. Abbildungen und Tabellen, auf die innerhalb des Laufs verwiesen wird, werden platziert, bevor er endet. Jede Seite, die mit Inhalt aus dem Container gesetzt ist, trägt das Papier im Layout (VDTPage.paper, die Attribute so, wie der Direktivenblock sie schreibt); Seiten außerhalb tragen nichts. Der Betrachter Folio liest es und zeichnet diese Blätter mit Farbe, Oberfläche, Dicke und Steifigkeit des Papiers. Canvas-, PDF- und HTML-Ausgabe ignorieren es: Die Seiten werden wie alle anderen gesetzt und gedruckt.

Die Attribute sind die der Einstellungen folio.paper, und alle sind optional. Was der Direktivenblock auslässt, folgt dem Papier des Dokuments und darüber hinaus den Standardwerten des Papiers:

AttributWert
typeDie Papiersorte: uncoated, bookWove, coatedMatte, coatedSilk, coatedGloss, bible, newsprint, cardStock, board. Sie legt die Standardwerte der folgenden Attribute fest.
grammageFlächengewicht in g/m², eine Zahl über 0. Schwereres Papier ist dicker, steifer und undurchsichtiger.
bulkDicke je Gewicht in cm³/g, eine Zahl über 0 (Dicke in µm = Grammatur × Volumen).
finishDie Oberfläche: auto, uncoated, matte, silk, gloss.
textureDas Relief der Oberfläche: auto, smooth, vellum, wove, laid, linen, felt.
textureStrengthWie stark die Struktur sichtbar ist, von 0 bis 2.
shadeDie Farbe des Papiers: #rgb, #rrggbb oder die ID eines Eintrags in colorPalette.
showThroughtrue oder false: ob die Rückseite schwach durchscheint. Ein bloßes showThrough bedeutet true.

Ein :::paper in einem anderen überschreibt nur die Attribute, die es setzt, und beginnt und endet ebenfalls mit einem Seitenumbruch. In einem :::callout werden die Direktivenblöcke ignoriert. Ein Wert, den die Engine nicht lesen kann, wird verworfen, und die Sandbox führt ihn als Warnung Ungültiges Papierattribut auf (paperAttributeInvalid in den contentWarnings des Dokuments).

#:::pagebreak

Die Direktive selbst erzwingt keine Parität – nur das Layout des nächsten Blocks. Verwenden Sie sie, um ein Vorwort zu beenden, eine Widmung auf eine eigene Seite zu setzen oder das Ende eines Abschnitts zu markieren. Sollen an derselben Stelle ein Seitenumbruch und ein Neubeginn der Nummerierung stehen, schreiben Sie :::pagebreak gefolgt von :::numbering – der Wechsel der Nummerierung gilt dann auf der neuen Seite, die :::pagebreak gerade erzeugt hat.

Ein Seitenumbruch auf einer noch leeren Seite bewirkt nichts und fügt daher nie eine leere Seite hinzu. Er ersetzt auch nicht das breakBefore einer unmittelbar folgenden Überschrift (Ebene 1 hat standardmäßig eines): Die Überschrift wendet ihre Parität trotzdem an, was nach der von der Direktive geöffneten Seite eine leere Seite hinzufügen kann. Soll eine Überschrift genau dort beginnen, schalten Sie ihren Umbruch aus (siehe Konfiguration → Überschriftenstile). Nach einer Titelüberschrift, die ihre Seite füllt, ist der Umbruch optional: Der Titel beansprucht den Rest seiner Seite bereits, in ein- wie mehrspaltigen Layouts, und ein :::pagebreak direkt danach schadet nicht. Nötig ist er nur nach einem Titel, dessen Gestaltung vor dem Seitenfuß endet, wenn der Text trotzdem auf der nächsten Seite beginnen soll (siehe Konfiguration → Reservierte Höhe).

The old chapter ends here.
 
:::pagebreak{parity="odd"}
 
# A new chapter

Das Flag center (:::pagebreak{center}, aus mit center=false) zentriert den Text der Seite, die der Umbruch öffnet, zwischen Kopf und Fuß des Satzspiegels, in vertikalem Text quer über die Seite: das ページの左右中央 eines japanischen Teiltitels oder einer Widmung. Gleitobjekte, Anmerkungen und Kolumnentitel bleiben, wo sie sind, und eine bereits volle Seite bleibt unberührt. Das Flag beendet die Seite nicht: Schließen Sie sie mit einem weiteren :::pagebreak.

:::pagebreak{center}
 
# 上 先生と私
 
:::pagebreak

Das Attribut parity

Das Attribut parity nimmt dieselben fünf Werte an wie headings.levels[*].breakBefore.parity:

  • 'any' – der Standard: keine Paritätsvorgabe; der Umbruch öffnet einfach eine neue Seite.
  • 'odd' / 'even' – die neue Seite beginnt auf der verlangten Seite der Doppelseite; eine einzelne leere Seite wird nur eingefügt, wenn die natürliche nächste Seite auf der falschen Seite liegt.
  • 'always-odd' / 'always-even' – garantiert mindestens eine verpflichtende leere Trennseite zwischen dem vorigen Inhalt und der neuen Seite und erzwingt dann die Parität. Die leere Trennseite gehört zum vorigen Kapitel; jede weitere Füllseite für die Parität gehört zu dem, was folgt.

Zugehörigkeit leerer Seiten

Die beiden Arten leerer Seiten, die :::pagebreak (und breakBefore) einfügen können, werden im Modell VDTPage unterschieden:

  • blankForParity: true – eingefügt, um eine Paritätsvorgabe zu erfüllen. In Kopfzeilen mit {chapterTitle} trägt diese Seite den Titel des kommenden Kapitels, denn die leere Seite existiert nur, um dieses Kapitel auf die richtige Seite zu schieben.
  • blankForForce: true – die verpflichtende vorangestellte Trennseite eines Modus 'always-*'. Sie gehört zum vorigen Kapitel – eine bewusste Atempause am Kapitelende, keine Füllseite für die Parität des nächsten Kapitels.

Dieselben beiden Regeln geben einer leeren Seite die Kolumnentitel und die Palette eines gestalteten Abschnitts – siehe Konfiguration › Überschriftenstile.

Ausnahme am Dokumentanfang

Ist :::pagebreak das allererste Element eines Dokuments (oder würde eine Überschrift mit breakBefore einen solchen Umbruch auslösen), wird die Parität nicht erzwungen, solange die erste Seite noch leer ist. Der nächste Block landet wie geschrieben auf Seite 1, unabhängig von der verlangten Parität – keine überflüssige leere Seite am Anfang.

#:::numbering

Mit :::numbering beginnen Sie den Seitenzähler mitten im Dokument neu. Das klassische Buchbeispiel:

---
title: "A Book With Front Matter"
---
 
# Preface
 
…
 
:::pagebreak{parity="odd"}
:::numbering{format="decimal" startAt=1}
 
# Chapter 1

Die Seiten des Vorworts tragen i, ii, iii, …; das erste Kapitel beginnt auf einer rechten Seite mit der Zahl 1.

Änderungen nur des Formats (ohne startAt) lassen den Zähler weiterlaufen – nützlich etwa, um von lower-alpha zu upper-alpha zu wechseln, ohne neu zu zählen.

format nimmt jede Schreibweise eines Nummerierungsformats an – roman-lower und i funktionieren ebenso wie lower-roman, arabic ebenso wie decimal, 一 und あ ebenso wie japanese-informal und hiragana (siehe Konfiguration › Schreibweisen der Nummernformate). Ein Wert, der keiner davon ist, lässt das Format unverändert, und die Sandbox markiert ihn.

lines beginnt die Zählung der Zeilennummern neu, nicht den Seitenzähler: Die nächste gezählte Zeile erhält die angegebene Nummer, gleich was lineNumbers.restart vorgibt. Ein Wert, der keine ganze Zahl ab 0 ist, wird ignoriert.

## Act II
 
:::numbering{lines=1}

#:::space

:::space lässt vertikalen Raum zwischen zwei Blöcken: um eine Schlusszeile vom Text darüber abzusetzen, ein Motto oder eine Unterschrift etwas tiefer zu rücken oder einen Leerraum (Szenenwechsel) zwischen zwei Textpassagen zu öffnen. Zusätzliche Leerzeilen im Markdown leisten das nicht – wie in jedem Markdown ist eine Folge von Leerzeilen nur ein einziger Absatztrenner, damit sich das Layout eines Dokuments nicht ändert, wenn ein Editor oder Formatierer Leerraum hinzufügt oder entfernt.

The last paragraph of the scene.
 
:::space
 
A new scene begins one line lower.
 
:::space{lines=2}
 
Two lines lower still.
  • lines – wie viel Raum, in Zeilen des Grundtexts (dem Grundlinienraster). Standard: 1. Ganze Zahlen halten jede Textzeile auf dem Raster, sodass die Spalten weiterhin über die Seite hinweg registerhaltig stehen; ein Bruchteil (lines=0.5) wird exakt eingehalten, auf Kosten dieser Ausrichtung bis zum nächsten Block, der am Raster einrastet. Ein Wert, der keine Zahl größer als 0 und höchstens 20 ist, fällt auf eine Zeile zurück, und die Sandbox markiert ihn (Ungültige Abstandsgröße).
  • Er addiert sich. Der Raum kommt zum Abstand hinzu, der die beiden Blöcke bereits trennt – dem oberen Abstand einer Überschrift, dem unteren einer Liste –, statt darin aufzugehen. Zwei Zeilen :::space hintereinander ergeben zwei Zeilen.
  • An einem Umbruch entfällt er, wie \vspace in LaTeX: Am Kopf einer Spalte oder Seite verschwindet er, sodass eine Seite nie mit einem Loch beginnt; und passt er am Fuß einer Spalte nicht mehr, beendet er einfach diese Spalte, ohne den Rest mitzunehmen.
  • Der Absatz danach beginnt stumpf. Ist bodyText.indentAfterHeading ausgeschaltet, verliert ein Absatz direkt nach :::space seinen Erstzeileneinzug, wie nach einer Überschrift – die übliche Konvention für Text, der nach einer Leerzeile wieder einsetzt.
  • In einem Kasten (oder einer Gruppe :::columns) trennt er die Kinder des Kastens auf dieselbe Weise, gemessen in den Grundtextzeilen des Kastens. Vor dem ersten Block des Kastens entfällt er, wie am Kopf einer Spalte – der Innenabstand setzt den Inhalt bereits vom Rahmen ab –, außer in zwei Fällen, in denen er entsprechend Raum öffnet: direkt unter dem Titel des Kastens und in einem Kasten, der sonst nichts enthält (ein Antwortkasten, ein Schreibfeld, bemessen in Zeilen). Am Kopf einer Gruppe :::columns, am Kopf jeder ihrer Spalten und am Anfang des Teils eines geteilten Kastens, der in der nächsten Spalte oder auf der nächsten Seite weitergeht, verschwindet er immer. In einem Container :::paragraphs wirkt er wie zwischen Absätzen des Grundtexts.
  • Das Zusammenhalten mit dem Folgenden zählt ihn mit: Eine Überschrift, auf die :::space folgt, wandert weiter, wenn der Raum und die ersten Zeilen ihres Texts nicht darunter passen.

Der Antwortkasten eines Arbeitsblatts ist ein Kasten, dessen einziger Inhalt Raum ist: die Frage im Titel, darunter Platz für vier Zeilen.

:::callout{type="answer" title="1. Name the three parts of the lantern."}
:::space{lines=4}
:::

Für einen festen Umbruch statt Raum verwenden Sie :::columnbreak oder :::pagebreak.

#:::verse

Ein Gedicht. :::verse setzt es in einem von zwei Layouts: Zeile für Zeile, wie die meisten Gedichte gedruckt werden, oder im klassischen arabischen Layout einer Qaṣīda, jeder Bayt in zwei nebeneinanderstehenden Halbversen. Ein Gedicht, dessen Zeilen ein Trennzeichen für Halbverse tragen (|| oder ein von Leerzeichen umgebenes \\), erhält das arabische Layout, jedes andere das Zeilenlayout; layout=lines oder layout=bayt am Direktivenblock legt eines fest.

Zeile für Zeile

Schreiben Sie das Gedicht so, wie es gedruckt wird: ein Vers je Markdown-Zeile, eine Leerzeile zwischen den Strophen und Leerzeichen vor einer Zeile, um sie einzuziehen.

:::verse
Whose woods these are I think I know.
His house is in the village though;
  He will not see me stopping here
  To watch his woods fill up with snow.
 
My little horse must think it queer
To stop without a farmhouse near
:::
  • Zeilen. Jede nicht leere Zeile ist ein Vers und wird für sich als Inline-Markdown gelesen: Kursive, Kapitälchen, Anmerkungen und Querverweise funktionieren. Eine Folge von Leerzeilen ist ein einziger Strophenwechsel.
  • Einzüge. Jedes führende Leerzeichen ist indentStep breit, standardmäßig 0,5 em, sodass zwei Leerzeichen eine Zeile um ein Geviert einziehen; ein Tabulator zählt als vier Leerzeichen, ein ideografisches Leerzeichen (U+3000) als zwei.
  • Überläufe. Eine Zeile, die etwas breiter ist als die Satzbreite, verringert zuerst ihre Wortabstände, bis auf bodyText.minWordSpacing ihrer natürlichen Breite (die Grenze, bis zu der Blocksatz staucht), und bleibt auf einer Zeile; tighten=false am Direktivenblock oder bodyText.verse.tighten: false bricht sie stattdessen um. Eine noch breitere Zeile wird an einem Wortzwischenraum umbrochen. Mit turnover=hang (Standard) hängt der Rest in der nächsten Zeile, um hang vom Anfang der eigenen Zeile eingerückt: den hangingIndent des Absatzformats des Gedichts, sonst 2 em (bodyText.verse.hang). Mit turnover=right wird er bündig mit dem Ende der Satzbreite gesetzt, hinter einer öffnenden eckigen Klammer (turnoverMark, standardmäßig [), wie in englischen und spanischen Ausgaben üblich. Verse werden nicht getrennt, es sei denn, ihr Absatzformat setzt selbst hyphenation: true. Eine Zeile und ihr Überlauf werden an einem Spalten- oder Seitenumbruch nie getrennt.
  • Strophen. Der Abstand zwischen zwei Strophen beträgt eine Zeile des Zeilenabstands des Gedichts; stanzaSpace=0.5 macht daraus eine halbe Zeile, und eine Länge (stanzaSpace=6pt) legt ihn genau fest. Auf dem Grundlinienraster ergibt er ganze Rasterzeilen. Spalten und Seiten brechen bevorzugt zwischen Strophen um; innerhalb einer Strophe gelten die Regeln für Waisen und Witwen, die dann die Zeilen der Strophe zählen. keepStanzas=N hält jede Strophe mit N oder weniger Zeilen zusammen: ein Haiku nimmt keepStanzas=3, ein Tanka keepStanzas=5.
  • Platzierung. Das Gedicht wird anhand seiner längsten Zeile in der Satzbreite zentriert, jede Zeile bündig mit dem Anfang des Gedichts (align=center, die übliche Einstellung für ein in Prosa zitiertes Gedicht); align=start setzt es bündig mit dem Anfang der Satzbreite, der Standard in vertikalem Text. Der Absatz, der das Gedicht einleitet, hält seine letzte Zeile mit den ersten Versen zusammen.
  • Gestaffelte Zeilen. Eine als + … geschriebene Zeile beginnt dort, wo die Zeile darüber endete, einen Wortzwischenraum weiter, wie ein Vers im Drama, den sich zwei Sprecher teilen. Schreiben Sie \+ für eine Zeile, die mit einem Pluszeichen beginnt.
  • Zäsuren. Mit keepSpaces am Direktivenblock behält eine Folge von zwei oder mehr Leerzeichen innerhalb einer Zeile ihre Breite; ohne das fallen Leerzeichen wie in jedem Absatz zusammen.
  • Schrift und Richtung. style nennt ein Absatzformat, das Schriftart, Größe, Zeilenabstand, indent sowie den Abstand über und unter dem Gedicht bestimmt. dir und lang legen Richtung und Sprache fest: Ein lateinisches Gedicht in einem arabischen Buch (dir=ltr) wird von seiner eigenen Anfangsseite aus eingezogen. In vertikalem Text ist jeder Vers eine Spalte, eingezogen vom Kopf aus.
AttributStandardBeschreibung
layoutautolines, bayt oder auto: das Bayt-Layout, wenn eine Zeile ein Trennzeichen trägt.
indentStep0.5emBreite eines führenden Leerzeichens.
turnoverhanghang oder right.
hanghangingIndent des Formats, sonst 2emEinzug eines hängenden Überlaufs vom Anfang seiner Zeile aus.
turnoverMark[Das Zeichen vor einem rechtsbündig gesetzten Überlauf.
stanzaSpace1Abstand zwischen Strophen: Eine bloße Zahl zählt Zeilen im Zeilenabstand des Gedichts, eine Länge ist genau diese Länge.
keepStanzas0Strophen mit höchstens so vielen Zeilen zusammenhalten; 0 schaltet es aus.
tightentrueDie Wortabstände einer etwas zu breiten Zeile bis auf bodyText.minWordSpacing verringern, bevor sie umbrochen wird.
keepSpacesausFolgen von zwei oder mehr Leerzeichen innerhalb einer Zeile beibehalten.
aligncenter (start in vertikalem Text)Das Gedicht anhand seiner längsten Zeile zentrieren oder bündig mit dem Anfang setzen.
style, dir, lang—Absatzformat, Richtung und Sprache des Gedichts.
numberedtruefalse nimmt das Gedicht von den Zeilennummern aus: Seine Zeilen werden nicht gezählt.
lineStart—Die Zeilennummer der ersten Zeile des Gedichts. Dort beginnt die Zählung neu, gleich was lineNumbers.restart vorgibt.
intervallineNumbers.intervalDas eigene Intervall des Gedichts: die Nummer jeder N-ten Zeile drucken.

bodyText.verse legt die Standardwerte für jedes Gedicht fest (siehe Konfiguration › Verse). Der reine Text bewahrt das Gedicht so, wie es geschrieben ist, mit einem Zeilenvorschub zwischen den Zeilen und einer Leerzeile zwischen den Strophen, sodass eine kopierte Passage und eine Suche es Zeile für Zeile lesen; das umfließende EPUB setzt eine Strophe als Element, dessen Zeilen ihre Überläufe hängen lassen, und das getaggte PDF taggt eine Strophe als Absatz.

Zeilennummern. Ist lineNumbers eingeschaltet, werden die Zeilen eines Gedichts gezählt (siehe Konfiguration › Zeilennummern). Jeder Vers zählt einmal: Ein Überlauf erhält keine Nummer, und der Abstand zwischen Strophen wird nicht gezählt. Standardmäßig druckt jede fünfte Zeile ihre Nummer im Außensteg, und die Zählung beginnt bei jedem Gedicht neu. Ein Gedicht im klassischen arabischen Layout zählt eine Zeile je Bayt. Der Direktivenblock passt ein einzelnes Gedicht an: lineStart=N gibt seiner ersten Zeile eine Nummer, interval=N ein eigenes Intervall, und numbered=false nimmt es aus.

:::verse{lineStart=37}
…
:::

Mit dem Standardintervall von 5 druckt dieses Gedicht 40, 45 und so weiter neben seine Zeilen.

Klassisches arabisches Layout

Ein Gedicht im klassischen arabischen Layout (eine Qaṣīda, eine Qiṭʿa): jeder Vers, der Bayt, auf einer Zeile in zwei Hälften, der Ṣadr auf der Anfangsseite (rechts im Arabischen) und der ʿAǧuz auf der Endseite, mit einem Zwischenraum dazwischen. Schreiben Sie einen Bayt je Zeile, die Halbverse getrennt durch || (ein \\ mit je einem Leerzeichen davor und danach, wie in Texten aus Wikisource, funktioniert auch). Eine Zeile ohne Trennzeichen ist ein einzelner Halbvers, auf das Gedicht zentriert.

فأنشد يقول:
 
:::verse
يَا حُرْقَةَ الدَّهْرِ كُفِّي || إِنْ لَمْ تَكُفِّي فَعِفِّي
فَلَا بِحَظِّيَ أُعْطِي || وَلَا بِصَنْعَةِ كَفِّي
:::
  • Eine Breite. Jeder Halbvers des Gedichts wird auf eine einheitliche Breite gesetzt, sodass jeder Ṣadr auf derselben Senkrechten beginnt und jeder ʿAǧuz auf einer anderen endet und die Reimbuchstaben untereinander stehen. Die Breite ist die des breitesten Halbverses, höchstens die halbe Satzbreite abzüglich des Zwischenraums; width legt sie fest (width=55mm). Jeder Halbvers wird zuerst mit Kaschidas auf diese Breite gebracht (Verse dehnen stärker als Prosa: doppelt bodyText.kashidaMaxLength), dann mit seinen Wortabständen; ein Halbvers aus einem einzigen Wort, der sie nicht füllen kann, lässt den Rest im Zwischenraum.
  • Der Zwischenraum beträgt standardmäßig 2 em; gap legt ihn fest (gap=3em, eine bloße Zahl gilt in Geviert). ornament druckt in seiner Mitte ein Zeichen (ornament="٭"), das nicht zum Text gehört.
  • Zu breit. Ein Halbvers, der breiter ist als die gemeinsame Breite, verringert zuerst seine Wortabstände bis auf bodyText.minWordSpacing. Passt er dann noch nicht, wird sein Bayt gestaffelt gesetzt: der Ṣadr bündig mit der Anfangsseite auf einer eigenen Zeile, der ʿAǧuz bündig mit der Endseite auf der nächsten.
  • Platzierung. Das Gedicht wird in der Spalte zentriert; align=start setzt es bündig mit der Anfangsseite. Ein Bayt wird nie auf Spalten oder Seiten verteilt, und das Gedicht folgt den Regeln für Waisen und Witwen von Absätzen (ein Gedicht mit drei Bayts oder weniger bleibt ganz). Der Absatz vor dem Gedicht, der es einleitet («فأنشد يقول:»), hält seine letzte Zeile mit den ersten Bayts zusammen.
  • Schrift. Das Gedicht übernimmt Schriftart, Größe und Zeilenabstand des Grundtexts; style nennt ein Absatzformat dafür (style="verse"), so erhält ein vokalisiertes Gedicht den zusätzlichen Zeilenabstand, den seine Harakat brauchen. dir=ltr oder dir=rtl legt seine Richtung fest wie bei jedem Block; bei einem Gedicht in lateinischer Schrift in einem linksläufigen Buch steht der Ṣadr links.

Der reine Text des Gedichts hält Halbverse und Bayts auseinander (ein Tabulator und ein Zeilenumbruch), sodass eine Suche oder eine kopierte Passage es so liest, wie es geschrieben ist; Kaschidas und Ornament bleiben weg.

#:::toc

:::toc setzt das Inhaltsverzeichnis an der Stelle, an der es steht. Es entfaltet sich zu gewöhnlichen Blöcken – einem je Überschrift der Ebenen, die toc.levels aufführt (standardmäßig Ebene 1), und einem je :::part –, sodass das Verzeichnis wie jeder andere Text durch Spalten und Seiten fließt und ein Klick auf einen Eintrag zur Zeile der Direktive führt. Ein Eintrag zeigt die Nummer der Überschrift (die Ausgabe ihres numberingTemplate, sonst die Ordnungszahl des Kapitels), ihren Titel, eine Punktlinie und die Bezeichnung der Seite, auf der sie beginnt, und, wenn toc.subtitle eingeschaltet ist, eine zweite Zeile mit einem Attribut der Überschrift wie dem {author="…"} des Kapitels. Ein Teil erhält eine eigene Zeile, gestaltet von toc.parts.design und eingefärbt mit der eigenen palette des Teils. Überschriften, deren Format numbered: false hat, werden ohne Nummer aufgeführt; {toc="false"} an einer Überschrift hält sie heraus (typischerweise die Überschrift des Verzeichnisses selbst).

# Contents {style="front-matter" toc="false"}
 
:::toc

Die Seitenzahlen sind die, die das Dokument tatsächlich druckt. Ein für sich gesetztes Dokument wird mit den Bezeichnungen des vorigen Durchgangs erneut gesetzt, bis sie sich nicht mehr verschieben – beginnt die Nummerierung nach der Titelei neu (das Rezept :::numbering oben), genügt ein zusätzlicher Durchgang. Ein für sich gesetztes Kapitel (die Vorschauen der Sandbox) erhält stattdessen die Gliederung des ganzen Buchs von seinem Host. Siehe Inhaltsverzeichnis in der Konfigurationsreferenz.

#:::index

:::index setzt das Register an der Stelle, an der es steht: die im ganzen Buch mit :index[…] oder :index{term="…"} ausgezeichneten Begriffe mit ihren Seiten, die dem Text folgen, wenn er sich verschiebt. Beschrieben wird es zusammen mit den Marken unter Register. Eine Spalte endet nie nach dem ersten Eintrag einer Gruppe und nie vor ihrem letzten: Zwei Einträge der Gruppe bleiben und zwei laufen weiter, oder die Gruppe wandert als Ganzes (index.groups.splitMinEntries).

# Index {style="index"}
 
:::index

#Zeilenumbrüche

Die Zeilen eines Absatzes werden mit einem Leerzeichen verbunden. Um innerhalb eines Absatzes eine Zeile zu beenden, ohne einen neuen zu beginnen (eine Anschrift, die Anrede eines Briefs, eine Widmung), beenden Sie die Quellzeile mit einem Backslash, dem harten Umbruch von CommonMark, oder schreiben Sie \\ gefolgt von einem Leerzeichen:

To the keeper of the lighthouse,\
at the end of the northern pier.
 
Ana Ruiz \\ Calle Mayor 4 \\ 28013 Madrid
  • Die Zeile vor einem Umbruch wird in ihrer natürlichen Breite gesetzt, wie die letzte Zeile eines Absatzes, nie auf die Satzbreite gedehnt. Der Text danach beginnt eine neue Zeile desselben Absatzes, ohne Erstzeileneinzug und ohne Abstand darüber; bei einem hängenden Einzug hängt er wie jede Zeile nach der ersten.
  • Absätze, Zitate (> First line\ über > second line), Fußnoten und Listenpunkte nehmen ihn an. Ein Listenpunkt ist eine einzige Quellzeile, daher bricht er bei \\ um.
  • Ein Backslash am Ende des Absatzes wird gedruckt, wie in CommonMark, und zwei Umbrüche hintereinander ergeben einen: Für eine leere Zeile beginnen Sie einen neuen Absatz oder fügen ein :::space ein.
  • Ein \\, das direkt am nächsten Zeichen hängt, ist kein Umbruch: \\* druckt einen Backslash und ein maskiertes Sternchen, C:\\Temp beide Backslashes. In Inline-Code und in einer Formel gehören die Backslashes zum Code bzw. zur Formel.
  • Zwei Leerzeichen am Zeilenende, der andere harte Umbruch von CommonMark, sind keiner: Sie sind in einem Editor unsichtbar, und viele Editoren lassen sie zurück, sodass sie Zeilen umbrechen würden, die niemand umbrechen wollte.
  • Aus dem HTML-Betrachter kopierter Text hat am Umbruch einen Zeilenvorschub, das umfließende EPUB ein <br/>, der Text des PDF ein Zeilenende und ein Word-Export einen manuellen Zeilenumbruch (Umschalt+Eingabe), den der Word-Import wieder als Umbruch liest.
  • Ein Gedicht behält seine Zeilen, Einzüge und Strophen in einem Block :::verse, ohne Backslash an jeder Zeile.

Bis postext 1.22 wurde der Backslash gedruckt, und die Zeilen wurden mit einem Leerzeichen verbunden. Ein damals gespeichertes Buch, dessen Text eine Zeile mit einem Backslash beendet oder \\ vor ein Leerzeichen setzt, behält diese Lesart (bodyText.hardLineBreaks: false, siehe Konfiguration › Pakete, die postext 1.4 oder früher geschrieben hat).

#Zeilenumbrüche in Titeln

Schreiben Sie \\ in eine Überschrift (oder in das Attribut title eines Teils), um einen Zeilenumbruch dort zu erzwingen, wo der Titel als Titel angezeigt wird: Die Überschrift in der Spalte fließt weiter und zeigt an dieser Stelle ein Leerzeichen, während {titleText} einer Auftaktgestaltung die Zeile dort umbricht (in jedem Modus overflow des Textelements). Kolumnentitel, {chapterTitle}, {partTitle} und die PDF-Gliederung geben den Titel stets einzeilig wieder. Im Chinesischen oder Japanischen gilt der Umbruch als ideografisches Leerzeichen zwischen zwei Zeichen der Schrift (ein Titel aus einem Verspaar); wo eines davon auf eine Ziffer oder lateinischen Text trifft (关于举办 \\ 2026年…), setzt die Seite den Abstand zwischen Han- und lateinischer Schrift, und die PDF-Lesezeichen und der Dokumenttitel fügen die beiden Hälften ohne Zwischenraum zusammen, wie chinesischer Fließtext geschrieben wird.

# Concepts of health and illness. \\ Community health {author="I. Zango Martín"}

#Inline-Formatierung

Inline-Auszeichnungen werden in jedem Textblock erkannt (Überschriften, Absätze, Zitate, Listeneinträge). In einer Überschrift folgen sie headings.inlineMarks, standardmäßig eingeschaltet: Kursives, Fettes, Hoch- und Tiefstellungen, Kapitälchen und Links des Titels werden wie in einem Absatz gedruckt, und eine kursive Folge in einer kursiven Überschrift erscheint aufrecht. Ist es ausgeschaltet, entfallen die Markierungen, und der Titel wird im eigenen Format der Überschrift gedruckt; Konfigurationen, die mit postext 1.4 oder früher gespeichert wurden und deren Überschriften Auszeichnungen tragen, werden so gelesen (siehe Konfiguration › Überschriften). Eine Überschriftengestaltung druckt {titleText} in jedem Fall als einfachen Text.

Inline-Formatierung auf einen BlickGegenüberstellung von Markdown und Ergebnis für fett, kursiv, fett kursiv, Inline-Code und Links.MarkdownAa Aa**fett**fett*kursiv*kursiv***beides***beides`code`code[Link](https://…)Link
Links das Markdown, rechts das gesetzte Ergebnis.
AuszeichnungSyntaxHinweise
Fettbold oder boldGesetzt mit bodyText.boldFontWeight. Ein optionales bodyText.boldColor ersetzt für fette Folgen die Standardfarbe des Fließtexts.
Kursivitalic oder italicGesetzt mit dem kursiven Schnitt der aktuellen Schriftfamilie. Ein optionales bodyText.italicColor ersetzt für kursive Folgen die Standardfarbe des Fließtexts. Ein Unterstrich kennzeichnet Hervorhebung nur an einer Wortgrenze, wie in CommonMark: Einer zwischen zwei Buchstaben oder Ziffern – snake_case_name, das SR_AIR_EN.pdf einer URL – ist Text (auch bei bold); innerhalb eines Worts verwenden Sie Sternchen (unbelievable). Chinesische, japanische und koreanische Zeichen zählen hier nicht, da diese Schriften keine Leerzeichen kennen: 中文_斜体_中文 und 中文__粗体__中文 sind kursiv bzw. fett. Ein __, das keinen Fettdruck ergibt, wird nie zu Kursivschrift: foo__bar__baz bleibt Text.
Fett kursivboth oder bothBeide Kennzeichen werden kombiniert.
Hochgestellt^text^Gesetzt in 58 % der Textgröße und um ein Drittel davon angehoben – ein Exponent (10^-8^), eine Ionenladung (Na^+^). Der markierte Text beginnt und endet mit einem Zeichen, das kein Leerzeichen ist; ein einzelnes Caret im Text bleibt wörtlich stehen, ebenso die Gesichter ^_^ und ^o^ (n.^o^ und 1^o^ sind dennoch hochgestellt).
Tiefgestellt~text~Gleiche Größe, um 0,15 der Textgröße abgesenkt, sodass es innerhalb der Unterlängen bleibt – ein chemischer Index (H~2~O, pK~a~). Eine Tilde mit einer Ziffer auf jeder Seite ist ein Bereich und bleibt wörtlich stehen: 3~5 days, 需要3~5天. Ebenso eine zwischen zwei chinesischen Wörtern, die keine Tiefstellung öffnet: 周一~周五, 北京~上海; eine Tiefstellung schließt aber weiterhin vor einem chinesischen Zeichen (F~合~等于). Lässt sich mit fett und kursiv kombinieren (H~2~O). Eine Tiefstellung und eine Hochstellung, die ohne etwas dazwischen zusammen geschrieben sind, werden wie in einer Formel gestapelt: T~0~^2^ setzt die 2 über die 0, gleich welche zuerst kommt, die Tiefstellung um 0,25 der Textgröße abgesenkt, damit sie der Hochstellung ausweicht, und das Paar nimmt die Breite des breiteren Teils ein. Ein Leerzeichen oder ein Buchstabe dazwischen setzt sie nacheinander; ein Wortverbinder (U+2060) ebenso, ohne dass dazwischen etwas sichtbar ist. Ein gestapeltes Paar wird nie an einem Zeilenumbruch getrennt: Ein für die Zeile zu breites Wort bricht vor dem Paar um.
Kapitälchen:smallcaps[text]Kleinbuchstaben als Großbuchstaben in 70 % der Textgröße gesetzt – der Name einer Figur in einem Theaterstück, ein Akronym im Fließtext. Nimmt andere Auszeichnungen in sich und um sich herum an; siehe Kapitälchen.
Ausrichtung in senkrechtem Text:tcy[12], :upright[GDP], :sideways[12]In senkrechtem Text: eine aufrechte Zelle (Tate-chū-yoko), jedes Zeichen aufrecht in einer eigenen Zelle oder die ganze Folge gedreht. Keine Wirkung in waagerechtem Text; siehe Ausrichtung in senkrechtem Text.
Chinesische Zeichen:dots[不可], :name[賈寶玉], :book[石頭記]Betonungspunkte (着重号), die Eigennamenlinie (专名号) und das Buchtitelzeichen (书名号: 《》 oder eine Wellenlinie, je nach cjk.bookTitleMark). Der Text bleibt so, wie er geschrieben ist; siehe Chinesische Zeichen, Ruby und Warichu.
Ruby:ruby[紅樓]{rt="hóng lóu"} oder {紅樓|hóng|lóu}Lesungen in Pinyin oder Zhuyin über (oder neben) den Grundzeichen. Die Kurzform braucht eine Basis aus Han-Zeichen, Kana oder Bopomofo, daher bleibt {x|x>0} Text.
Warichu:warichu[note]{open="〔" close="〕"}Eine Anmerkung, in zwei Zeilen halber Größe innerhalb der Zeile gesetzt (双行夹注), über Zeilen und Seiten umbrochen.
Inline-CodecodeDie Backticks werden entfernt; die Folge wird als einfacher Text gesetzt, genau so, wie sie geschrieben ist: Ein , ein Chip, eine Formel, ein Link oder eine Hervorhebungsmarkierung darin wird wörtlich gedruckt, und so zeigt ein Text die Syntax. Gesetzt wird sie in der Schrift des Texts oder, mit codeStyle.inline, als Einheit in der Code-Schrift (siehe Konfiguration › Code-Listings). Ein Listing gehört in einen Codeblock.
Escape, , , , , Ein Backslash setzt das Markierungszeichen selbst – das Sternchen einer Tabellenfußnote (), ein wörtliches Caret, ein Dollarzeichen, das keine Formel öffnet –, statt eine Folge zu öffnen. Funktioniert im Fließtext, in Chips sowie in Legenden, Zellen und Anmerkungen. (Bis postext 1.4 druckten Legenden, Zellen, Anmerkungen und Chips den Backslash von mit.)
Geschütztes Leerzeichendas Zeichen selbst: U+00A0, U+202F, U+2007Verbindet die Wörter zu beiden Seiten, sodass eine Zeile nie zwischen ihnen umbricht: eine Zahl und ihre Einheit (37 °C), eine Seitenangabe (S. 12), eine Tausendergruppe (225 000). Das geschützte Leerzeichen (U+00A0), das schmale geschützte Leerzeichen (U+202F) und der Ziffernabstand (U+2007) verbinden alle – im Fließtext, in Legenden, Zellen, Kästen und Kolumnentiteln –, und jedes behält seine eigene Breite: Der Blocksatz dehnt nur die Wortzwischenräume. Viele Schriften haben kein Glyph für das schmale geschützte Leerzeichen oder den Ziffernabstand; diese werden dann so gesetzt, wie Browser sie setzen, im Canvas, im HTML und im PDF gleichermaßen: als halber Wortzwischenraum bzw. in der Breite einer Ziffer. Praktisch jede Schrift hat U+00A0, daher ist es die sichere Wahl. Eine so verbundene Gruppe, die breiter ist als die ganze Zeile, bricht an ihrem letzten geschützten Leerzeichen um statt innerhalb eines Worts. Der Wortverbinder (U+2060) verbindet, ohne Platz einzunehmen. Tippen Sie das Zeichen selbst: Eine HTML-Entität wie wird so gedruckt, wie sie geschrieben ist. Siehe Wo eine Zeile nie umbricht.
Bedingter Trennstrichdas Zeichen selbst: U+00ADEine Stelle, an der das Wort getrennt werden darf, mit einem hinzugefügten Trennstrich, wenn dort eine Zeile endet: nur zwischen zwei Buchstaben oder Ziffern. Ein Wort, das einen enthält, erhält aus dem Wörterbuch keine weitere Trennstelle, sodass der bedingte Trennstrich seine einzige Trennung ist; vor dem ersten Buchstaben eines Worts getippt, trennt er nichts und hält dieses Vorkommen ganz. Neben einer Klammer, einem Anführungszeichen oder einem Satzzeichen bewirkt er nichts. Siehe Wo eine Zeile nie umbricht.
LinktextDer sichtbare Text bleibt im Fluss und wird genau so gesetzt wie ohne den Link. Die URL macht die Wörter in der HTML- und PDF-Ausgabe zu einem aktiven Link; siehe Links.
BildaltMarkdown für Inline-Bilder wird aus dem Text entfernt. Bilder müssen in PostextContent.resources deklariert werden, damit die Layout-Engine sie nach den Regeln von resourcePlacement platzieren kann.
Chip:chip[text]Eine eingerahmte Textfolge, die als Einheit umbricht – eine Wortbank, eine Taste, ein Tag. Gestaltet über chipStyles; siehe Inline-Chips.
Tabulator:tab, :tab{at=120mm align=end leader="."}Schickt die Wörter danach zum nächsten Tabstopp: einem der Tabstopps des Absatzformats oder dem, den seine Attribute festlegen. Ein im Text getippter Tabulator ist nur dort ein Tabulator, wo das Format Tabstopps setzt. Siehe Tabulatoren und Tabstopps.
Inline-Formel$…$Eine LaTeX-Formel, die mit dem umgebenden Text fließt, z. B. $e^+1=0$. Gesetzt von MathJax und auf jedem Backend als Vektorpfade gerendert. Verwenden Sie \$ für ein wörtliches Dollarzeichen. Skalierung, die abgesetzte Form ($$ … $$) und die Fehlerbehandlung werden unter Mathematische Formeln behandelt.

Ein Markdown-Link, [text](url), behält seinen Text im Fluss genau so, wie der Text ohne ihn gesetzt würde: Der Link ändert nie Zeilenumbrüche, Abstände oder Farbe. Er behält seine URL für die Ausgaben, die ihr folgen können:

  • HTML (renderToHtml): Die verlinkten Wörter werden in <a href="…" rel="noopener noreferrer"> eingeschlossen, das die Textfarbe übernimmt und nicht unterstrichen ist. Je Folge verlinkter Wörter auf einer Zeile gibt es einen Anker.
  • PDF (postext-pdf): Jede Folge verlinkter Wörter auf einer Zeile wird zu einer anklickbaren URI-Link-Annotation. In einem getaggten PDF ist sie ein Element Link, dessen Text die verlinkten Wörter sind.
  • Canvas: als einfacher Text gemalt, da ein Canvas keine Klickfläche hat.
Read the [configuration guide](https://postext.dev/en/docs/configuration "Configuration")
or write to [the team](mailto:team@example.com).
  • Das Ziel kann einen Titel tragen, der ignoriert wird ([text](https://example.com "Title")). Es kann auch in spitze Klammern eingeschlossen sein, wobei Leerzeichen zu %20 werden ([text](<https://example.com/a b>)).
  • Nur sichere Ziele bleiben erhalten: http:, https:, mailto:, tel:, ftp: und relative URLs (../guide, #top). Jedes andere Schema (javascript:, data:, file: …) setzt den Text ohne Link. Das PDF verlinkt nur absolute URLs.
  • Das Ziel darf Klammern enthalten, solange sie ausgeglichen sind, wie in CommonMark: [photo](https://commons.wikimedia.org/wiki/File:Bike_(Unsplash).jpg) verlinkt die ganze URL. Ein Backslash maskiert ein Zeichen (\(, \_). Sind die Klammern nicht ausgeglichen, endet das Ziel an seiner ersten ), und der Text wird ohne Link gesetzt; kodieren Sie eine einzelne Klammer als %28 oder %29. Auch ein Leerzeichen beendet das Ziel, sofern es nicht in spitze Klammern eingeschlossen ist.
  • Ein Wort, das direkt am Linktext klebt, gehört mit zum Link. In see [the site](https://example.com). ist der Punkt Teil der anklickbaren Fläche.
  • Der Linktext kann Hervorhebungen enthalten ([**bold** words](…)) und selbst darin stehen (**[words](…)**).
  • Links funktionieren in Absätzen, Listeneinträgen, Zitaten, Kästen, Legenden, Anmerkungen und Tabellenzellen sowie in Überschriften, solange headings.inlineMarks eingeschaltet ist (die Voreinstellung). Kolumnentitel, die Gliederung und die aus einer Überschrift erzeugten Zeilen des Inhaltsverzeichnisses behalten nur den Text, ebenso der Text eines :chip[…].
  • Links im Referenzstil ([text][id]) und Autolinks (<https://…>) werden nicht erkannt (siehe Was NICHT unterstützt wird).

Im VDT steht das Ziel an jedem verlinkten Segment, als VDTLineSegment.href. Der Parser hält die Links einer Folge als Bereiche ihres Texts in InlineSpan.links fest und teilt eine Folge nie wegen eines Links; deshalb kann ein Link das Layout nicht verändern.

#Inline-Chips

:chip[text] setzt text in einen Kasten – einen abgerundeten, getönten „Chip“ –, der mit der Zeile fließt: die Wörter einer Wortbank oder einer Zuordnungsübung, Tastaturtasten, Tags. :chip[text]{style="key"} wählt ein benanntes Format aus chipStyles (siehe die Konfigurationsreferenz); ohne style oder mit einer ID, die kein Format deklariert, erhält der Chip das erste Format (ein eingebautes Format chip, wenn die Konfiguration keines hat; die Sandbox warnt vor einer unbekannten ID).

Classify: :chip[battery] :chip[cable] :chip[switch] :chip[bulb]
 
Press :chip[Ctrl]{style="key"} + :chip[C]{style="key"} to copy.
  • Eine Einheit. Ein Chip wird innen nie umbrochen oder getrennt; die Zeile bricht zwischen Chips um, an den Wortzwischenräumen um sie herum. Ein Chip, der breiter ist als die ganze Zeile, ragt über sie hinaus, statt geteilt zu werden.
  • Breite. Seine Laufweite ist der Text plus der waagerechte Innenabstand und die Kontur auf beiden Seiten. Der Blocksatz dehnt nur die Wortzwischenräume, nie das Innere eines Chips. Das gap des Formats ist der geringste Abstand, der über einen Zwischenraum hinweg zwischen dem Kasten und einem benachbarten Wort oder Chip bleibt – ein schmalerer Zwischenraum wird aufgefüllt (nicht an einem Zeilenrand und nicht vor anhängender Interpunktion wie in :chip[a],).
  • Höhe. Der Kasten ist ein Band um die Grundlinie, 0,8 em darüber und 0,25 em darunter in der Größe des Chips, erweitert um den senkrechten Innenabstand und die Kontur. Der senkrechte Innenabstand wird außerhalb des Zeilenkastens gemalt und ändert nie die Zeilenhöhe, sodass das Grundlinienraster hält; ein Kasten, der höher ist als der Zeilenabstand, kann in einen Chip der Zeile darüber oder darunter hineinreichen, und die Sandbox kennzeichnet zwei Chips auf verschiedenen Zeilen, die sich überlappen („Chips berühren die nächste Zeile“), damit Innenabstand, Kontur oder Größe verringert werden können.
  • Text. Der Text des Chips nimmt eigene Inline-Auszeichnungen an (:chip[**bold** word], :chip[x^2^]) sowie die Hervorhebung um ihn herum (**:chip[a]**); das Format kann Familie, Größe, Farbe, fett und kursiv festlegen. Schreiben Sie \] für eine wörtliche Klammer darin. Verweise, Farbfelder und Formeln in einem Chip bleiben wörtlich, und \$ druckt ein Dollarzeichen (bis postext 1.4 wurde auch der Backslash gedruckt).
  • Leer. Ein Chip nur aus Leerzeichen (:chip[ ], geschützte Leerzeichen eingeschlossen) ist ein leerer Kasten – eine Antwortlücke, ein Schlusszeichen: so breit wie waagerechter Innenabstand und Kontur seines Formats, so hoch wie ein Chip mit Wörtern. Die Breite der Lücke bestimmen Sie über das paddingX eines Formats (:chip[ ]{style="blank"}). Steht gar nichts zwischen den Klammern, bleibt :chip[] wörtlicher Text.
  • Wo. Absätze, Listeneinträge, Zitate, Kästen, Tabellenzellen, Legenden und Anmerkungen. Überschriften behalten :chip[…] als wörtlichen Text.
  • Ausgabe. Canvas, HTML und PDF malen den Kasten und setzen die Wörter als echten Text: im HTML auswählbar, im PDF extrahierbar und in Lesereihenfolge (in einem getaggten PDF ist der Kasten ein Layout-Artefakt, und die Wörter gehören zum Absatz).

#Kapitälchen

:smallcaps[text] setzt text in Kapitälchen – die Namen der Figuren in einem Theaterstück, ein Akronym im Fließtext, die ersten Wörter eines Kapitels. Kleinbuchstaben werden als Großbuchstaben in 70 % der Textgröße gesetzt, während Großbuchstaben, Ziffern und Satzzeichen die volle Größe behalten; :smallcaps[Hamlet] druckt also ein H in voller Größe, gefolgt von AMLET in Kapitälchen.

Enter :smallcaps[Hamlet] and :smallcaps[Horatio], reading.
 
The :smallcaps[unesco] report and the :smallcaps[who] guidelines.
  • Synthetisch. Die Kapitälchen werden aus den Großbuchstaben der Schrift selbst gebildet, auf dem Canvas, im HTML und im PDF auf dieselbe Weise, sodass der Text überall gleich gemessen und umbrochen wird. Echte Kapitälchen einer Schrift (das OpenType-Feature smcp) werden nicht verwendet; für sie setzen Sie den Text über ein Absatzformat in einer Kapitälchenfamilie (etwa einer Familie, deren Name auf „SC“ endet).
  • Auszeichnungen. Der Text nimmt eigene Inline-Auszeichnungen an (:smallcaps[**Ophelia**]) sowie die Hervorhebung um ihn herum (*:smallcaps[Act I]*); schreiben Sie \] für eine wörtliche Klammer darin. Ein Verweis oder ein Chip darin wird ebenfalls in Kapitälchen gesetzt, und ein Verweis bleibt im HTML und im PDF ein einziger Link; eine Formel nicht.
  • Umbruch. Wörter werden wie üblich umbrochen und getrennt; die Silbentrennung liest jedes Wort in seiner eigenen Schreibung.
  • Wo. Absätze, Listeneinträge, Zitate, Kästen, Tabellenzellen, Legenden und Anmerkungen sowie Überschriften, solange headings.inlineMarks eingeschaltet ist (die Voreinstellung); ist es ausgeschaltet, wird die Auszeichnung aus einer Überschrift entfernt und der Text so gedruckt, wie er geschrieben ist.
  • Ganze Absätze. Ein Absatzformat oder der Inhalt eines Kastens mit smallCaps: true setzt seinen ganzen Text auf diese Weise (siehe Absatzformate).
  • Text. Canvas, HTML und PDF enthalten die Buchstaben so, wie sie gemalt sind: Wer :smallcaps[Hamlet] kopiert, erhält „HAMLET“.

#Tabulatoren und Tabstopps

Ein Tabulator schickt die Wörter danach zu einem Stopp auf der Zeile: den Preis eines Gerichts bündig am Ende der Zeilenbreite hinter einer Punktreihe, den Darsteller hinter der Rolle in einer Besetzungsliste, die Punktzahl einer Prüfungsfrage am Rand. Schreiben Sie :tab dort, wo der Tabulator hingehört; die Leerzeichen um ihn herum gehen in ihm auf. Die Tabstopps werden in der Konfiguration festgelegt: bodyText.tabStops für jeden Absatz, Listeneintrag und jedes Zitat, das tabStops eines Absatzformats für die Absätze einer Gruppe :::paragraphs und das body.tabStops eines Kastenformats innerhalb seiner Kästen (siehe Konfiguration › Tabulatoren). Eine Speisekarte, deren Preise am Ende der Zeilenbreite hinter Punkten enden:

paragraphStyles: [
  { id: 'menu', firstLineIndent: { value: 0, unit: 'em' }, tabStops: [{ position: 'end', align: 'end', leader: '. ' }] },
],
:::paragraphs{style="menu"}
Onion soup :tab 8.50
 
Grilled sea bream with fennel and lemon :tab 21.00
:::

:tab{…} setzt einen Stopp für genau diesen einen Tabulator, ohne Format: die Lücke eines Formulars bis zum Zeilenende, einen Betrag an seinem Dezimaltrennzeichen.

Name and surname :tab{at=end leader=rule}
 
Total due :tab{at=80% align=decimal} 1,234.50
AttributBedeutung
atWo der Stopp steht, gemessen vom Anfangsrand der Zeilenbreite des Absatzes: eine Länge (120mm, 4cm, 2em; eine bloße Zahl gilt in Punkt), end für das Ende der Zeilenbreite oder ein Anteil davon (60%). Ohne at geht :tab{…} zu den Stopps des Formats, wie ein bloßes :tab.
alignstart (die Voreinstellung): Der Text nach dem Tabulator beginnt am Stopp. end: Er endet dort (der Text bis zum nächsten Tabulator oder zum Ende des Absatzes). center: Er wird auf dem Stopp zentriert. decimal: Sein Dezimaltrennzeichen steht auf dem Stopp; eine Folge ohne eines endet dort.
leaderText, der über den Raum vor dem Stopp wiederholt wird: ".", ". ", "·", "_", "-" oder ein anderer kurzer Text, in Schrift und Farbe des Absatzes. rule zieht eine Linie knapp unter der Grundlinie, die Lücke eines Formulars. Standardmäßig keiner.
gapAbstand, der zwischen der Füllung und dem Text auf beiden Seiten bleibt. Standardmäßig 0.5em der Größe des Absatzes; eine bloße Zahl gilt in Punkt.
decimalDas Trennzeichen, an dem ein Stopp decimal ausrichtet. Standardmäßig das der Dokumentsprache: . in Englisch, Chinesisch, Japanisch und Arabisch, , in Spanisch, Katalanisch, Portugiesisch, Französisch, Deutsch und anderen.
  • Wohin ein Tabulator geht. Zum ersten Stopp hinter dem Text davor, unter den Stopps nach demjenigen, den der vorige Tabulator der Zeile genommen hat; der zweite Tabulator einer Zeile nimmt daher meist den zweiten Stopp. Hinter dem letzten Stopp setzt tabInterval weitere Stopps in jedem Intervall ab dem Anfang der Zeilenbreite; ohne es ist der Tabulator ein Wortzwischenraum.
  • Tabulatorzeichen. Ein im Text getippter Tabulator (U+0009) ist nur in einem Absatz ein Tabulator, dessen Format tabStops oder tabInterval setzt. Überall sonst ist er der Wortzwischenraum, der er immer war, sodass ein Dokument, das Tabulatoren statt Leerzeichen verwendet, sein Layout behält. Mehrere Tabulatorzeichen hintereinander gehen ebenso viele Stopps weiter. Ein Tabulator am Anfang einer Quellzeile wird mit den übrigen führenden Leerräumen der Zeile entfernt: Schreiben Sie :tab, um eine Zeile an einem Stopp zu beginnen.
  • Was Text bleibt. Ein :tab, auf das ein Buchstabe folgt (3:table), sowie ein :tab in Inline-Code, in einer Formel, in der Adresse eines Links oder in den Attributen einer Direktive.
  • Wo. Absätze, Listeneinträge, Zitate, Kästen und Gruppen :::paragraphs. Überschriften, Legenden, Tabellenzellen und die Texte von Gestaltungen (Kapitelauftakte, Kolumnentitel) haben keine Tabstopps.
  • Text hinter dem Stopp. Hat der Text vor einem Tabulator bereits jeden auf seiner Zeile verbliebenen Stopp überschritten, nimmt ein Stopp end, center oder decimal das letzte Wort vor dem Tabulator zusammen mit dem Text am Stopp in die nächste Zeile mit, und der Text davor wird schmaler gesetzt, so wie eine Zeile des Inhaltsverzeichnisses ihren Titel umbricht, um die Seitenzahl zu behalten. Ein Stopp start bricht die Zeile vor dem Tabulator um, und der Text danach beginnt die nächste Zeile an seinem Stopp. Ein Tabulator, der seine Zeile eröffnet und trotzdem keinen Stopp findet, nimmt keinen Platz ein.
  • Füllzeichen. Eine Füllung füllt den Raum vor ihrem Stopp und endet bündig mit dem Ende dieses Raums, sodass die Punkte mehrerer Zeilen untereinander stehen, gleich welcher Text davor steht. gap hält sie vom Text auf beiden Seiten fern; davor gibt es keinen Abstand, wenn der Tabulator die Zeile eröffnet, und danach keinen, wenn nichts folgt. Eine Füllung wird ab drei Wiederholungen gesetzt; ein Raum für eine oder zwei bleibt leer, wie im Inhaltsverzeichnis.
  • Zeilenumbruch. Ein Absatz mit einem Tabulator wird Zeile für Zeile gesetzt, nie mit Knuth-Plass. Im Blocksatz nehmen nur die Wortzwischenräume nach dem letzten Tabulator einer Zeile den Ausgleich auf, und die letzte Zeile des Absatzes wird nicht gedehnt (siehe Blocksatz › Zeilen mit Tabulatoren). Ein zentrierter oder rechtsbündiger Absatz setzt seine Zeilen mit Tabulatoren von der Anfangsseite aus, da die Stopps Positionen auf der Zeilenbreite sind. Von rechts nach links werden die Stopps von rechts gemessen, und ein Stopp end steht links (siehe Arabischer Satz). In senkrechtem Text ist ein Tabulator ein Wortzwischenraum, und ein :tab löst dort die Inhaltswarnung tabInVerticalText aus.
  • Text und Ausgaben. Der reine Text enthält an jedem Tabulator ein Tabulatorzeichen (\t); die Füllzeichen sind kein Text, und Kopien, Suchen und die Source-Map lassen sie weg. Canvas, HTML-Betrachter und EPUB mit festem Layout malen sie (im HTML vor Screenreadern verborgen); ein getaggtes PDF kennzeichnet sie als Artefakte, sodass sein Text Onion soup 8.50 lautet. Das umfließende EPUB kann die Stopps nicht exakt halten: Jede Zeile eines Absatzes mit Tabulatoren wird zu einer Reihe aus den Teilen zwischen ihren Tabulatoren, in der ein Stopp end, center oder decimal oder einer mit Füllung den nächsten Teil an das Ende der Reihe schiebt (seine Füllung als gepunkteter oder durchgezogener Rand), und ein Stopp start den Teil davor in seiner gedruckten Breite hält. Ein Word-Export schreibt :tab als Word-Tabulator, und der Word-Import liest einen Tabulator im Fließtext als :tab mit dem Stopp zurück, den Word dafür gesetzt hat (siehe Sandbox › Word-Dokumente).

#Ausrichtung in senkrechtem Text

In senkrechtem Text (layout.writingMode: 'vertical-rl') stehen chinesische Zeichen aufrecht, lateinische Wörter und lange Zahlen werden seitlich gedreht, und eine Zahl mit höchstens zwei Ziffern steht aufrecht in einer Zelle, es sei denn, sie steht in einem lateinischen Satz, dessen Wörtern sie folgt (siehe Konfiguration › Zahlen im vertikalen Text). Drei Auszeichnungen heben eine Folge von Hand ab:

第:tcy[120]回,:upright[GDP]增長:sideways[12]倍。
  • :tcy[…] (Tate-chū-yoko, 縱中橫) setzt seinen Text nebeneinander in eine aufrechte Zelle von einem Geviert, quer gestaucht, wenn er breiter ist: :tcy[120], :tcy[3.0], :tcy[A+]. Bis zu etwa vier Zeichen lesen sich gut.
  • :upright[…] stellt jedes Zeichen aufrecht in eine eigene Zelle, lateinische Buchstaben darin zentriert: ein Akronym, das Buchstabe für Buchstabe die Spalte hinab gelesen wird. Darin bricht nie eine Zeile um.
  • :sideways[…] dreht die ganze Folge mit der Zeile, auch chinesische Zeichen: eine zweistellige Zahl, die der Autor seitlich haben will.
  • Der Text bleibt im reinen Text erhalten; die Auszeichnungen nehmen andere Inline-Auszeichnungen in sich auf (:tcy[**12**]), einen Link (:sideways[[iPhone](https://…)]) und einander, wobei die innerste gewinnt (:tcy[:upright[AB]] stellt A und B aufrecht), und für eine wörtliche Klammer schreiben Sie \]. In waagerechtem Text ändern sie nichts.
  • Ein Verweis, eine Anmerkungsmarke, eine Formel, ein Chip oder ein Farbfeld innerhalb einer Auszeichnung behält seine eigene Einstellung: :sideways[iPhone[^1]] dreht iPhone und lässt die Anmerkungsnummer so, wie jede Anmerkungsnummer gesetzt wird; die Nummer eines Verweises steht nach cjk.uprightDigits wie jede kurze Zahl in einer Zelle.
  • Ein Textelement einer Gestaltung mit inlineMarks: true nimmt sie ebenfalls an, wenn es senkrecht gesetzt wird (siehe Konfiguration › Vertikale Textelemente).
  • Für Umbruch und Blocksatz zählen eine Zelle :tcy und jedes Zeichen von :upright als chinesische Zeichen, und neben ihnen wird kein Han-Latein-Abstand gesetzt.

#Chinesische Zeichen, Ruby und Warichu

Chinesische und japanische Ausgaben kennzeichnen Text zwischen den Zeilen statt mit Kursivschrift oder Unterstreichung, versehen Zeichen mit ihren Lesungen und setzen Kommentare in die Zeile. Sieben Direktiven leisten das. Chinesischer Satz und Japanischer Satz erklären die Konventionen dahinter. Sie behalten ihren Text: Die Zeichen zwischen den Klammern bleiben im Absatz (Suche, Inhaltsverzeichnis, Registeranker und kopierter Text lesen sie so, wie sie geschrieben sind), und die Direktiven nehmen die anderen Inline-Auszeichnungen in sich und um sich herum an, verschachtelte eingeschlossen. Schreiben Sie \] für eine wörtliche Klammer.

此事:dots[不可]輕忽。:name[賈寶玉]與:name[林黛玉]讀:book[西廂記]。
 
{滿紙|mǎn|zhǐ}荒唐言,:ruby[一把]{rt="yì bǎ"}辛酸淚!:ruby[都]{rt="ㄉㄡ"}云作者痴。
 
寶玉:warichu[甲戌側批:此是第一首標題詩。]{open="〔" close="〕"}道:……
 
{東京|とう|きょう}の:ruby[紫陽花]{rt="あじさい"}は*とんと*:sideline[見事]だ。:book[こころ]を読む。
 
:kunten[學]{okuri="ビテ"}而:kunten[時]{okuri="ニ"}:kunten[習]{kaeri="二" okuri="フ"}:kunten[之]{kaeri="一" okuri="ヲ"}。
  • :dots[text] setzt einen Betonungspunkt (着重号) unter jedes Zeichen in waagerechtem Text, rechts daneben in senkrechtem Text, und keinen auf Satzzeichen oder Leerzeichen. style="dot|circle|sesame" (Standard dot), fill="open" für eine Kontur, pos="over|under" für die andere Seite. Markdown-Hervorhebung *…* auf chinesischen oder japanischen Zeichen bewirkt dasselbe unter cjk.emphasis: 'dots', der Voreinstellung in einem chinesischen oder japanischen Dokument; lateinische Buchstaben in derselben Hervorhebung bleiben kursiv. Weggelassene Attribute übernehmen cjk.emphasisMark: im Chinesischen ein Punkt unter dem Text, im Japanischen ein Sesam darüber (in senkrechtem Text rechts daneben).
  • :name[text] zieht die Eigennamenlinie (专名号) unter den Text (in senkrechtem Text links daneben), und :book[text] setzt das Buchtitelzeichen (书名号): 《》 um den Titel (〈〉 für einen Titel in einem anderen), die Wellenlinie klassischer und taiwanischer Ausgaben oder nichts, wie cjk.bookTitleMark es angibt (standardmäßig Klammern auf dem Festland und in Japan, die Wellenlinie in Taiwan und Hongkong). In einem japanischen Dokument sind die Klammern 『』 und 「」 für einen Titel in einem anderen (cjk.bookTitleBrackets). Eine Quelle dient so einer modernen Festlandausgabe wie einer klassischen. Zwei Namen oder Titel nebeneinander halten ihre Linien getrennt.
  • :ruby[base]{rt="…"} setzt Lesungen über die Basis (Pinyin) oder rechts neben jedes Zeichen (Zhuyin, die Voreinstellung für Bopomofo-Lesungen). Bei ebenso vielen Lesungen wie Zeichen, getrennt durch Leerzeichen oder |, erhält jedes Zeichen seine eigene, und zwischen ihnen darf eine Zeile umbrechen (Mono-Ruby); group oder eine Anzahl, die nicht passt, setzt eine Lesung zentriert über die ganze Basis, die nie umbricht. pos="over|under|right" wählt die Seite. Die Kurzform {紅樓|hóng|lóu} (eine Lesung je |) oder {紅樓|hónglóu} (eine Lesung für die ganze Basis) liest sich gleich, aber nur, wenn die Basis ein Han-, Kana- oder Bopomofo-Zeichen enthält, und außerhalb von Formeln, Code und Attributen, sodass {x|x>0} in lateinischem Text Text bleibt. Ein Backslash vor der Klammer oder dem Strich lässt eine chinesische Kurzform Text bleiben: \{紅|hóng} und {紅\|hóng} drucken {紅|hóng}. Eine Basis, die eine Zeile eröffnet oder schließt, richtet sich mitsamt ihrer Lesung an diesem Rand aus. mode=mono|group|jukugo wählt, wie die Lesungen über die Basis verteilt werden (mode=group entspricht group), und align=center|jis|start, wie eine Lesung, die kürzer ist als ihre Basis, gesperrt wird. In einem japanischen Dokument ist die Form je Zeichen für ein Wort aus zwei oder mehr Zeichen ({東京|とう|きょう}, rt="とう|きょう") Jukugo-Ruby: Jedes Zeichen behält seine Lesung, die auf das nächste Zeichen des Worts übergreifen darf, die Zeile darf zwischen ihnen umbrechen, und die Lesungen werden so gesperrt und greifen so auf Kana über, wie cjk.ruby.align und cjk.ruby.overhang es angeben; eine Lesung für die ganze Basis ({紫陽花|あじさい}, das 《》 von Aozora) ist Gruppen-Ruby; mode=mono behält eine Lesung je Zeichen, ohne Übergreifen auf die Nachbarn.
  • :sideline[text] zieht eine Seitenlinie (傍線) neben den Text, Satzzeichen und Leerzeichen eingeschlossen: darunter in waagerechtem Text, rechts daneben in senkrechtem Text. style="solid|double|wavy|dotted" (Standard solid), pos="over|under" (in senkrechtem Text ist „over“ rechts und „under“ links; position= funktioniert ebenfalls). Es funktioniert in jeder Schrift, auch für eine unterstrichene englische Wendung.
  • :warichu[note] setzt eine Anmerkung (双行夹注) in zwei Zeilen in halber Textgröße innerhalb der Zeile, die obere Zeile wird zuerst gelesen (in senkrechtem Text die rechte). Eine lange Anmerkung füllt den Rest der Zeile und setzt sich in der nächsten Zeile, Spalte oder Seite fort, mit mindestens zwei ihrer Zeichen auf jeder Seite des Umbruchs (cjk.warichu.minChars). open und close schließen sie in Klammern in Textgröße ein; cjk.warichu legt Größe, Farbe und Standardklammern fest (() in einem japanischen Dokument). Eine Anmerkung in lateinischer Schrift bricht zwischen ihren Wörtern um.
  • :kunten[字]{kaeri="…" okuri="…" tate} setzt die Kanbun-Zeichen des letzten Zeichens zwischen den Klammern: kaeri das Rückkehrzeichen (レ, 一 二 三, 上 中 下, 甲 乙 丙, 天 地 人 sowie 一レ 上レ 甲レ 天レ; die Codepunkte ㆑ ㆒ … werden gleich gelesen), okuri das Okurigana (die Klammern (ヲ) von Aozora entfallen) und der Schalter tate den Tatesen, der es mit dem nächsten Zeichen verbindet. Der Text wird nicht umgestellt: Die Zeichen werden in halber Größe daneben gesetzt (cjk.kunten), und kopierter Text lautet 學ビテ而時ニ習フ之ヲ, mit dem Okurigana und ohne die Rückkehrzeichen. Ein Ruby darin funktioniert für zweimal gelesene Zeichen: :kunten[:ruby[未]{rt="ザル" pos=under}]{kaeri="レ" okuri="ダ"}.

Der Zeilenabstand ändert sich nie: Zeichen und Lesungen sitzen im Durchschuss, und der Build warnt, wenn der Zeilenzwischenraum eines Absatzes für sie zu schmal ist (cjkMarksExceedLeading, rubyExceedsLeading, kuntenExceedsLeading) und wenn die Zeichen unter einer Zeile und die Lesungen über der nächsten nicht in den Zwischenraum passen, den sie sich teilen, in einem Absatz oder über zwei hinweg. Geben Sie annotierten Absätzen ein Absatzformat mit mehr Zeilenabstand. Zeichen, Lesungen und Anmerkungen werden in Absätzen, Überschriften, Listeneinträgen, Zitaten und Kästen gezeichnet, ebenso in Legenden, Tabellenzellen und Anmerkungen, deren Zeilenabstand auf dieselbe Weise geprüft wird; in Kolumnentiteln und Gestaltungen wird der Text ohne sie gedruckt. Unter cjk.bookTitleMark: 'brackets' sind die 《》 eines Titels Satzzeichen des Texts: Legenden, Zellen, Anmerkungen, Zeilen des Inhaltsverzeichnisses, Lesezeichen und Registereinträge behalten sie. Siehe Konfiguration › Zeichen, Ruby und Warichu.

#Schreibrichtung in der Auszeichnung

Ein Dokument läuft in der Richtung, die sein locale vorgibt (direction in der Konfiguration: von rechts nach links für Arabisch, Persisch, Urdu oder Hebräisch). Darin legt die Auszeichnung die Richtung eines Blocks oder einer Textfolge fest, für ein englisches Zitat in einem arabischen Buch oder ein arabisches in einem englischen Buch.

  • Eine Überschrift oder ein Container: {dir=ltr} oder {dir=rtl} in ihren Attributen, # Introduction {dir=ltr}, :::paragraphs{dir=ltr}, :::callout{dir=rtl}. Jeder Block in einem Container übernimmt die Richtung, bis hinab zu einem verschachtelten Container oder einer Überschrift, die eine andere festlegt. Ein einfacher Absatz, eine Liste oder ein Zitat hat keine eigenen Attribute: Schließen Sie ihn in :::paragraphs{dir=…} ein. Andere Werte werden ignoriert. Das lang eines Containers (:::paragraphs{dir=ltr lang=en}) benennt auf dieselbe Weise die Sprache der Blöcke darin: Ihre geordneten Listen zählen in den Ziffern dieser Sprache.
  • Eine Textfolge: :ltr[…] und :rtl[…] isolieren ihren Text (die LRI…PDI und RLI…PDI des Unicode-Bidi-Algorithmus): Innen wird er geordnet, und der umgebende Absatz sieht ein einziges neutrales Zeichen. {lang=…} kennzeichnet die Sprache der Folge im HTML und im PDF. Eine Anmerkungsmarke, ein :ref oder eine Formel darin gehört zur Isolierung, und Isolierungen lassen sich verschachteln.
:::paragraphs{dir=ltr}
The opening of the *Nights* in Lane's translation.
:::
 
ترجمها :ltr[Edward William Lane]{lang=en} سنة ١٨٣٩.

Ein Block, der gegen die Richtung des Dokuments gesetzt ist, behält seine eigene Anfangsseite: Einzug, Listenmarken und das bündige Ende seiner letzten Zeile wandern auf die Seite, auf der sein Text beginnt. Verwenden Sie eine Isolierung, wenn ein lateinischer Titel auf ein neutrales Zeichen endet (einen Punkt, eine Klammer), das sich sonst dem umgebenden Arabisch anschließen würde. Die Unicode-Steuerzeichen selbst (U+2066–2069, U+202A–202E, U+200E, U+200F, U+061C) werden ebenfalls beachtet. Im Editor der Sandbox läuft jede Zeile in der Richtung ihres ersten Buchstabens. Siehe Arabischer Satz.

#Fußnoten

Eine Fußnote hat zwei Teile: die Marke [^id] an der Stelle, an der die Anmerkung zitiert wird, und die Definition, einen eigenen Absatz, der irgendwo im Kapitel mit [^id]: beginnt.

The keeper climbed the tower every evening.[^steps] The wind put out his candle,
so he learned to count the steps in the dark.
 
[^steps]: The cast-iron staircase has 112 steps; the tower was built in 1861.
  • Marke. [^id] druckt die Nummer der Anmerkung hochgestellt, angehängt an das Wort davor (schreiben Sie sie wie oben nach dem Satzzeichen). Die ID besteht aus Buchstaben, Ziffern, -, _, . und :. Die Marke funktioniert in Absätzen, Listeneinträgen, Zitaten und Kästen; in Überschriften, Legenden und Tabellenzellen wird sie so gedruckt, wie sie geschrieben ist.
  • Definition. Ein Absatz, der mit [^id]: beginnt; sein Text reicht bis zur nächsten Leerzeile und nimmt die üblichen Inline-Auszeichnungen an (fett, kursiv, Links, :ref, Formeln, Chips). Definitionen verlassen den Fluss, wo immer sie stehen; sie können also unter dem Absatz stehen, der sie zitiert, oder gesammelt am Ende des Kapitels. Die erste Definition einer ID gilt.
  • Nummern. Anmerkungen werden in der Reihenfolge ihrer ersten Zitierung nummeriert, in jedem Kapitel neu beginnend (eine Überschrift der Ebene 1 und jedes Dokument eines Buchs); eine zweimal zitierte Anmerkung behält ihre erste Nummer und wird einmal gesetzt. footnotes.numbering: 'document' zählt die Nummern durch das ganze Buch weiter, und 'page' beginnt sie auf jeder Seite neu, wie es chinesische Bücher tun; footnotes.numberFormat: 'circled-decimal' schreibt ① ② ③ auf die Grundlinie. footnotes.numberFormat: 'symbols' kennzeichnet sie mit *, †, ‡, §, ‖, , danach verdoppelt, auf jeder Seite neu beginnend, wie in Fachzeitschriften.
  • Japanischer Text. Schreiben Sie die Marke vor ein satzschließendes 。 (先生[^1]。): Sie bleibt beim Zeichen davor, und 。 eröffnet nie eine Zeile. Ein senkrecht gesetztes japanisches Buch setzt seine Marken (1) standardmäßig rechts neben die Zeile und seine Anmerkungen hinter das Kapitel; footnotes.markerPosition: 'side' setzt eine kleine Marke neben das Wort, ohne Platz in der Zeile einzunehmen, und footnotes.placement: 'spread' setzt die Anmerkungen neben den Text jeder Doppelseite (siehe Konfiguration › Fußnoten).
  • Wohin die Anmerkung kommt. Standardmäßig an den Fuß der Spalte, die die zitierende Zeile enthält, unter eine kurze Linie: Zeile und Anmerkung teilen sich immer eine Spalte, und eine Zeile, deren Anmerkung nicht passt, wandert mit ihr weiter. In einem einspaltigen Layout ist das der Fuß der Seite. footnotes.placement: 'chapterEnd' setzt stattdessen alle Anmerkungen eines Kapitels hinter dessen letzten Block, standardmäßig an den Fuß der Spalte, die sie abschließen. Größen, Linie und Abstände finden Sie unter Fußnoten in der Konfigurationsreferenz.
  • Prüfungen. Eine Marke ohne Definition (undefinedFootnote) druckt ihre Nummer über einer leeren Anmerkung; eine Definition, die keine Marke zitiert (unusedFootnote), wird nicht gesetzt. Die Sandbox führt beide im Bedienfeld Prüfungen auf.

#Querverweise und Anker

Ein Querverweis benennt eine Stelle im Buch und druckt ihre Nummer, ihren Titel oder ihre Seite: siehe Abschnitt 3.2, wie Kapitel 4 erläutert, auf S. 112. Wörter und Nummern folgen dem Text; wird ein Abschnitt verschoben, werden die Kapitel neu nummeriert oder das Buch neu umbrochen, aktualisiert sich jeder Verweis. Im PDF, im HTML und in den Vorschauen der Sandbox ist jeder Verweis ein Link: Ein Klick führt den Leser zu seinem Ziel, auch in ein anderes Kapitel.

Anker. Ein Verweis braucht etwas, worauf er zeigt:

  • Eine Überschrift mit einem Bezeichner: ## Method {#sec-method} (die Form von Pandoc; id="sec-method" funktioniert ebenfalls).
  • Ein Kasten oder ein anderer Container, der mit einem Bezeichner geöffnet wird: :::callout{#box-safety title="Safety"}. Auf einen Kasten eines nummerierten Formats (ein Theorem) wird mit seiner Bezeichnung und Nummer verwiesen: Theorem 2.
  • Eine abgesetzte Formel mit einem \label{eq:x} (siehe Mathematische Formeln): Ein Verweis druckt ihre Nummer so, wie die Formel es tut, (3).
  • Eine Stelle im Text: :anchor{#key-idea} setzt einen unsichtbaren Anker; [the key idea]{#key-idea} behält seine Wörter und benennt sie.

Ein Bezeichner besteht aus Buchstaben, Ziffern, -, _, . und :. Er muss im Buch eindeutig sein: Das Bedienfeld Prüfungen führt einen doppelt gesetzten auf (duplicateAnchor), und Verweise erreichen sein erstes Vorkommen.

Verweise. :ref{id="…"} benennt einen Anker so, wie es eine Abbildung oder eine Tabelle benennt:

## Method {#sec-method}
 
The results of :ref{id="sec-method"} hold on :ref{id="sec-method" style=page}.
styledruckt
(keiner)eine nummerierte Überschrift mit ihrem Wort und ihrer Nummer (Abschnitt 3.2, Kapitel 4), eine nicht nummerierte Überschrift mit ihrem Titel, einen Anker mit seinem Text, eine Gleichung mit ihrer Nummer, wie sie gedruckt ist ((3)), einen nummerierten Kasten mit seiner Bezeichnung und Nummer (Theorem 2)
numbernur die Nummer (3.2, 3, 2)
titleden Titel der Überschrift, den Text des Ankers oder den title des Kastens
pagedie Seite, auf der das Ziel gelandet ist (S. 112)
pageNumbernur die Seitenzahl (112)

\eqref{x} und \ref{x} aus LaTeX funktionieren auch im Text: \eqref als Verweis ohne Format, \ref als style=number, sodass \ref{thm:main} 2 druckt und \ref{fig:map} die Nummer einer Abbildung. Ein ~ direkt davor ist ein geschütztes Leerzeichen (Theorem~\ref{thm:main}). Innerhalb von $…$ gehören sie zur Formel.

text="…" druckt Ihre eigenen Wörter und verlinkt trotzdem; case=capitalize beginnt die Bezeichnung mit einem Großbuchstaben (Section 3.2 am Satzanfang). Die Wörter folgen der Dokumentsprache (sección 3.2, 第3.2节, S. 112) und lassen sich unter Querverweise in der Konfiguration ändern; eine Überschriftennummer, die ihre Vorlage bereits ausschreibt (Chapter 4, 第四章), wird so gedruckt, wie sie ist.

Zeilenumbrüche. Ein Verweis, der Wörter druckt, bricht wie der umgebende Text an seinen Leerzeichen um: der Text eines Ankers ([close the lever so that it points backwards]{#step}), ein Titel, Ihr eigenes text="…". Seine Leerzeichen sind Leerzeichen der Zeile, sodass sie sich auf einer Zeile im Blocksatz mit den anderen dehnen, und der Verweis bleibt ein einziger Link, in zwei Stücken, wenn er über zwei Zeilen läuft. Seine Wörter werden nie getrennt. Innerhalb einer solchen Bezeichnung bleibt eine Zahl, eine römische Zahl oder ein einzelner Buchstabe beim Wort davor, sodass text="Fig. 1a" oder text="plate IV" nie getrennt wird. Eine Bezeichnung, die eine Nummer oder eine Seite enthält (Abschnitt 3.2, S. 112, Abb. 1.7, Theorem 2), bricht nie um, gleich welchen Zwischenraum ihre Vorlage enthält, und ein geschütztes Leerzeichen in einer Bezeichnung verbindet wie überall. crossRefs.breakLabels: false hält jede Bezeichnung ganz, wie bis postext 1.27, als eine Bezeichnung ein einziges Wort war, das nicht in die Zeile davor hinaufrücken konnte; siehe Querverweise.

Seitenverweise sind erst bekannt, wenn das Buch gesetzt ist. Die Engine setzt das Dokument mit den Seiten des vorigen Durchgangs erneut, bis sie stabil bleiben, wie beim Inhaltsverzeichnis; bis dahin druckt eine Seite ?.

pandoc-crossref. Für pandoc-crossref geschriebener Text liest sich gleich: @sec:method, [@fig:map] und [-@tbl:data] für die bloße Nummer. Das Präfix (sec, fig, tbl, eq, lst) kann Teil des Bezeichners sein ({#sec:method}) oder fehlen ({#method}). Ein @, das direkt an einem Wort klebt, wie in einer E-Mail-Adresse, bleibt Text.

Ein Verweis auf eine ID, die nichts setzt, druckt ?, und das Bedienfeld Prüfungen führt ihn auf (unknownResourceId). Im Editor der Sandbox bietet @ die Abbildungen, Tabellen, Überschriften mit ID und Anker des Buchs an.

#Zitate und Literaturverzeichnis

Schreiben Sie Zitate so, wie Pandoc sie liest, halten Sie die Literaturangaben im Dokument und wählen Sie den Zitierstil in den Einstellungen: Der Wechsel von APA zu IEEE oder zu Chicago-Anmerkungen ändert die Stileinstellung, nicht den Text. Jedes Zitat verlinkt auf seinen Eintrag im Literaturverzeichnis.

#Zitieren

As [@garcia2020, p. 33] shows, reading on paper is faster [see @lopez2019, chap. 2; @bringhurst2004].
@garcia2020 [p. 4] says it plainly; the 2020 study [-@garcia2020] agrees.
  • [@key] zitiert in Klammern; mehrere Werke stehen in einem Klammerpaar, getrennt durch ;.
  • Fundstelle: nach einem Komma p. 33, pp. 4–6, chap. 2, sec. IV, fig. 3, vol. 2, n. 12, l. 4, § 4.2; eine bloße Zahl ist eine Seite. Spanische (pág., cap.) und chinesische (页, 章) Wörter funktionieren ebenfalls. Ein Bereich nimmt einen Halbgeviertstrich oder die zwei Bindestriche von TeX: pp. 4--6 druckt 4–6.
  • Präfix und Suffix: Text vor dem @ (see) und nach dem Schlüssel oder der Fundstelle (, emphasis added). Das Suffix behält das davor geschriebene Komma, mit oder ohne Fundstelle: [@brown2020, inter alia] druckt (Brown et al., 2020, inter alia), wie bei Pandoc; ohne Komma geschrieben ([@brown2020 inter alia]) hat es keines. Hervorhebung in einem Präfix oder Suffix wird in jedem Stil als Hervorhebung gesetzt: [*e.g.*, @brown2020, *inter alia*].
  • [-@key] lässt den Autor weg, für einen Satz, der den Autor bereits nennt.
  • @key zitiert im Satz (García (2020)); @key [p. 4] fügt eine Fundstelle hinzu.
  • In Legenden: Die Legende einer Abbildung oder Tabelle und ihre Anmerkung zitieren wie der Text (Prior best from [@cobbe2021].). Ihre Werke gelangen ohne nocite ins Literaturverzeichnis, und ein nummerierter Stil nummeriert sie dort, wo die Ressource platziert wird: nach den Zitaten des Absatzes, der zuerst auf sie verweist (ihr Block ::resource oder ihr erstes :ref). Ein Zitat in einer Tabellenzelle bleibt Text.
  • Ein @, das an einem Buchstaben oder einer Ziffer klebt (eine E-Mail-Adresse), ein @ in Inline-Code und \@ sind Text. Ein Zitat, für das das Buch keine Literaturangabe hat, wird so gedruckt, wie es geschrieben ist, sodass sich ein Dokument ohne Literaturangaben wie zuvor liest. In einem Zitat mehrerer Werke wird ein Schlüssel, den keine Literaturangabe definiert, fett hinter den anderen gedruckt ((Glen, 1955) **@nye1953**), sodass das fehlende Werk auf der Seite ebenso sichtbar ist wie unter den Warnungen. Ein Doppelpunkt nach einem Zitat ist Text: [@french2018]: the land….
  • In chinesischem, japanischem und koreanischem Text folgt ein Zitat ohne Leerzeichen auf das letzte Zeichen (周明远@zhou2019认为), und ein Autor-Jahr-Zitat übernimmt die Satzzeichen voller Breite des umgebenden Texts: (施雅风等,1988;刘时银等,2015).

#Literaturangaben

Literaturangaben werden im Dokument geschrieben, in CSL-Form (dem Datenmodell von Zotero und Pandoc):

---
references:
  - id: garcia2020
    type: book
    author: [{family: García, given: Ana}]
    title: Tipografía y lectura
    issued: 2020
    publisher: Trea
nocite: "@lopez2019"
---

oder in einem Block :::references, in BibTeX (ein Export aus Zotero, JabRef oder Google Scholar), CSL-JSON oder CSL-YAML:

:::references{format=bibtex}
@article{lopez2019, author = {López, Luis and Ruiz, Eva}, title = {Leer en pantalla},
  journal = {Revista de Letras}, year = 2019, volume = 12, pages = {45--67}, doi = {10.1000/xyz}}
:::

Der Block druckt nichts. nocite führt Werke auf, ohne sie zu zitieren (@*: alle). In einem Buch gelten Literaturangaben aus jedem Kapitel für das ganze Buch.

In einer BibTeX-Namensliste steht and others für die weggelassenen Namen (author = {Tan, Wei and others}): Jeder Stil druckt an seiner Stelle et al. In YAML schreiben Sie others als letzten Namen der Liste.

#Das Literaturverzeichnis

:::bibliography setzt die Liste der zitierten Werke dort, wo es steht; ohne einen solchen Block folgt die Liste auf das letzte Kapitel, betitelt in der Dokumentsprache (References, Referencias, 参考文献). :::bibliography{title="Works cited"} ändert den Titel, und title="" lässt ihn weg; scope=chapter führt die Werke auf, die das Kapitel zitiert (ein Sammelband). Jeder Eintrag ist ein Anker (ref-<key>), sodass ein Markdown-Link auf #ref-garcia2020 ihn erreicht, und das PDF taggt ihn als BibEntry.

scope=new führt die bisher im Dokument zitierten Werke auf, die keine vorherige Liste gedruckt hat, in der Reihenfolge des Stils und mit seinen Nummern: Ein :::bibliography{scope=new} nach dem Haupttext und ein weiteres nach den Methoden ergeben die zwei Listen eines Nature-Artikels, die zweite von der ersten an weiternummeriert. Ein nummerierter Stil zählt seine Zitate durch das ganze Buch; mit citations.numbering: 'chapter' nummeriert jedes Kapitel (jedes Dokument und jede Überschrift der Ebene 1 nach einem Zitat) seine eigenen ab 1, und seine Kapitelliste übernimmt diese Nummern, wie es die Berichte eines Bulletins oder die Beiträge eines Tagungsbands tun.

#Zitierstile

Der Stil entscheidet, was ein Zitat und ein Eintrag aussagen. Die mitgelieferten Stile sind unten aufgeführt; jeder andere CSL-Stil (im Stil-Repository von Zotero gibt es mehr als zehntausend) lässt sich aus seiner .csl-Datei unter Einstellungen → Zitate laden.

citations.styleNameSystem
apaAPA 7Autor-Jahr
chicago-author-dateChicago (Autor-Jahr)Autor-Jahr
harvard-cite-them-rightHarvardAutor-Jahr
iso690-author-date-en, iso690-author-date-esISO 690Autor-Jahr
china-national-standard-gb-t-7714-2025-author-dateGB/T 7714—2025 著者-出版年Autor-Jahr
china-national-standard-gb-t-7714-2015-author-dateGB/T 7714—2015 著者-出版年Autor-Jahr
modern-language-associationMLA 9Autor-Seite
ieeeIEEEnummeriert
elsevier-vancouverVancouvernummeriert
american-medical-associationAMAnummeriert
natureNaturenummeriert
iso690-numeric-enISO 690nummeriert
china-national-standard-gb-t-7714-2025-numericGB/T 7714—2025 顺序编码nummeriert
china-national-standard-gb-t-7714-2015-numericGB/T 7714—2015 顺序编码nummeriert
sist02SIST 02 参照文献の書き方nummeriert
chicago-notes-bibliographyChicago (Anmerkungen)Anmerkungen
oscolaOSCOLAAnmerkungen
china-national-standard-gb-t-7714-2025-noteGB/T 7714—2025 注释Anmerkungen
china-national-standard-gb-t-7714-2015-noteGB/T 7714—2015 注释Anmerkungen

Bei einem Anmerkungsstil wird jedes Zitat zu einer Fußnote, platziert und nummeriert nach den Fußnoteneinstellungen; spätere Zitate desselben Werks nehmen eine Kurzform an. In chinesischem Text setzt citations.notes: 'warichu' sie als zweizeilige Anmerkungen in die Zeile (夹注); eine Anmerkung, auf die ein chinesisches Satzzeichen folgt (,, 。), verliert ihren eigenen Schlusspunkt.

Chinesisch. Die Stile nach GB/T 7714-2015 schreiben die Dokumenttyp-Codes ([M], [J], [D], [EB/OL]), lassen chinesische Namen ungeteilt und schreiben 等 nach drei Autoren eines chinesischen Werks und et al. nach denen eines westlichen, je nach der language jedes Werks. In senkrechtem Text steht eine hochgestellte Nummer rechts neben ihrem Zeichen; citations.marker: 'corner' schreibt 〔1〕, das aufrecht bleibt.

Engine. Zitate werden vom Paket postext-citeproc formatiert (citeproc-js und die CSL-Stile). Die Sandbox lädt es für Dokumente, die zitieren; in Ihrem eigenen Code registrieren Sie es vor dem Setzen:

import 'postext-citeproc/register';

Das Bedienfeld Prüfungen führt einen Schlüssel auf, den keine Literaturangabe definiert (unknownCitationKey), sowie einen Literaturblock, der sich nicht lesen lässt (referencesUnreadable).

#Register

Ein Register führt die Begriffe eines Buchs mit den Seiten auf, auf denen sie vorkommen. Markieren Sie jeden Begriff dort, wo der Text ihn behandelt, und drucken Sie das Register mit :::index an der Stelle, an die es gehört, meist in einem eigenen Kapitel am Ende. Die Engine ermittelt die Seite jeder Marke nach dem Setzen, sodass die Zahlen dem Text folgen: Fügen Sie einen Absatz hinzu, verschieben Sie ein Kapitel oder ändern Sie das Endformat, und das Register druckt die neuen Seiten.

Iron-deficiency :index[anaemia] is the most common kind.
The pulse is taken at the wrist.:index{term="Pulse!radial" main}
 
# Index {style="index"}
 
:::index

#Registermarken

  • :index[text] druckt text und ordnet ihn unter seinen eigenen Wörtern ein. Inline-Auszeichnungen darin werden gedruckt und aus dem Eintrag entfernt. Attribute nach der Klammer ordnen ihn anderswo ein: :index[iron deficiency]{term="Anaemia!iron-deficiency"}.
  • :index{term="…"} druckt nichts. Die Marke übernimmt die Seite des Worts, das auf ihrer Zeile direkt vor ihr steht, oder, wenn sie eine Zeile eröffnet, die des Worts danach. Eine Zeile, die nur Marken enthält, wird entfernt, sodass eine Marke auf einer eigenen Zeile nie einen Absatz teilt oder Abstand hinzufügt.
  • Wo. Absätze, Überschriften, Listeneinträge, Zitate, Kästen und Fußnotendefinitionen. In Legenden, Tabellenzellen und Gestaltungselementen wird eine Marke so gedruckt, wie sie geschrieben ist. In Inline-Code und nach einem Backslash (\:index) ist sie Text.
AttributWirkung
termDer Eintrag, seine Ebenen durch ! getrennt: term="Heart!valves!mitral" ordnet die Seite unter mitral ein, einem Untereintrag von valves unter Heart. Eine Ebene kann Inline-Auszeichnungen tragen (term="*Escherichia coli*"); sortiert wird sie ohne sie. Ohne term verwendet :index[text] seinen Text.
subEine nach term hinzugefügte Ebene: term="Heart" sub="valves" entspricht term="Heart!valves".
sortDer Sortierschlüssel der letzten Ebene, wenn sie nach anderen Buchstaben sortiert werden soll: :index[St Kilda]{sort="Saint Kilda"}, term="20th century" sort="twentieth century". Ein chinesisches Register sortiert und gruppiert nach der Lesung, die die Kollation einem Zeichen gibt. Für ein Zeichen mit mehreren Lesungen, das anders gelesen wird, schreiben Sie den Schlüssel in Zeichen, die nur die gewünschte Lesung haben: :index[重阳]{sort="崇阳"} ordnet 重阳 unter C ein, zwischen 程 und 崔, nicht unter Z. Ein Pinyin-Schlüssel (sort="chong yang") erreicht ebenfalls C, sortiert aber hinter alle chinesischen Einträge von C, weil die Kollation lateinische Buchstaben hinter chinesische Zeichen setzt (siehe Konfiguration › Register, groupBy).
yomi, readingDie Lesung der letzten Ebene in Kana, nach der ein japanisches Register sie sortiert und gruppiert: :index[夏目漱石]{yomi="なつめそうせき"} wird unter な eingeordnet, in der な-Reihe. Ohne sie wird eine Marke, deren Text Furigana in Kana trägt, über diese gelesen (:index[{東京|とう|きょう}] sortiert als とうきょう), dann über sort, dann über den Text; ein Eintrag, der weiterhin mit einem Kanji beginnt, wird als indexReadingMissing gemeldet. In einem Register in einer anderen Sprache wirkt yomi wie sort. Schreiben Sie Furigana in einer Marke in der Kurzform: Ein :ruby[…] bräuchte maskierte Klammern. Seit postext 1.16.
mainEin Schalter: die Hauptbehandlung des Begriffs. Ihre Seitenzahl wird fett gesetzt (index.main). Eine auf beide Arten markierte Seite ist fett.
rangerange="start" und range="end" mit demselben Begriff begrenzen eine Behandlung, die über mehrere Seiten läuft: Der Eintrag druckt 34–37. Ein Anfang ohne Ende oder ein Ende ohne Anfang druckt seine eine Seite und löst indexRangeUnclosed aus.
seeEin Querverweis statt einer Seitenzahl: :index{term="Cardiac insufficiency" see="Heart failure"} druckt Cardiac insufficiency. See Heart failure. Ebenen des Ziels werden durch ! getrennt und mit einem Doppelpunkt gedruckt (See Heart: valves). Ein Ziel, das kein Eintrag des Registers ist, löst indexSeeUnknown aus.
seealsoEin Querverweis nach den Seitenzahlen des Eintrags: Heart, 12, 40. See also Circulation. Die eigene Seite der Marke zählt wie die jeder anderen Marke, sodass eine Marke eine Passage registrieren und auf einen verwandten Eintrag zeigen kann; eine Marke see fügt keine Seite hinzu.
indexDer Name eines eigenen Registers: index="names" ordnet die Marke in das Register ein, das :::index{index="names"} druckt, nicht in das Hauptregister.

Eine Marke ohne Begriff (:index{} oder :index{see="…"} allein) registriert nichts und löst indexMarkInvalid aus.

#Das Register drucken

:::index druckt das Hauptregister dort, wo es steht, und :::index{index="names"} ein benanntes. Die Direktive entfaltet sich zu gewöhnlichen Blöcken, einem je Eintrag, die wie Text durch Spalten und Seiten fließen: Unter einer Überschrift, deren Überschriftenstil ein zweispaltiges layout festlegt, ergibt sie das übliche zweispaltige Register. Ein Klick auf einen Eintrag führt zur Zeile der Direktive.

# Index of names {style="index"}
 
:::index{index="names"}
 
# Index of subjects {style="index"}
 
:::index
  • Reihenfolge. Einträge werden in der alphabetischen Reihenfolge der Dokumentsprache sortiert (locale oder index.locale): Ein Buchstabe mit Akzent wird bei seinem Grundbuchstaben eingeordnet (Árbol unter A), und im Spanischen folgt ñ auf n, unter einem eigenen Kopf. Einträge, die mit einem Symbol beginnen, kommen zuerst, dann die mit einer Ziffer, dann die Buchstaben. Untereinträge werden unter ihrem Eintrag ebenso sortiert, um eine Stufe je Ebene eingerückt. Ein japanisches Register sortiert nach der Lesung in der Reihenfolge von JIS X 4061 und gruppiert nach Gojūon-Reihen (あ行, か行 …), seine lateinischen Einträge vor den Kana (siehe Japanischer Satz › Register in Gojūon-Ordnung).
  • Gruppen. Jeder neue Anfangsbuchstabe eröffnet eine Gruppe: einen Buchstabenkopf (index.groups) und eine Leerzeile darüber (keine über der ersten Gruppe). Der Kopf wird in einem Block mit dem ersten Eintrag der Gruppe gesetzt, sodass er nie allein eine Spalte beschließt; ein Eintrag ohne eigene Seite (einer, der nur seine Untereinträge anführt) wird aus demselben Grund mit seinem ersten Untereintrag gesetzt.
  • Seitenzahlen. Die Bezeichnungen, die die Seiten drucken, römische in der Titelei eingeschlossen. Die Seiten eines Eintrags werden sortiert und jede einmal aufgeführt; aufeinanderfolgende Seiten verbinden sich zu einem Bereich (12–14, index.mergeRanges), eine Seite innerhalb eines Bereichs desselben Eintrags geht in ihm auf (eine Hauptseite darin macht den Bereich fett), und index.rangeFormat: 'chicago' kürzt die zweite Zahl (234–37). Fette Seiten (Hauptstellen) bleiben getrennt. Im PDF verlinkt jede Zahl auf ihre Seite.
  • Querverweise schließen den Eintrag ab: Begriff. See Ziel, wenn der Eintrag keine Seiten hat, Begriff, 12. See also Ziel, wenn er welche hat. Die Bezeichnungen folgen der Dokumentsprache (See, Véase …) und lassen sich in index.see festlegen.
  • Bücher. In einem Buch, das Kapitel für Kapitel gesetzt wird (die Sandbox, buildBundle), erhält das Kapitel, das das Register druckt, die Marken jedes Kapitels mit ihren Seiten und wird nur dann neu gesetzt, wenn sich eine davon verschiebt. Ein Dokument, das sowohl seine Marken als auch sein Register enthält, wird so lange neu gesetzt, bis sich die Zahlen eingependelt haben, wie bei :::toc.

Typografie, Einzüge und Trennzeichen finden Sie unter Register in der Konfigurationsreferenz.

#Mathematische Formeln

Formelsatz ist ein vollwertiger Bestandteil des Dokumentformats. Postext liest $…$ als Formel im Text und $$…$$ als abgesetzte Formel (Blockformel) und rendert beide mit MathJax im SVG-Modus. Dieselben Vektorpfade speisen alle drei Backends, sodass die Canvas-Vorschau, der HTML-Export und die PDF-Ausgabe pixelgenau übereinstimmen – und das PDF bleibt bei jeder Vergrößerung vollständig vektoriell.

  • Im Text: $…$. Wird in jedem Textblock erkannt (Absatz, Überschrift, Zitat, Listenpunkt). Bildet in der Zeile eine einzige unteilbare Box ohne Umbruchstelle; Knuth-Plass behandelt sie wie ein Wort, das nicht getrennt werden darf. Würde die natürliche Höhe der Formel die Zeilenbox sprengen, wird sie gleichmäßig verkleinert, damit das Grundlinienraster erhalten bleibt – sehr hohe Ausdrücke gehören in eine abgesetzte Formel.
  • Abgesetzt: $$…$$. Entweder in einer eigenen Zeile ($$\int_0^1 x^2\,dx$$) oder über mehrere Zeilen, eingefasst von $$-Markierungen in eigenen Zeilen. Wird in der Spalte zentriert und mit einstellbarem Abstand oben und unten (math.marginTop, math.marginBottom) auf das Grundlinienraster gesetzt – mit genau demselben Korrekturmechanismus wie bei Überschriften, sodass der Absatz nach der Formel wieder auf dem Raster steht.
  • Text um eine abgesetzte Formel: Eine abgesetzte Formel in einer eigenen Zeile unterbricht einen Absatz auch ohne Leerzeile darüber. Der Text davor ist ein Absatz, der zu ihr hinführt; Text, der direkt unter dem schließenden $$ ohne Leerzeile steht, setzt den unterbrochenen Absatz fort und wird ohne Erstzeileneinzug gesetzt, so wie TeX das „wobei …“ nach einer abgesetzten Formel setzt. Eine Formel, die vom Text darüber durch eine Leerzeile getrennt ist (oder die auf eine Liste, ein Zitat oder eine Überschrift folgt), unterbricht nichts: Der Text danach ist ein neuer Absatz, wie gewohnt eingezogen, ob mit Leerzeile oder ohne (math.indentAfterDisplay: false setzt ihn ebenfalls stumpf). Nur eine vollständige abgesetzte Formel unterbricht einen Absatz – eine Formel allein in der Zeile oder ein $$-Block, der vor der nächsten Leerzeile geschlossen wird; eine Zeile wie $$a$$ and $$b$$ bleibt Text. math.keepWithLeadIn hält eine Formel in der Spalte der Zeile, die sie einleitet. (Bis postext 1.4 wurde eine $$…$$-Zeile ohne Leerzeile darüber als Teil des Absatzes gelesen und so gedruckt, wie sie geschrieben war.)
  • Gleichungsnummern: \label{eq:x} in einer abgesetzten Formel nummeriert sie in Lesereihenfolge: (1), (2) … Eine nummerierte Formel nimmt die ganze Spaltenbreite ein (oder die Innenbreite des Kastens), die Gleichung zentriert und ihre Nummer rechtsbündig in ihrer Zeile. In einem align, gather, alignat, flalign oder eqnarray erhält jede Zeile mit einem \label eine eigene Nummer, sofern die Zeile nicht \nonumber oder \notag enthält. Eine Formel ohne \label wird nicht nummeriert, wie $$…$$ es nie wurde. \tag{…} nummeriert eine Formel weiterhin mit dem angegebenen Text (\tag*{…} ohne Klammern) und wird nicht mitgezählt; ein \label daneben benennt diesen Text. Format, Kapitel- oder Abschnittsnummern (2.3) und Neubeginn der Zählung werden in math.equationNumbering eingestellt. Setzen Sie das \label auf die oberste Ebene der Formel oder ihrer Zeile, nicht in aligned, split oder cases.
  • Verweise auf Gleichungen: \eqref{eq:x} im Text druckt die Nummer so, wie die Formel sie trägt, (3), und \ref{eq:x} die bloße Nummer, 3; beide sind Links, wie jeder Querverweis. Eq.~\eqref{eq:x} behandelt ~ wie LaTeX: als geschütztes Leerzeichen. :ref{id="eq:x"} und @eq:x drucken ebenfalls (3). Innerhalb einer Formel drucken \eqref und \ref die Nummer (ohne Link). Ein Label, das nirgends gesetzt wird, druckt ? und erscheint im Bedienfeld Prüfungen.
  • Maskieren: \$ ist ein wörtliches Dollarzeichen. Nicht geschlossene $- oder $$-Begrenzer erzeugen im Bedienfeld Prüfungen der Sandbox einen Eintrag unclosedMath mit einem Quellanker, der per Klick die Stelle anspringt.
  • Legenden, Anmerkungen und Tabellenzellen setzen ebenfalls Formeln im Text (seit postext 1.19), in der Zeile mit dem Text, mit der Ausrichtung der Zelle und in der Größe des Textstücks. Dort eröffnet ein $ nur nach der Pandoc-Regel eine Formel: kein Leerzeichen nach dem öffnenden $, keines vor dem schließenden und keine Ziffer direkt danach, sodass die Preise in $5 to $10 Text bleiben; \$ druckt ein Dollarzeichen, sodass ein maskierter String im Text und in einer Tabelle gleich gelesen wird. Die Beschriftung eines Chips nimmt keine Formeln auf. Bis postext 1.18 wurde ein $ dort immer so gedruckt, wie es geschrieben war.
  • Fehler: TeX-Quelltext, den MathJax ablehnt (undefinierte Makros, Syntaxfehler), erscheint als Warnung invalidMath. Die Formel wird durch einen kleinen roten Platzhalter ersetzt, damit die Geometrie des Layouts gültig bleibt.
  • Konfiguration: Der Abschnitt math der Konfiguration bietet enabled, fontSizeScale (relativ zur Größe des umgebenden Textes: bei 1.0 ist ein Geviert der Formel so groß wie dieser – die Grundschriftgröße bei abgesetzten Formeln und bei Formeln im Grundtext; seit postext 1.5, das Formeln etwa 13 % kleiner setzt als 1.4, während Pakete und Sandbox-Bücher, die mit 1.4 gespeichert wurden, ihre Größe behalten – siehe Formelgröße), color (übernimmt ohne eigene Angabe die Farbe des Grundtextes) und die Abstände abgesetzter Formeln.
  • Die Engine: MathJax wird bei Bedarf geladen. Die Sandbox und der Layout-Worker starten es selbst; in Ihrem eigenen Code rufen Sie await initMathEngine() vor buildDocument auf, sonst wird jede Formel als grauer Platzhalterkasten gesetzt (siehe Die Mathematik-Engine starten).
The Euler identity $e^{i\pi}+1=0$ links the five fundamental constants.
 
$$
\int_0^{\infty} e^{-x^2}\,dx = \frac{\sqrt{\pi}}{2}
$$

Eine Formel mitten im Satz, und der Satz geht danach ohne Einzug weiter:

For a pendulum of length $L$ the period is
$$T_0 = 2\pi\sqrt{L/g}$$
where $g$ is the acceleration of free fall.

Nummerierte Gleichungen und Verweise darauf:

The energy is conserved,
$$
\begin{align}
E &= T + V \label{eq:energy} \\
  &= \tfrac12 m v^2 + m g h \nonumber
\end{align}
$$
and Eq.~\eqref{eq:energy} holds at every instant.

Sätze, Lemmata und Beweise. Ein Kastenformat mit numbering zählt seine Kästen, so wie amsthm in LaTeX Theorem-Umgebungen zählt: Jeder Kasten beginnt mit seiner Bezeichnung und Nummer in Fett, „Theorem 2.“, der title des Blocks folgt der Nummer in Klammern, „Theorem 2 (Bradley–Terry).“, und ein Verweis auf seine {#id} druckt „Theorem 2“ (\ref{thm:x} oder style=number die bloße 2). Formate, die denselben Zähler nennen, teilen ihn, sodass ein Lemma nach einem Theorem Lemma 3 ist. Das endMark eines Beweisformats schließt seine Kästen mit ∎ oder □ ab, rechtsbündig in der letzten Zeile. Die Formate finden Sie unter Nummerierte Aussagen und Beweise.

:::callout{type="theorem" #thm:main title="Bradley–Terry"}
Every reward class holds one reparameterised reward.
:::
 
:::callout{type="proof"}
Apply the projection of \eqref{eq:projection} to any member of the class.
:::
 
By :ref{id="thm:main"}, the objective is unchanged.

#Ressourcen

Bilder, SVGs, Tabellen und Videos werden nicht im Text geschrieben. Sie werden einmal als Ressourcen angelegt (verwaltet im Bedienfeld Ressourcen der Sandbox, das das Hochladen von Bildern und SVGs, einen interaktiven Tabelleneditor, YouTube-, Vimeo- und hochgeladene Videos sowie die Bearbeitung von Legende und Platzierung übernimmt) und dann über ihre ID mit dem Text verbunden. Ein Verweis auf eine Ressource genügt, um sie einzubinden – Sie nennen sie einmal mit einem :ref{id="…"} im Text, und die Engine lässt die Abbildung oder Tabelle in den ersten freien Platz nach diesem Verweis gleiten – an den Fuß der Spalte, in der Sie sie nennen, an den Kopf der nächsten Spalte, in ein Band der nächsten Seite –, so wie es ein Setzer im Druck täte. Sie platzieren sie kein zweites Mal.

Beide Formen unten sind neue Syntax, die nicht mit CommonMark kollidiert, sodass ein Dokument, das sie verwendet, in jedem anderen Markdown-Betrachter weiterhin als reiner Text lesbar bleibt.

#Verweis im Text (die Hauptform)

Verweisen Sie im Fließtext mit :ref{id="…"} auf eine Ressource. Der erste Verweis bindet die Ressource zugleich ein (sie wird also auf der Seite platziert) und gibt ihre berechnete Nummer aus, standardmäßig mit der Kurzbezeichnung des Typs davor:

As shown in :ref{id="lighthouse-diagram"}, the lantern room sits above the gallery.

ergibt: As shown in Fig. 1.7, the lantern room sits above the gallery. – und das Diagramm selbst gleitet an den nächsten freien Platz nach dem Satz (den Fuß dieser Spalte, den Kopf der nächsten oder ein Band der nächsten Seite), während dieser Satz und der Text danach ohne Unterbrechung weiterlaufen.

Der Fließtext wird an der Verweisstelle nie unterbrochen. Wo die Ressource landet – am ersten freien Platz oder nur an einem Platz oben oder unten, innerhalb einer Spalte oder über die ganze Breite –, bestimmen ihre Platzierung (siehe Platzierung weiter unten) und die Stelle, an der Sie sie nennen: Die Suche beginnt direkt nach dem Verweis.

#Blockeinbettung (optional, ausdrückliche Platzierung im Text)

Gelegentlich soll eine Ressource an einer genauen Stelle im Textfluss stehen, statt zu gleiten. Schalten Sie das Gleiten ab, indem Sie der Ressource placement.position: "here" geben und sie mit ::resource{id="…"} in einer eigenen Zeile einbetten:

Here is the floor plan we discussed.
 
::resource{id="lighthouse-diagram"}
 
The keeper's quarters occupy the eastern wing.

Für eine gleitende Ressource ist die Direktive ::resource unnötig – das :ref hat sie bereits platziert, und ein überzähliges ::resource für dieselbe ID wird einfach als weiterer Verweis behandelt, nicht als zweite Kopie. Ein ::resource setzt die Ressource nur dann im Text, wenn ihre aufgelöste Platzierung "here" ist. Eine Ressource im Text hält über sich eine Zeile Abstand (den Gleitobjektabstand), wie es ein Gleitobjekt täte, sofern der Block davor nicht mehr verlangt. Im Fließtext hält sie darunter denselben Abstand; danach kehrt der Text auf das Grundlinienraster zurück, was bis zu einer weiteren Zeile hinzufügen kann. Eine Überschrift, eine Liste, ein Kasten oder eine weitere Ressource im Text direkt danach teilt diesen Abstand mit ihrem eigenen Abstand oben: Es gilt der größere der beiden, nicht beide. (Bis postext 1.4 war der Abstand darunter nur das, was die Rasterausrichtung übrig ließ, irgendwo zwischen nichts und einer Zeile; layout.inlineResourceGap: 'above' behält diese Regel bei, und vor 1.5 gespeicherte Bücher werden damit gelesen.) Innerhalb eines Kastens (:::callout) behält die Ressource denselben Abstand, eine Zeile des Kastentextes darüber und, mit 'around', darunter; am Kopf oder Fuß des Kastens setzt stattdessen der Innenabstand sie ab. (Bis postext 1.4 stand sie direkt am Text des Kastens; layout.inlineResourceGapInBoxes: false behält das bei, und vor 1.5 gespeicherte Bücher, deren Kästen eine Ressource einbetten, werden damit gelesen.)

Eine Ressource im Text, deren Platzierung zusätzlich span: 'page' angibt (placement: { position: 'here', span: 'page' }), läuft in einem mehrspaltigen Layout an der Stelle ihrer Direktive über die ganze Seitenbreite, wie ein seitenbreiter Kasten: Die Spalten darüber enden auf gleicher Höhe (ausgeglichen, oder die Ressource wandert an den Kopf der nächsten Seite, wenn das nicht geht), sie wird über die Breite des Inhaltsbereichs mit demselben Abstand darüber und darunter gesetzt, und der Text läuft in jeder Spalte darunter weiter. Auf einer einspaltigen Seite wird sie wie bisher in voller Satzbreite gesetzt. Eine Ressource mit span: 'column' und gesetztem columns bleibt in ihrer Spalte, wenn sie im Text eingebettet wird: Die Spaltenzahl gilt nur für Gleitobjekte. Seit postext 1.19.

Die id muss einer im Bedienfeld Ressourcen angelegten Ressource entsprechen. Die Engine rendert die Ressource (Bitmap, SVG oder Tabelle) mit ihrer Legende darunter als Fuß der Abbildung bzw. Tabelle. Der Legendentext setzt sich aus dem captionPrefix des Ressourcentyps, der berechneten Nummer und der eigenen Legende der Ressource zusammen – z. B. Figure 1.7. The original lighthouse plan. Ihre Typografie regelt Konfiguration › Legendenstil: Bezeichnung und Beschreibung teilen Schriftart und Größe, während die Bezeichnung eigene Einstellungen für fett, kursiv und Farbe behält; der Abstand über der Legende ist standardmäßig 0.75em, die Ausrichtung linksbündig. Die Legende kann stattdessen über der Ressource stehen (captionStyle.position: 'above', global oder je Ressourcentyp), wahlweise auf einem farbigen Balken. Eine Ressource kann außerdem eine note tragen – eine kurze Quellen- oder Nachweiszeile mit derselben Formatierung im Text und denselben :ref-Markierungen wie die Legende –, die kleiner unter der Ressource gesetzt wird (unter der Legende, wenn diese unten steht, unter dem Inhalt, wenn sie oben steht) und über captionStyle.note gestaltet wird.

Zeilenumbrüche in Legenden und Anmerkungen. Eine Legende oder Anmerkung ist ein Absatz in der Satzbreite ihres Platzes, und ein darin getippter Zeilenwechsel ist ein Leerzeichen. Um eine neue Zeile zu beginnen, schreiben Sie \\ – den erzwungenen Umbruch von Titeln – oder beenden die Zeile mit einem Backslash, dem harten Umbruch von Markdown: ¹ Measured at 20 °C. \\ ² Mean of three runs. setzt jede Fußnote einer breiten Tabelle in eine eigene Zeile. Die Zeile vor einem Umbruch behält ihre natürliche Breite und wird nie auf die Satzbreite gedehnt, und zwei Umbrüche hintereinander ergeben keine Leerzeile (ein geschütztes Leerzeichen dazwischen schon). In einer Tabellenzelle wirkt \\ wie ein Zeilenwechsel: Es beginnt einen neuen Absatz; der Einzug der folgenden Zeile bleibt erhalten, sodass zwei führende Leerzeichen weiterhin einen Listenpunkt verschachteln. Im Text selbst sind die beiden Backslashes immer ein Umbruch, ohne Maskierung: Um sie zu drucken, setzen Sie sie in Code im Text, wo Backslashes so gedruckt werden, wie sie geschrieben sind. Im Ziel eines Links bleiben sie Teil der URL, in den Attributen einer Direktive (dem text eines :ref) Teil des Wertes; in einem Chip, der einzeilig gesetzt wird, ist ein Umbruch ein Leerzeichen. (Bis postext 1.4 wurden die Backslashes gedruckt, und eine Legende oder Anmerkung brach nur dort um, wo die Satzbreite endete.)

Tabellenressourcen zeichnen ihr eigenes Gitter, gestaltet über Konfiguration › Tabellenstil: Grund- und Kopfzellen haben völlig unabhängige Typografie, der Hintergrund der Kopfzeile ist standardmäßig #f0f0f0, Linien sind 0.75pt stark und cellPadding beträgt 0.375em – jedes nicht gesetzte Feld übernimmt den Wert des Grundtextes. Spaltenbreiten gehören zur Tabelle selbst: TableModel.columnWidths enthält je Spalte ein relatives Gewicht ([2, 1, 1] gibt der ersten Spalte die halbe Breite); ohne Angabe teilen sich die Spalten die Breite gleichmäßig. Eine Tabelle kann auch in einer benannten Variante gesetzt werden: table.styleId wählt einen der tableStyles des Dokuments (siehe Konfiguration › Benannte Tabellenstile), dessen nicht gesetzte Felder tableStyle übernehmen; eine unbekannte oder fehlende ID behält tableStyle bei.

Eine Zelle richtet ihren Inhalt mit TableCell.align (left, center, right; Listenpunkte bleiben linksbündig) und TableCell.verticalAlign (top, der Standard, middle oder bottom) aus. Die vertikale Ausrichtung verschiebt den gesamten Zellinhalt – das Bild und den Text darunter als Einheit – innerhalb einer Zelle, die höher ist als er: einer Zeile, die eine längere Nachbarzelle streckt, oder der Zeilen, die ein rowSpan überdeckt. Sie gilt in jeder Ausgabe (Canvas, HTML, PDF), in gedrehten Tabellen und in jedem Teilstück einer über mehrere Seiten geteilten Tabelle. Beide werden je Zelle über die Ausrichtungsschaltflächen in der Werkzeugleiste des Tabelleneditors der Sandbox gesetzt.

Eine Tabellenzelle kann auch ein Bild enthalten. TableCell.image nennt eine Bitmap- oder SVG-Ressource über ihre ID ({ "resourceId": "fig-arm", "width": 0.7 }): Das Bild wird in der Zelle gezeichnet – nie nummeriert, gleitend oder beschriftet –, auf die Innenbreite der Zelle eingepasst (oder auf den mit width angegebenen Anteil davon, Standard 1) unter Wahrung des Seitenverhältnisses, ausgerichtet wie der Zelltext, und ein etwaiger Zelltext läuft darunter. Die Zeile wächst, um es aufzunehmen. Im Tabelleneditor der Sandbox wählt die Bildschaltfläche der Werkzeugleiste die Ressource für die aktive Zelle, und ein Breitenfeld setzt den Anteil. Eine ID, die zu keiner Bildressource passt, lässt die Zelle reinen Text enthalten.

Eine Zelle kann eine eigene Füllung tragen. TableCell.background ist ein Farbwert ({ "hex": "#c1dfd6", "model": "hex" }, wahlweise über paletteId mit einem Eintrag der Dokumentpalette verknüpft), der statt des Kopf- oder Grundhintergrunds des Stils gemalt wird – eine Kompatibilitätsmatrix färbt ihre Zellen auf diese Weise grün, rot und gelb. Der Tabelleneditor der Sandbox setzt ihn über das Füllsteuerelement der Werkzeugleiste. Um solche Füllungen zu erklären, nehmen Legende, Anmerkung und jeder Textblock ein Farbfeld im Text auf: :swatch{color="#c1dfd6"} (ein Hexwert oder die ID eines Paletteneintrags – :swatch{color="table-compatible"}) setzt ein kleines Quadrat auf die Grundlinie, drei Viertel der Schriftgröße groß, mit der Farbe gefüllt und in der Textfarbe umrandet, sodass eine Anmerkung :swatch{color="ok"}: compatible; :swatch{color="no"}: incompatible lauten kann. Eine Farbe, die sich zu nichts auflöst, zeichnet einen leeren Umriss. Der Hexwert kann einen Alphakanal enthalten (#rrggbbaa, #rgba), und rgb()- / rgba()-Farben funktionieren ebenfalls, sodass eine durchscheinende Zellfüllung ein passend durchscheinendes Farbfeld hat (siehe Konfiguration › Transparenz).

SVG-Ressourcen lassen sich zusätzlich für den Druck mit einer einzigen Schmuckfarbe umfärben, über diagramStyle.singleInk (Standard false). Ist es eingeschaltet, wird jede Farbe in einem SVG-Diagramm auf einen helligkeitsabhängigen Tonwert von diagramStyle.inkColor abgebildet (standardmäßig die Hauptfarbe der Palette, #295AA3) – Weiß wird zu Papier, Schwarz zur vollen Farbe –, sodass Abbildungen getreu wiedergegeben werden, wenn das Dokument mit einer einzigen Schmuckfarbe gedruckt wird. Siehe Konfiguration › Diagrammstil.

Eine fehlerhafte Einbettung (fehlende oder leere id, eine id ohne Anführungszeichen oder in einfachen Anführungszeichen, zusätzliche Attribute) wird nicht zu einem Ressourcenblock; sie fällt auf das normale Lesen als Absatz zurück und bleibt in der Ausgabe sichtbar. Ebenso eine korrekt geschriebene Einbettungszeile, die ohne Leerzeile direkt unter einer Absatzzeile steht: Sie wird als Teil dieses Absatzes gelesen. Beide lösen eine Warnung malformedEmbed aus – einen Eintrag Einbettung als Text gesetzt im Bedienfeld Prüfungen der Sandbox.

Verweise im Text werden in jedem Textblock erkannt – Absätzen, Überschriften, Zitaten und Listenpunkten – und können neben fett, kursiv, Code und Formeln im Text stehen.

Verweisoptionen

Die Direktive :ref nimmt drei optionale Attribute in beliebiger Reihenfolge an. style wählt, wie die berechnete Bezeichnung ausgegeben wird: style="number" druckt die bloße Nummer (1.7), style="full" den vollen Namen des Typs plus Nummer (Figure 1.7), und ohne style wird die shortLabel des Typs plus Nummer verwendet (Fig. 1.7). case ändert nur die Groß- und Kleinschreibung des Bezeichnungsteils – lower, upper oder capitalize – und lässt die Nummer unberührt. text ist eine wörtliche Ersetzung, die jede berechnete Bezeichnung ersetzt und Vorrang vor style und case hat. Die Ausgabeoptionen nebeneinander:

SyntaxAusgabeHinweise
:ref{id="…"}Fig. 1.7Standardstil: die shortLabel des Typs, gefolgt von der Nummer, verbunden durch ein geschütztes Leerzeichen, sodass beide nie getrennt umbrochen werden.
:ref{id="…" style="number"}1.7Die bloße berechnete Nummer, ohne Bezeichnung.
:ref{id="…" style="full"}Figure 1.7Der volle name des Typs, gefolgt von der Nummer. Für den Satzanfang oder wo die Abkürzung schlecht liest.
:ref{id="…" case="lower"}fig. 1.7Ändert nur die Schreibung der Bezeichnung: lower (fig. 1.7), upper (FIG. 1.7) oder capitalize (erster Buchstabe groß). Lässt sich mit style="full" kombinieren (figure 1.7); die Nummer wird nie verändert, und ein unbekannter Wert wird ignoriert.
:ref{id="…" text="see the plan"}see the planEine ausdrückliche Ersetzung. Der angegebene Text wird wörtlich statt jeder berechneten Bezeichnung verwendet – nützlich für Links im Fließtext wie „wie wir zuvor gesehen haben“. Ist text vorhanden, hat es Vorrang vor style und case.

Nennt ein :ref (oder ::resource) eine ID ohne passende Ressource, fällt die Bezeichnung auf ? zurück (eine text=-Bezeichnung wird stattdessen gedruckt, weiterhin ohne Nummer und Link), und die Sandbox meldet eine Warnung Unbekannte Ressource. Die Engine verzeichnet sie als Eintrag unknownResourceId in den contentWarnings des Dokuments, mit dem Quellbereich und der Seite des Verweises – auch für ein :ref in der Legende, der Anmerkung oder einer Tabellenzelle einer Ressource, die der Text verwendet.

#Nummerierung beim ersten Verweis

Die Nummer einer Ressource wird vergeben, wenn sie in Lesereihenfolge zum ersten Mal genannt wird – ob diese erste Nennung eine Blockeinbettung ::resource oder ein :ref im Text ist. Von da an druckt jeder Verweis auf dieselbe ID dieselbe Nummer.

Die Nummern folgen also der Reihenfolge, in der der Leser auf sie trifft, nicht der Reihenfolge, in der die Ressourcen im Bedienfeld angelegt wurden:

  • Wenn Sie in der Einleitung per :ref auf eine Abbildung verweisen und sie erst zwei Seiten später einbetten (::resource), erhält sie trotzdem die Nummer der Einleitung – der Verweis kam zuerst.
  • Ein neuer Verweis weiter vorn im Dokument nummeriert alles danach automatisch neu. Es gibt keine manuelle Nummerierung, die abgeglichen werden müsste.

Die Nummerierung erfolgt je Ressourcentyp und beachtet dessen Rücksetzbereich und Zählerformat – siehe Konfiguration › Ressourcentypen zu den Vorlagen-Tokens ({h1}, {n}), resetOn und counterFormat.

Gezählt wird nur, worauf der Text verweist: Eine Ressource, die nur eine Gestaltung zeichnet (etwa ein Bildelement eines Kapitelauftakts), erhält keine Nummer und lässt den Zähler unverändert. Und {h1} zählt jede Überschrift der Ebene 1, deren Format nicht numbered: false ist, auch eine mit leerer numberingTemplate, sodass ein Artikel, dessen einzige H1 sein Titel ist, seine Abbildungen standardmäßig 1.1, 1.2 … nummeriert. Konfiguration › Was nummeriert wird beschreibt beide Regeln und die Einstellungen für Abbildung 1, 2 ….

#Platzierung

Jede Ressource hat eine Platzierung, die bestimmt, wo ihr Gleitobjekt landet; aufgelöst wird sie je Ressource (ihr eigenes placement), dann über das defaultPlacement ihres Typs, dann über den eingebauten Standard auto / column:

FeldWerteBedeutung
position"auto" · "top" · "bottom" · "here""auto" (der Standard) nimmt den ersten freien Platz nach dem Verweis, oben oder unten; "top" / "bottom" nehmen nur Plätze dieser Art an; "here" schaltet das Gleiten ab und bettet die Ressource an der Direktive ::resource im Text ein (eine dort platzierte Tabelle wird zwischen Zeilen geteilt, wenn sie nicht in den Rest ihrer Spalte passt, siehe Tabellen, die höher als die Seite sind).
width, align0 < width < 1; "left" · "center" · "right"Eine Ressource, die schmaler ist als ihr Platz: width ist der Anteil der Spalten- (oder Seiten-)breite, den sie einnimmt, align, wo sie im Platz steht (eine kleine Tabelle mittig in ihrer Spalte; ein seitenbreites Band, dessen Bild eine Spalte breit ist). Ein Bild, das schmaler ist als sein Platz – eine Bitmap, die kleiner ist als die Spalte, oder eine, die layout.fitFiguresToPage verkleinert hat –, steht ebenfalls gemäß align dort, unter einer Legende, die die Satzbreite des Platzes behält. Gilt für Gleitobjekte und für Einbettungen mit ::resource im Text gleichermaßen.
captionSidetrue · falseIn einem anderthalbspaltigen Layout, dessen Nebenspalte für Gleitobjekte reserviert ist (layout.sideColumnRole: 'floats'), behält ein "column"-Gleitobjekt mit captionSide seinen Inhalt in der Hauptspalte und setzt seine Legende (und Anmerkung) in die Nebenspalte, auf Höhe der Oberkante der Abbildung – oder ihrer Unterkante bei einem Gleitobjekt unten; die Nebenspalte gibt dieses Band ab. Eine Seite ohne solche Spalte behält die Legende unter der Abbildung. Seit postext 1.28 gilt das auch für eine im Text gesetzte Ressource ("here"), eine Spalte breit: Ihre Legende und Anmerkung stehen in der Nebenspalte, auf Höhe der Oberkante ihres Inhalts, der Block im Text ist nur so hoch wie der Inhalt, und die danach gesetzten Abbildungen und Kästen der Nebenspalte halten Abstand zur Legende. Wo die Nebenspalte neben der Einbettung belegt ist, bleibt die Legende unter dem Inhalt; eine Einbettung, die in die nächste Spalte oder auf die nächste Seite wandert, entscheidet dort neu. Nicht in einem Kasten, auf einer Seite mit senkrechtem Satz oder bei einem Bild, das vom Text umflossen wird. layout.inlineCaptionSide: false beschränkt seitliche Legenden auf Spalten-Gleitobjekte.
span"column" · "page"Eine einzelne Spalte belegen oder den Spaltenfluss unterbrechen und über die ganze Breite des Inhaltsbereichs, über alle Spalten laufen. In einem einspaltigen Layout sind beide gleich.
columnseine ganze Zahl, Standard 1Auf einer mehrspaltigen Seite ein "column"-Gleitobjekt über so viele benachbarte Spalten, Spaltenabstände eingeschlossen: ein Bild über zwei der fünf Spalten einer Zeitung. Es nimmt den Kopf einer Folge leerer Spalten, die auf gleicher Höhe beginnen, oder den Fuß der zitierenden Spalte und der leeren Spalten danach. So viele Spalten, wie die Seite hat, oder mehr machen es zu einem seitenbreiten Gleitobjekt. Wird bei den Spannweiten "page" und "side", bei einer gedrehten Ressource und bei einer Einbettung im Text ("here") ignoriert; captionSide gilt nur für ein Gleitobjekt von einer Spalte Breite. Seit postext 1.18.
rotate"ccw" · "cw"Die Ressource um eine Vierteldrehung gedreht setzen – eine Tabelle im Querformat in einem Buch im Hochformat. "ccw" dreht sie gegen den Uhrzeigersinn, ihre Oberkante zum linken Seitenrand (der Leser dreht das Buch im Uhrzeigersinn), die übliche Konvention; "cw" in die andere Richtung. Eine gedrehte Ressource ist immer ein seitenbreites Gleitobjekt auf einer eigenen Seite: Sie wird entlang der Höhe des Inhaltsbereichs gesetzt, abgerundet auf ganze Zeilen des Grundlinienrasters und abzüglich einer Grundtextzeile, des Gleitobjektabstands, den jedes Gleitobjektband hält (ein Satzspiegel von 237 mm auf einem 14-pt-Raster fasst 47 Zeilen, 232,1 mm, die Ressource erhält also 46 davon, 227,2 mm), steht bei gespiegelten Rändern bündig am Bund (sonst linksbündig), und eine Tabelle, die zu breit für eine Seite ist, wird zwischen Zeilen geteilt und läuft gedreht auf den folgenden Seiten weiter, mit wiederholter Kopfzeile, genau wie eine aufrechte Tabelle, die höher ist als eine Seite. Eine gedrehte Abbildung wird auf die Seite eingepasst. Wird bei einer Einbettung im Text ("here") ignoriert.
shrink, minScale"never" · "page" · "slot"; 0 < minScale ≤ 1, Standard 0.7Ein gleitendes Bild (Bitmap, SVG, das Posterbild eines Videos) unter Wahrung seiner Proportionen auf den Raum eines Platzes verkleinern, statt es weiterzuschieben. "never" (der Standard) setzt es in seiner Größe. "page" verkleinert es nur, wenn es zu hoch für das Band einer frischen Seite ist: den Inhaltsbereich abzüglich dessen, was dort bereits steht (ein Auftakt, andere Gleitobjekte, Fußnoten), und des Gleitobjektabstands, wie bei einer Katalogtafel, die auf ihre Seite zugeschnitten ist. "slot" verkleinert es außerdem in einen Platz der zitierenden Seite oder in den neben einem anderen Band verbliebenen Raum, wenn es dort mit minScale oder mehr hineinpasst; sonst wandert es wie bisher weiter. Die Plätze werden in ihrer üblichen Reihenfolge geprüft, und das Band endet weiterhin auf dem Grundlinienraster. Ein Bild mit Sicherheitsbereich wird innerhalb dessen beschnitten, bevor es skaliert wird (siehe Sicherheitsbereich). Auf einer frischen Seite, wo es sonst nirgends hin kann, wird ein Bild, das selbst bei minScale nicht passt, in diesem Maßstab gesetzt und ragt über das Band hinaus. Das Layout meldet jedes verkleinerte Gleitobjekt als Warnung floatShrunk. Tabellen (die geteilt werden), gleitende Kästen, Comicstreifen, gedrehte Ressourcen und Einbettungen im Text werden nie skaliert. Der Dokumentstandard ist layout.floatShrink. Seit postext 1.24.
captionMeasure"slot" · "body"Die Satzbreite von Legende und Anmerkung eines Bildes, das schmaler ist als sein Platz (verkleinert oder eine Bitmap, die kleiner ist als die Spalte): "slot" (der Standard) behält die Satzbreite des Platzes; "body" setzt sie so breit wie das Bild, darunter gemäß align, sodass eine zentrierte Tafel ihre Legende mittig darunter hat. Gilt für Gleitobjekte und Einbettungen im Text gleichermaßen. Seit postext 1.24.
wrap, wrapGap"none" · "left" · "right" · "start" · "end"; eine LängeDen Text neben der Ressource laufen lassen: Sie steht an dieser Seite ihrer Spalte, und die Zeilen daneben werden auf die verbleibende Satzbreite gesetzt, mit wrapGap Abstand zu ihrem Kasten (Legende eingeschlossen), und kehren darunter zur vollen Satzbreite zurück. Eine Einbettung im Text ("here") und ein einspaltiges Gleitobjekt am Kopf oder Fuß einer Spalte nehmen das an; seitenbreite, mehrspaltige, Nebenspalten- und gedrehte Gleitobjekte behalten ihr Band. Die Ressource nimmt width der Spalte ein, sonst layout.wrap.defaultWidth (0.45). wrapGap ist standardmäßig layout.wrap.gap, sonst eine Grundtextzeile. Siehe Textumfluss. Seit postext 1.24.
citingPagetrue · false, Standard falseEin "top"- oder "auto"-Gleitobjekt den Kopf der Seite (bei einem seitenbreiten Gleitobjekt) oder der Spalte (bei einem Spalten-Gleitobjekt, auch über columns) einnehmen lassen, auf der die Zeile landet, die es zuerst zitiert, wie es die Platzierung t in LaTeX tut, statt des ersten freien Platzes nach dieser Zeile. Der Text über dem Verweis rückt unter das Gleitobjekt nach unten. Das geschieht nur, wenn das Gleitobjekt dort innerhalb von layout.maxTopFraction der Spalte (standardmäßig 0.7) Platz findet, wenn die früheren Gleitobjekte seiner Nummernfolge bereits gesetzt sind, wenn kein ausdrücklicher Umbruch die Seite eröffnet (die erste Seite eines Kapitels, ein Teil, ein :::pagebreak) und nichts Seitenbreites über der zitierenden Zeile steht, und wenn die zitierende Zeile bei dieser Anordnung noch auf dieser Seite landet (in einer Spalte, die das Gleitobjekt anführt); andernfalls nimmt das Gleitobjekt seinen üblichen Platz. Gedrehte Gleitobjekte, Nebenspalten-Gleitobjekte und der Rest einer über Seiten geteilten Tabelle werden nie so verschoben. Standard: das defaultPlacement des Typs, dann layout.floatsAtCitingPage. Seit postext 1.25.

Ein Gleitobjekt kommt an den ersten freien Platz nach seinem ersten Verweis, in Lesereihenfolge: den Fuß der Spalte, in der der Verweis steht, dann Kopf und Fuß der nächsten leeren Spalte derselben Seite, dann die Bänder der nächsten Seite, die der Fluss öffnet (ein seitenbreites Gleitobjekt nimmt den Fuß der Seite, wenn jede Spalte noch Platz dafür hat, sonst ein Band der nächsten Seite). Eine Seite, die eine Abbildung oder Tabelle im Text eröffnet, zählt ebenfalls: Ein Gleitobjekt, das auf diese Seite wartet, nimmt ihren Kopf über der Abbildung oder Tabelle ein, wenn beide darauf passen; passen sie nicht, behält die Abbildung oder Tabelle die Seite, und das Gleitobjekt wartet auf die nächste. Bis postext 1.4 wurde eine solche Seite übersprungen, und das Gleitobjekt wartete auf die Seite danach, auch wenn beide gepasst hätten. Es wird in seiner Größe gesetzt, sofern sein shrink es nicht auf den Raum eines Platzes skalieren lässt (siehe Tabelle oben), und es landet nie vor seinem Verweis. Gleitobjekte einer Nummernfolge erscheinen in Verweisreihenfolge: Eine Abbildung, die auf einer Seite nirgends passt, hält die Abbildungen hinter ihr auf (eine wartende Tabelle hält keine Abbildung auf und umgekehrt), sodass Abbildung 12 nie vor Abbildung 11 erscheint. Eine Tabelle, die sonst warten müsste, wird stattdessen geteilt: Bietet sich ihr der Kopf einer leeren Spalte, nimmt sie die Zeilen, die passen, und setzt sich im nächsten Platz fort – der Spalte daneben oder der nächsten Seite – mit wiederholten Kopfzeilen (siehe tableStyle.overflow). Ein top- oder auto-Gleitobjekt mit eingeschaltetem citingPage kann stattdessen die Seite (oder Spalte) anführen, auf der seine zitierende Zeile landet, wobei der Text über dem Verweis darunter nach unten rückt: Es wird dann auf derselben Seite über seinem Verweis gemalt, nie auf einer früheren, und in einem getaggten PDF und im HTML weiterhin danach gelesen. Die Engine klärt das in einigen zusätzlichen Durchläufen und behält es nur, solange die zitierende Zeile auf dieser Seite bleibt.

Gleitobjekte verlassen nie ihr Kapitel: An einem Kapitelauftakt (einer Überschriftenebene mit breakBefore oder span: 'page'), einem :::part, einem Kastenformat mit floatBarrier: true (dem abschließenden Kasten „Das Wichtigste“ eines Kapitels) und am Ende des Dokuments wird jedes noch ausstehende Gleitobjekt zuerst platziert – in den freien Plätzen der Seite oder auf Seiten, die vor der Grenze eröffnet werden. Ein Gleitobjekt, das zuerst vom Auftakt selbst zitiert wird (ein Kapiteltitel, der seine Abbildung nennt) oder vom ersten Block nach einem :::part, gehört zum neuen Kapitel: Es landet nach dieser Zeile, wie jedes andere. Eine Abbildung oder Tabelle, die den Kopf einer Seite verlangt hat, kann dann den Fuß der Schlussseite des Kapitels unter dessen ausgeglichenen Spalten einnehmen, statt einer eigenen Seite. Ein :::pagebreak schickt ausstehende Gleitobjekte einfach auf die Seite danach.

Unter einem seitenbreiten Auftakt über zwei oder mehr Textspalten gilt die eigene Spalte des Auftakts an ihrem Kopf als leer, solange ihm darin nichts folgt: Ein gleitender Kasten, der direkt nach dem Auftakt steht, oder eine dort mit ::resource eingebettete Ressource nimmt den Kopf der ersten Spalte ein, unter dem Auftakt und auf Höhe der Köpfe der anderen Spalten (mit columns über mehrere Spalten ab dieser), und der Text der Spalte beginnt darunter. Ein im Fließtext zitiertes Gleitobjekt folgt weiterhin seiner zitierenden Zeile. Bis postext 1.24 bot die erste Spalte dort keinen Platz, und ein solches Gleitobjekt landete erst ab der zweiten Spalte; layout.floatsUnderOpener: false behält das bei (siehe Konfiguration › Layout).

Seitenkästen (span="side") bleiben ebenfalls in ihrem Kapitel. Ein Kasten, den die Nebenspalte seiner Seite nicht fassen kann, nimmt die Nebenspalte der nächsten Seite; wo das Kapitel oder das Dokument vorher endet, wird jeder noch wartende Kasten in der Nebenspalte einer nach dem Text eröffneten Seite gesetzt, in der Reihenfolge ihrer Blöcke, und eine danach zitierte Seitenabbildung steht hinter ihnen. Eine solche Seite enthält keinen Text, daher meldet der Build jeden Kasten und jede Abbildung darauf (afterText). Ein Kasten, der höher ist als eine leere Nebenspalte, wird trotzdem gesetzt und gemeldet (calloutOverflow), und alles, was weiterhin keine Seite findet, wird ebenfalls gemeldet (unplaced) statt verworfen. Bis postext 1.24 wurde nur die erste dieser Seiten eröffnet, und die übrigen Kästen gingen ohne Warnung verloren.

Gleitobjektbänder werden am Grundlinienraster ausgerichtet, damit der umgebende Text den seitenweiten vertikalen Rhythmus behält. Ein Band oben vergrößert seinen unteren Abstand bis zur nächsten Rasterlinie, sodass der Text unter dem Gleitobjekt mit den Nachbarspalten und der gegenüberliegenden Seite registerhaltig bleibt. Ein Gleitobjekt unten wird so verankert, dass die letzte Zeile seiner Legende eine Grundlinie mit der letzten Textzeile der anderen Spalten teilt (Inhalt ohne Legende richtet seine Unterkante an der letzten Rasterzeile aus) – volle Seiten enden daher über alle Spalten und gegenüberliegenden Seiten hinweg auf derselben Höhe.

Auf der Schlussseite eines Kapitels – und des Dokuments – folgt den seitenbreiten Abbildungen und Tabellen unter dem letzten Textband nichts mehr; sie rücken daher nach oben und stehen einen Gleitobjektabstand darunter, in ihrer Reihenfolge gestapelt, statt Weißraum zwischen dem Text und einer Abbildung am Seitenfuß zu lassen. Das gilt auch für ein Gleitobjekt mit position: 'bottom'. Um sie wie auf jeder anderen Seite am Fuß zu halten, setzen Sie layout.hugClosingFloats: false (siehe Konfiguration › Layout). Seiten mit Nebenspalte verschieben sie nie.

Alle drei Backends – die Canvas-Vorschau, der HTML-Betrachter und die PDF-Ausgabe – rendern Ressourcen. Im HTML-Backend liegen die Bilddaten außerhalb des Dokuments, daher liefert der Host sie über die Resolver-Option resourceImageUrl(fileId); fehlt der Resolver (oder liefert er für eine Datei nichts), wird die Ressource als neutraler Platzhalterkasten gerendert, damit das Layout stabil bleibt. Die eigene Datei eines Videos kommt auf dieselbe Weise über resourceVideoUrl(fileId) (siehe Videos).

Wo ein Gleitobjekt landen kann

„Nie vor seinem Verweis“ zählt ab der Zeile, die das Gleitobjekt zitiert: Das Gleitobjekt wartet, bis diese Zeile gesetzt ist, und nimmt den ersten freien Platz danach in Lesereihenfolge – der Kopf der Seite, auf der die Zeile steht, kommt vor ihr. Ein Seitengleitobjekt (span: 'side', in der Nebenspalte nur für Gleitobjekte eines anderthalbspaltigen Layouts) ist die Ausnahme: Es stapelt sich in der Nebenspalte neben dem Text, der es zitiert, und kann höher auf der Seite stehen als die zitierende Zeile. Für eine auf Seite 5 zitierte Abbildung:

PlatzierungAuf Seite 5Sonst
top, span: 'page'Nie: Das Band am Kopf der Seite liegt über der zitierenden Zeile.Das obere Band von Seite 6.
top, span: 'column'Der Kopf einer späteren Spalte, die noch leer ist – in der ersten von zwei Spalten zitiert, kann sie die zweite eröffnen.Der Kopf einer Spalte von Seite 6.
auto oder bottom, span: 'page'Das Fußband von Seite 5, wenn jede Spalte noch Platz dafür hat.Ein Band von Seite 6.
auto oder bottom, span: 'column'Der Fuß der zitierenden Spalte; dann der Fuß (beide) oder der Kopf (nur auto) einer späteren leeren Spalte.Seite 6.
  • Eine Seite mit Kapitelauftakt folgt denselben Regeln: Ein seitenbreites auto- oder bottom-Gleitobjekt, das im ersten Absatz des Auftakts zitiert wird, kann das Fußband dieser Seite unter ihrem Text einnehmen; ein top-Gleitobjekt eröffnet die nächste Seite. Soll das Bild auf der Seite stehen, die es zitiert, verwenden Sie auto oder bottom, oder zeichnen Sie es als Bildelement in der Gestaltung des Auftakts.
  • Zwei Spalten-Gleitobjekte, die im selben Absatz zitiert werden, nehmen die nächsten beiden Plätze: typischerweise das erste den Fuß der zitierenden Spalte, das zweite den Kopf der nächsten leeren Spalte – nebeneinander auf der Seite.
  • In einem einspaltigen Layout ist ein seitenbreites Gleitobjekt ein Spalten-Gleitobjekt, und es gelten dieselben Regeln: Ein top-Gleitobjekt, das auf einer Seite zitiert wird, landet am Kopf der nächsten.
  • Ein Absatz, der von einer Seite auf die nächste läuft, zählt ebenfalls ab seiner zitierenden Zeile. Beginnt der Absatz am Fuß von Seite 5 und fällt der Verweis auf Seite 6 – oder wandert der ganze Absatz auf Seite 6, weil am Fuß von Seite 5 nicht genug seiner Zeilen passen –, steht der Verweis auf Seite 6: Ein top-Gleitobjekt eröffnet Seite 7, und ein auto-Gleitobjekt nimmt den Fuß von Seite 6, wenn dort Platz ist. Dasselbe gilt zwischen den Spalten einer Seite und für einen über Seiten geteilten Kasten: Eine Abbildung, die sein zweiter Teil zitiert, wartet auf diesen Teil.
  • Geändert in postext 1.5. Bis postext 1.4 wurde ein Gleitobjekt eingereiht, sobald das Layout den zitierenden Absatz erreichte, sodass die Seite, auf die ein solcher Absatz lief (oder wanderte), mit dem Gleitobjekt beginnen konnte, über der Zeile mit dem Verweis. Eine solche Abbildung landet jetzt eine Seite später oder, wenn sie auto verlangt, am Fuß der Seite; die Seitenzahl kann sich dadurch ändern.

#Textumfluss

Ein Bild, eine Tabelle oder ein Kasten, schmaler als die Spalte, kann an einer Seite davon stehen, während der Text daneben läuft, wie in einer Zeitschrift oder einem Newsletter. Geben Sie seiner Platzierung eine Umflussseite wrap und, wenn Sie möchten, eine width:

{ "id": "bed", "typeId": "figure", "kind": "svg", "caption": "The new planting bed.",
  "placement": { "position": "here", "wrap": "right", "width": 0.4 } }
  • Im Text ("here"). Die Ressource steht an ihrer Seite der Spalte, ihre Oberkante auf Höhe der Oberkante der nächsten Zeile an der ::resource-Zeile, und die folgenden Absätze, Zitate und Listenpunkte laufen in der verbleibenden Satzbreite daneben, dann in voller Satzbreite darunter. Ein Absatz, der daneben beginnt und darunter endet, bleibt ein Absatz: kein Umbruch, kein zusätzlicher Abstand am Fuß des Bildes. Jede Zeile bleibt auf dem Grundlinienraster; der Raum unter dem Bild ist sein Abstand, aufgerundet auf ganze Rasterzeilen.
  • Ein Spalten-Gleitobjekt. Ein span: "column"-Gleitobjekt von einer Spalte Breite, am Kopf ("top" oder "auto" am Kopf einer Spalte) oder am Fuß ("bottom", "auto") einer Spalte, wird wie jedes Gleitobjekt in seinem Band platziert; die ersten oder letzten Zeilen der Spalte laufen dann daneben. Auf einer zweispaltigen Seite gehört das Gleitobjekt zu seiner Spalte, und die andere läuft in voller Breite.
  • Ein Kasten. Ein :::callout nimmt dieselben Einstellungen als Attribute an: :::callout{wrap="right" width=0.4} setzt ein Zitat in Auszeichnungsgröße oder einen Seitenkasten an die Stelle, an der er steht, mit dem Text danach daneben, und placement="top" oder "bottom" mit wrap lässt ihn an den Kopf oder Fuß einer Spalte gleiten. Ein umflossener Kasten wird als Ganzes gesetzt und nie geteilt.
  • Was darunter kommt. Eine Überschrift, eine abgesetzte Formel, eine Abbildung oder Tabelle, ein Kasten und ein Gedicht laufen nicht neben einem umflossenen Element: Sie kommen darunter, und der Weißraum neben ihm über ihnen bleibt leer. Das Verlassen der Spalte (ihr Fuß, ein :::columnbreak, ein Seitenumbruch) beendet den Umfluss dort: Das Element gehört zu seiner Spalte. Kann der Block direkt nach einer Ressource im Text nicht daneben laufen, nimmt die Ressource ihr Band ein, wie ohne wrap.
  • Abstand und Grenzen. wrapGap (sonst layout.wrap.gap, sonst eine Grundtextzeile) trennt das Element, Legende eingeschlossen, vom Text daneben und vom Text darunter. Wo der Text daneben schmaler würde als layout.wrap.minTextWidth (12 em Grundtext) oder das Element kürzer ist als layout.wrap.minLinesBeside Zeilen (2), nimmt es sein Band ganz ein, und eine Warnung textWrap sagt das. Ein Element im Text, das zu hoch für den in seiner Spalte verbliebenen Raum ist, wandert mit seinem Anker in die nächste, mit derselben Warnung.
  • Seiten. left und right sind Seiten des Textflusses, wie bei align: In einem Buch, das von rechts nach links läuft, ist left die rechte Seite des Blattes. start und end bezeichnen dieselben Seiten.
  • Ausgaben. Canvas, HTML-Betrachter, PDF und EPUB mit festem Layout setzen die Zeilen so, wie sie gesetzt wurden; ein getaggtes PDF liest das Bild oder den Kasten vor dem Absatz, der daneben läuft. Ein umfließendes EPUB lässt es per CSS an seine Seite gleiten, mit demselben Anteil an der Textbreite.
  • Noch nicht. Text auf beiden Seiten eines Bildes, Konturenumfluss, Umfluss innerhalb des eigenen Inhalts eines Kastens und Umfluss in senkrechtem Text (das Element behält sein Band, mit einer Warnung). Spalten mit einem umflossenen Element werden vom Spaltenausgleich ausgenommen.

#Bitmap-Größe

Eine Bitmap gibt ihre Pixel an: bitmap.width und bitmap.height sind die Pixelzahlen der Datei, keine Druckgröße. Wie viele davon auf einen Zoll kommen, entscheidet, wie groß das Bild gesetzt wird, bevor sein Platz es begrenzt. Es gibt drei Wege, die Größe festzulegen:

  • Ihre Pixel bei der dpi-Zahl der Seite (der Standard). Ohne Auflösung ist ein Pixel des Bildes ein Pixel des Layouts (page.dpi, 300, sofern nicht gesetzt): Ein Foto von 2400 px ist auf einer Seite mit 300 dpi 8 Zoll (203,2 mm) breit und auf einer mit 150 dpi doppelt so breit.
  • Eine Auflösung. bitmap.resolution ist die ppi-Zahl des Bildes bei seiner natürlichen Druckgröße, seine natürliche Breite ist also auf einer Seite beliebiger dpi-Zahl width × page.dpi / resolution: 2400 px bei resolution: 300 sind 203,2 mm breit, ob die Seite mit 150 dpi oder mit 300 gesetzt wird. layout.bitmapResolution gibt jeder Bitmap ohne eigene Auflösung eine: eine Zahl (300) oder 'file', die Auflösung, die ihre Datei angibt (bitmap.fileResolution: das pHYs eines PNG, die JFIF- oder EXIF-Dichte eines JPEG, das EXIF eines WebP; bei einem aus Word importierten Bild die Größe, in der Word es gedruckt hat). Kameras, Bildschirmfotos und Web-Exporte geben oft 72 oder 96 ppi an, wenn sie nichts über eine Druckgröße wissen, daher gelten diese beiden Werte unter 'file' als nicht gesetzt, und das Bild behält seine Pixel bei der dpi-Zahl der Seite; eine an der Ressource selbst angegebene 72 wird wörtlich genommen. 'document', der Standard, ist der erste Weg.
  • Ein Anteil an der Spalte. placement.width verengt ein Gleitobjekt oder eine Einbettung im Text auf einen Bruchteil ihrer Spalte (oder Seite), und ein Bild, das größer ist als dieser Anteil, wird unabhängig von seinen Pixeln darauf verkleinert (siehe Platzierung).

In jedem Fall begrenzt der Platz das Bild unter Wahrung seiner Proportionen, und ein kleineres Bild wird nie vergrößert. Dieselbe natürliche Größe gilt für ein Bild in einer Tabellenzelle und für ein image-Element einer Gestaltung mit Größe 'auto'. Das PDF bettet die Datei unverändert in ihrer platzierten Größe ein. Der Preflight prüft die Auflösung, in der jedes Bild gedruckt wird, und das Bedienfeld Ressourcen der Sandbox zeigt sie für jedes Bild an. Seit postext 1.24.

{ "id": "harbour", "typeId": "figure", "kind": "bitmap", "caption": "The harbour at dawn.",
  "bitmap": { "fileId": "harbour.jpg", "format": "jpeg", "width": 2400, "height": 1600, "resolution": 300 } }

bitmapInfo(bytes) (aus postext und postext/bundle) liest die Pixel einer Datei und die Auflösung, die sie angibt, { width, height, resolution?: { x, y, source } }; ein unter 'file' geöffnetes Paket füllt damit fileResolution, und die Sandbox speichert sie für jedes Bild, das sie hochlädt.

#Sicherheitsbereich

Eine Bitmap- oder SVG-Ressource kann einen Sicherheitsbereich markieren: das Rechteck des Bildes, das das Wesentliche enthält (eine Person und einen Streifen der Landschaft hinter ihr, den Datenbereich eines Diagramms) und immer gezeigt wird. Es ist das safeArea der Ressource, vier Bruchteile (0–1) der Eigengröße des Bildes, gemessen von seiner linken oberen Ecke: x und width sind Bruchteile seiner Breite, y und height seiner Höhe. Der Name sagt, was erhalten bleiben muss; ein Beschnittrahmen würde sagen, wo geschnitten wird.

const harbour: Resource = {
  id: 'harbour', typeId: 'figure', kind: 'bitmap', caption: 'The harbour at dawn.',
  createdAt: 0, updatedAt: 0,
  bitmap: { fileId: 'harbour.jpg', format: 'jpeg', width: 2400, height: 1600 },
  // the boats and the quay: 18–68 % of the width, 25–85 % of the height
  safeArea: { x: 0.18, y: 0.25, width: 0.5, height: 0.6 },
};

Nur ein Bild mit Sicherheitsbereich wird jemals beschnitten. Die Engine kann es dann in jedem Seitenverhältnis zwischen dem ganzen Bild und dem Sicherheitsbereich zeigen: höher als das eigene Verhältnis des Bildes, indem sie die Seiten beschneidet, höchstens bis auf die Breite des Sicherheitsbereichs, oder niedriger, indem sie oben und unten beschneidet, höchstens bis auf seine Höhe. Die Breite der Abbildung ändert sich nie, nur ihre Höhe. Was außerhalb des Sicherheitsbereichs liegt, wird auf beiden Seiten im Verhältnis der dortigen Ränder beschnitten, sodass ein Motiv links der Mitte links der Mitte bleibt. Bei 60 mm Breite ist der Hafen oben ganz 40 mm hoch und kann in jeder Höhe zwischen 24 mm (oben und unten auf 60 % der Höhe beschnitten) und 80 mm (die Seiten auf die halbe Breite beschnitten) gezeigt werden. Werte über die Bildränder hinaus werden auf diese begrenzt; ein Bereich mit einem Wert, der keine Zahl ist, oder einer Seite unter 2 % des Bildes, oder einer, der das ganze Bild abdeckt, wird ignoriert, ebenso das Feld bei einer Tabelle. Ohne Sicherheitsbereich wird ein Bild wie bisher immer ganz gezeigt.

Die Engine nutzt diesen Spielraum an vier Stellen:

  • Der in einer Spalte verbliebene Raum. Ein Bild im Text (position: 'here'), das etwas zu hoch für den in seiner Spalte verbliebenen Raum ist, auch eines, dessen Legende über den Seitenfuß hinauslaufen würde, wird innerhalb seines Sicherheitsbereichs beschnitten, um dort zu bleiben, statt in die nächste Spalte oder auf die nächste Seite zu wandern und diese hier kurz zu lassen.
  • Seiten, die niedriger sind als die Abbildung. Mit layout.fitFiguresToPage wird ein Bild, das zu hoch für die Seite ist, zuerst innerhalb seines Sicherheitsbereichs beschnitten, bei gleicher Breite, und nur verkleinert, wenn es dann noch zu hoch ist (siehe Konfiguration › Layout).
  • Bänder, die niedriger sind als die Abbildung. Ein Gleitobjekt, dessen placement.shrink es auf den Raum seines Platzes skaliert, wird zuerst innerhalb seines Sicherheitsbereichs beschnitten, bei gleicher Breite, und erst dann verkleinert; der Hebel flexFigure unten lässt es nie über diesen Raum hinaus wachsen.
  • Spaltenausgleich. Ein Bild mit Sicherheitsbereich, das im Text einer kurzen Spalte steht oder am Kopf oder Fuß dieser Spalte nur über diese Spalte gleitet, wächst um ganze Zeilen des Grundlinienrasters, um die leeren Zeilen der Spalte zu füllen. Ein höheres Bild hinterlässt kein sichtbares Loch, daher wird dieser Hebel, flexFigure, direkt nach dem Kasten, der die Spalte abschließt, versucht und vor jedem zusätzlichen Abstand über Überschriften oder nach Listen. Ein Gleitobjekt am Kopf einer Spalte auf der Schlussseite eines Kapitels oder in einem Schlussband wächst nicht, da diese Spaltenköpfe auf gleicher Höhe bleiben (siehe Konfiguration › Spaltenausgleich).

Der VDT verzeichnet den Beschnitt am Ressourcenblock: bodySource ist der in bodyRect gezeigte Teil des Bildes, in denselben Bruchteilen (fehlt, wenn das ganze Bild es füllt), und bodyFlex gibt die px an, um die der Inhalt noch schrumpfen und wachsen könnte, und die px, um die die Hebel ihn bereits verändert haben ({ shrink, grow, delta }). Die Canvas-Vorschau und das PDF beschneiden auf den Inhalt und zeichnen das ganze Bild in unbeschnittener Größe; der HTML-Betrachter und das EPUB mit festem Layout setzen das Bild mit object-fit: cover und einer passenden object-position; ein umfließendes EPUB, das keine Seite zu füllen hat, zeigt das ganze Bild. Ein Host, der Bilder selbst zeichnet, kann die Hilfsfunktionen nutzen, die postext exportiert: resourceSafeArea und normalizeSafeArea (der Bereich, wie die Engine ihn liest, oder undefined), safeAreaHeightRange (der niedrigste und der höchste Inhalt bei einer Breite), safeAreaSource (der bei einer gegebenen Höhe gezeigte Teil) und uncroppedPictureBox (wo das ganze Bild vor dem Beschneiden zu zeichnen ist), mit dem Typ ResourceSafeArea. In der Sandbox heißt das Feld bei einem Bild im Bedienfeld Ressourcen Sicherheitsbereich.

Rezept Nº 116 im Rezeptbuch, Fotos, die eine kurze Spalte füllen, setzt eine zweispaltige Zeitschriftenreportage zweimal, ohne und mit Sicherheitsbereichen, sodass Sie die Seiten nebeneinander vergleichen können.

#Sprecheranker und Sperrzonen

Ein Bild, das die Zeichnung eines Comic-Panels ist, kann für das Lettering außerdem angeben, wo seine Figuren sind (siehe Comics). anchors listet einen Punkt je Sprecher und avoid die Bereiche, die keine Sprechblase verdeckt, beide in Bruchteilen des Bildes wie der Sicherheitsbereich:

const radio: Resource = {
  id: 'lh-radio', typeId: 'figure', kind: 'bitmap', createdAt: 0, updatedAt: 0,
  bitmap: { fileId: 'lh-radio.jpg', format: 'jpeg', width: 1000, height: 1000 },
  safeArea: { x: 0, y: 0.36, width: 0.62, height: 0.56 },
  anchors: [
    // the keeper: mouth, head (for thought balloons) and face
    { id: 'tomas', x: 0.345, y: 0.52, head: { x: 0.38, y: 0.44 }, face: { x: 0.29, y: 0.4, width: 0.16, height: 0.18 } },
  ],
  avoid: [{ x: 0, y: 0.44, width: 0.22, height: 0.26 }], // the radio
};

Die id eines Ankers ist der Sprecherschlüssel des Skripts (tomas: …) oder sfx für den Punkt, an dem sich die Geräuscheffekte des Panels sammeln; x und y sind der Mund, auf den der Dorn einer Sprechblase zeigt, head der Punkt, auf den die Bläschen einer Gedankenblase zeigen (ohne Angabe der Mund), und face ein Rechteck, das keine Sprechblase verdeckt. Die Engine bildet jeden Punkt über Beschnitt und Spiegelung des Panels ab, sodass ein Dorn auf seinem Sprecher bleibt, welche Form das Panel auch annimmt; ein Anker außerhalb des Sicherheitsbereichs löst comicAnchorOutsideSafeArea aus, weil ein Beschnitt ihn abschneiden kann. Eine dritte Liste, faces, enthält die Gesichter von Figuren, die nicht sprechen, als Rechtecke wie die von avoid: Keine Sprechblase verdeckt sie, während eine Sperrzone nachgibt, wenn ein Panel keinen anderen Platz hat. Anker gehören zum Bild und dienen jeder Übersetzung des Comics. Nur Comic-Panels lesen sie; eine Abbildung ignoriert sie. In der Sandbox werden sie im Dialog Sicherheitsbereich und Lettering des Bedienfelds Ressourcen markiert.

#Videos

Eine Video-Ressource (kind: 'video') ist ein YouTube- oder Vimeo-Video oder ein eigenes Video: eine im Buch gespeicherte Datei (MP4, WebM) oder eine unter einer Webadresse, eine Datei auf einem Server oder ein HLS-Stream (eine .m3u8-Playlist). Es wird wie ein Bild platziert, beschriftet, gleiten gelassen und zitiert und in einer eigenen Folge nummeriert: Der eingebaute Typ video druckt Video 1.1, Video 1.2 … neben Figure 1.1 und Table 1.1 (siehe Konfiguration › Ressourcentypen). Jede Ausgabe zeigt es, so gut sie kann:

AusgabeWas sie zeigt
Canvas, PDFDas Posterbild, ein Einzelbild des Videos, mit einem Abspielzeichen und einem QR-Code, der das Video öffnet (Konfiguration › Videostil). Im PDF ist das Posterbild außerdem ein Link zum Video.
FolioDas Posterbild, wie gedruckt. Ein Klick darauf spielt das Video auf der Seite selbst ab, und es läuft weiter, während das Blatt umgeblättert wird (siehe Videos auf den Seiten von Folio unten). YouTube- und Vimeo-Videos bleiben Posterbilder.
HTML-BetrachterDer Player des Videos: der von YouTube oder Vimeo oder der HTML5-Player des Browsers für eine Datei oder eine Adresse. Ein HLS-Stream läuft nativ in Safari und im aktuellen Chrome; anderswo bindet der Host einen Player wie hls.js ein, wie es die Sandbox tut. Mit videoStyle.html: 'poster' zeigt er stattdessen das gedruckte Posterbild.
EPUBEine Datei läuft im eigenen Player des Lesesystems, im Buch verpackt oder von ihrer Produktionsadresse gelesen. Ein YouTube- oder Vimeo-Video ist sein Posterbild, mit dem Video verlinkt: Ein EPUB darf den Player einer Webseite nicht einbetten. Ein HLS-Stream ist ebenfalls sein verlinktes Posterbild: Eine HLS-Playlist ist kein Medientyp, den ein EPUB abspielen darf. Wo das Lesesystem Skripte ausführt, halten sich die Dateien einer Seite oder eines Kapitels an player.exclusive: Das Starten einer Datei pausiert die anderen, mit denen sie nicht gleichzeitig läuft.
const talk: Resource = {
  id: 'keeper-talk', typeId: 'video', kind: 'video',
  caption: 'The keeper explains the lamp.',
  altText: 'A lighthouse keeper beside the lamp',
  createdAt: 0, updatedAt: 0,
  video: {
    source: 'youtube',                        // 'youtube' | 'vimeo' | 'file'
    url: 'https://youtu.be/aqz-KE-bpKQ',
    poster: { fileId: 'talk.jpg', format: 'jpeg', width: 1280, height: 720 },
    start: 30,                                // plays from 0:30; the printed link starts there too
  },
};

Der Text zitiert ein Video wie eine Abbildung: :ref{id="keeper-talk"} druckt Video 1.1 und lässt das Posterbild an den ersten freien Platz nach dem Verweis gleiten, und ::resource{id="keeper-talk"} mit placement.position: 'here' setzt es im Text. Die Felder von Resource.video (ResourceVideo):

FeldTypBedeutung
source'youtube' · 'vimeo' · 'file'Woher das Video abgespielt wird: von einer YouTube- oder Vimeo-Seite oder als eigenes Video ('file'), hochgeladen oder unter einer Adresse.
urlstringYouTube oder Vimeo: die Adresse des Videos in beliebiger Form (eine Watch-Seite, youtu.be, Shorts, ein Embed-Link, youtube-nocookie.com; eine Vimeo-Seite, Kanalseite oder ein nicht gelisteter Link mit seinem Hash). Eine Datei: ihre Produktionsadresse, unter der das veröffentlichte Buch sie findet. Ein eigenes Video ohne eigene Datei wird von dieser Adresse abgespielt: eine MP4- oder WebM-Datei auf einem Server oder ein HLS-Stream (…/master.m3u8).
fileId, formatstringEine Datei: das hochgeladene Video, wie eine Bitmap außerhalb des Dokuments gespeichert, und sein Format: 'mp4', 'webm', 'ogv', 'mov' oder 'hls' für einen HLS-Stream. Ohne Format bestimmt es die Dateiendung der Adresse (.m3u8 ist 'hls'), sonst 'mp4'.
posterDas Posterbild, eine Bitmap.
width, height, durationnumberDie Bildgröße des Videos in px (sein Seitenverhältnis, wenn es kein Posterbild gibt) und seine Länge in Sekunden.
posterTimenumberDie Sekunde des Einzelbildes einer Datei, das als Posterbild dient, gespeichert, damit es erneut gewählt werden kann.
start, endnumberVon start bis end Sekunden abspielen. Der QR-Code und der PDF-Link beginnen ebenfalls bei start.
playerVideoPlayerOptionsDie Player-Optionen dieses Videos, über videoStyle.player gelegt.

Das Posterbild. Es wird in der Satzbreite seines Platzes gesetzt (oder im Anteil placement.width davon), in seinem eigenen Seitenverhältnis, unabhängig von seiner Pixelgröße: Ein bildschirmgroßes Einzelbild wird vergrößert, statt klein gedruckt zu werden. Wie eine Bitmap kann es einen Sicherheitsbereich tragen und placement.align folgen. Ein Video ohne Posterbild druckt einen dunklen Kasten im Seitenverhältnis des Videos (16:9, wenn nichts anderes angegeben ist) mit seinen Überlagerungen und löst die Inhaltswarnung videoWithoutPoster aus. In der Sandbox wird das Posterbild eines YouTube- oder Vimeo-Videos von der Plattform geholt, sobald seine Adresse eingegeben wird, und das einer Datei ist ein Einzelbild, das Sie im Video auswählen.

Die Adresse. Der QR-Code und der PDF-Link öffnen die Seite des Videos, https://youtu.be/<id> oder https://vimeo.com/<id>, ab start. Eine Datei hat keine Seite: Sie öffnen ihre Produktionsadresse, von der auch ein Video ohne eigene Datei abgespielt wird (eine MP4-Datei auf einem Server, ein HLS-Stream). Ohne eine solche Adresse erhält der Druck weder QR-Code noch Link (videoWithoutUrl), und eine HTML- oder EPUB-Ausgabe, die die Datei nicht mitführt, zeigt das Posterbild. Eine YouTube- oder Vimeo-Adresse, die kein Video dieser Plattform nennt, löst videoUrlInvalid aus; statt eines Players wird das Posterbild gezeigt.

Die Player. Die Player-Optionen (Bedienelemente, Download-Schaltfläche, Vollbild, Geschwindigkeitsmenü, Bild-in-Bild, Casting, automatisches Abspielen, stummer Start, Schleife, Vorladen, datenschutzfreundliche Einbettung) werden für das ganze Buch in videoStyle.player und für ein einzelnes Video in video.player gesetzt; jeder Player berücksichtigt, was er kann (siehe Konfiguration › Videostil). Das HTML-Backend erhält die abspielbare URL einer Datei über die Option resourceVideoUrl(fileId), so wie es Bilder über resourceImageUrl erhält, und fällt auf die Produktionsadresse zurück. Seine Option videos: { files, streams, hls } wählt je Quelle zwischen Player und Posterbild, über videoStyle.html hinweg (hls, ein von einer HLS-Adresse abgespieltes Video, folgt ohne eigene Angabe files); der EPUB-Writer verwendet sie. Ein <video>, das eine HLS-Adresse abspielt, trägt data-pt-hls, sodass ein Host ihm in Browsern ohne natives HLS einen Player geben kann (Safari und das aktuelle Chrome spielen es unverändert ab). In einem Buch, das von rechts nach links läuft, werden der Player und die Überlagerungen des Posterbildes wie ein Bild zurückgedreht, damit der QR-Code lesbar bleibt.

Im VDT. Der Ressourcenblock eines Videos hat kind: 'video', sein Posterbild als fileId / format (wie eine Bitmap gezeichnet) und video (VDTResourceVideo): den link, zu dem ein Leser geschickt wird, die YouTube- oder Vimeo-embedUrl mit angewandten Player-Optionen, die fileId einer Datei, den mimeType eines eigenen Videos (seiner Datei oder nur seiner Adresse, application/vnd.apple.mpegurl für HLS), den Bereich start / end, den aufgelösten player, linkPoster, html und die Überlagerungen playMark und qr (die QR-Module als Zeilen aus '0' / '1'), mit Rechtecken relativ zur linken oberen Ecke des Inhalts. Ein Host, der Videos selbst zeichnet, kann die Hilfsfunktionen nutzen, die postext exportiert: parseVideoUrl, videoWatchUrl, resourceVideoLink, videoEmbedUrl, videoEmbedAllow, videoElementAttributes, mediaFragment, videoMimeType, videoFormatOfUrl, resourceVideoFormat, isHlsMimeType, HLS_MIME_TYPE, youtubePosterUrls, encodeQr, layoutVideo, playMarkTriangle und qrModuleRuns.

In einem Paket. Eine .postext-Datei enthält eine Videodatei (resources/<id>.mp4) und das Posterbild (resources/<id>.poster.jpg): Der Manifesteintrag nennt sie in file und poster, gibt die Größe des Posterbildes in width / height an und hält den Rest ohne Datei-IDs in video. bundleVideoUrl(bundle) ist der resourceVideoUrl-Resolver über die Dateien eines Pakets. Ein Video, das nur von einer Adresse abgespielt wird, enthält keine Datei: Sein Eintrag hat nur das Posterbild. In einem zweisprachigen Paket kann eine Sprache einem Video in localized[…].resources ein eigenes poster und video geben (einen anderen Schnitt unter eigener Adresse).

Videos auf den Seiten von Folio

Im 3D-Buch spielt ein eigenes Video auf der Seite, auf der es gedruckt ist. Ein Klick auf das Posterbild startet es dort, was auch immer der Zeiger am Buch gerade tut (umblättern, die Ansicht drehen oder Text auswählen): Der Shader der Seite zeichnet die Einzelbilder des Videos über das Posterbild, sodass sich das Bild beim Umblättern mit dem Papier biegt und wölbt, und es läuft während des Umblätterns weiter. Ein Klick auf ein laufendes Video pausiert es, ein Klick auf ein pausiertes setzt es fort, und Leertaste oder Eingabetaste tun dasselbe für das erste Video der aufgeschlagenen Doppelseite. Das Starten eines anderen Videos stoppt das laufende (es kehrt zu seinem Posterbild zurück), und ein Video stoppt, wenn das Buch auf einer Doppelseite zur Ruhe kommt, die es nicht mehr zeigt, oder bei seinem end. Über einem Video, das er abspielen kann, wird der Zeiger zur Hand; ein Ziehen, das auf einem Video beginnt, blättert weiterhin die Seite um oder dreht die Ansicht. Ein Video, das von selbst startet (video.player.autoplay), beginnt von selbst, wenn das Buch zum ersten Mal auf seiner Doppelseite zur Ruhe kommt, sobald das Buch fertig aufgebaut ist (auch wenn ein Host es schrittweise setzt), und in diesem Betrachter nie wieder.

Ein Video, das neben den anderen läuft (video.player.exclusive: false, seit postext 1.18), ändert beide Regeln. Sein Start stoppt nur die exklusiven Videos, sodass mehrere solche Videos gleichzeitig laufen; der Start eines exklusiven Videos stoppt es ebenfalls. Mit autoplay startet es stumm jedes Mal, wenn das Buch auf seiner Doppelseite zur Ruhe kommt, und stoppt, wenn die Doppelseite umgeblättert wird: Die stummen Schleifen (loop) einer Seite laufen jedes Mal gemeinsam, wenn der Leser sie aufschlägt.

  • Was abgespielt wird. Eine Datei (der Host macht aus ihrer fileId mit der Option videoUrl eine URL, in der Sandbox eine Object-URL) oder, ohne Datei, ihre Adresse: MP4, WebM oder ein HLS-Stream. Ein HLS-Stream läuft über hls.js, wo immer der Browser Media Source Extensions hat (beim ersten Abspielen geladen; eine optionale Peer-Abhängigkeit von postext-folio), begrenzt auf die Variante, die der Bildgröße auf dem Bildschirm am nächsten kommt, sodass ein Bild von einigen hundert Pixeln Höhe nie eine 4K-Variante lädt; das eigene HLS des Browsers ist die Rückfallebene. Seine Anfragen tragen eine eigene Abfrage pt-cors, sodass der Browser-Cache ihnen nie eine Kopie liefert, die ein anderer Player ohne CORS geholt hat. YouTube und Vimeo laufen in iframes, die WebGL nicht zeichnen kann: Ein Klick auf ihr Posterbild blättert die Seite um wie überall sonst.
  • Ursprungsübergreifendes Lesen. WebGL zeichnet ein Video nur, wenn sein Server das Lesen erlaubt (CORS, Access-Control-Allow-Origin). Ein Video, das nicht gelesen werden kann, bleibt ein Posterbild, und onVideo erhält error.
  • Ton. Der Klick lässt das Video mit Ton abspielen; ein Browser, der das trotzdem verweigert, spielt es stumm ab. Ein Video, das von selbst startet, hat Ton, sobald der Leser auf der Seite geklickt oder getippt hat (das Aufschlagen zählt); vorher startet es stumm, und ein Klick darauf schaltet den Ton ein, bevor der nächste es pausiert. video.player.muted startet es stumm, loop spielt es erneut ab, und start / end geben den abgespielten Teil an.
  • Auf jeder Seite. Das Bild wird dort gezeichnet, wo das Layout es hinsetzt: gedreht bei einer gedrehten Ressource, aufrecht auf einer Seite mit senkrechtem Satz und ungespiegelt in einem Buch, das von rechts nach links läuft, wie das Posterbild. Ein innerhalb seines Sicherheitsbereichs beschnittenes Posterbild beschneidet das Video auf dieselbe Weise.
  • Ohne WebGL2 oder mit reduzierter Bewegung läuft das Video in einem HTML-<video>, das über die Seite gelegt wird.
const book = createFolioFromDocument(container, doc, {
  // An uploaded video's playable URL (an object URL over its bytes).
  videoUrl: (fileId) => urls.get(fileId),
  onVideo: ({ resourceId, state }) => console.log(resourceId, state), // playing | paused | stopped | error
});
book.stopVideo();

videos: false schaltet es ab. toggleVideoAt({ page, x, y }) tut, was ein Klick an dieser Stelle tut, und pageVideoSpots(page, doc) listet, wo jedes Video auf einer Seite liegt, für einen Host, der eigene Bedienelemente zeichnet.

Zwei Rezepte im Rezeptbuch setzen Videos: Nº 131, Ein Filmclub-Programm mit QR-Codes auf den Postern, druckt jeden Film als Titelkarte mit Abspielzeichen und QR-Code, und Nº 132, Ein Laborblatt, dessen Clips auf dem Bildschirm und im EPUB laufen, setzt die Player-Optionen für die HTML-Ausgabe und verpackt seine eigenen Clips in einem EPUB mit festem Layout.

#Comics

Comicseiten, Comicstreifen und Doppelseiten werden in zwei Blöcken geschrieben, deren Inhalt die Engine selbst Zeile für Zeile liest: :::page und :::strip. Darin beginnen ::panel-Zeilen die Panels, und Skriptzeilen lettern sie. Die Anleitung mit den Layoutregeln, dem Lettering und den Ausgaben ist Comics; die Einstellungen stehen unter Konfiguration › Comics.

#:::page

:::page{split="30 [30 | 20 | *] / *" gutter=4mm}
::panel{art=lh-arrive}
caption: Every summer, Maya spent a week at the lighthouse.
maya: Grandpa! I'm here!
::panel{art=lh-radio focus="40% 50%"}
tomas: Just in time.
::panel{art=lh-maya}
maya{thought}: That valve looks loose…
::panel{art=lh-beam bleed}
sfx{rotate=-8}: KRAK
:::

Ein :::page-Block ist eine Comicseite: Er eröffnet eine frische Seite, nimmt sie ganz ein, und der Text nach seinem schließenden ::: beginnt auf der nächsten Seite. Seine Attribute sind split (wie die Seite in Zellen geteilt wird: Größen in Prozent, getrennt durch / für Streifen und | für nebeneinanderliegende Panels, eine Liste in eckigen Klammern, um eine Zelle erneut zu teilen, * für den Rest, a~b für eine schräge Linie), gutter (eine Länge oder zwei: zwischen Streifen und zwischen Panels; eine bloße Zahl gilt in Millimetern), style (ein benannter Panelstil), bleed, direction (ltr oder rtl, auch als dir geschrieben) und spread (siehe Doppelseiten). Ohne split werden die Panels in gleich hohen Streifen übereinandergestapelt. Markdown-Blöcke, Container und Direktiven werden innerhalb des Blocks nicht gelesen; <!-- comments --> schon.

#Panels

Eine Zeile ::panel{…} beginnt ein Panel, das die nächste Zelle in Lesereihenfolge füllt und bis zur nächsten ::panel-Zeile oder zum schließenden Block reicht:

AttributWirkung
art=<id>Das Bild: eine Bitmap- oder SVG-Ressource. Ohne es bleibt das Panel leer.
fit=cover, fit=containDas Bild beschneiden, um die Zelle zu füllen (nie in seinen Sicherheitsbereich hinein), oder es ganz zeigen.
focus="x% y%"Der Punkt, der zentriert bleiben soll, wo der Sicherheitsbereich Spielraum lässt.
style=…, border=none, border=0.5mm, bg=#hexEin benannter Panelstil, der Rahmen, der Hintergrund (eine Farbe, eine Paletten-ID oder none).
bleed, bleed="top start", bleed=falseDie Seiten, die den Rahmen berühren, bis zum Endformat und in den Anschnitt laufen lassen.
pad="…"Das Panel kleiner als seine Zelle machen: eine bis vier Längen oder Prozentangaben (oben, Ende, unten, Anfang).
inset="x y w h"Das Panel über das vorige legen, in diesem Rechteck in Prozent davon, statt ihm eine Zelle zu geben.
pop=<id>Ein transparenter Ausschnitt, der mit dem Beschnitt der Zeichnung über den Rahmen gezeichnet wird (ein durchbrochener Rahmen).
mirror, mirror=falseDas Bild spiegeln oder es auf einer gespiegelten Seite so lassen, wie es gezeichnet ist.
alt="…", id=…Die Textalternative (sonst der altText der Ressource) und eine Anker-ID.

#Skriptzeilen

Jede Zeile eines Panels ist eine Sprechblase, ein Textkasten oder ein Geräuscheffekt, geschrieben als key{attributes}: text:

maya: Grandpa! I'm here!
tomas{whisper}: Shh. Listen.
caption{at=bottom-end}: Three streets away.
sfx{at="62% 40%" rotate=-8 size=1.4}: KRAK
ben{tail=start}: (from off the panel) Over here!
sfx{vertical size=2.6 font="Dela Gothic One"}: ドン
maya: This line goes on
  on the next line,\
  and breaks here.
  • Der Schlüssel ist eine Sprecher-ID (Buchstaben, Ziffern, _, ., -), in jeder Übersetzung dieselbe; caption, sfx und note sind reserviert. Der Doppelpunkt darf der vollbreite : sein.
  • Ein bloßes Wort in den geschweiften Klammern ist ein Sprechblasenstil (thought, whisper, shout, radio, inner oder einer aus comics.balloonStyles); style= sagt dasselbe.
  • at heftet die Sprechblase an: einen Punkt in Prozent des Panelbildes (at="62% 40%") oder eine Ecke oder Kante (top-start, top-end, bottom-start, bottom-end, top, bottom). to richtet den Dorn auf einen Punkt des Bildes; tail=none entfernt ihn, und tail=top|bottom|start|end|left|right lässt ihn aus dem Panel hinauszeigen. join und join=false verbinden die Sprechblase mit der vorigen desselben Sprechers oder halten sie getrennt; break lässt sie den Rahmen überschreiten, und das Überschreiten wird nicht als Überlauf gemeldet. rotate (Grad), size (ein Faktor, für Geräuscheffekte), color und font ändern ihr Lettering.
  • vertical und horizontal (oder mode=vertical, mode=horizontal) setzen die Schreibrichtung der Zeile über die des Buches: ein unübersetztes ドン in einer Spalte in einer waagerechten Ausgabe, ein quer geschriebenes Schild in einer Zeile in einer senkrechten. Eine Spalte in einem Buch einer anderen Sprache folgt den Regeln ihres eigenen Textes (mit Kana denen des Japanischen). In einem senkrechten Buch wird eine Zeile ohne chinesische oder japanische Zeichen trotzdem waagerecht gesetzt.
  • Eine Zeile, die um zwei Leerzeichen oder einen Tab eingerückt ist, setzt die Sprechblase darüber fort; ein Backslash am Zeilenende bricht den Text dort um. Leerzeilen werden ignoriert.
  • Der Text ist Markdown im Text: Hervorhebung (als fett-kursives Lettering), :tcy, :ruby (die Lesung über der Basis, außer über einer Basis, die von rechts nach links läuft), :ltr und :rtl (ein Abschnitt, der seine eigene Richtung behält). Fußnoten und :ref-Markierungen werden nicht gelesen.

#:::strip

:::strip{split="* | * | *" aspect=3 span=page placement=top}
::panel{art=pip-1}
pip: Morning, Otto!
::panel{art=pip-2}
::panel{art=pip-3}
otto: Is it?
:::

Ein :::strip hat den Inhalt einer Seite, steht im Text aber als ein unteilbarer Kasten, in Panels geteilt: span (column, der Standard, oder page), placement (here, der Standard, an der Stelle, an der er geschrieben ist; oder top, bottom, auto, gleitend wie eine Abbildung) und seine Größe, entweder height (eine Länge, eine bloße Zahl in Millimetern) oder aspect (Breite durch Höhe: 3, 4/1, 4:1; standardmäßig die Proportionen, die seine Panels quadratisch machen). Ein seitenbreiter Streifen, der auf einer mehrspaltigen Seite mit here gesetzt ist, schneidet die Spalten dort, wo er steht, wie es ein seitenbreiter Kasten tut. width macht ihn schmaler als die Satzbreite, über die er läuft (60% davon oder eine Länge), und align setzt ihn an den Anfang (start), in die Mitte (center, der Standard) oder ans Ende (end) dieser Satzbreite, entlang der Textrichtung. caption="…" setzt eine Legende darunter im Legendenstil; mit type=figure (einem Ressourcentyp) erhält die Legende Bezeichnung und Nummer des Typs, und der Streifen zählt in dessen Folge, und mit id=… kann ein :ref ihn nennen. Ohne split stehen die Panels nebeneinander. Streifen werden nur auf der obersten Ebene eines Kapitels gelesen.

#Doppelseiten

:::page{spread} legt eine Seite über zwei gegenüberliegende Seiten: Die Teilung umfasst beide Satzspiegel, am Bund verbunden, ohne ihre Bundstege, und ein Panel darf den Bund überqueren. Die Doppelseite beginnt auf einer geraden Seite, nötigenfalls nach einer Vakatseite. Siehe Comics › Doppelseiten.

#Was NICHT unterstützt wird

Postext erkennt die folgenden CommonMark-Merkmale nicht. Sie werden entweder als reiner Text behandelt (und erscheinen daher wörtlich in der Ausgabe) oder stillschweigend verworfen:

  • Setext-Überschriften – die unterstrichene Form mit === / ---. Verwenden Sie ATX-Überschriften (#).
  • HTML-Durchreichung – rohe <tags> werden nicht interpretiert. Tags im MDX-Stil werden ebenfalls nicht unterstützt; Postext-Quelltext ist reines Markdown.
  • Horizontale Linien – ---, ***, ___.
  • Tabellen – Pipe-Tabellen werden nicht gelesen. Tabellen werden als strukturierte Ressourcen in PostextContent.resources abgebildet.
  • Referenzlinks – [text][id] plus ein Definitionsblock.
  • Autolinks – <https://example.com>.
  • Harte Zeilenumbrüche mit zwei Leerzeichen am Zeilenende – die Leerzeichen werden entfernt. Beenden Sie die Zeile stattdessen mit einem Backslash (siehe Zeilenumbrüche).
  • Durchgestrichener Text – ~~text~~. Der Renderer für Durchstreichung ist derzeit erledigten Aufgabenpunkten vorbehalten.
  • Marginalien – nicht umgesetzt, und PostextContent.notes, das die Typen akzeptieren, wird von der Engine ignoriert. Fußnoten und Kapitelendnoten werden mit [^id] geschrieben (siehe Fußnoten); bis postext 1.5 mussten sie als Text gesetzt werden.

Diese Liste wird mit der Zeit kürzer. Bis dahin ist alles, was oben nicht ausdrücklich als unterstützt aufgeführt ist, als wörtlicher Text anzunehmen.

Über die Syntax hinaus werden Arabisch und die anderen linksläufigen Schriften von rechts nach links gesetzt, mit dem bidirektionalen Algorithmus und Bindung rechts (siehe Arabischer Satz). Chinesisch wird waagerecht und senkrecht gesetzt, mit dem Zeilenumbruch, den Satzzeichenbreiten, dem Blocksatz zwischen Zeichen, den Markierungen, Ruby und Warichu, die seine Region erwartet (siehe Chinesischer Satz). Japanisch wird nach seinen eigenen Regeln gesetzt, mit Kinsoku, Yakumono-Abständen, Furigana, Betonungszeichen, Kanbun-Zeichen und Anmerkungen (siehe Japanischer Satz); Koreanisch durchläuft denselben Setzer mit den Regeln für Festlandchina. Silbentrennmuster werden für acht Sprachen mitgeliefert, eingebaute Bezeichnungen für diese acht sowie für Chinesisch, Japanisch und Arabisch. Siehe Sprachen und Schriftsysteme.

#Konventionen beim Schreiben

Einige Konventionen machen den Unterschied zwischen einem Dokument, das sauber gelesen wird, und einem, das Sie überrascht:

  • Lassen Sie zwischen Blöcken eine Leerzeile. Zwei durch eine Leerzeile getrennte Absätze sind zwei Absätze. Zwei Absätze in aufeinanderfolgenden Zeilen werden zu einem – jede Zeile geht im vorigen Absatz auf.
  • Zusätzliche Leerzeilen fügen keinen Abstand hinzu. Drei Leerzeilen trennen zwei Blöcke genauso wie eine. Wenn Sie mehr Raum zwischen ihnen möchten, schreiben Sie eine :::space-Zeile.
  • Rücken Sie einen verschachtelten Punkt bis zum Text des Punktes darüber ein. Zwei Leerzeichen unter einem Aufzählungszeichen (- ), drei unter 1. , vier unter 10. , so wie CommonMark Listen verschachtelt; zwei Leerzeichen unter 1. verschachteln ebenfalls. Ein Punkt wird unter den nächsten offenen Punkt verschachtelt, dessen Markierung mindestens zwei Spalten links von ihm steht, sodass ein einzelnes Leerzeichen nichts verschachtelt und nie eine Ebene übersprungen wird, wie groß der Schritt auch ist (bis postext 1.15 war die Tiefe floor(spaces / 2) + 1, und ein 1. unter 1. landete auf Ebene 4). Ein Tab reicht bis zum nächsten Vielfachen von vier Spalten. Die Tiefe ist auf 5 begrenzt.
  • Rücken Sie den ersten Listenpunkt nicht ein. Punkte der Ebene 1 beginnen in Spalte 0. Der erste Punkt einer Liste eröffnet Ebene 1, wie weit er auch eingerückt ist (bis postext 1.15 erhöhten seine führenden Leerzeichen die Tiefe), sodass Verschachtelung einen Punkt darüber braucht, unter den verschachtelt werden kann.
  • Aufgabenmarkierungen müssen in eckigen Klammern mit genau einem Leerzeichen stehen. [ ], [x], [X] – keine Varianten. [*] oder [-] sind keine Aufgabenmarkierungen; sie werden als wörtlicher Text ausgegeben.
  • Zitate innerhalb von Listen werden nicht unterstützt. Beginnen Sie das Zitat in Spalte 0, außerhalb der Liste.
  • Bilder und Tabellen gehören in resources. Ein ![alt](src) im Text wird gerade deshalb entfernt, weil Bilder im Text die spaltenbewusste Platzierung stören. Legen Sie jedes Bild als Ressource an und verweisen Sie über seine ID darauf – die Engine entscheidet dann, ob es gleitet, die Spalte unterbricht oder an den Kopf der nächsten Seite wandert.
  • Maskieren Sie Dollarzeichen mit \$, wenn Sie keine Formel meinen. Postext liest $…$ als LaTeX im Text, daher beginnt ein bloßes $ im Fließtext eine Formel. Preise, Shell-Prompts und alles andere mit einem einzelnen Dollarzeichen sollten als \$ geschrieben werden.
  • Tippen Sie das Markup in ASCII, auch in chinesischem und japanischem Text. Eine chinesische oder japanische Eingabemethode liefert vollbreite Formen: ::: für einen Direktivenblock, # für eine Überschrift, [^1] für eine Fußnotenmarkierung, {…} für Attribute, ** für fett. Sie werden als Text gedruckt, und der Build meldet die Zeile als Warnung fullwidthMarkup, die die zu tippende ASCII-Form nennt. Attributwerte dürfen in jeder Schrift stehen und mit “…” oder 「…」 in Anführungszeichen gesetzt werden; Schlüssel bleiben ASCII.

#Durchgearbeitetes Beispiel

Ein kurzes Dokument, das jedes unterstützte Konstrukt verwendet:

---
title: The Typesetter's Craft
author: Anon
---
 
# Opening
 
A good book reads itself. The **reader** should never notice the
typesetter's work — only the author's voice.
 
## What makes text readable
 
Three properties matter most:
 
1. Line measure — 40 to 75 characters per line.
2. Leading — 1.3 to 1.5 times the font size.
   a. Tighter at short measures.
   b. Looser at long measures.
3. Contrast between body and headings.
 
Common failure modes include:
 
- Lines that stretch across the whole page.
- Headings that float without a following paragraph.
- Orphans and widows at column boundaries.
 
> Typography is the craft of endowing human language with a durable
> visual form.
> — Robert Bringhurst
 
### Review checklist
 
- [x] Column width under 75 characters
- [x] Leading set to 1.5
- [ ] Orphan and widow pass
- [ ] Final proofread
 
### A note on formulas
 
Inline math such as $a^2 + b^2 = c^2$ flows with the surrounding text, and
display math sits centred on the baseline grid:
 
$$
\int_0^1 x^2\,dx = \tfrac{1}{3}
$$

Dasselbe Dokument erzeugt, durch die Layout-Engine gesetzt, ein strukturiertes VDTDocument, dessen Seiten jeden dieser Blöcke als typisierten Eintrag enthalten – wie aus Blöcken Geometrie wird, beschreibt die Seite Architektur.