다음과 같은 폴더 구조가 있습니다.
chapters/
01-chapter.md
02-chapter.md
03-chapter.md
format.sh
parse.sh
파싱.sh
pandoc -t html5+smart -so dist/book.html --html-q-tags chapters/*.md
format.sh
for f in chapters/*.md;
do
pandoc "$f" -o "$f" -t \
markdown+smart+footnotes-escaped_line_breaks+example_lists \
--columns=80;
done
내 생각은 기본적으로 Pandoc을 변환기뿐만 아니라 포맷터로도 사용하는 것이었습니다. 이것은 각주를 사용하기 시작할 때까지 꽤 잘 작동했습니다.
내가 달릴 때format.sh각주에 사용하는 모든 참조 이름은 숫자로 덮어쓰여집니다. 괜찮을 것 같지만 문제는 다음을 실행하는 것입니다.파싱.sh다음 메시지가 나타납니다.
[WARNING] Duplicate note reference '1' at line 360 column 1
문제는 각주가 모두 있다는 것 01-chapter.md
입니다 . 기본적으로 Pandoc이 각 파일의 각주를 개별적으로 처리하고 마크다운 파일 전체에서 상호 참조를 허용하지 않기를 원하지만 이를 수행할 수 있는 방법이 없습니다.02-chapter.md
[^1]
누구든지 아이디어가 있나요?
답변1
루아는 필요없어
방금 옵션을 우연히 발견했습니다 --file-scope
. 이것을 추가하면 parse.sh
문제가 해결됩니다 ...
--file-scope
여러 파일 문서를 결합하기 전에 각 파일을 개별적으로 구문 분석합니다. 이렇게 하면 동일한 식별자를 가진 다른 파일의 각주가 예상대로 작동할 수 있습니다. 이 옵션을 설정하면 각주와 링크가 파일 전체에서 작동하지 않습니다.
답변2
Pandoc은 포맷터로 작동하도록 설계되지 않았지만 대부분의 경우 합리적으로 잘 작동합니다.
원본 각주를 보존하기 위해 pandoc을 구할 수 있는 방법은 없으므로 다른 방법을 찾아야 합니다. 문제는 pandoc이 파일을 개별 문서로 순차적으로 읽은 다음 pandoc 내의 문서를 최종 문서로 결합하도록 하는 것입니다. 모든 입력 파일을 (를 통해) 전달하면 *.md
pandoc이사슬 같이 잇다마크다운을 구문 분석하기 전에 이러한 파일을 단일 문서로 만듭니다.
내 제안은 "인덱스"(또는 마스터) 파일을 사용하는 것입니다. Pandoc Markdown에는 하위 파일을 포함하기 위한 기본 구문이 없지만 다음을 사용하여 자체적으로 롤링할 수 있습니다.판독 루아 필터. 예를 들어, 모든 챕터를 함께 묶는 파일을 정의합니다. 여기서 파일은 코드 블록에서 한 줄에 하나씩 나열됩니다.
``` include
chapters/1.md
chapters/2.md
chapters/3.md
```
다음 코드를 파일에 넣습니다 include.lua
(다음에서 가져옴).이 요점)
--- Pandoc Lua filter to include other Markdown files
local List = require 'pandoc.List'
function CodeBlock(cb)
if cb.classes:includes'include' then
local blocks = List:new()
for line in cb.text:gmatch('[^\n]+') do
if line:sub(1,1)~='#' then
local fh = io.open(line)
blocks:extend(pandoc.read (fh:read '*a').blocks)
fh:close()
end
end
return blocks
end
end
그런 다음 Lua 필터와 마스터/인덱스 파일을 입력으로 사용하여 pandoc를 호출합니다.
pandoc -t html5+smart -so dist/book.html --html-q-tags --lua-filter=include.lua index.md
index.md
이는 새 Markdown 파일을 추가할 때마다 편집해야 한다는 단점이 있습니다 . 또한 인덱스 파일에 정의된 메타데이터만 출력에 포함됩니다(이러한 제한은 약간의 코딩으로 피할 수 있음). 그 외에는 당신이 찾고 있는 것을 정확하게 수행해야 합니다.