Генерирование Pandoc в формате PDF с уценкой, не учитывая форматирование заголовков
Я использую pandoc для создания pdf-кода из некоторой уценки. Я использую h1-h4 через хэш-символы. Пример h1 = #, h4 = ####. Когда я создаю свой документ следующим образом:
pandoc input.md -o output.pdf
Я получаю документ, где h1, h2 и h3 имеют новую строку после них, но h4 не имеет новой строки. Текст начинается в той же строке, что и заголовок (он не форматируется одинаково, но между символом новой строки нет).
Я попытался добавить пробелы после #### и добавить ручную строку, используя мой редактор, но ничего не работает.
Любые идеи?
Ответы
Ответ 1
pandoc
создает файлы PDF через LaTeX. В LaTeX "заголовки" генерируются с использованием следующих команд:
-
\section
-
\subsection
-
\subsubsection
-
\paragraph
-
\subparagraph
Как вы можете видеть, "четвертый уровень" соответствует команде \paragraph
, которая отображается при описании. Просто не используется команда \subsubsubsection
.
Единственный способ получить то, что вы хотите, - это переопределить команду \paragraph
, что довольно сложно. Мне не удалось заставить его работать с Pandoc.
Ответ 2
Перенос заголовков
Возможно, лучший способ решить эту проблему - полностью избежать проблемы, сдвигая заголовок уровня 4. По умолчанию для pandoc используются команды \section
для 1-го уровня и \paragraph
для заголовков 4-го уровня. Это можно изменить с помощью параметра --top-level-division
:
--top-level-division=[default|section|chapter|part]
Обрабатывать заголовки верхнего уровня как заданный тип деления в выводе LaTeX [...]. Порядок иерархии - это часть, глава, затем раздел; все заголовки смещены так, что заголовок верхнего уровня становится указанным типом. Поведение по умолчанию - определить наилучший тип деления с помощью эвристики [...]
Таким образом, с --top-level-division=chapter
заголовок 4-го уровня будет генерироваться с помощью команды \subsubsection
.
Стилизация с помощью LaTeX
Если это не вариант, следующий лучший способ - настроить макет соответствующей команды LaTeX: для заголовков четвертого уровня по умолчанию это \paragraph
. Следующие методы взяты из ответов TeX StackExchange.
Стандартные классы документов
По умолчанию можно настроить \paragraph
через пакет titlesec. Для этого мы можем использовать поле метаданных заголовка-включения, которое pandoc включит в промежуточный документ LaTeX.
---
header-includes: |
''' {=latex}
\usepackage{titlesec}
\titlespacing*{\paragraph}{0pt}{1ex}{-\parskip}
\titleformat{\paragraph}[hang]
{\normalfont\bfseries}
{}
{0pt}
{}
'''
---
Классы документов KOMA
Использование titlesec не будет работать должным образом для документов, использующих классы KOMA (например, scrartcl), поскольку у KOMA есть свои собственные способы ведения дел. Для этого используйте этот альтернативный фрагмент:
---
documentclass: scrartcl
header-includes: |
''' {=latex}
\makeatletter
\renewcommand\paragraph{\@startsection{paragraph}{4}{\[email protected]}%
{-3.25ex \@plus -1ex \@minus -0.2ex}%
{0.01pt}%
{\raggedsection\normalfont\sectfont\nobreak\[email protected]}%
}
\makeatother
'''
---
Ответ 3
Хотя @tarlebs ответ, безусловно, лучший (за исключением того, что он указывает
неправильное количество вертикального пространства), здесь "проще" (по некоторым показателям)
но более хакерское (по крайней мере, в терминах LaTeX) решение, которое дополнительно использует фильтр Pandoc Lua или взлом LaTeX, но избегает загрузки другого пакета LaTeX.
Мы хотим, чтобы источник LaTeX выглядел примерно так:
\hypertarget{level-4-heading}{%
\paragraph{Level 4 heading}\label{level-4-heading}}
\hfill
Lorem ipsum dolor sit amet.
Этот LaTeX выглядит ужасно, но если вам не нужно сохранять или делиться LaTeX
источник он делает то, что вы, вероятно, хотите: пространство между уровнем 4
заголовок и абзац после него равны промежутку между уровнем 3
заголовок и абзац после него.
![Level 4 heading with paragraph break]()
Вот как это работает: поскольку \hfill
на отдельной строке примерно
закрыть, как вы можете добраться до пустого абзаца в LaTeX вы получите первый
абзац - тот, который идет с заголовком - содержащий только
горизонтальный пробел до конца строки, а затем сразу
после нового абзаца - фактический первый абзац после заголовка -
просто обычный абзац между ним и заголовком. Этот
вероятно, также расстраивает идею LaTeXs о том, каким должен быть \paragraph
как можно меньше.
Ручной способ сделать это заключается в следующем:
#### Level 4 heading
''''{=latex}
\hfill
''''
Lorem ipsum dolor sit amet.
Здесь используется относительно новый синтаксис необработанной разметки Pandocs - "блок кода".
на самом деле это необработанный блок LaTeX - но выглядит он еще ужаснее, чем
результирующий источник LaTeX! Это также утомительная рутина, чтобы вставлять
это после каждого заголовка уровня 4. Другими словами, вы хотите вставить это
Необработанный LaTeX автоматически, и это можно сделать с помощью фильтра Lua:
--[======================================================================[
latex-h4-break.lua - Pandoc filter to get break after a level 4 heading.
Usage:
$ pandoc --lua-filter latex-h4-break.lua input.md -o output.pdf
--]======================================================================]
-- create it once, use it many times!
local hfill_block = pandoc.RawBlock('latex', '\\hfill')
function Header (elem)
if 4 == elem.level then
return { elem, hfill_block }
else -- ignore headings at other levels!
return nil
end
end
Однако вы также можете сделать простой взлом LaTeX в header-includes
Блок метаданных, чтобы получить тот же эффект:
---
header-includes:
- |
''' {=latex}
\let\originAlParaGraph\paragraph
\renewcommand{\paragraph}[1]{\originAlParaGraph{#1} \hfill}
'''
---
#### Level 4 heading
Lorem ipsum dolor sit amet.
Это работает, сначала создав псевдоним команды \paragraph
и
затем переопределить саму команду \paragraph
, используя псевдоним в
новое определение, так что теперь везде, где источник LaTeX создан Pandoc
содержит \paragraph{Foo}
, если он вместо этого содержал
\paragraph{Foo} \hfill
, который делает то, что мы хотим, с нулевой прибавкой
зависимости! (В случае, если вам интересно странное написание "псевдонима"
Команда сводит к минимуму риск того, что он сталкивается с чем-либо, что
уже существует, так как команда TeX \let
не проверяет это. Мы
конечно, не хотите перезаписывать любую существующую команду!)
ПРИМЕЧАНИЕ. Если вам действительно нужно больше или меньше места, чем обычно
Разрыв абзаца после заголовка просто добавьте соответствующий \vspace
команда после \hfill
: \hfill \vspace{-0.5\parskip}
.
Ответ 4
Я не уверен, почему, но это работает для меня:
Поместите $\ \\ $
в первую строку после #### headline