Скомпилируйте несколько файлов в один с блоками заголовков

Я хотел бы знать, как скомпилировать несколько файлов pandoc в один выходной документ, где каждый входной файл имеет блок заголовка.

Например. предположим, у меня есть два файла:

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.

Обычно с несколькими входными файлами вы можете скомпилировать их, предоставив pandoc:

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

Однако pandoc объединяет входные файлы перед компиляцией, что означает, что только первый блок заголовка (из ch1.md) имеет соответствующий стиль. Я хотел бы, чтобы каждая основная надпись была стилизована соответствующим образом (например, в html первая строка основной надписи имеет стиль <h1 class="title">, вторая <h2 class="author"> и т. Д.).

(Примечание: я также пытался скомпилировать каждую главу как отдельную по отдельности, а затем объединить их вместе с помощью pandoc. Это удаляет стиль заголовка для глав после 1, хотя сохраняет стиль для авторов / даты).

Почему? Я могу:

  • компилировать каждую главу в отдельный документ, а автор / название / дата помечаются соответствующим образом
  • скомпилировать весь документ вместе, и автор / заголовок / дата помечаются соответствующим образом для каждой главы (можно использовать параметр --chapters)

Я мог бы просто указать заголовок с помощью '#' (h1), автора с '##' (h2) и дату с '###' (h3) непосредственно в каждом файле главы, но это означает, что pandoc не "знает" каковы заголовок / заголовок / дата моего документа, поэтому (например), если я компилирую в латекс, он не будет использовать теги \date{} или \author{} соответственно.


person mathematical.coffee    schedule 21.01.2014    source источник
comment
Вероятно, вы захотите скомпилировать их отдельно, а затем объединить их с помощью PDF-файла. Я доведу этот вопрос до сведения списка рассылки в надежде, что у кого-нибудь найдется лучшее решение.   -  person Shahbaz    schedule 29.04.2014
comment
@Shahbaz - Я не хочу ограничиваться PDF, но да, это сработало бы, если бы меня интересовал вывод PDF. На данный момент я собрал достаточно хорошее решение.   -  person mathematical.coffee    schedule 06.05.2014
comment
Попробуйте pandoc ch1.md ch2.md --standalone -o output.html --file-scope. Согласно документации, это будет анализировать каждый файл индивидуально перед объединением для многофайловых документов. Это позволит сноскам в разных файлах с одинаковыми идентификаторами работать должным образом. Если этот параметр установлен, сноски и ссылки не будут работать в файлах. Чтение двоичных файлов (docx, odt, epub) подразумевает --file-scope.   -  person David Martinez C.    schedule 24.06.2021


Ответы (2)


Я написал фильтр pandoc, который при запуске для каждого отдельного файла главы вставляет блок заголовка как заголовки ( уровень 1 для заголовка, уровень 2 для автора, уровень 3 для даты (это то, что делает писатель HTML).

Это позволяет вам запускать pandoc для каждой главы отдельно (для создания вывода pandoc'd плюс отформатированный блок заголовка), а затем запускать pandoc для всех глав вместе для компиляции единого документа.

Фильтр находится здесь по сути (я не несу ответственности за неисправный код и т. Д.): https://gist.github.com/matMathematicalcoffee/e4f25350449e6004014f

Вы можете изменить его, если хотите, чтобы он форматировался по-другому (например, таким образом автор / дата отображаются в оглавлении, поскольку они являются заголовками, что не совсем верно ... но это другая проблема, как это происходит со значением по умолчанию HTML писатель тоже).

Теперь мой рабочий процесс выглядит примерно так:

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

где у меня chmod +x chapter.hs и это в текущем каталоге.

(У меня также есть title.txt, который я высовываю вперед вместе с основной надписью тезиса (в отличие от основной надписи каждой главы)).

Мне помогли группа pandoc google, которая была отличный.

person mathematical.coffee    schedule 01.05.2014

Вы не можете сделать это с % блоками заголовка, но можете сделать это с новыми блоками заголовков YAML.

Начинайте каждый документ так:

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

Когда документы объединяются вместе, первый набор значений будет иметь приоритет над другими, поэтому последующие строки YAML, использующие тот же параметр (например, «title:»), будут проигнорированы. (См. readme в разделе «Расширение: yaml_metadata_block».)

person John MacFarlane    schedule 29.04.2014
comment
Это работает для компиляции каждого документа по отдельности, но когда я компилирую документы вместе, я теряю заголовки и т. Д. Для последующих глав (поскольку последующие блоки YAML игнорируются). На данный момент у меня есть только Makefile, который заменяет блок% на '#', '##' и т. Д. Для заголовка / автора / даты при совместной компиляции отдельных документов (понижает титульные блоки до глав). Я думаю, мне следует написать правильный сценарий, чтобы понизить каждый заголовок на один уровень при компиляции документов в виде глав? (Я думаю, что с латексом вы должны выбрать, скажем, первую главу в качестве заголовка документа / автора). - person mathematical.coffee; 30.04.2014