防止衍生产品的重新排序?

tel*_*f14 5 wolfram-mathematica typesetting differentiation

最近一篇关于Wolfram博客的文章提供了以下函数,以更传统的方式格式化衍生品.

pdConv[f_] := 
 TraditionalForm[
  f /. Derivative[inds__][g_][vars__] :> 
    Apply[Defer[D[g[vars], ##]] &, 
     Transpose[{{vars}, {inds}}] /. {{var_, 0} :> 
        Sequence[], {var_, 1} :> {var}}]
 ]
Run Code Online (Sandbox Code Playgroud)

一个示例用途,Dt[d[x, a]] // pdConv给出:

在此输入图像描述

如果不打破一般功能pdConv,有人可以改变它来维持给定的变量顺序,产生如下所示的输出吗?(当然这纯粹是出于个人原因,使得人类可以更容易地进行推导)

在此输入图像描述

我怀疑这将是非常重要的 - 除非有人知道一个Global可以暂时覆盖的魔法选项Block.

对于它的价值,这些SO问题可能是相关的:

Hei*_*ike 4

可能有一种更干净的方法来执行 s,但如果纯粹出于演示目的,您可以执行类似的操作

pdConv[f_, vv_] :=
 Module[{v},
  (HoldForm[
       Evaluate@
        TraditionalForm[((f /. Thread[vv -> #]) /. 
           Derivative[inds__][g_][vars__] :> 
            Apply[Defer[D[g[vars], ##]] &, 
             Transpose[{{vars}, {inds}}] /. {{var_, 0} :> 
                Sequence[], {var_, 1} :> {var}}])]] /. 
      Thread[# -> vv]) &@ Table[Unique[v], {Length[vv]}]]
Run Code Online (Sandbox Code Playgroud)

此处,额外参数是按您希望偏导数出现的顺序排列vv的变量列表。f要使用此功能,您需要执行类似的操作

pdConv[Dt[d[x, c]], {x, c}]
Run Code Online (Sandbox Code Playgroud)

按正确顺序排列的方程

基本上,该解决方案的作用是将变量列表临时替换vv为按正确字典顺序排列的虚拟变量列表,应用转换,然后用原始变量替换虚拟变量,同时通过包装转换后的内容来保留所需的顺序中的表达式HoldForm.