# Displaying equations, how to combine strings and values without evaluating everything.

Say I'm trying to make a simple multiplication table and used

Table[i"x"j"="i*j,{i,1,9},{j,1,9}]


I'm trying to make it so that I can get a table of equations, but Mathematica keeps simplifying it so that 1x2 = 2 becomes 4=x.

• You need some ToStrings and StringJoins thrown in to do it right. Try: Table[ToString@i <> "x" <> ToString@j <> "=" <> ToString[i j], {i, 1, 9}, {j, 1, 9}] – rm -rf Sep 29 '12 at 23:14
• Try Inactivate – Wjx Jun 9 '17 at 6:14

You can use ToString and StringJoin to "correct" your approach as in my comment above. Another possibility of displaying it without using strings (my preferred way) is:

Outer[HoldForm[#1 #2 ] == #1 #2 &, #, #] &@Range@9 // TableForm

• Nice. I forgot about HoldForm. +1 – Matariki Sep 29 '12 at 23:20
• You, sir, are a lifesaver. I knew the solution was simple, but I wasn't thinking straight for a while for some reason. Again, thank you so much. – David Sep 29 '12 at 23:23
• One can also use Array[] for the purpose: Array[HoldForm[#1 #2] == #1 #2 &, {9, 9}] // Grid. – J. M. will be back soon Sep 30 '12 at 1:25

Row is useful for building up expressions that mix strings and non-strings without converting everything to strings:

Table[Row[{i, "×", j, "=", i*j}], {i, 1, 9}, {j, 1, 9}] StringForm[] is a very convenient function for the purpose:

Array[StringForm["1×2=3", #1, #2, #1 #2] &, {9, 9}] // TableForm Remember to convert your numbers to strings (ToString) and to join the strings with StringJoin (<>)

For example:

Table[
ToString@i <> "×" <> ToString@j <> "=" <> ToString[i*j], {i, 1,
9}, {j, 1, 9}]

(* Out:
{{"1×1=1", "1×2=2", "1×3=3", "1×4=4", "1×5=5", "1×6=6", "1×7=7", "1×8=8", "1×9=9"},
{"2×1=2", "2×2=4", "2×3=6", "2×4=8", "2×5=10", "2×6=12", "2×7=14", "2×8=16", "2×9=18"},
{"3×1=3", "3×2=6", "3×3=9", "3×4=12", "3×5=15", "3×6=18", "3×7=21", "3×8=24", "3×9=27"},
{"4×1=4", "4×2=8", "4×3=12", "4×4=16", "4×5=20", "4×6=24", "4×7=28", "4×8=32", "4×9=36"},
{"5×1=5", "5×2=10", "5×3=15", "5×4=20", "5×5=25", "5×6=30", "5×7=35", "5×8=40", "5×9=45"},
{"6×1=6", "6×2=12", "6×3=18", "6×4=24", "6×5=30", "6×6=36", "6×7=42", "6×8=48", "6×9=54"},
{"7×1=7", "7×2=14", "7×3=21", "7×4=28", "7×5=35", "7×6=42", "7×7=49", "7×8=56", "7×9=63"},
{"8×1=8", "8×2=16", "8×3=24", "8×4=32", "8×5=40", "8×6=48", "8×7=56", "8×8=64", "8×9=72"},
{"9×1=9", "9×2=18", "9×3=27", "9×4=36", "9×5=45", "9×6=54", "9×7=63", "9×8=72", "9×9=81"}}
*)


Here's a variant using Defer, it requires a little trickery using the replacement facilities of With, though. But, again, no strings.

Table[With[{a = i, b = j, res = i*j}, Defer[a*b = res]], {i, 1, 3}, {j, 1, 3}]
(*
{{1 1 = 1, 1 2 = 2, 1 3 = 3},
{2 1 = 2, 2 2 = 4, 2 3 = 6},
{3 1 = 3, 3 2 = 6, 3 3 = 9}}
*)


Lately, I've been answering questions using Inactive, so here's an Inactive approach:

Table[Inactive[Times][i, j] == i*j, {i,1,9}, {j,1,9}]


{{1*1==1,1*2==2,1*3==3,1*4==4,1*5==5,1*6==6,1*7==7,1*8==8,1*9==9},{2*1==2,2*2==4,2*3==6,2*4==8,2*5==10,2*6==12,2*7==14,2*8==16,2*9==18},{3*1==3,3*2==6,3*3==9,3*4==12,3*5==15,3*6==18,3*7==21,3*8==24,3*9==27},{4*1==4,4*2==8,4*3==12,4*4==16,4*5==20,4*6==24,4*7==28,4*8==32,4*9==36},{5*1==5,5*2==10,5*3==15,5*4==20,5*5==25,5*6==30,5*7==35,5*8==40,5*9==45},{6*1==6,6*2==12,6*3==18,6*4==24,6*5==30,6*6==36,6*7==42,6*8==48,6*9==54},{7*1==7,7*2==14,7*3==21,7*4==28,7*5==35,7*6==42,7*7==49,7*8==56,7*9==63},{8*1==8,8*2==16,8*3==24,8*4==32,8*5==40,8*6==48,8*7==56,8*8==64,8*9==72},{9*1==9,9*2==18,9*3==27,9*4==36,9*5==45,9*6==54,9*7==63,9*8==72,9*9==81}}

For completeness, since V10. we can use StringTemplate or friends:

Array[
StringTemplate["1×2= <*# #2*>"]
, {9, 9}
] // TableForm


Strings in Mathematica have a problem with multilevel formulas like fractions: It is better to use CellPrint[ExpressionCell[<your formula>, "Output"]] which does not have such problems.

• Not true, depends what do you do: ToString[1/2], ToString[1/2, InputForm], ToString[1/2, StandardForm] – Kuba Jun 9 '17 at 6:40
• I did just simple ToString@(a/b) and it makes #%&^& – Rom38 Jun 9 '17 at 6:56
• That is the output form, but it is not the only one available. Please watch your language :) – Kuba Jun 9 '17 at 6:57
• @Kuba Disgusting language indeed. In order to make it suitable for this site we must supply the infix Power operator with a second argument, e.g. like so: #%&^#&. Usage, e.g., like so: In: 3; In: #%&^#& Out: 6 Rom38, please see What the @#%^&*?! do all those funny signs mean? and next time sanitize your input :-) – LLlAMnYP Sep 18 '18 at 10:00