1

上下文:我在一个也使用 KaTeX 的平台上使用 Maxima。由于与内容管理相关的各种原因,这意味着我们经常使用 Maxima 函数来生成必要的 KaTeX 命令。

我目前正在尝试开发一组函数,这些函数将有助于为与向量相关的各种符号生成与 KaTeX 命令相对应的不同字符串集。


问题

我编写了以下函数makeKatexVector(x),它接受一个字符串、列表或列表列表并返回相同类型的对象,每个字符串都包含在其中\vec{}(即makeKatexVector(字符串)返回\vec{字符串}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));

尽管我对上述代码的效率或优雅性表示怀疑,但它似乎返回了所需的表达式;但是,我想修改此函数,以便它可以区分单字符串和多字符串。

特别是,我希望多字符串 likex_1\vec{x}_1not \vec{x_1}的形式返回。

事实上,我只是想修改上面的代码,使其\vec{}包裹在字符串的第一个字符周围,而不管可能有多少个字符。


我的尝试

我已经准备好用蛮力解决这个问题(例如,将字符串的每个字符转录成一个列表,然后重新组装);但是,该项目的真正程序员建议我研究“正则表达式”。在探索了那个无尽的兔子洞之后,我找到了命令regex_subst;但是,我找不到任何 Maxima 文档,并且正在努力重现此处相关文档中的示例。

一旦我可以计算出要使用的适当正则表达式,我打算在上面的代码中使用一个if语句来实现它,例如:

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

如果有人知道这些方面的有用资源,我将非常感谢任何指针。

4

2 回答 2

1

虽然我没想到我会自己解决这个问题,但几个小时后,我取得了一些进展,所以我想在这里分享一下,以防其他人可以从我投入的时间中受益。

  1. 要在 wxMaxima 中加载正则表达式,至少在 MacOS 版本上,只需键入load("sregex");. 我没有加载这个,并试图通过我们的自定义平台工作,这花了我几个小时。

  2. 请注意, Dorai Sitaram链接文档中的许多参数都以相反的顺序出现,或者与它们在相应的 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}确实返回了所需的形式)。

我还没有为函数的其余部分调整代码,但我怀疑这对其他人有用,并且想确保在其他人花时间帮助我之前在这里发布更新。

总是对更好的方法/实践或任何其他指针/反馈感兴趣。

于 2020-11-21T20:00:02.553 回答
1

看起来你让正则表达式方法起作用了,这很棒。然而,我对在 TeX 中处理下标表达式的建议是避免在 Maxima 中使用包含下划线的名称,而是使用带有索引的 Maxima 表达式,例如,foo[k]而不是foo_k. 虽然在 Maxima 中编写foo_k是一个小小的便利,但您很快就会遇到问题,为了理顺它,您最终可能会将一个复杂问题堆积在另一个上面。

例如,Maxima 不知道 , 和 之间有任何关系foo——foo_1它们foo_k没有比foo,abc和更多的共同点xyz。如果有 2 个索引怎么办?foo_j_k通过前面的方法会变成类似的东西foo_{j_k}——如果你想要foo_{j, k}怎么办?(顺便说一下,这两个是foo[j[k]]and foo[j, k]when 用下标表示。)另一个有问题的表达式是foo_bar_baz. 这是否意味着foo_bar[baz]foo[bar_baz]或者foo_bar_baz

tex(x_y)TeX中的 yield代码x_y已经很老了,所以它不太可能消失,但多年来我越来越觉得应该避免它。然而,上次它出现时,我提议禁用它,有足够多的人支持它,我们最终保留了它。

一些可能有用的东西,有一个函数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)。

于 2020-11-22T20:39:22.873 回答