Обновить

Книга в Markdown: Автоматическая сборка статического сайта mdBook и файла DOCX с оформлением по ГОСТ

Уровень сложностиПростой
Время на прочтение17 мин
Охват и читатели7.5K
Всего голосов 16: ↑16 и ↓0+19
Комментарии13

Комментарии 13

Afaik по ГОСТ надо ещё иметь колонтитулы с именем организации и нумерацией и соотвественно оглавление.

От нас издательство, с которым мы сотрудничали, пока требовало только номера страниц в колонтитулах docx-файла, название организации и прочее они проставляют сами. Колонтитулы с номерами страниц тоже настроены в template.docx, сгенерированный docx-файл их наследует. Сгенерировать оглавление на основе заголовков первого # и второго ## уровней можно при помощи опции --toc при сборке документа при помощи pandoc. А для ЕСПД с его сложной вёрсткой, на мой взгляд, самые интересные результаты получены в проекте GOSTdown. Обновил текст статьи, чтобы прояснить эти моменты, спасибо за замечание!

Afaik по ГОСТ надо ещё иметь колонтитулы

А рамки с основными надписями?!?

Для издательства не нужно, а в принципе это возможно?

В GOSTdown есть пример сгенерированного документа по ГОСТ 19.xxx (ЕСПД). Колонтитулы у них содержат как номера страниц, так и дополнительный текст. Как в template.docx настроите, так и будет в сгенерированном файле. А вот с титульными листами ЕСПД есть нюанс:

Всё содержимое документа, кроме листа утверждения, титульной страницы и листа регистрации изменений (в конце) изначально создано в Markdown и преобразуется в Word автоматически.

Сгенерированную часть можно соединять со статической частью на этапе сборки, например, средствами python-docx. Мы так когда-то делали:

from docx import Document
from docx.enum.text import WD_BREAK
import sys

def concat_doc(head_path, body_path):
    body = Document(body_path)
    head = Document(head_path)
    head.add_paragraph().add_run().add_break(WD_BREAK.PAGE)
    for e in reversed(head.element.body):
        body.element.body.insert(0, e)
    body.save(body_path)

concat_doc(sys.argv[1], sys.argv[2])

"Обещаю, там все проще чем в латехе"

Лайк за сарказм. ;)

Справедливости ради решаемая проблема выглядит "не писать и не верстать в ворде" при этом md освоить сильно проще latex, точнее его кже знает значительное количество людей.

Как по мне, самая главная проблема Markdown - это его синтаксис для таблиц

О, недавно придумали миниатюрное решение и для вёрстки таблиц с rowspan/colspan в Markdown — сверстать таблицу в HTML, затем специальным фильтром на Lua построить для таблицы AST, после чего встроить это AST в AST документа.

Работает оно почти как фильтр pysvg из статьи. Но нужно учитывать, что в ячейках таблицы тоже может быть Markdown, поэтому ячейки таблицы нужно обойти и вклеить их AST в AST таблицы. Lua-фильтр, который мы используем для HTML-таблиц в Markdown, выглядит так:

tools/html-table.lua

function RawBlock(raw)
    if raw.format:match 'html' and raw.text:match '%<table' then
        -- Разбираем HTML средствами pandoc в AST.
        local ast = pandoc.read(raw.text, 'html')
        local table = ast.blocks[1]
        local caption = table.attr.identifier
        table.caption = pandoc.Caption({pandoc.Str(caption)})
        -- Обходим AST таблицы и строим AST для каждой ячейки.
        -- После чего встраиваем AST ячеек в AST таблицы.
        local div = pandoc.walk_block(pandoc.Div(ast.blocks), {
            Plain = function (element)
                local md = pandoc.utils.stringify(element)
                local ast = pandoc.read(md, 'markdown')
                return ast.blocks
            end
        })
        return div.content
    end
end

В текст Markdown-документа с книгой вставляется следующий блок кода:

# Таблица

```{=html}
<table>
 <tr> 
  <td colspan="2">Ячейка 1</td>
 </tr>
 <tr> 
  <td>Ячейка 2</td>
  <td>Ячейка 3</td>
 </tr>
</table>
```

К команде сборки pandoc нужно добавить опцию --lua-filter=tools/html-table.lua, после чего таблица в сгенерированном docx-документе начинает выглядеть так:

Стили таблицы тоже можно задать в template.docx.

Однако работа со стилями в LaTeX простотой и минималистичным синтаксисом не отличается.

Насколько я могу судить по опыту, работа со стилями в Латех очень проста и минималистична. Определяете только те стили, которые вам удобны, — а всё остальное оставляете без внимания.

\begin{habr}

\emph{Насколько я могу судить по опыту}, работа со стилями в Латех очень \bold{проста} и \bold{минималистична}. Определяете только те стили, которые вам удобны, \tire{} а всё остальное оставляете без внимания.

\end{habr}

Да, но что делать, если на выходе требуется получить оформленный по ГОСТ или иным требованиям DOCX с отступами, подписями к рисункам, SVG-диаграммами? С заданием стилей уже не всё так просто. Условный IEEE LaTeX-шаблоны предоставляет, но не все издательства и организации так могут, приходится поддерживать DOCX.

Pandoc поддерживает трансляцию LaTeX в DOCX, но, кажется, не полностью, всё равно придётся делать свои фильтры для преобразований AST. То есть, остаётся вопрос выбора входного языка — LaTeX или Markdown. Мне кажется, входной язык в примерах из статьи можно заменить и на LaTeX, оставив остальное, не потеряв в удобстве.

Как раз та работа, которую незазорно делегировать нэйросетям.

ага, искал идею чегонить повайбкодить. придумал - напрограммировать свой обсидиан только под аскидок

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации