Ich habe eine Ordnerstruktur wie die folgende:
chapters/
01-chapter.md
02-chapter.md
03-chapter.md
format.sh
parse.sh
parse.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
Meine Idee bestand im Wesentlichen darin, Pandoc nicht nur als Konverter, sondern auch als Formatierer zu verwenden. Dies funktionierte ziemlich gut, bis ich begann, Fußnoten zu verwenden:
Wenn ich laufeformat.shjeder Referenzname, den ich für meine Fußnoten verwende, wird durch eine Nummer überschrieben - das wäre in Ordnung, aber das Problem ist, wenn ich dann ausführeparse.shIch erhalte folgende Meldung:
[WARNING] Duplicate note reference '1' at line 360 column 1
Das Problem ist 01-chapter.md
, dass 02-chapter.md
beide eine Fußnote haben [^1]
. Grundsätzlich möchte ich, dass Pandoc die Fußnoten für jede Datei separat behandelt und keine Querverweise zwischen meinen Markdown-Dateien zulässt, aber ich sehe keine Möglichkeit, dies zu tun.
Irgendjemand irgendwelche Ideen?
Antwort1
Lua ist nicht nötig
Ich bin zufällig auf diese --file-scope
Option gestoßen. Fügen Sie diese hinzu parse.sh
, und Sie sind aus dem Ärger raus ...
--file-scope
Analysieren Sie jede Datei einzeln, bevor Sie sie für Dokumente mit mehreren Dateien kombinieren. Dadurch funktionieren Fußnoten in verschiedenen Dateien mit denselben Kennungen wie erwartet. Wenn diese Option festgelegt ist, funktionieren Fußnoten und Links nicht dateiübergreifend.
Antwort2
Pandoc ist nicht als Formatierungsprogramm konzipiert, funktioniert aber meistens recht gut.
Es gibt keine Möglichkeit, pandoc dazu zu bringen, die ursprünglichen Fußnoten beizubehalten, also müssen Sie eine andere Methode finden. Die Herausforderung besteht darin, pandoc dazu zu bringen, die Dateien sequenziell als einzelne Dokumente zu lesen und die Dokumente dann innerhalb von pandoc zum endgültigen Dokument zu kombinieren. Wenn Sie einfach alle Eingabedateien (über *.md
) übergeben, führt pandoc dazu,verkettendiese Dateien in ein einzelnes Dokument, bevor das Markdown analysiert wird.
Mein Vorschlag wäre, eine „Index“-Datei (oder Master-Datei) zu verwenden. Pandoc Markdown hat keine integrierte Syntax für die Einbindung von untergeordneten Dateien, aber wir können unsere eigene mit einemPandoc Lua-Filter. Definieren Sie beispielsweise eine Datei, die alle Ihre Kapitel zusammenhält, wobei die Dateien in einem Codeblock zeilenweise aufgelistet werden:
``` include
chapters/1.md
chapters/2.md
chapters/3.md
```
Fügen Sie den folgenden Code in eine Datei ein include.lua
(entnommen ausdieser Kern)
--- 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
Rufen Sie dann pandoc mit dem Lua-Filter und der Master-/Indexdatei als Eingabe auf:
pandoc -t html5+smart -so dist/book.html --html-q-tags --lua-filter=include.lua index.md
Dies hat den Nachteil, dass Sie jedes Mal Änderungen vornehmen müssen, wenn index.md
Sie eine neue Markdown-Datei hinzufügen. Außerdem werden nur die in der Indexdatei definierten Metadaten in die Ausgabe aufgenommen (beide Einschränkungen könnten jedoch mit ein wenig Codierung vermieden werden). Abgesehen davon sollte es genau das tun, wonach Sie suchen.