【问题标题】:Maxima: creating a function that acts on parts of a stringMaxima:创建一个作用于字符串部分的函数
【发布时间】: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}_1not \vec{x_1}

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


我的尝试

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

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

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

如果有人知道这些方面的有用资源,我将不胜感激。

【问题讨论】:

    标签: regex function maxima


    【解决方案1】:

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

    例如Maxima 不知道foofoo_1foo_k 之间有任何关系——它们与fooabcxyz 没有更多的共同点。如果有 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) 在 TeX 中产生 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)。

    【讨论】:

    • 这里有这么多有用的信息,感激不尽! FWIW 到目前为止,我还没有从 (Ka)TeX 给 Maxima 喂过任何东西,我实际上只是用它来生成 KaTeX 命令(这听起来很奇怪,我意识到,断章取义),但这将是当我不可避免地到达栅栏的这一边时非常有帮助。非常感谢您的宝贵时间和建议!
    【解决方案2】:

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

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

    2. 请注意,Dorai Sitaram 的 linked documentation 中的许多参数都以相反的顺序出现,或者与它们在相应的 Maxima 版本中的顺序不同。

    3. Maxima 中并非所有“pregexp”函数都存在;

    除此之外,转义特殊字符在 wxMaxima、内联 Maxima 编译器(在 Ace 编辑器中运行)和我们平台上的实际渲染版本之间存在重要差异;特别是,对于在 wxMaxima 和平台上正确编译的表达式,内联编译器经常返回 false。因为我从一开始就没有在 wxMaxima 上加载sregex,所以我为此浪费了很多时间。

    最后,在我的例子中,实现所需替换的正则表达式是:

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

    在 wxMaxima 中返回 vec{v}_1注意我尝试让 wxMaxima 返回 \vec{v}_1 均未成功;转义反斜杠似乎不起作用;幸运的是,通常的转义版本\\vec{\\1} 确实返回了所需的形式)。

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

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

    【讨论】:

      猜你喜欢
      • 2021-12-30
      • 1970-01-01
      • 2021-02-16
      • 2010-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-07
      • 2019-03-19
      相关资源
      最近更新 更多