# Ненавижу Word

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

[Я ненавижу Word. Поэтому сделал это.](https://youtu.be/7Cfe1gGeHm0?si=uRDc8-LEY9HuH_bf)

![](/blog/nenavizhu-word/xotm.gif)

Я ненавижу [Word](http://office.microsoft.com/ru-ru/word).

А так же его клоны: [OnlyOffice](http://onlyoffice.com/), [WPS Office](https://www.wps.com/), а [LibreOffice](https://www.libreoffice.org/) среди них, наверное, самый неудобный и перегруженный.

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

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

![](/blog/nenavizhu-word/word-pain.jpg)

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

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

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

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

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

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

Альтернатив было по большей части две: [LaTeX](http://www.latex-project.org/) и [Typst](https://typst.app/)

![](/blog/nenavizhu-word/latex-bell-curve.jpg)

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

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

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

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

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

![Моя лаба в Overleaf](/blog/nenavizhu-word/overleaf-lab.png)

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

Но при этом LaTeX был удобен тем, что [ChatGPT](https://chatgpt.com) хорошо его генерировал, поэтому этот критерий я оставил как один из ключевых в своих последующих поисках.

![](/blog/nenavizhu-word/chat-gpt.jpg)

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

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

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

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

![](/blog/nenavizhu-word/json2docx.jpg)

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

Писал я её на python, а для работы с xml взял [python-docx](https://github.com/python-openxml/python-docx).

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

![json + WPS Office](/blog/nenavizhu-word/json-wps.png)

Но библиотека не покрывала всех элементов вордовского документа, поэтому 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](https://graphviz.org/), позволяющей языком dot описать блок-схемы и диаграммы, для графиков выбрал matplotlib, позже я добавил [kroki](https://kroki.io/) — бэкенд, который поддерживает большинство таких языков для всевозможной графики через код. Так я добавил блоки изображений в свой диалект, которые мог генерировать ИИ, а json2docx рендерил и сразу вставлял их в документ.

![Работа в Graphviz Online](/blog/nenavizhu-word/graphviz-online.png)

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

![Как выглядели формулы тогда](/blog/nenavizhu-word/formula_image.png)

Я уже думал, что это всё - победа, но как бы не так, потребовалась утилита обратной конвертации 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.**

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

![](/blog/nenavizhu-word/docx2json.jpg)

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

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

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

![](/blog/nenavizhu-word/claude-limits.gif)

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

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

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

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

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

Так как концепция перестала быть просто конвертацией между форматами, а обрастала еще содержательными правилами, то название стало docx-automation. Вот, кстати, это репо со спеками, диалектом yaml, валидатором и скриптом проверки источников — [docx-automation](https://github.com/Artem891372/docx-automation).

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

![Я 1 в 1 выгляжу кста](/blog/nenavizhu-word/meme.jpg)

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

Для не-программиста 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](https://daringfireball.net/projects/markdown/), простой, зрелый и проверенный язык разметки. Плюсом он позволяет встроить рисунки, формулы, таблицы и ссылки, что как раз кстати. 

Но Markdown не идеален. О соблюдении [ГОСТ 7.32](https://docs.cntd.ru/document/1200157208) и [ГОСТ 2.105](https://docs.cntd.ru/document/1200001260) в таком документе речи и не идет, потому что этот язык не заточен под ГОСТ, требовались расширения диалекта под написание академических работ.

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

![](/blog/nenavizhu-word/sticker.jpg)

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

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

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

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

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

![Работа в редакторе](/blog/nenavizhu-word/editor.png)

Можно очень гибко настроить стиль. Настолько гибко, что в какой-то момент я изучил, что такое [капитель](https://en.wikipedia.org/wiki/Small_caps), реализовал её поддержку и потратил на это несколько часов жизни. До сих пор не уверен, что она понадобилась хоть кому-нибудь кроме меня.

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

![Работа со стилем](/blog/nenavizhu-word/style.png)

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

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

![](/blog/nenavizhu-word/final.jpg)

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

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

---

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

- [Как писать диплом в Markdown и конвертировать в Word по ГОСТ](/blog/kak-pisat-diplom-v-markdown)
- [Как оформить диплом (ВКР), написанный ИИ, по ГОСТу](/blog/kak-oformit-vkr-napisannuyu-ii)
- [Как написать диплом с ChatGPT и оформить его по ГОСТ](/blog/kak-napisat-diplom-s-chatgpt)
- [Как написать курсовую работу с ChatGPT и оформить её по ГОСТ](/blog/kak-napisat-kursovuyu-s-chatgpt)
- [Как написать отчет по практике с ИИ (ChatGPT) и оформить его по ГОСТ](/blog/kak-napisat-otchet-po-praktike)
- [Как написать лабораторную работу с ChatGPT и оформить её по ГОСТ](/blog/kak-napisat-laboratornuyu-s-chatgpt)
- [Открытые исходники: диалект Markdown и примеры работ — GitHub](https://github.com/Artem891372/oformitel)
