#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:
Хотя я и не ожидал, что справлюсь с этим самостоятельно, через несколько часов я добился некоторого прогресса, поэтому решил поделиться здесь, на случай, если кому-то еще может пригодиться время, которое я потратил.
- чтобы загрузить регулярное выражение в wxMaxima, по крайней мере, в версии macOS, просто введите
load("sregex");
. У меня это не было загружено, и я пытался работать через нашу пользовательскую платформу, что стоило мне нескольких часов. - обратите внимание, что многие аргументы в связанной документации Дорая Ситарама приводятся в обратном порядке или в другом порядке, чем в соответствующих версиях Maxima.
- не все функции «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}
возвращает желаемую форму).
Мне еще предстоит скорректировать код для остальной части функции, но я сомневаюсь, что это будет полезно кому-либо еще, и я хотел бы обязательно опубликовать обновление здесь, прежде чем кто-либо еще найдет время, чтобы помочь мне.
Всегда интересуюсь лучшими методами / практиками или любыми другими указателями / отзывами.