2014-01-21 3 views
7

Ich würde gerne wissen, wie mehrere Pandoc-Dateien in einem Ausgabedokument, kompilieren, wo jede Eingabedatei einen Titelblock hat.Kompilieren Sie mehrere Dateien zu einem mit Titelblöcken

z. Angenommen, ich habe zwei Dateien:

ch1.md:

% Chapter 1 
% John Doe 
% 1 Jan 2014 
Here is chapter 1. 

ch2.md:

% Chapter 2 
% Jane Smith 
% 3 Jan 2014 
Here is chapter 2. 

Regel mit mehreren Eingabedateien Sie sie, um sie zu pandoc zusammenstellen können, indem sie:

pandoc ch1.md ch2.md --standalone -o output.html 

Pandoc verkettet jedoch die Eingabedateien vor com Stapeln, das heißt nur die erste Titelblock (von ch1.md) wird entsprechend gestaltet. Ich möchte jeder Titelblock entsprechend formatiert werden (z. B. in HTML, wird die erste Zeile des Titelblocks mit <h1 class="title"> gestylt, die zweite <h2 class="author"> und so weiter).

(Hinweis: Ich habe auch versucht, jedes Kapitel als eigenständiges Programm zu kompilieren und dann unter Verwendung von pandoc miteinander zu verknüpfen. Dies entfernt den Titelstyling für Kapitel nach 1, behält jedoch das Styling für die Autoren/das Datum bei).

Warum? ich kann:

  • jedes Kapitel in einem eigenen Dokument zusammenzustellen und um den Autor/Titel/Datum wird in geeigneter Weise
  • das gesamte Dokument zusammen und Autor/Titel/Datum wird in geeigneter Weise für jedes Kapitel markiert kompilieren markiert (kann verwenden, um die --chapters Option)

ich nur die Überschrift mit '#' geben könnte (h1), Autor mit '##' (h2) und dem Datum mit '###' (h3) in jedem Kapiteldatei direkt, aber das bedeutet, dass pandoc nicht weiß, was Titel/Überschrift/Datum meines Dokuments sind, also (zB) wenn ich nach Latex kompiliere, wird esnicht benutzenoder \author{} Tags entsprechend.

+0

Wahrscheinlich möchten Sie sie separat kompilieren und dann mit einem PDF-Concatter versehen. Ich werde diese Frage an die Mailingliste richten, in der Hoffnung, dass jemand eine bessere Lösung hätte. – Shahbaz

+0

@Shahbaz - Ich möchte nicht auf PDF beschränkt werden, aber das würde funktionieren, wenn ich an der PDF-Ausgabe interessiert wäre. Ich habe für den Moment eine Lösung, die gut genug ist, zusammengehackt. –

Antwort

13

ich ein pandoc filter schrieb, dass, wenn auf jedes einzelnes Kapitel der Datei ausführen, fügt den Titelblock als Überschriften (Stufe 1 für den Titel, Stufe 2 für Autor, Stufe 3 für Datum Das macht der HTML-Writer).

Dadurch können Sie Pandoc für jedes Kapitel einzeln ausführen (um die Pandoras Ausgabe plus den formatierten Titelblock zu erzeugen), und dann pandoc auf allen Kapiteln zusammen ausführen, um das einzelne Dokument zu kompilieren.

Der Filter hier auf Kern ist (Ich übernehme keine Verantwortung für fehlerhafte Code, usw.): https://gist.github.com/mathematicalcoffee/e4f25350449e6004014f

Sie können es ändern, wenn Sie es wollten anders formatiert werden (zum Beispiel so der Autor/Datum erscheint in der Inhaltsverzeichnis, da sie Überschriften sind, was nicht ganz richtig ist ... aber das ist ein anderes Problem, wie es auch mit dem Standard-HTML-Writer passiert).

Mein Workflow ist jetzt so etwas wie diese:

FORMAT=latex # as understood by -t <format> in pandoc 
FLAGS=--toc # other flags for pandoc, --smart, etc 
OUT=pdf  # output extension 
for f in Chapter*.md; do \ 
    pandoc $FLAGS -t $FORMAT --filter ./chapter.hs $f; \ 
    echo ""; \ 
done | pandoc $FLAGS --standalone -o thesis.$OUT 

wo ich chmod +x chapter.hs habe und es ist im aktuellen Verzeichnis.

(Ich habe zusätzlich eine title.txt, die ich vorne mit der gesamten Thesis 'Titelblock (im Gegensatz zu jedem Kapitel Titelblock)) sticht)).

Ich bekam Hilfe von der pandoc google group, die großartig war.

2

Das können Sie nicht mit den Titelblöcken %, aber Sie können es mit den neuen YAML-Titelblöcken tun.

Beginn jedes Dokument wie folgt aus:

--- 
title: Chapter One 
author: Me 
date: June 4 
... 

Wenn die Dokumente miteinander verkettet sind, wobei der erste eingestellte Wert wird Vorrang vor dem anderen nehmen, so dass die nachfolgenden YAML Linien der gleichen Parametern (zB mit „title:“) wird ignoriert. (Siehe readme unter „Extension: yaml_metadata_block“.)

+0

Dies funktioniert, um jedes Dokument einzeln zu kompilieren, aber wenn ich die Dokumente zusammen kompiliere, verliere ich die Überschriften usw. für nachfolgende Kapitel (da die nachfolgenden YAML-Blöcke ignoriert werden). Im Moment habe ich nur ein Makefile, das den% -Block durch '#', '##' usw. für den Titel/Autor/Datum ersetzt, wenn separate Dokumente zusammen kompiliert werden (Titelblöcke zu Kapiteln degradieren). Ich schätze, ich sollte ein richtiges Skript schreiben, um jede Überschrift um eine Stufe zu degradieren, wenn ich Dokumente als Kapitel kompiliere? (Ich denke, mit Latex muss man das erste Kapitel als Überschrift/Autor des Dokuments wählen). –