【发布时间】:2020-11-21 19:47:55
【问题描述】:
上下文:我在一个也使用 KaTeX 的平台上使用 Maxima。由于与内容管理相关的各种原因,这意味着我们经常使用 Maxima 函数来生成必要的 KaTeX 命令。
我目前正在尝试开发一组函数,这些函数将有助于为与向量相关的各种符号生成与 KaTeX 命令相对应的不同字符串集。
问题
我编写了以下函数makeKatexVector(x),它接受一个字符串、列表或列表列表并返回相同类型的对象,每个字符串都包裹在\vec{}中(即makeKatexVector(string)返回\vec{string} 和makeKatexVector(["a","b"]) 返回["\vec{a}", "\vec{b}"]等)。
/* 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 和 not \vec{x_1}。
事实上,我只是想修改上面的代码,让\vec{}包裹在字符串的第一个字符上,不管有多少个字符。
我的尝试
我已经准备好用蛮力解决这个问题(例如将字符串的每个字符转录成一个列表,然后重新组合);但是,该项目的真正程序员建议我研究“正则表达式”。在探索了那个无尽的兔子洞之后,我找到了命令regex_subst;但是,我找不到任何 Maxima 文档,并且正在努力重现相关文档 here 中的示例。
一旦我可以计算出合适的正则表达式来使用,我打算在上面的代码中使用if 语句来实现它,例如:
if slength(x) >1
then {regex command}
else {regular treatment}
如果有人知道这些方面的有用资源,我将不胜感激。
【问题讨论】: