Как стать автором
Обновить

Расчеты на прочность в LibreOffice и выбор текстового редактора

Время на прочтение10 мин
Количество просмотров9.4K

Проблемы оформления расчетов и что такое iMath


Наверное, многие, кто учился в техническом ВУЗе, сначала делали вычисления своих курсовых в Mathcad (или другом математическом пакете), а затем старательно набирали эти же формулы в MS Word с подстановкой чисел. Потом забыли про это.


Когда меня взяли конструктором по расчетам на прочность — пришлось вспомнить.



Нет, современные технологии МКЭ используются (SolidWorks, Ansys), но формулы с методиками по ГОСТ никто не отменял. Тут принципы не изменились, хотя со времен защиты моего диплома прошло более 10 лет. Люди сначала набирают формулы, уже набранные в Mathcad, а потом руками подставляют каждое число в формулу и записывают результат.


$\boxed{d=\sqrt{8F_2i\overπτ_2}=\sqrt{8 · 200 · 5\over3.14 · 900}=1.68}\text{мм}$


Зачем писать цифры после формулы, если результат считает компьютер?

Это спорное мнение, такие записи действительно иногда помогают найти ошибку. Просто нонсенс делать это руками. Люди пытались решить эту проблему с разных сторон: существуют TechEditor, CalcPad, NormCad. Но не о них речь, на практике применяю только 2 решения:


  1. Оформление прямо в Mathcad и распечатка как есть.


  2. Оформление в LibreOffice Writer с плагином iMath — он считает и подставляет числа.



Подход 1 применим не для всех документов:


  • рамки ГОСТ, таблицы, автонумерацию рисунков, ссылок в Mathcad не особо реализуешь;


  • для "оформленных" расчетов требуют подставлять числа и перечислять переменные с пояснением после формулы:


    $ \boxed{d=\sqrt{8F_2i\over πτ_2}=\sqrt{8 · 200 · 5\over3.14 · 900}=1.68}\text{мм,}\\ \begin{align} \text{где } & \boxed{F_2=200}\text{Н - рабочее усилие на пружине;}\\ & \boxed{i=5}\text{ - индекс пружины;}\\ & \boxed{τ_2=900}\text{МПа - допускаемое напряжение сдвига.} \end{align} $


    если подставить значения можно в старом Mathcad 15, то с присвоением значений после формулы — проблемы что в Mathcad 15, что в Mathcad Prime;


  • общее ограничение оформительских возможностей, например, нельзя вывести значение переменной без её имени и знака равенства.



Подход 2 тоже ограничен возможностями iMath, и иногда приходится копипастить таблицы из Mathcad в LibreOffice Writer, но не приходится хотя бы каждую цифру руками набирать в каждой формуле.


Зачем нужен text expander при наборе формул iMath


Простой пример (серым показан исходный текст):


$ \boxed{ \color{gray}{\text{%ii @nospace\{%DELTA x\}@ EQDEF nospace\{%DELTA x\}=10}}\\ \Delta x=10 } $


Многовато для переменной из двух символов. Но решается проблема просто, т.к. iMath поддерживает Юникод и существуют программы, раскрывающие сниппеты не только в Вашем любимом текстовом редакторе, но вообще везде. С их помощью можно набирать греческие буквы просто и без мышки.


Назначим сниппеты по аналогии с Mathcad, где это делается так: D, Ctrl+G → Δ, у нас будет так: DG → Δ. Тогда и читать исходник формулы станет проще:


$ \boxed{ \color{gray}{\text{%ii @Δx@ EQDEF Δx=10}}\\ \Delta x=10 } $


Из бесплатных программ остановился на этих, они решают проблему:


  • aText (некоторые функции платные, пока без них приемлемо) Windows7+/MacOS
    Здесь лежат греческие буквы и другие сниппеты для оформления расчетной документации, загружаются через File→Открыть и надо выбрать csv в диалоге, перед загрузкой можно удалить Default Group и Examples
  • espanso Windows8+/MacOS/Linux

Причем здесь текстовый редактор


Проблема №1. Чтобы отобразить переменные после формулы, нужно просто присвоить их скрытно перед формулой и затем отобразить после формулы их значения (серым показан исходный текст)


$ \boxed{\small\color{silver}{ \text{%%ii @F_2@ EQDEF* F_2=200}\\ \text{%%ii @i_{}@ EQDEF* i_{}=5}\\ \text{%%ii @τ_2@ EQDEF* τ_2=900} }} \boxed{ \small\color{silver}{ \text{%%ii @d@ EQDEF d=sqrt{{8 · F_2 · i_{}}over{%pi · τ_2}}}\\ \text{%%ii TEXT =sqrt\{\{8 · _ii_VAL(F_2)_ii_ · _ii_VAL(i_\{\})_ii_\}}\\ \text{over\{_ii_VAL(%pi)_ii_ · _ii_VAL(τ_2)_ii_\}\}=_ii_VAL(d)_ii_} }\\ d=\sqrt{8F_2i\overπτ_2}=\sqrt{8 · 200 · 5\over3.142 · 900}=1.682 }\text{мм,}\\ \begin{align} \text{где } & \boxed{\small\color{silver}{\text{%%ii PRINTVAL F_2}}\\F_2=200}\text{Н - рабочее усилие на пружине;}\\ & \boxed{\small\color{silver}{\text{%%ii PRINTVAL i_{}}}\\i=5}\text{ - индекс пружины;}\\ & \boxed{\small\color{silver}{\text{%%ii PRINTVAL τ_2}}\\τ_2=900}\text{МПа - допускаемое напряжение сдвига.} \end{align} $


В чем проблема? А в подстановке значений. Здесь пришлось скопипастить d=sqrt{{8 · F_2 · i_{}}over{%pi · τ_2}}}, немного изменить до вида =sqrt{{8 · F_2 · i_{}}over{%pi · τ_2}}}=d и обернуть каждую переменную в _ii_VAL()_ii_. На практике это быстрее чем вместо оборачивания выискивать значения и вписывать их. Но работа лишняя.


Автоматизировать эту подстановку в iMath проблематично, но можно зайти с другого конца — сделать эти правки с помощью макросов в текстовом редакторе.


Проблема №2. Вместе со сгенерированным текстом исходник формулы довольно тяжело воспринимается


%%ii @d@ EQDEF d=sqrt{{8 · F_2 · i_{}}over{%pi · τ_2}}
d=sqrt{{8 · F_2 · i_{}}over{%pi · τ_2}} %%gg
%%ii TEXT =sqrt{{8 · _ii_VAL(F_2)_ii_ · _ii_VAL(i_{})_ii_}over{_ii_VAL(%pi)_ii_ · _ii_VAL(τ_2)_ii_}}=_ii_VAL(d)_ii_
=sqrt{{8 · 200 · 5}over{3,142 · 900}}=1,682 %%gg

Лечится подсветкой сгенерированного отдельным цветом, опять же в текстовом редакторе.


Проблема №3. Часто приходится искать пропавшую скобочку. Во встроенном редакторе формул подсветку парных скобок никак не добавят. Тоже решается использованием внешнего редактора.


Разработчик iMath, Jan Rheinlaender, пошел мне навстречу и добавил редактирование формул из внешнего редактора. Дело за малым — выбрать его и настроить.


Требования к редактору такие:


  • бесплатность;
  • макросы;
  • множественное редактирование (потребуется для использования в макросах, и просто удобно);
  • подсветка пользовательского синтаксиса;
  • подсветка парных скобок;
  • удобство редактирования английского текста вперемешку с русским, чтобы набирать такое, например:
    Q_д=0.785 · D_сп^2 · p
  • кроссплатформенность (желательно);
  • сохранение без подтверждений при закрывании (желательно).

Сравнение текстовых редакторов


Sublime Text


Этот редактор выглядит привлекательнее остальных. Формально он не бесплатный, но напоминает об этом даже не каждый день и ничем больше не досаждает.


Смотрим, можно ли настроить подсветку своего синтаксиса. Да, у него есть возможность описать его в yaml. Пишем файл подстветки, результат выглядит отлично:



Теперь записываем макросы: Ctrl+Q, Ctr+F, пишем регулярку для выделения переменной, выделяем, переводим курсор влево, пишем _ii_VAL(, выделяем регуляркой опять, переводим курсор вправо, пишем )_ii_, нажимаем Ctrl+Q. Проверяем что получилось — запускаем макрос с помощью Ctrl+Shift+Q. И ничего. Не выделяется оно, и люди жалуются с 2009. Да...


Ладно, разберёмся позже. Попробуем пока настроить Sublime, чтобы он сохранял файл без подтверждений и выходил по одной кнопке. И тут снова проблема — в Sublime нельзя назначить 2 действия на один шоткат. Окей, ставим плагин для поддержки назначения нескольких действий, но сохранить без подтверждений и закрыть редактор все равно не получается. Не проблема — у нас же есть макросы! Нажимаем Ctrl+Q, запись пошла, нажимаем Ctrl+S — сохранились, теперь выходим...



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


Vim


Настроить его можно, но каково набирать русские подписи к переменным. Везде описываются решения с langmap и keymap, но они не достаточны. В статье Vim и переключение раскладок: о наболевшем рекомендуется плагин, который переключает раскладку. Можно найти еще одно вроде бы рабочее решение.


Однако даже при решении проблемы с русской раскладкой остается вопрос: сколько инженеров использует vim в своей работе? Его даже из программистов только часть использует. Откладываем vim в сторону и ищем дальше.


[W]indows [L]inux [M]acOS WLM WLM W__ WLM W__ W__ WLM WLM
поиск регулярками + + + + + + + +
замена внутри выделения + + + + + + + +
подстановки (\0, \1, ...) + +⁸ + + + + + +
✎ добавить курсор мышью + + + - + + ?
✎ добавить выделение совпадения ^D ^⇧D - ^⇧D - - ^⇧D⁴ +⁰
✎ выделить все совпадения ⌥F3 Ø - - - ^⇧␠ - ?
✎ выделить все совпадения из диалога поиска ⌥⏎ ⌥E - - - - - ?
✎ добавить курсор строкой ниже ^⌥↓⁵ ⌥⇧↓ -⁶ -⁶ - -⁶ -⁶ +⁰
⬤ макрос редактирования текста + +⁰ + - +⁰ - + +
⬤ запись поиска - +⁰ + - - - + +
подсветка парных скобок +⁷ + + +⁰ + + +
возможность определить сложный синтаксис + + ± ? ? ? + ±
удобство работы с русским текстом + + + + + ±⁴ ±⁰
поддержка плагинов + + + ± + - + +
менеджер плагинов + + + - + - -
палитра команд ^⇧P ^⇧P ^M⁰³ - - - ^⇧E⁴ -

Клавиши (для Windows): ^ — Ctrl, ⇧ — Shift, ⌥ — Alt, ␠ — Space, ⏎ — Enter, ←↑↓→ — стрелки, Ø — не назначено
⁰ — делается плагинами
¹ — требует настройки
² — по умолчанию русский текст не отображается, нужно активировать code.page=65001 в файле настроек
³ — шоткат NppMenuSearch конфликтует с пометками, нужно перенастраивать
⁴ — шоткаты, содержацие буквы, работают только в английской раскладке
⁵ — конфликтует с шоткатом переворачивания экрана
⁶ — есть шоткат ⌥⇧↓, но на самом деле он выполняет прямоугольное выделение
⁷ — без настройки нижнее подчеркивание не очень заметно
⁸ — используются обозначения $1-$9, а не \1-\9


Что тут можно обобщить? Удивляют 2 вещи: невозможность записи поиска в макросах Sublime и невозможность (или я плохо искал?) подстановки при поиске с заменой в CudaText. Тем не менее, выбора в общем-то и нет.


Logo Название Версия Дата Текстовый компонент Решение
Sublime Text 3.2.2 01.10.19 Cвой (на Skia) ✘ Нужные макросы не записать
CudaText 1.118.2.0 29.12.20 Свой Подходит
Notepad++ 7.9.2 01.01.21 Scientilla ✘ Слабые возможности редактирования текста
SciTE 4.4.6 01.12.20 Scientilla ✘ Макросов вообще не нашел
AkelPad 4.9.8 18.07.16 Scientilla ✘ Нужные макросы не записать
Notepad3 5.20.915.1 15.09.20 Scientilla ✘ Блокнот я им заменил, но нужные макросы не записать
Textadept 11.0 01.12.20 Scientilla / Curses ✘ Шоткаты на русской раскладке не работают
Vim 8.2 10.12.20 ? ✘ Сколько инженеров его знает?

CudaText


Итак, берем CudaText. Он поставляется как portable zip-архив. В wiki что-то пишут про не portable версию, но инсталлятора я не нашел. Хорошо это или плохо? Устанавливающаяся версия кажется понятнее — все настройки лежат в %APPDATA% и их можно хранить в репозитории. А здесь? Окей, положим весь редактор в репозиторий, 25Мб — это не так много, зато на другой машине не надо будет устанавливать — запустил из репозитория и голову не забиваешь. Надо сказать, что настройки хоть и хранятся в той же папке, что и редактор, при заливке в нее новой версии не перетираются, неудобство только в том что нужно руками распаковать новую версию. Первый запуск:



Эстетически выглядит норм, но как-то не контрастно всё. Ладно, это настроим. Так, убираем все что нам не нужно для набора формул. Включаем подсветку парных скобок и перенос по словам. Также убираем поведение с последней строкой вверху экрана при прокрутке до упора (непривычно), автозакрытие скобок (польза спорная, а записи макросов иногда мешает). Statusbar оставляем, чтобы видеть, когда включен режим записи макроса.


Выбираем Options → Settings default/user, пишем:


{
  "wrap_mode" : 1,
  "wrap_indented" : false,
  "ui_statusbar_show" : true,
  "ui_sidebar_show" : true,
  "find_hidden_buttons": "c",
  "bracket_highlight" : true,
  "ui_toolbar_show" : false,
  "ui_theme" : "white",
  "ui_theme_syntax" : "white",
  "ui_font_name" : "default",
  "ui_font_size" : 9,
  "font_name" : "Lucida Console",
  "font_size" : 10,
  "ui_title_path" : true,
  "ui_menu_show" : false,
  "ui_tab_show" : false,
  "gutter_show" : false,
  "gutter_fold" : false,
  "show_last_line_on_top" : false,
  "log_sessions" : false,
  "py_init_log" : false,
  "auto_close_brackets": ""
}

Теперь команды меню доступны только по кнопке ' ⋮ ' слева вверху и через меню Ctrl+Shift+P (как в Sublime). Текущая вкладка, крестика которой теперь не видно, закрывается по Ctrl+W.


Нужно выбрать тему поконтрастнее.



Но тратить время на это не придётся — светлая контрастная тема одна — white (вторая слева).


Из оригинального: если увеличить высоту окна, слева появится кнопка 'δ', которая показывает список специальных символов:



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


Теперь надо установить плагины: Auto_Save и Macros. Устанавливаются они как в Sublime: Plugins → Addons Manager → Install..., или через Ctrl+Shift+P и наборе чего-то типа plugin:Install+Enter. Через некоторое время появится список доступных плагинов:



Тут все понятно. Надо только обратить внимание, что плагины разбиты по категориям, и для фильтрации можно набирать название этой категории с ':', например, 'theme:' — для просмотра всех неустановленных тем. И еще: установленные плагины не отображаются в списке, для них есть пункт меню Plugins → Addons Manager → Remove add-on...


Сначала повесим шоткаты на команды макроса (из коробки таких шоткатов нет). Если в Sublime это делалось правкой конфига через Preferences→Key Bindings, то здесь это делается оригинально:


  • надо нажать Ctrl+Shift+P, выбрать требуемую команду, например 'macros: start recording'
  • нажать F9
  • в появившемся окне нажать кнопку "Set"
  • нажать комбинацию клавиш
  • нажать ОК

Назначаем Ctrl+Q для "macros: start recording" и Ctrl+Shift+Q для "macros: stop recording".


Эти настройки сохраняются в файле settings/keys:


...
"2810" : {
    "name" : "macros: start recording",
    "s1" : [ "Ctrl+Q" ]
  }
...

Но можно ли дописывать шоткаты прямо в файле и назначать произвольные цифровые айдишники — не ясно.


Основная задача — записать макрос iMath:explain EQDEF, который будет копировать выражение, ставить переменную в конце после '=', оборачивать переменные в _ii_VAL( и )_ii_ и еще будет переименовывать @метку@. Задача большая, поэтому разобъем её на более мелкие. Здесь приведу запись только одной. Итак, записываем макрос, который обернет переменные в _ii_VAL( и )_ii_:


  • Ctrl+Q — запись пошла.
  • Вначале надо подписать всем ключевым словам @@ впереди, чтобы не обернуть их нечаянно. CudaText — это единственный редактор без поддержки замены с подстановками вместо групп совпадения типа \0, \1, ..., поэтому будем пользоваться мультивыделением. Жмем Ctrl+F, пишем регулярку \b(abs|acute|aleph|alignb...widetilde|widevec|wp|yellow)\b, жмем Alt+E, Esc — теперь у нас выделены все ключевые слова, жмем ←, вписываем @@.
  • Выделяем строки, начинающиеся на %%ii TEXT, с помощью регулярки (?<=^%%ii\s+TEXT).*$.
  • Выделяем внутри выделения числа и переменные с помощью регулярки (?<=[^%@'"])(\d+\.\d+|%\w+_\{[^{}]*\}|%\w+|\b\w+_\{[^{}]*\}|\b\w+)(?!.*%%gg$).
  • С прыжками курсора влево-вправо возиться лениво — ну что ж, затрем буфер обмена, Ctrl+X.
  • Пишем _ii_VAL(, Ctrl+V, )_ii_.
  • Удаляем @@ простой заменой по всему документу.
  • Ctlr+Shift+Q — закончили запись, назначаем имя imath:_ii_VAL()_ii_ all.
  • Теперь он появился в списке команд — назначаем шоткат по той же схеме: Ctrl+Shift+P, выбрать макрос imath:_ii_VAL()_ii_ all (не нажимая Enter), F9, назначаем Ctrl+Shift+V.

Макрос можно править (что я и делал), он лежит в settings/macros.json. Примерно такими же хитрыми манипуляциями записываем остальное. При записи макроса можно вызывать другой макрос.


Теперь настроим Auto_Save. Ctrl+Shift+P → ищем plugin:Auto Save: config, правим конфиг:


[op]
save_interval=30
save_before_closing_tab=1
on_deactivate=0

Теперь Cudа будет сохранять файлы ничего не спрашивая, таким образом правка формулы в CudaText будет происходить по той же логике, что и правка в LibreOffice Math. Ещё я назначил "file:quit program" шоткат F3 (у меня и в iMath редактор вызывается по F3) — чтобы открыть/закрыть двумя нажатиями одной кнопки.


Осталось настроить подсветку синтаксиса. Wiki говорит, что чтобы создать свой лексер, нужно установить SynWrite и потом, видимо, удалить и забыть про него. Действуем по этой инструкции:


  1. Устанавливаем SynWrite.
  2. Options → Customize lexers library..., копируем какой-нибудь простой язык или добавляем новый с именем eqn.
  3. View → Lexer → Выбираем свой новый лексер.
  4. Options → Customize lexer...
  5. Накидываем стили из других языков с помощью кнопки "Import Items" (красная стрелка с листом бумаги):

  6. Добавляем правила:

  7. Копируем файлы eqn.lcf и eqn.cuda-lexmap из SynWrite\Data\lexlib в cudatext\Data\lexlib.
  8. Перезапускаем редактор, вставляем тестовый текст, нажимаем Ctrl+Shift+P, eqn, Enter. Появляется окно:


Выбираем подходящие по смыслу стили и нажимаем ОК, лексер заработал:


Вот и все. Теперь заниматься оформительской писаниной стало гораздо легче! Настройки можно взять здесь (нужно распаковать в папку, в которую распаковали редактор).



Заключение


Конечно, я пропустил много популярных редакторов (те же Atom и Visual Studio Code). Но все равно странно — казалось, подойдет любой продвинутый, а подошел только один, причём в других не хватало простых вещей. Хотелось поделиться обнаружением этого редактора. Еще хотел поделиться способом оформления расчетной документации (или курсовых) с помощью iMath (плагин еще тот по стабильности и эргономичности, но другого нет).


Страница скачивания LibreOffice — тестировал на 7.0, но и 6.4 должен работать
Страница скачивания iMath — скачивать нужно iMath-2.3.1~beta2.oxt
Обсуждение фичи iMath "open in external editor" на sourceforge.net — про настройку iMath
Документация по iMath
Страница скачивания CudaText
Настройки CudaText для работы с iMath (нужно распаковать в папку, в которую распаковали редактор)
CudaText на github.com
CudaText на sourceforge.net — здесь только плагины
Настройки aText для набора греческих символов и не только — открываются по Ctrl+O из aText

Теги:
Хабы:
Всего голосов 11: ↑11 и ↓0+11
Комментарии22

Публикации

Истории

Ближайшие события

15 – 16 ноября
IT-конференция Merge Skolkovo
Москва
22 – 24 ноября
Хакатон «AgroCode Hack Genetics'24»
Онлайн
28 ноября
Конференция «TechRec: ITHR CAMPUS»
МоскваОнлайн
25 – 26 апреля
IT-конференция Merge Tatarstan 2025
Казань