I have following expression
−3bσd−3bσv−b−b2+2j−2j2−2j3+2j6+12
Mathematica input
12-b+2 j-Subscript[b, 2]-3 Subscript[b, Subscript[\[Sigma], d]]-3 Subscript[b, Subscript[\[Sigma], v]]-2 Subscript[j, 2]-2 Subscript[j, 3]+2 Subscript[j, 6]
I want to reorder this expression by partitioning the occuring symbols. Additionally, common factors of the partitions should be factored out:
Partition (given by user): {{j,j2,j3,j6},{b,b2,bσd,bσv}}
The order should also be respected. The end result would look like 2(j−j2−j3+j6)−(b+b2+3bσd+3bσv)+12
I have considered FactorTerms[poly,{x_1,x_2,...]
and Collect[expr,{x_1,x_2,...}]
but was not successful to achieve this.
Answer
expr = 12 - b + 2 j - Subscript[b, 2] -
3 Subscript[b, Subscript[σ, d]] -
3 Subscript[b, Subscript[σ, v]] - 2 Subscript[j, 2] -
2 Subscript[j, 3] + 2 Subscript[j, 6]
Inactive[Plus] @@
(Total /@ Join @@
GatherBy[List @@ expr, MatchQ[_ (# | Subscript[#, _])] & /@ {j, b}])
TeXForm @ %
12+(−3bσd−3bσv−b−b2)+(2j−2j2−2j3+2j6)
Update:
ClearAll[f]
f[e_] := Row @ Flatten @ Append[Reverse @ Values @
GroupBy[Transpose[{Coefficient[e, #], #}& @ Variables[e]] /.
{a_, b_Symbol} :> {a, Subscript[b, 0]}, #[[2,1]]&,
Row[{# /. { 1 -> " + ", -1 -> " - "}, "(", HoldForm @ #2, ")"}]& @@
FactorList[ Dot @@ Transpose[#]][[All, 1]]&],
If[# < 0, {" - ", -#}, {" + ", #}]&[e /.
(Alternatives@@Variables[e] -> 0)] /. {_, 0} -> Nothing] /.
Subscript[a_, 0] -> a
Examples:
f @ expr
System`Convert`CommonDump`templateBoxToDisplay = BoxForm`TemplateBoxToDisplayBoxes;
TeXForm @ f @ expr
2(j−j2−j3+j6) - (b+b2+3bσd+3bσv) + 12
f[- expr - 20] // TeXForm
−2(j−j2−j3+j6) + (b+b2+3bσd+3bσv) - 32
Note: I used Carl's answer from this q/a to make TeXForm process Row
s properly.
Comments
Post a Comment