Максимумы: создание функции, которая воздействует на части строки

#regex #function #maxima

#регулярное выражение #функция #максимумы

Вопрос:

Контекст: я использую Maxima на платформе, которая также использует KaTeX. По разным причинам, связанным с управлением контентом, это означает, что мы регулярно используем функции Maxima для генерации необходимых команд KaTeX.

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


Проблема

Я написал следующую функцию makeKatexVector(x) , которая принимает строку, список или список списков и возвращает объект того же типа, причем каждая строка завернута в vec{} ( makeKatexVector( т. ) Е. vec{ string } возвращает makeKatexVector([" string, "," а "]) a ["vec{ b }", "vec{ возвращает }"] ab и т.д.).

 /* Flexible Make KaTeX Vector Version of List Items */
makeKatexVector(x):= block([ placeHolderList : x ],
            if stringp(x)   /* Special Handling if x is Just a String */
            then placeHolderList : concat("vec{", x, "}")
            else        if listp(x[1])   /* check to see if it is a list of lists */
                    then        for j:1 thru length(x) 
                            do placeHolderList[j] : makelist(concat("vec{", k ,"}"), k, x[j] ) 
                        else        if  listp(x)   /* check to see if it is just a list */
                            then  placeHolderList    : makelist(concat("vec{", k, "}"), k, x) 
                            else    placeHolderList : "makeKatexVector error: not a list-of-lists, a list or a string", 
        return(placeHolderList));
 

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

В частности, я бы хотел, чтобы многозначные строки, например x_1 , возвращались как vec{x}_1 и нет vec{x_1} .

На самом деле, я просто хотел бы изменить приведенный выше код так, чтобы vec{} он был обернут вокруг первого символа строки, независимо от того, сколько символов там может быть.


Моя попытка

Я был готов заняться этим с помощью грубой силы (например, переписать каждый символ строки в список, а затем собрать заново); однако настоящий программист в проекте предложил мне изучить «Регулярные выражения». После изучения этой бесконечной кроличьей норы я нашел команду regex_subst ; однако я не могу найти для нее никакой документации Maxima и изо всех сил пытаюсь воспроизвести примеры в соответствующей документации здесь.

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

 if slength(x) >1 
then {regex command}
else {regular treatment}
 

Если кто-нибудь знает полезные ресурсы по любому из этих направлений, я был бы очень признателен за любые указания.

Ответ №1:

Похоже, у вас работает подход с регулярными выражениями, это здорово. Однако мой совет по поводу обработки выражений с подписью в TeX заключается в том, чтобы избегать работы с именами, которые содержат символы подчеркивания в Maxima, и вместо этого работать с выражениями Maxima с индексами, например foo[k] , вместо foo_k . Хотя запись foo_k в Maxima является незначительным удобством, вы довольно быстро столкнетесь с проблемами, и, чтобы исправить это, вы можете в конечном итоге нагромоздить одно усложнение на другое.

Например. Maxima не знает, что существует какая-либо связь между foo , foo_1 , и foo_k — у них не больше общего, чем foo , abc , и xyz . Что, если есть 2 индекса? foo_j_k станет чем-то вроде foo_{j_k} предыдущего подхода — что, если вы хотите foo_{j, k} вместо этого? (Кстати, эти два являются foo[j[k]] и foo[j, k] , когда представлены нижними индексами.) Другое проблемное выражение выглядит примерно так foo_bar_baz . Означает ли это foo_bar[baz] , foo[bar_baz] или foo_bar_baz ?

Код для tex(x_y) x_y вывода в TeX довольно старый, поэтому он вряд ли исчезнет, но с годами я все больше чувствую, что этого следует избегать. Однако, в последний раз, когда она появилась, и я предложил отключить ее, было достаточно людей, которые ее поддержали, и в итоге мы ее сохранили.

Что может быть полезным, есть функция texput , которая позволяет указать, как символ должен отображаться в выводе TeX. Например:

 (%i1) texput (v, "\vec{v}");
(%o1)                       "vec{v}"
(%i2) tex ([v, v[1], v[k], v[j[k]], v[j, k]]);
$left[ vec{v} , vec{v}_{1} , vec{v}_{k} , vec{v}_{j_{k}} , 
 vec{v}_{j,k} right] $
(%o2)                         false
 

texput может изменять различные аспекты вывода TeX; вы можете взглянуть на документацию (см. ? texput ).

Комментарии:

1. Здесь так много полезной информации, не могу отблагодарить вас! FWIW до сих пор я ничего не передавал Maxima из (Ka) TeX, на самом деле я просто использую его для генерации команд KaTeX (что звучит странно, вне контекста, я понимаю), но это будет очень полезно, когда я неизбежно доберусь до этой стороны забора. Очень ценю ваше время и советы!

Ответ №2:

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

  1. чтобы загрузить регулярное выражение в wxMaxima, по крайней мере, в версии macOS, просто введите load("sregex"); . У меня это не было загружено, и я пытался работать через нашу пользовательскую платформу, что стоило мне нескольких часов.
  2. обратите внимание, что многие аргументы в связанной документации Дорая Ситарама приводятся в обратном порядке или в другом порядке, чем в соответствующих версиях Maxima.
  3. не все функции «pregexp» существуют в Maxima;

В дополнение к этому, экранирование специальных символов существенно различалось в зависимости от wxMaxima, встроенного компилятора Maxima (работающего в редакторе Ace) и фактической отображаемой версии на нашей платформе; в частности, встроенный компилятор часто возвращал false выражения, которые правильно компилировались в wxMaxima и на платформе. Поскольку я не sregex загружал wxMaxima с самого начала, я потерял много времени на это.

Наконец, выражение регулярного выражения, которое достигло желаемой замены, в моем случае, было:

 regex_subst("vec{\1}", "([[:alpha:]])", "v_1");
 

которая возвращает vec{v}_1 в wxMaxima (Примечание: ни одна из моих попыток вернуть wxMaxima vec{v}_1 не увенчалась успехом; экранирование обратной косой черты, похоже, просто не работает; к счастью, обычная экранированная версия \vec{\1} возвращает желаемую форму).

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

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