Folio Writer의 컴파일 파이프라인은 인용, 상호 참조, 템플릿, 형식 등 99%를 감당합니다. Lua 필터는 나머지 1%를 위한 비상구입니다. 저널의 별난 내부 규칙, 나만의 약식 표기, 어떤 체크박스도 예상하지 못한 것들 말이지요. 필터는 컴파일 도중에 문서를 다시 쓰는 몇 줄짜리 Lua 코드이며, pandoc이 기본으로 실행하므로 설치할 것이 없습니다.
pandoc은 원고를 컴파일할 때 먼저 Markdown을 문서 트리(문단, 제목, 스팬, 인용)로 파싱합니다. Lua 필터는 그 요소 이름을 딴 함수들의 모음입니다. 각 함수는 일치하는 모든 요소와 함께 호출되며, 대체할 요소를 반환할 수 있습니다. 아무것도 반환하지 않으면 그대로 두고, {}를 반환하면 삭제하고, 새 요소를 반환하면 변환합니다. 모델은 이게 전부입니다.
.lua 파일로 저장하세요. 프로젝트 안에 두면(예: Research 안의 Filters 하위 폴더) 원고와 함께 동기화되고 이동합니다.아무 곳에나 @@today라고 쓰면 컴파일된 문서에 컴파일 날짜가 들어갑니다. 커버 레터나 초고 워터마크에 유용합니다.
-- today.lua
function Str(el)
if el.text == "@@today" then
return pandoc.Str(os.date("%B %e, %Y"))
end
end
나에게 남기는 메모를 펜스 div 안에 쓰세요. 초고 작성 중에는 보이고, 출력물에는 반드시 빠집니다.
::: 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
이 필터를 제출용 프로필에만 연결하면 지도교수용 초고 프로필에는 메모가 그대로 나타납니다. 프로필별 필터는 바로 이럴 때 쓰는 것입니다.
[key result]{.highlight}에 형식별로 실제 의미를 부여하세요. HTML에서는 노란 마크, LaTeX PDF에서는 하이라이트가 됩니다.
-- 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
LaTeX 쪽을 위해서는 포맷 메타데이터에 하이라이트 패키지를 한 번만 추가하세요: header-includes: \usepackage{soul}.
두 가지 습관이면 필터 작성이 수월해집니다. 일치시키려는 트리를 보려면 터미널에서 코드 조각에 pandoc -t native를 실행하세요. 함수가 받게 될 요소를 정확히 출력해 줍니다. 그리고 컴파일이 이상하게 동작할 때는 컴파일 및 미리보기 로그가 필터 오류를 포함한 전체 pandoc 명령줄과 출력을 보여 줍니다. Folio에만 해당하는 참고 사항 하나: 파일 위치가 바뀐 필터는 컴파일을 실패시키는 대신 건너뜁니다. 필터가 아무 말 없이 작동하지 않는 것 같다면 로그를 확인하세요.
pandoc Lua 필터 문서에는 모든 요소와 도우미 함수가 정리되어 있고, 커뮤니티의 필터 모음에는 약어 처리, 표 조정, 다이어그램 렌더링 등 바로 쓸 수 있는 필터가 가득합니다. 그곳의 어떤 필터든 컴파일 시트에 그대로 넣을 수 있습니다.