Die Kompilier-Pipeline von Folio Writer deckt die 99 % ab – Zitate, Querverweise, Vorlagen, Formate. Lua-Filter sind der Notausgang für das letzte 1 %: die eigenwillige Hausregel der Zeitschrift, Ihre eigene Kurzschreibweise, das, was kein Kontrollkästchen vorhersieht. Ein Filter besteht aus ein paar Zeilen Lua, die das Dokument während des Kompilierens umschreiben, und pandoc führt sie nativ aus – nichts zu installieren.
Wenn pandoc Ihr Manuskript kompiliert, zerlegt es das Markdown zuerst in einen Dokumentbaum – Absätze, Überschriften, Spans, Zitate. Ein Lua-Filter ist eine Sammlung von Funktionen, die nach diesen Elementen benannt sind; jede wird mit jedem passenden Element aufgerufen und kann einen Ersatz zurückgeben. Geben Sie nichts zurück, bleibt das Element unverändert; geben Sie {} zurück, wird es gelöscht; geben Sie neue Elemente zurück, wird es umgewandelt. Das ist das ganze Modell.
.lua-Datei – liegt er im Projekt (z. B. in einem Unterordner Filters in Research), synchronisiert und reist er mit dem Manuskript.Tippen Sie irgendwo @@today; das kompilierte Dokument trägt das Datum des Kompilierens – nützlich in Anschreiben und Entwurfswasserzeichen:
-- today.lua
function Str(el)
if el.text == "@@today" then
return pandoc.Str(os.date("%B %e, %Y"))
end
end
Schreiben Sie Notizen an sich selbst in ein Fenced Div – sichtbar beim Entwerfen, garantiert nicht in der Ausgabe:
::: draft Ask Wei whether the 2019 calibration applies here. :::
-- strip-draft.lua
function Div(el)
if el.classes:includes("draft") then
return {} -- deleted from every compiled format
end
end
Binden Sie ihn nur in Ihre Einreichungsprofile ein, und die Notizen erscheinen weiterhin in Ihrem Profil für den Entwurf an die Betreuung – genau dafür gibt es Filter pro Profil.
Geben Sie [key result]{.highlight} pro Format eine echte Bedeutung – eine gelbe Markierung in HTML, eine Hervorhebung in LaTeX-PDFs:
-- highlight.lua
function Span(el)
if not el.classes:includes("highlight") then return nil end
if FORMAT:match("latex") then
local out = pandoc.Inlines(pandoc.RawInline("latex", "\\hl{"))
out:extend(el.content)
out:insert(pandoc.RawInline("latex", "}"))
return out
elseif FORMAT:match("html") then
local out = pandoc.Inlines(pandoc.RawInline("html", ""))
out:extend(el.content)
out:insert(pandoc.RawInline("html", ""))
return out
end
end
Für den LaTeX-Zweig fügen Sie das Hervorhebungspaket einmal in den Format-Metadaten hinzu: header-includes: \usepackage{soul}.
Zwei Gewohnheiten machen das Schreiben von Filtern schmerzlos. Um den Baum zu sehen, gegen den Sie abgleichen, führen Sie im Terminal pandoc -t native auf einem Ausschnitt aus – es gibt genau die Elemente aus, die Ihre Funktionen erhalten werden. Und wenn ein Kompiliervorgang sich seltsam verhält, zeigt das Kompilier- & Vorschauprotokoll die vollständige pandoc-Befehlszeile und ihre Ausgabe, Filterfehler inklusive. Ein Folio-spezifischer Hinweis: Ein Filter, dessen Datei verschoben wurde, wird übersprungen, statt das Kompilieren scheitern zu lassen – sehen Sie ins Protokoll, wenn ein Filter stillschweigend untätig zu sein scheint.
Die Dokumentation zu pandoc-Lua-Filtern listet jedes Element und jede Hilfsfunktion auf, und die Filtersammlung der Community ist voller fertiger Filter – Umgang mit Abkürzungen, Tabellen-Feinschliff, Diagramm-Rendering. Alles davon lässt sich direkt ins Kompilierfenster übernehmen.