Генерирование 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