Appearance
你是说怎么才能让 Mathematica 里的输出变得更好看点儿 我他妈直接开盒!
- 原文: https://zhuanlan.zhihu.com/p/1983918772449461168
- 发布日期: 2026-01-23
- 分类: Mathematica / 软件 / 写作与计算工具
因为对新手来说几乎毫无实用价值以前就没想过要介绍, 但后来发现这种屎上雕花的ワザ最终出现在了我代码的方方面面所以就还是推荐大家也吃饱了撑的地去搞搞这些东西.
至于说有啥用··· 就是说你的 MaiMai 八成得事这样儿的:
- \text{FeynIntToFeynPara}\left[ \frac{1}{\text{InverProp}\left( k-p,0,{n}_{0} \right)\text{InverProp}\left( k,m,{n}_{1} \right)},k,p \right].\
然而我那完全等效的代码的却可以长这样儿:
- \cancel{p}\int_{0}^{1}{\text{d}x}\ \frac{\left( 1-x \right)\left( 1-x+a \right)}{\left( x+a \right)}^{2}\int{\frac{\text{d}^{d}k}{\left( 2\pi \right)}^{d}\frac{1}{\left[ {\left( k-p \right)}^{2}+\text{i}\varepsilon \right]}^{n}_{0}{\left( {k}^{2}-{m}^{2}+\text{i}\varepsilon \right)}^{n}_{1}.
或者说难道你不好奇这是个啥情况吗:

为啥明明事 Pair[Momentum[k], Momentum[p]] 却能显示为 呢? 我能不能搞出类似的东西来呢? 问得好, 这就事本文的主题了,,
一些特别简单的操作这里就不介绍了, 你要能碰到看不懂的就说明你的水平还没到能吃饱了撑的的程度, 那还是先多吃点儿吧, 看把孩子饿的:
https://zhuanlan.zhihu.com/p/136542995噢对了, 如果你能坚持看到最后的话, 那你还能学到一手能为函数赋予特定运算性质的代码··· 嗯, 就比如说类似于给函数 F 赋予一个 F[a] + F[b] = F[a+b] 这样的性质之类的.
一个需求上最直观的例子就是 Feynman 积分, 比如你要有个关于 Feynman 积分的通项公式:
\int{\frac{\text{d}^{d}{k}_{1}{\left( 2\pi \right)}^{d}\frac{\text{d}^{d}{k}_{2}{\left( 2\pi \right)}^{d}\ \frac{1}{\left[ {\left( {k}_{1}+{k}_{2}-p \right)}^{2}-m_{0}^{2}+\text{i}\varepsilon \right]}^{n}_{0}{\left( k_{1}^{2}-m_{1}^{2}+\text{i}\varepsilon \right)}^{n}_{1}{\left( k_{2}^{2}-m_{2}^{2}+\text{i}\varepsilon \right)}^{n}_{2}=F\left( {n}_{0},{n}_{1},{n}_{2} \right),
那所谓的套公式就是替换呗, 然后你会发现似乎重要的根本就只有那么仨参数罢了, 也就是说本质上我们需要的替换规则其实就只长这样:
{\left[ P\left( {k}_{0} \right) \right]}^{n0\text{ }\!\!\_\!\!\text{ }{\left[ P\left( {k}_{1} \right) \right]}^{n1\text{ }\!\!\_\!\!\text{ }{\left[ P\left( {k}_{2} \right) \right]}^{n2\text{ }\!\!\_\!\!\text{ }:\to F\left( -n0,-n1,-n2 \right).
但我就是在计算过程中比起 更想看到 可咋整呢?
于是就又到了本文的主题: 我们可以将 都显示为 而具体运算时还是被视为 确实够吃饱了撑的的吧? 但你要整个人都总是很吃饱了撑的, 那就很有必要了呀.
答案就是你可以这么写:

InverProp/:MakeBoxes[InverProp[Subscript[k,n_]],TraditionalForm]:=MakeBoxes[Subsuperscript[k,n, 2]-Subsuperscript[m,n,2]];
するとまあ, あら不思議:

计算结果中所有的 InverProp[] 竟都便乘了 感叹号儿.
关键还只是长这样, 实际上人家还事那个 good ol' InverProp.
最后要提一下的就是我并不推荐写 Subscript[k,n_], 因为这玩意儿是排版格式, 或许可以参与运算但无形中就加大了计算成本且容易出乱子, 比如有时候可能会无法替换直接恶心死你, 我这里包括下文都这么写只是为了方便解说. 事实上你永远都应该用 x[n] 而非 Subscript[x,n] 去参与运算, 但你说 x[n] 很丑陋? 那这不就是本文的重点吗?
但你好不放心啊, 那段代码到底啥意思? 好不敢乱抄是吧?
那你可以这么去想吧, 就 Mathematica 具体怎么算的你不用管, 但至少它肯定不是拿着草稿纸嗯搁那列竖式的吧? 所以它的计算结果总得先翻译回人话对你来说才会比较易读, 而这里所说的人话其实也就是些字符拼接出来的图像罢了, 更具体来说这个拼接的结构就是所谓的盒 [Box] 结构.
所以如果你希望它按照你的意思去翻译自己的结果, 那就要在盒结构的层面去建立映射. 显然这样的操作并不会影响到实际的计算过程, 也绝不会改变计算后的实际输出.
或许可以说我们使用 Mathematica 的过程是这样的:
- 以 InputForm 的形式输入要计算的东西.
- 输入的内容被翻译为 Mathematica 的语言.
- Mathematica 计算出结果.
- 计算的结果被翻译为盒结构.
- 将盒结构渲染为 TraditionalForm 给你看.
比如说你让它算 那你输入的实际上不就只是俩字母、一对括号、一数字和一加号吗? 你要想的话完全可以用 ToBoxes 去直接开它的盒:

那啥叫 MakeBoxes 呢? 你可以理解为就是生成一个表达式的所对应的盒结构:

然后你总可以通过 DisplayForm 来渲染你手头的盒结构:

所以之前的代码

指的其实就是把 的盒结构赋给了 TraditionalForm 下的 InverProp[{k}_{n\text{ }\!\!\_\!\!\text{ }] 的盒结构, 至于说右边的话就不用填 MakeBoxes 的第二个参数了.
不难发现它在 StandardFrom 下还是会原形毕露的:

显然你要赋给了 StandardFrom 的话那情况就会反过来:

而我这儿因为调用了 FeynCalc 导致计算结果都是 TraditionalForm 的, 所以我就赋给了 TraditionalForm.
当然平时也并不只涉及 吧, 显然你还可以这样写:

开玩笑的, 你这是在找死你知道吗? 千万别拿任何 script 去参与计算, 你总还可以这样写嘛:

那话说为啥不用 ToBoxes 直接开盒呢? 因为太暴力了, 总之千万别这么干, 早晚要出大事儿的.
你发现欸那似乎就直接写行盒结构的赋值就能效果欸
那为啥还要在前面加个 InverProp/: 呢?
那你试试呗:

确实也行, 但为毛 Clear 不掉呢? 捅娄子了吧?
这下你只能用 Remove 去删掉所有关于它的一切来勉强补救了:

好吧其实你 Unset[MakeBoxes[InverProp[Subscript[k,n_]],TraditionalForm]] 也行··· 但为毛要搞得这么复杂? 越复杂就越容易桶大篓子, 真不开玩笑的, 写程序的一大原则就是能不越界就别越界:

所以这个 😕 除了看起来有点儿不开心之外还能有些啥含义呢?
那其实 😕 还真就只是不太高兴的意思, 前面用的根本就不是 😕 而是 /: 好吗?
而这个 /: 其实就是建立责任制的意思, 比如说我希望为函数 F 构建一个 F[a] + F[b] = F[a+b] 这样的性质, 我怎么写呢? 难道就直接嗯写:

似乎不行噢, 因为你左边的实际上是 Plus[F[Pattern[x1,Blank[]]],F[Pattern[x2,Blank[]]]]:

这就意味着你前面是在更改 Plus 这个内置函数的定义, 然后人家肯定不给呗.
那简单, Unprotect 呗··· 神经, 永远不要越界! 要不然你这比代码就越写越混沌了.
其实所谓的责任制就是说 /: 左边的符号要为这条赋值规则负责:

现在我们终于理解了最初的

就是说让 Inverprop 为这条复制规则负责呗··· 大概就是这种感觉吧.
噢, 你这么搞可行不通嗷:

这都跟人家没关系就别坑人了好吧?
但你要能骗他亲自去工地走两圈儿那确实可行:

翻到最后将再奖励一则没用小知识:

首先我觉得这个 Co 函数对一部分人来说可能是相当有用的, 然后是之所以会出现类似于"⟨ q⟩" 或 "⟨g²G²⟩" 这样的疯狂写法是因为只有这样才能保证渲染出来的全都事正体, 注意 "⟨g²G²⟩" 里的这个 ² 其实也很不一般,,是的, 只要能算得更好看点儿, 我就可以轻易地花掉比写代码的逻辑构架本身所需的精力还要多得多的精力···