Проблемы оформления расчетов и что такое iMath
Наверное, многие, кто учился в техническом ВУЗе, сначала делали вычисления своих курсовых в Mathcad (или другом математическом пакете), а затем старательно набирали эти же формулы в MS Word с подстановкой чисел. Потом забыли про это.
Когда меня взяли конструктором по расчетам на прочность — пришлось вспомнить.
Нет, современные технологии МКЭ используются (SolidWorks, Ansys), но формулы с методиками по ГОСТ никто не отменял. Тут принципы не изменились, хотя со времен защиты моего диплома прошло более 10 лет. Люди сначала набирают формулы, уже набранные в Mathcad, а потом руками подставляют каждое число в формулу и записывают результат.
Зачем писать цифры после формулы, если результат считает компьютер?
Это спорное мнение, такие записи действительно иногда помогают найти ошибку. Просто нонсенс делать это руками. Люди пытались решить эту проблему с разных сторон, существуют TechEditor, CalcPad, NormCad, но не о них речь, на практике применяю только 2 решения:
-
Оформление прямо в Mathcad и распечатка как есть
-
Оформление в LibreOffice Writer с плагином iMath — он считает и подставляет числа
Подход 1 применим не для всех документов:
-
рамки ГОСТ, таблицы, автонумерацию рисунков, ссылок в Mathcad не особо реализуешь
-
для "оформленных" расчетов требуют подставлять числа и перечислять переменные с пояснением после формулы:
$$display$$ boxed{d=sqrt{8F_2iover πτ_2}=sqrt{8 · 200 · 5over3.14 · 900}=1.68}text{мм,}\ begin{align} text{где } & boxed{F_2=200}text{Н - рабочее усилие на пружине;}\ & boxed{i=5}text{ - индекс пружины;}\ & boxed{τ_2=900}text{МПа - допускаемое напряжение сдвига.} end{align} $$display$$
если подставить значения можно в старом Mathcad 15, то с присвоением значений после формулы — проблемы что в Mathcad 15, что в Mathcad Prime
-
общее ограничение оформительских возможностей, нельзя вывести значение переменной без её имени и знака равенства, например
Подход 2 тоже ограничен возможностями iMath, и иногда приходиться копипастить таблицы из Mathcad в LibreOffice Writer, но не приходится хотя бы каждую цифру руками набирать в каждой формуле.
Зачем нужен text expander при наборе формул iMath
Простой пример (серым показан исходный текст):
$$display$$ boxed{ color{gray}{text{%ii @nospace{%DELTA x}@ EQDEF nospace{%DELTA x}=10}}\ Delta x=10 } $$display$$
Многовато для переменной из 2-х символов. Но решается проблема просто, т.к. iMath поддерживает юникод и существуют программы, раскрывающие сниппеты не только в Вашем любимом текстовом редакторе, но вообще везде. С помощью них можно набирать греческие буквы просто и без мышки.
Назначим сниппеты по аналогии с Mathcad, где это делается так: D, Ctrl+G → Δ, у нас будет так: DG → Δ. Тогда и читать исходник формулы станет проще:
$$display$$ boxed{ color{gray}{text{%ii @Δx@ EQDEF Δx=10}}\ Delta x=10 } $$display$$
Из бесплатных программ остановился на этих, они решают проблему:
- aText (некоторые функции платные, пока без них приемлемо) Windows7+/MacOS
Здесь лежат греческие буквы и другие сниппеты для оформления расчетной документации, загружаются через File→Открыть и надо выбрать csv в диалоге, перед загрузкой можно удалить Default Group и Examples - espanso Windows8+/MacOS/Linux
Причем здесь текстовый редактор
Проблема №1. Чтобы отобразить переменные после формулы, нужно просто присвоить их скрытно перед формулой и затем отобразить после формулы их значения (серым показан исходный текст)
$$display$$ boxed{smallcolor{silver}{ text{%%ii @F_2@ EQDEF* F_2=200}\ text{%%ii @i_{}@ EQDEF* i_{}=5}\ text{%%ii @τ_2@ EQDEF* τ_2=900} }} boxed{ smallcolor{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_2ioverπτ_2}=sqrt{8 · 200 · 5over3.142 · 900}=1.682 }text{мм,}\ begin{align} text{где } & boxed{smallcolor{silver}{text{%%ii PRINTVAL F_2}}\F_2=200}text{Н - рабочее усилие на пружине;}\ & boxed{smallcolor{silver}{text{%%ii PRINTVAL i_{}}}\i=5}text{ - индекс пружины;}\ & boxed{smallcolor{silver}{text{%%ii PRINTVAL τ_2}}\τ_2=900}text{МПа - допускаемое напряжение сдвига.} end{align} $$display$$
В чем проблема? А в подстановке значений. Здесь пришлось скопипастить 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
- Кроссплатформенность (желательно)
- Сохранение без подтверждений при закрывании (желательно)
Сравнение текстовых редакторов
Этот редактор выглядит привлекательнее остальных. Формально он не бесплатный, но напоминает об этом даже не каждый день и ничем больше не досаждает.
Смотрим, можно ли настроить подсветку своего синтаксиса. Да, у него есть возможность описать его в yaml. Пишем файл подстветки, результат выглядит отлично:
Теперь записываем макросы: Ctrl+Q, Ctr+F, пишем регулярку для выделения переменной, выделяем, переводим курсор влево, пишем _ii_VAL(
, выделяем регуляркой опять, переводим курсор вправо, пишем )_ii_
, Ctrl+Q. Проверяем что получилось — запускаем макрос с помощью Ctrl+Shift+Q. И ничего. Не выделяется оно, и люди жалуются с 2009. Да...
Ладно, разберёмся позже. Попробуем пока настроить Sublime, чтобы он сохранял файл без подтверждений и выходил по одной кнопке. И тут снова проблема — в Sublime нельзя назначить 2 действия на один шоткат. Окей, ставим плагин для поддержки назначения нескольких действий, но сохранить без подтверждений и закрыть редактор все равно не получается. Не проблема — у нас же есть макросы! Нажимаем Ctrl+Q, запись пошла, нажимаем Ctrl+S — сохранились, теперь выходим...
Ну окно закрылось, может быть даже закрытие записалось в макрос, но сам макрос то не сохранился. Что ж, не судьба, смотрим другие редакторы.
Настроить его можно, но каково набирать русские подписи к переменным. Везде описываются решения с langmap и keymap, но они не достаточны. В статье Vim и переключение раскладок: о наболевшем рекомендуется плагин, который переключает раскладку. Можно найти еще одно вроде бы рабочее решение.
Однако даже при решении проблемы с русской раскладкой остается вопрос: сколько инженеров использует vim в своей работе? Его даже из программистов только часть использует. Откладываем vim в сторону и ищем дальше.
[W]indows [L]inux [M]acOS | WLM | WLM | W__ | WLM | W__ | W__ | WLM | WLM |
поиск регулярками | + | + | + | + | + | + | + | + |
замена внутри выделения | + | + | + | + | + | + | + | + |
подстановки (, 1, ...) | + | - | + | + | + | + | + | + |
✎ добавить курсор мышью | + | + | +¹ | + | - | + | + | ? |
✎ добавить выделение совпадения | ^D | ^⇧D | - | ^⇧D | - | - | ^⇧D⁴ | +⁰ |
✎ выделить все совпадения | ⌥F3 | Ø | - | - | - | ^⇧␠ | - | ? |
✎ выделить все совпадения из диалога поиска | ⌥⏎ | ⌥E | - | - | - | - | - | ? |
✎ добавить курсор строкой ниже | ^⌥↓⁵ | ⌥⇧↓ | -⁶ | -⁶ | - | -⁶ | -⁶ | +⁰ |
⬤ макрос редактирования текста | + | +⁰ | + | - | +⁰ | - | + | + |
⬤ запись поиска | - | +⁰ | + | - | - | - | + | + |
подсветка парных скобок | +⁷ | +¹ | + | + | +⁰ | + | + | + |
возможность определить сложный синтаксис | + | + | ± | ? | ? | ? | + | ± |
удобство работы с русским текстом | + | + | + | +² | + | + | ±⁴ | ±⁰ |
поддержка плагинов | + | + | + | ± | + | - | + | + |
менеджер плагинов | + | + | + | - | + | - | - | +¹ |
палитра команд | ^⇧P | ^⇧P | ^M⁰³ | - | - | - | ^⇧E⁴ | - |
Клавиши (для Windows): ^ — Ctrl, ⇧ — Shift, ⌥ — Alt, ␠ — Space, ⏎ — Enter, ←↑↓→ — стрелки, Ø — не назначено
⁰ — делается плагинами
¹ — требует настройки
² — по умолчанию русский текст не отображается, нужно активировать code.page=65001
в файле настроек
³ — шоткат NppMenuSearch конфликтует с пометками, нужно перенастраивать
⁴ — шоткаты, содержацие буквы, работают только в английской раскладке
⁵ — конфликтует с шоткатом переворачивания экрана
⁶ — есть шоткат ⌥⇧↓, но на самом деле он выполняет прямоугольное выделение
⁷ — без настройки нижнее подчеркивание не очень заметно
Что тут можно обобщить? Удивляют 2 вещи: невозможность записи поиска в макросах Sublime и невозможность (или я плохо искал?) подстановки при поиске с заменой в Cuda. Тем не менее, выбора в общем-то и нет.
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. Он поставляется как 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 — это единственный редактор без поддержки замены с подстановками вместо групп совпадения типа , 1, ..., поэтому будем пользоваться мультивыделением. Жмем Ctrl+F, пишем регулярку
b(abs|acute|aleph|alignb...widetilde|widevec|wp|yellow)b
, жмем Alt+E, Esc — теперь у нас выделены все ключевые слова, жмем ←, вписываем@@
- Выделяем строки, начинающиеся на
%%ii TEXT
с помощью регулярки(?<=^%%iis+TEXT).*$
- Выделяем внутри выделения числа и переменные с помощью регулярки
(?<=[^%@'"])(d+.d+|%w+_{[^{}]*}|%w+|bw+_{[^{}]*}|bw+)(?!.*%%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а будет сохранять файлы ничего не спрашивая, таким образом правка формулы в Cuda будет происходить по той же логике, что и правка в LO Math. Ещё я назначил "file:quit program" шоткат F3 (у меня и в iMath редактор вызывается по F3) — чтобы открыть/закрыть двумя нажатиями одной кнопки.
Осталось настроить подсветку синтаксиса. Wiki говорит, что чтобы создать свой лексер, нужно установить SynWrite и потом, видимо, удалить и забыть про него. Действуем по этой инструкции.
- Устанавливаем SynWrite
- Options → Customize lexers library..., копируем какой-нибудь простой язык или добавляем новый с именем eqn
- View → Lexer → Выбираем свой новый лексер
- Options → Customize lexer...
- Накидываем стили из других языков с помощью кнопки "Import Items" (красная стрелка с листом бумаги)
- Добавляем правила
- Копируем файлы eqn.lcf и eqn.cuda-lexmap из SynWriteDatalexlib в cudatextDatalexlib
- Перезапускаем редактор, вставляем тестовый текст, нажимаем 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
Автор: cser