оформитель
документы по ГОСТ 7.32 · Markdown → docx + pdf
Ненавижу Word

Ненавижу Word

· обновлено

Предпочитаете видео? Для этой статьи есть видеоверсия:

Я ненавижу Word. Поэтому сделал это.

Я ненавижу Word.

А так же его клоны: OnlyOffice, WPS Office, а LibreOffice среди них, наверное, самый неудобный и перегруженный.

Чем же плохи docx редакторы?

Ничем, они классные (я шиз, статью заканчиваем).

Ладно, претензия была относительно написания студенческих работ, таких как лабораторная, отчет по практике, курсовая и тем более диплом. В Word ты занимаешься оформлением, а не содержанием документа.

Но многие поколения как-то писали работы в Word, и я тоже писал.

На первом курсе университета нас учили работать в Word и я тогда думал, ему нет альтернативы, это был общепринятый стандарт, ниспосланный богами Microsoft, поэтому весь бакалавриат я писал и страдал, переписывал, узнавал, откуда у меня руки растут и что с этим делать, особенно больно было после перехода на Linux и смены программы на LibreOffice и WPS Office.

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

На последнем курсе я, естественно, взял с десяток дипломов в довесок к своему (я очень люблю страдать ОЧЕНЬ). На нормоконтроле диплома я потратил несколько дней и ночей бесконечных переписываний и... решил продолжить пытки, пойдя в магистратуру.

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

Альтернатив было по большей части две: LaTeX и Typst

LaTeX - стандартое и надежное решение типографических задач, он имеет кучу пакетов, примеров и обучающего материала, а так же мощно автоматизирует рутину по выставлению нумерации, ссылок, стилей, подписи титульников и т.д.

А Typst быстрый и молодой инструмент с простым синтаксисом, написанный на Rust (ЛУЧШЕМ ЯЗЫКЕ В МИРЕ, ДАВАЙТЕ ВСЕ ПЕРЕПИШЕМ НА НЕГО).

Но после пробы:

Typst показался совсем незрелым и со слабым комьюнити, я все никак не понимал, как правильно писать тот или иной блок, документация не помогала (skill issue знаю), плюс к этому ИИ на нем жутко галлюцинировал, пытаясь писать LaTeX вместо Typst.

Поэтому я выбрал LaTeX, сделал на нем отчет по лабораторной и пошел его сдавать и, так как сдача была с экрана монитора, препод сильно удивился, что я показываю ему pdf, а не docx, и ему показалось, что я свистнул отчет у кого-то другого (хоть на титульнике и была моя фамилия, но это же не доказательство правда?), а связи в тот день как назло не было, и Overleaf, где я писал работу открыть с исходниками отчета я не мог, пришлось признать поражение и пересдавать в другой день.

Моя лаба в Overleaf
Моя лаба в Overleaf

Тут-то я понял, что обязательно требуется средство для вывода в docx, потому что Word проклятый монополист, и многие других методов написания документов в глаза не видели (даже если это кандидаты технических наук).

Но при этом LaTeX был удобен тем, что ChatGPT хорошо его генерировал, поэтому этот критерий я оставил как один из ключевых в своих последующих поисках.

Вообще всеми любимый GPT перевернул игру и вывел мою работоспособность на новый уровень, превратив эту работу буквально в кнопку БАБЛО. Но ИИ при всем при этом плохо генерировал docx напрямую и даже сегодня: самые мощные модели требуют кучи лимитов, чтобы сгенерировать хороший docx, потому что делают это через библиотеки языков программирования упрощающие манипуляции с языком разметки вордовских файлов, а в редких случаях правят напрямую язык верстки, и об оформлении в таком случае лучше забыть, особенно если вы не готовы к долгим переделкам, которые все равно упрутся в лимиты.

Поэтому я подумал, что нужен инструмент, не дающий ИИ каждый раз генерировать код с нуля, но и при этом упрощающий работу с версткой.

Тут-то я и решил сделать свой инструмент, зная всего полторы команды на Python, но я и Deepseek (да им можно не только ролить) справились с этой задачей.

Входными данными я решил сделать текстовый формат json, потому что я тогда думал, что ИИ хуже генерирует просто текст, мне казалось, json он генерирует быстрее (как же я ошибался).

Утилиту я назвал json2docx.

Писал я её на python, а для работы с xml взял python-docx.

Довольно быстро был сделан прототип и проверен на ближайшей курсовой. По итогам этого: моя работа упростилась раза в 3, хоть и пришлось дорабатывать документ руками, но и это был прорыв.

json + WPS Office
json + WPS Office

Но библиотека не покрывала всех элементов вордовского документа, поэтому json2docx довольно быстро оброс прямыми манипуляциями с xml. Типа таких:

def replace_in_xml_element(element, replacements):
    """
    Пробегает по XML-дереву элемента (lxml) и заменяет текст в тегах w:t.
    Это позволяет захватить текст внутри текстбоксов / shape'ов.
    """
    for node in element.iter():
        # namespace-aware: теги вида '{...}t'
        if node.tag.endswith('}t') and node.text:
            text = node.text
            for placeholder, value in replacements.items():
                if placeholder in text:
                    text = text.replace(placeholder, value)
            node.text = text

Но в работе кроме текста требовались блок-схемы, графики и диаграммы. Тут я узнал о библиотеке Graphviz, позволяющей языком dot описать блок-схемы и диаграммы, для графиков выбрал matplotlib, позже я добавил kroki — бэкенд, который поддерживает большинство таких языков для всевозможной графики через код. Так я добавил блоки изображений в свой диалект, которые мог генерировать ИИ, а json2docx рендерил и сразу вставлял их в документ.

Работа в Graphviz Online
Работа в Graphviz Online

Были еще формулы, и с ними тоже были сложности. Напрямую писать вордовский формат формул ИИ умели плохо, но была экспериментальная библиотека переводящая LaTeX в формулы вордовского формата, после нескольких проб я понял, что часть элементов не рендерилась, а давала билеберду, но я нашел выход: рендерить фото LaTeX формул и вставлять в документ.

Как выглядели формулы тогда
Как выглядели формулы тогда

Я уже думал, что это всё - победа, но как бы не так, потребовалась утилита обратной конвертации json из docx, чтобы дать ИИ для анализа не только текст, но и понимание, для каких элементов какой стиль, так генерация стала точнее.

Пример оформления одного из стилей на тот момент:

"styles": {
        "heading": {
          "font_name": "Times New Roman",
          "font_size": 16,
          "bold": true,
          "italic": false,
          "font_color": "#000000",
          "alignment": "center",
          "first_line_indent_mm": 0,
          "line_spacing": 1.5,
          "space_after_pt": 0
        },
		<...>
	}

Я сделал docx2json.

Так уже инструменты породили удобный цикл: попросил ИИ написать работу -> отрендерил -> попросил поправить документ и снова отрендерил, повторял пока не получал хороший результат.

Через десяток работ я понял, что полностью отдавать выбор стиля на ИИ — это лишняя трата лимитов и добавление хрупкости из-за ошибок генерации стилей (опять же ИИ тогда галлюционировали больше, чем сейчас), поэтому я стал жестко задавать стили для каждого типа элемента (заголовка, абзаца, подписей рисунков и таблиц и других), но возможность ручных стилей для конкретного элемента еще оставлял.

Так прошел первый год проб, ошибок и доработок.

На второй год я открыл для себя claude code и тут был прорыв: можно было четко описать, что требуется по структуре и содержанию работы, и получить результат практически без галлюцинаций, а если и были, валидатор их ловил без проблем, работы получались отличные, но я не замечал слона в комнате... ЛИМИТЫ.

Лимиты кончались на подписке Pro очень быстро, а цены поднимать, чтобы окупать Max самый лучший месседжер из когда либо созданных подписку не очень-то хотелось.

Решено было оптимизировать трату токенов и первым под нож пошел json как очень многословный. Кроме траты лимитов это увеличивало контекст и вследствие этого ухудшало качество содержания работы. Поэтому я перевел инструмент с json на его более лаконичного "брата" yaml.

Так трата лимитов упала до 50% от изначальных, и работать стало приятнее, без бесконечных перебивок на покурить (я не курю, поэтому еще грустнее), а из-за читаемости yaml можно было даже писать такой документ руками.

Освободившийся контекст я решил заполнить еще несколькими инструкциями, написал валидатор не только по синтаксису, но и по содержанию, который claude использовал после каждой главы, и спецификацию для написания любых академических работ (что спросить у пользователя и в чем отказать).

Также сделал скрипт проверки источников с ИИ на их существование, так как даже claude без веб запросов придумывал (совсем дурашка), но главное, скрипт был адаптирован под проверку наших ГОСТов и нормативных документов (в чем он ошибался чаще всего).

Так как концепция перестала быть просто конвертацией между форматами, а обрастала еще содержательными правилами, то название стало docx-automation. Вот, кстати, это репо со спеками, диалектом yaml, валидатором и скриптом проверки источников — docx-automation.

В целом инструмент вместе с claude code стал просто комбайном академических работ (НОВАЯ БОЛЕЕ КРУТАЯ КНОПКА БАБЛО)

Я 1 в 1 выгляжу кста
Я 1 в 1 выгляжу кста

Так как не успевал помочь всем желающим, я хотел все же выпустить публичную версию инструмента, доступную неискушенному в коде пользователю, чтобы у них появлялся шанс сдать неплохую работу и ДАТЬ МНЕ ЕЩЕ БОЛЬШЕ ДЕНЕГ (на самом деле меньше).

Для не-программиста yaml — абракадабра, которой никто в здравом уме писать диплом не будет. Вот пример:

document:
  type: section
  content:
    - type: heading
      level: 0
      text: Реферат
    - type: paragraph
      text: "Документ содержит {PAGES} с., {IMAGES_COUNT} рис., {TABLES_COUNT} табл., {SOURCES_COUNT} источников."
    - type: heading
      level: 1
      text: Анализ предметной области
    - type: paragraph
      runs:
        - text: "Обычный текст, затем "
        - text: "полужирный"
          bold: true
        - text: " и "
        - text: "курсивный"
          italic: true
        - text: " фрагменты внутри одного абзаца."
    - type: heading
      level: 2
      text: Подраздел
    - type: paragraph
      text: "Абзац внутри подраздела. Нумерация заголовков (1, 1.1, 1.1.1) проставляется автоматически — в тексте её писать не нужно."

Кто-то из менеджеров или экономистов захочет писать так? Возможно врачи стали бы, им писать на мертвых языках не впервой.

Ещё одним минусом было постоянное прописывание тегов type, text и т.д.

Нужна была возможность писать это проще и нагляднее.

Поэтому был выбран более дружелюбный Markdown, простой, зрелый и проверенный язык разметки. Плюсом он позволяет встроить рисунки, формулы, таблицы и ссылки, что как раз кстати.

Но Markdown не идеален. О соблюдении ГОСТ 7.32 и ГОСТ 2.105 в таком документе речи и не идет, потому что этот язык не заточен под ГОСТ, требовались расширения диалекта под написание академических работ.

Я снова переписал свое ядро на прием Markdown вместо yaml. Хотя прокладка была бы более надежным решением, но я многое хотел поменять в ядре, сделать более модульным и убрать хардкод стиля под свой вуз.

Так добавилась еще полезная фишка — стили, в которых можно гибко настроить стиль под свою кафедру/журнал/новый стандарт.

Дальше был написан фронтенд (Claude и ChatGPT помогли, естественно), а бэкенд — моими кривыми ручками. Конвертация так же шла через библиотеку python-docx. Было решено, что нужно превью налету как у Overleaf, поэтому нужна была сборка docx в pdf, для этого используется LibreOffice...

Подружить его с решениями, которые работали в Word было той еще задачей, но я справился, и даже придумал как заставить рендериться docx почти 1 в 1 во всех клонах Word (с учетом что шрифты не заменяются на неидеальные аналоги).

В итоге редактор с превью стал важной функцией, позволяя на лету смотреть, что получается, и править размеры таблиц, формул или изображений, что ИИ часто может делать гиганскими.

Проведя несколько экспериментов с написанием работ через сервис и поправив баги я выпустил в прод сайт Оформитель, который позволяет сделать документы под ГОСТ или кастомные стили в docx и pdf.

Работа в редакторе
Работа в редакторе

Можно очень гибко настроить стиль. Настолько гибко, что в какой-то момент я изучил, что такое капитель, реализовал её поддержку и потратил на это несколько часов жизни. До сих пор не уверен, что она понадобилась хоть кому-нибудь кроме меня.

Также в процессе тестирования добавил поддержку рамок, корректно оформленных блоков "где" для формул и других фишек, помогающих забыть об оформлении и сосредоточиться на содержании (или отдать это на аутсорс ИИ).

Работа со стилем
Работа со стилем

Буду рад, если кто-то потыкает сервис и найдёт баг или будут предложения по улучшению, попробовать могут все желающие, так как всё до генерации готовой работы в docx/pdf бесплатно, писать отзывы можно в сообщения канала Telegram-надеюсь-пока-не-запрещен, прекрасно если запишите видео или сделаете фото с пояснением проблемы/идеи.

Разбор всех фишек и доработок Оформителя я опишу как-нибудь в других статьях.

Все мои эксперименты — от json2docx до Оформителя — были попыткой дать студенту сконцентрироваться на содержании, а не оформлении.

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


Читайте также

Поделиться: Telegram · ВКонтакте · WhatsApp