I want to define a vector lets say k containing elements Symbolize[Subscript[k, 1]], k2, k3 ... etc. When I define lets say k4 . I want the symbol automatically added to vector k. Something like below but not working at all.

k /: {k, Symbolize[
 StyleBox["v", FontFamily -> "Courier New", FontWeight -> "Plain", 
   FontSlant -> "Italic"], "_"]]]} := 
AppendTo[k, Subscript[v, _]];

My Question is;

1) How can I symbolically define elements (with sub scripts) automatically added to a vector.

2) If I assign values to symbols, How can I get elements values only and symbols only.


Symbolize[Subscript[k, _]] 

Command Symbolizes all subscripts of k e.g. k1 (Subscript[k, 1]), k2 (Subscript[k, 2]) etc. This is fine. What I want is collect k1, k2 k3 in a set (List) k with out additional commands or additional functions. Just as soon as sybolize sub scripted ones it should add it self to set k (sort of pattern maching as in Subscript[k, _]). When I call k it should give me the list {k1, k2, k3}. @Mr. Wizards answer gives the list but as calling function ksym. Sort of what I need but not exactly. @halirutan answer is also interesting but I don' t want to define additional functions or operators (may be as minimum as possible).


Its sort of bag or set; no order is required, only k1,k3 can be given and k2 can be missing.


<< Notation`
(*below line symbolizes all subscripted k_]*)
Symbolize[ ParsedBoxWrapper[
   SubscriptBox["k", "_"]]]

somewhere here I need additional code that all k_ are added to k once its been defined. For example:

{Subscript[k, 1], Subscript[k, 2], Subscript[k, 3]} = {1, 2, 3}

after that when I ask k it should give me {Subscript[k, 1], Subscript[k, 2], Subscript[k, 3]} as @Mr.Wizard suggested ksym[] := HoldForm @@@ UpValues[k][[All, 1]] and for values kval[] := UpValues[k][[All, 2]] should work. But, what I' m missing in @Mr.Wizard example is that one needs to define symbols as;

k /: Subscript[k, 1] = "val1";
k /: Subscript[k, 2] = "val2";
k /: Subscript[k, 3] = "val3";

what I need is once I write {Subscript[k, 1], Subscript[k, 2], Subscript[k, 3]} = {1, 2, 3} I should be able to get k vector and {Subscript[k, 1], Subscript[k, 2], Subscript[k, 3]} is appended automatically to k.

  • $\begingroup$ I think I don't really understand your second question. Could you write a bit more what you mean exactly? $\endgroup$
    – halirutan
    Commented Mar 31, 2013 at 5:56
  • $\begingroup$ @halirutan Thank you for your answer. Please see the edit as well as Mr. Wizards answer. It's very close to what I asked for. $\endgroup$
    – s.s.o
    Commented Mar 31, 2013 at 19:18
  • $\begingroup$ Have you thought about what should happen if you define $k_1$ and $k_3$, but not $k_2$? Does the resulting list only contain $\{k_1, k_3\}$ or is there supposed to be some placeholder for $k_2$? Can't really answer your question if that isn't defined first. $\endgroup$
    – Jens
    Commented Apr 1, 2013 at 0:51
  • $\begingroup$ @Jens Its sort of bag or set neither order is required nor k1,k2,k3, so k2 can be missing. $\endgroup$
    – s.s.o
    Commented Apr 1, 2013 at 8:57
  • $\begingroup$ s.s.o, you haven't responding to my question in the comments below my answer. I'd still like to help further if I can. You may be interested in this, but I think a different syntax is a better way to approach the problem. $\endgroup$
    – Mr.Wizard
    Commented Apr 8, 2013 at 4:30

2 Answers 2


Method #1

If you define each Subscript using TagSet(1)(2) the value will be associated with the Symbol, e.g. k:

k /: Subscript[k, 1] = "val1";
k /: Subscript[k, 2] = "val2";
k /: Subscript[k, 3] = "val3";

You could then use definitions such as:

kval[] := UpValues[k][[All, 2]]

ksym[] := HoldForm @@@ UpValues[k][[All, 1]]

These will always be up to date as they are dynamically generated:


{"val1", "val2", "val3"}


{k1, k2, k3}

Each "symbol" name is wrapped in HoldForm to prevent evaluation; ReleaseHold may be used to trigger it.

These definitions assume that no other UpValues for k are generated but if there are that can be addressed with pattern matching at the expense of speed.

Method #2

Following your update EDIT 3 here is another approach you might consider. Start by setting HoldFirst on Subscript so that k may be used without forming an infinite recursion, then make a definition for k that extracts the matching rules from the DownValues list:

SetAttributes[Subscript, HoldFirst]

k := Cases[DownValues@Subscript, (_[x : Subscript[k, _]] :> _) :> Hold[x]]

Make some assignments and check k:

{Subscript[k, 1], Subscript[k, 2], Subscript[k, 3]} = {"a", "b", "c"}

{Hold[Subscript[k, 1]], Hold[Subscript[k, 2]], Hold[Subscript[k, 3]]}

The subscripts are returned in held form, for further processing. One can use ReleaseHold to recover the values:

k // ReleaseHold
{"a", "b", "c"}
  • $\begingroup$ @ Mr. Wizard your guess is wright :) Please see the edit 1 if it needs further clarification. $\endgroup$
    – s.s.o
    Commented Mar 31, 2013 at 19:19
  • $\begingroup$ @s.s.o Could you explain for me in what way my proposal is lacking? I see a problem with your specification in that it is not likely practical (though not entirely impossible) to have a single symbol k serve both purposes, so if your objection is to the use of a different symbol (kval, ksym) I'm not sure that can be fixed in a robust way. Again if things like this are acceptable more possibilities open, but I would not choose that here myself. $\endgroup$
    – Mr.Wizard
    Commented Apr 1, 2013 at 10:12
  • $\begingroup$ @ Mr.Wizard please see the edit 3 if it needs further explanation. $\endgroup$
    – s.s.o
    Commented Apr 16, 2013 at 9:41
  • $\begingroup$ @s.s.o please see my update and tell me if this does what you want, or if it is at least getting close. $\endgroup$
    – Mr.Wizard
    Commented Apr 17, 2013 at 8:24
  • $\begingroup$ @ Mr.Wizard I think it's very close to what I asked for. I'll check it tonight. Thank you for your efforts. $\endgroup$
    – s.s.o
    Commented Apr 17, 2013 at 10:21

Although I don't like the Notation stuff very much, I regard the question as very nice, because it offers some insight into the evaluation process. When you bind UpValues to the symbol k and k has DownValues (because you want it to hold your list too), you have to make sure that k is not evaluated because otherwise the rule you gave as UpValues never kicks in.

One way to prevent this is to use an operator which holds its arguments anyway. One such an operator is += which could be interpreted in your context as append another k_n to the vector k. To keep it as simple as possible, let's say I want to following notation:


which means, append $k_1$ to the vector $k$. If $k$ has no value, create a new list and put $k_1$ as first element.

<< Notation`
k /: k += n_ := With[{sn = ToString[n]},
  If[! ValueQ[k], k = {}];
  Symbolize[ParsedBoxWrapper[SubscriptBox["k", sn]]];
   ToExpression["k\[UnderBracket]Subscript\[UnderBracket]" <> sn]]

And now everything happens automatically.

Table[k += i, {i, 10}];

Mathematica graphics


Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.