La cadena de compilación de Folio Writer cubre el 99 %: citas, referencias cruzadas, plantillas, formatos. Los filtros Lua son la vía de escape para el último 1 %: la norma interna rara de la revista, tus propias abreviaturas, lo que ninguna casilla prevé. Un filtro son unas pocas líneas de Lua que reescriben el documento durante la compilación, y pandoc los ejecuta de forma nativa: no hay nada que instalar.
Cuando pandoc compila tu manuscrito, primero analiza el Markdown y lo convierte en un árbol de documento: párrafos, encabezados, spans, citas. Un filtro Lua es un conjunto de funciones con los nombres de esos elementos; cada una se llama con cada elemento que coincide y puede devolver un sustituto. No devuelvas nada para dejarlo como está, devuelve {} para eliminarlo, devuelve elementos nuevos para transformarlo. Ese es todo el modelo.
.lua; si lo guardas en el proyecto (por ejemplo, en una subcarpeta Filters dentro de Research), se sincroniza y viaja con el manuscrito.Escribe @@today en cualquier parte; el documento compilado lleva la fecha de compilación, algo útil en cartas de presentación y marcas de agua de borradores:
-- today.lua
function Str(el)
if el.text == "@@today" then
return pandoc.Str(os.date("%B %e, %Y"))
end
end
Escribe notas para ti en un div delimitado, visibles mientras redactas y con la garantía de que no aparecerán en la salida:
::: 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
Asócialo solo a tus perfiles de envío y las notas seguirán apareciendo en tu perfil de borrador para el director: para eso existen precisamente los filtros por perfil.
Dale a [key result]{.highlight} un significado real en cada formato: una marca amarilla en HTML, un resaltado en los PDF de LaTeX:
-- 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
Para la rama de LaTeX, añade una sola vez el paquete de resaltado en los metadatos del formato: header-includes: \usepackage{soul}.
Dos hábitos hacen que escribir filtros sea indoloro. Para ver el árbol con el que estás comparando, ejecuta pandoc -t native sobre un fragmento en el Terminal: imprime exactamente los elementos que recibirán tus funciones. Y cuando una compilación se porte mal, el Registro de compilación y vista previa muestra la línea de comandos completa de pandoc y su salida, errores de los filtros incluidos. Una nota específica de Folio Writer: un filtro cuyo archivo se ha movido se omite en lugar de hacer fallar la compilación; consulta el registro si un filtro parece inactivo sin dar explicaciones.
La documentación de filtros Lua de pandoc recoge todos los elementos y funciones auxiliares, y la colección de filtros de la comunidad está llena de filtros listos para usar: gestión de abreviaturas, ajustes de tablas, renderizado de diagramas. Cualquiera de ellos se añade directamente en la hoja de compilación.