Проблемы оформления расчетов и что такое iMath
Наверное, многие, кто учился в техническом ВУЗе, сначала делали вычисления своих курсовых в Mathcad (или другом математическом пакете), а затем старательно набирали эти же формулы в MS Word с подстановкой чисел. Потом забыли про это.
Когда меня взяли конструктором по расчетам на прочность — пришлось вспомнить.
Нет, современные технологии МКЭ используются (SolidWorks, Ansys), но формулы с методиками по ГОСТ никто не отменял. Тут принципы не изменились, хотя со времен защиты моего диплома прошло более 10 лет. Люди сначала набирают формулы, уже набранные в Mathcad, а потом руками подставляют каждое число в формулу и записывают результат.
Зачем писать цифры после формулы, если результат считает компьютер?
Это спорное мнение, такие записи действительно иногда помогают найти ошибку. Просто нонсенс делать это руками. Люди пытались решить эту проблему с разных сторон: существуют TechEditor, CalcPad, NormCad. Но не о них речь, на практике применяю только 2 решения:
Оформление прямо в Mathcad и распечатка как есть.
Оформление в LibreOffice Writer с плагином iMath — он считает и подставляет числа.
Подход 1 применим не для всех документов:
рамки ГОСТ, таблицы, автонумерацию рисунков, ссылок в Mathcad не особо реализуешь;
для "оформленных" расчетов требуют подставлять числа и перечислять переменные с пояснением после формулы:
если подставить значения можно в старом Mathcad 15, то с присвоением значений после формулы — проблемы что в Mathcad 15, что в Mathcad Prime;
общее ограничение оформительских возможностей, например, нельзя вывести значение переменной без её имени и знака равенства.
Подход 2 тоже ограничен возможностями iMath, и иногда приходится копипастить таблицы из Mathcad в LibreOffice Writer, но не приходится хотя бы каждую цифру руками набирать в каждой формуле.
Зачем нужен text expander при наборе формул iMath
Простой пример (серым показан исходный текст):
Многовато для переменной из двух символов. Но решается проблема просто, т.к. iMath поддерживает Юникод и существуют программы, раскрывающие сниппеты не только в Вашем любимом текстовом редакторе, но вообще везде. С их помощью можно набирать греческие буквы просто и без мышки.
Назначим сниппеты по аналогии с Mathcad, где это делается так: D, Ctrl+G > ?, у нас будет так: DG > ?. Тогда и читать исходник формулы станет проще:
Из бесплатных программ остановился на этих, они решают проблему:
- aText (некоторые функции платные, пока без них приемлемо) Windows7+/MacOS
Здесь лежат греческие буквы и другие сниппеты для оформления расчетной документации, загружаются через File>Открыть и надо выбрать csv в диалоге, перед загрузкой можно удалить Default Group и Examples - espanso Windows8+/MacOS/Linux
Причем здесь текстовый редактор
Проблема №1. Чтобы отобразить переменные после формулы, нужно просто присвоить их скрытно перед формулой и затем отобразить после формулы их значения (серым показан исходный текст)
В чем проблема? А в подстановке значений. Здесь пришлось скопипастить 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 |
поиск регулярками | + | + | + | + | + | + | + | + |
замена внутри выделения | + | + | + | + | + | + | + | + |
подстановки (\0, \1, ...) | + | +? | + | + | + | + | + | + |
? добавить курсор мышью | + | + | +? | + | - | + | + | ? |
? добавить выделение совпадения | ^D | ^?D | - | ^?D | - | - | ^?D? | +? |
? выделить все совпадения | ?F3 | O | - | - | - | ^?? | - | ? |
? выделить все совпадения из диалога поиска | ?? | ?E | - | - | - | - | - | ? |
? добавить курсор строкой ниже | ^?v? | ??v | -? | -? | - | -? | -? | +? |
? макрос редактирования текста | + | +? | + | - | +? | - | + | + |
? запись поиска | - | +? | + | - | - | - | + | + |
подсветка парных скобок | +? | +? | + | + | +? | + | + | + |
возможность определить сложный синтаксис | + | + | ± | ? | ? | ? | + | ± |
удобство работы с русским текстом | + | + | + | +? | + | + | ±? | ±? |
поддержка плагинов | + | + | + | ± | + | - | + | + |
менеджер плагинов | + | + | + | - | + | - | - | +? |
палитра команд | ^?P | ^?P | ^M?? | - | - | - | ^?E? | - |
Клавиши (для Windows): ^ — Ctrl, ? — Shift, ? — Alt, ? — Space, ? — Enter, <^v> — стрелки, O — не назначено
? — делается плагинами
? — требует настройки
? — по умолчанию русский текст не отображается, нужно активировать code.page=65001
в файле настроек
? — шоткат NppMenuSearch конфликтует с пометками, нужно перенастраивать
? — шоткаты, содержацие буквы, работают только в английской раскладке
? — конфликтует с шоткатом переворачивания экрана
? — есть шоткат ??v, но на самом деле он выполняет прямоугольное выделение
? — без настройки нижнее подчеркивание не очень заметно
? — используются обозначения $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. Он поставляется как 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 и потом, видимо, удалить и забыть про него. Действуем по этой инструкции:
- Устанавливаем SynWrite.
- Options > Customize lexers library..., копируем какой-нибудь простой язык или добавляем новый с именем eqn.
- View > Lexer > Выбираем свой новый лексер.
- Options > Customize lexer...
- Накидываем стили из других языков с помощью кнопки "Import Items" (красная стрелка с листом бумаги):
- Добавляем правила:
- Копируем файлы eqn.lcf и eqn.cuda-lexmap из SynWrite\Data\lexlib в cudatext\Data\lexlib.
- Перезапускаем редактор, вставляем тестовый текст, нажимаем 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
Aleho
Вопрос немного в сторону.
Чем привлек Notepad3 как замена штатного блокнота?
Сам пользовался AkelPad раньше долгое время, только на десятке он плохо выглядит, перешел на Notepad++, а он избыточен для блокнота все-таки.
alex-open-plc
Посмотреть madeditmod?
Aleho
И чем madeditmod заслуживает внимания?
Текстовых редакторов очень много, могу и сам минимум десяток только по памяти набросать )
cser Автор
Notepad3 на scientilla построен, должен быть поудобнее для редактирования, отличий в поведении при открытии файлов от блокнота нет, к которым надо привыкать. Для замены надо только поставить галочку. Нехитрые соображения, это ж не выбор основного редактора для работы.
Aleho
На scientilla пробовал SkiTE, уже и не вспомню почему вернулся на Notepad++.
В AkelPad замена тоже галочкой, только у меня он с ClearType не задружился.
Блокнот вроде и нехитрое дело, только используется много и часто, а потому может начать раздражать, например своей задумчивостью.
alsoijw
В статье упомянут vim, но не упомянут emacs… Ну ладно. Что значит «добавить курсор мышью», «выделить все совпадения из диалога поиска»?
«добавить выделение совпадения», «выделить все совпадения»
:set hlsearch
«добавить курсор строкой ниже»Ctrl + V, v
cser Автор
Emacs просто не знаю — пытался давно освоить — на второй день стало жалко свои пальцы и эксперимент прекратил.
«добавить выделение совпадения», «выделить все совпадения» — это всё про множественное редактирование (не путать с прямоугольным выделением, впервые появилось, пожалуй, в sublime, в scientilla добавили недавно), означает добавление новых курсоров на каждое выделение
:set hlsearch — это просто подсветка выделений, не совсем то. Вообще в vim есть плагин для мультикурсоров и скорее всего он может все что я пометил ?, просто пользовался им давно — устанавливать и проверять лениво. Хотя, в vim даже отсутствие мультикурсоров не так критично, как в других редакторах, там другие способы редактирования достаточно мощные
Dreadd
Несколько лет назад столкнулся с этой задачей на учебе и тоже пришлось строить велосипеды. В моем случае пришел к следующей модели велосипеда на костыльно-паровой тяге:
Недостатки такого подхода понятны, но есть и преимущества:
Ну и конечно написание такого инструмента это весьма забавный процесс, куда веселее чем руками писать сотни формул (хотя быстрее или нет в конечном итоге это вопрос спорный, но нам же лучше два дня потерять зато потом за два часа долететь :)
cser Автор
Прикольно. А есть посмотреть где это чудо? Если не далеко запрятано — чисто из любопытства, потому что если я такое на работе устрою — коллеги будут слегка обескуражены :)
warlock13
Mathcad, MS Word. У нас настолько всё плохо в технических вузах? (Я сам в педагогическоми учился, так что действительно не знаю.)
cser Автор
Думаете «у них» лучше? Тут не понятно как лучше. То что я описал — это было в 2007 году. Но и сейчас на работе так. Разрешить вставку кода на mathcad в приложения в тот же диплом, без расписывания порядка расчета? — Не знаю, логика расчета должна же быть объяснена.
warlock13
Точно не знаю. Я думал, что «у нас» лучше. Лучше — это когда слова Mathcad и MS Word воспринимаются как шутка и страшный сон. К описанной вами проблеме это ортогонально.
Catslinger
Notepad++ в любых репах Linux на видном месте лежит. А в статье его записали, как будто он не доступен на Linux. А вообще, что только люди не придумают, лишь бы LaTex не учить.
cser Автор
Под wine все-таки, он там стабильно работает?
kompilainenn2
Да уж. С одной стороны радует применение LibreOffice в реал лайф, а с другой — не радует костыль в виде внешнего текстового редактора. По хорошему это всё должно бы входить в функционал расширения (но это мечты конечно). Жаль не могу лайк за статью поставить, карма плохая=)
Mike-M
Согласен с Вашим мнением. Дополню: касается не только LibreOffice, но и Microsoft Word.
Mike-M
После прекращения разработки AkelPad (очень жаль) задумался о его замене.
Перепробовал кучу редакторов, в т.ч. довольно долго изучал SublimeText.
Но в результате остановился на, кмк, незаслуженно малоизвестном EmEditor:
Рекомендую! (нет, я не работаю в этой компании; просто с удовольствием делюсь ссылкой на продукт, который, по моему мнению, этого явно достоин)
DEM_dwg
Немного не понимаю если честно, зачем нужен текстовый редактор.
Можно же и в самом LibreOffice сделать плагин для подстановки значений.
Причем результат будет сразу обсчитываться, внешним плагином, который будет и являтся расчетной программой. Такой подход гораздо удобнее.
С учетом того что для расчетов используется в основном Python, то данную программу можно будет сделать в виде дополнительной пары функций которые просто добавлять в тело основного расчета.
cser Автор
Здесь речь про решение проблемы хоть как-нибудь и малой кровью. Я даже плагин к текстовому редактору не пишу — использую макросы.
С другой стороны — использовать текстовый редактор удобнее чем встроенный LibreOffice Math. Его разработчики ведь до сих пор считают, что подсветка парных скобок, не говоря о подсветке синтаксиса — это лишнее. Плагин, позволяющий удобно редактировать текст быстро не напишешь.
И нет уверенности что все так просто, в iMath же сторонняя математическая библиотека используется. Автор одно время говорил, что там чуть ли не дублирущий парсер нужно писать для корректной обработки (а не как у меня, в 90% работает, в 5% минимальные правки, 5% — много правок руками)