Компилирайте множество файлове в един със заглавни блокове

Бих искал да знам как да компилирам множество 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 concatter. Ще обърна внимание на този въпрос на вниманието на пощенския списък с надеждата, че някой ще има по-добро решение.   -  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/mathematicalcoffee/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