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

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

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

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

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

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

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

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

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

  2. Оформление в 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
  • Кроссплатформенность (желательно)
  • Сохранение без подтверждений при закрывании (желательно)

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

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 в сторону и ищем дальше.

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

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

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 — это единственный редактор без поддержки замены с подстановками вместо групп совпадения типа , 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 и потом, видимо, удалить и забыть про него. Действуем по этой инструкции.

  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 из SynWriteDatalexlib в cudatextDatalexlib
  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

Let’s block ads! (Why?)

Read More

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *