Skip to main content

front end - Forcing Mathematica to recognize a symbol without defining it


In the Mathematica front-end, symbols that have been defined are colored black and symbols with no definition associated are colored blue. This is useful to prevent spelling mistakes. Also, defined symbols appear in the autocomplete (as of Mathematica v9.0).


I have a symbol chrom with no definitions associated, but I want Mathematica to recognize it. That is, I want that when I type chrom in the front end, it appears colored black, and I want it to appear in the autocomplete.


I can't associate a definition with chrom (as in chrom = ... or chrom[..] = .., because then if chrom appears in the evaluation of an expression, it will be replaced by the associated defined value. This is not the behavior I want.


In other words, is there a Mathematica function that does the opposite of Remove? Remove removes a symbol from the symbol table. How can I add a symbol to the symbol table without associating a definition with it?



Answer



Update


In a comment MB1965 proposed an undocumented but apparently canonical function to do this in recent versions. It is DeclareKnownSymbols. It takes a String or list of Strings, e.g.:


DeclareKnownSymbols[{"var", "res"}]


After this var and res are colored as known Symbols.




As far as I know the syntax highlighting for defined Symbols depends on one of the Symbol's *Values lists being non-empty. As suggested in the comments one way, and perhaps the best, is to simply assign the Symbol to itself:


symbol = symbol

OwnValues[symbol]


{HoldPattern[symbol] :> symbol}


Other rules existing in one of the *Values lists also work, even invalid ones:


Remove[symbol]

OwnValues[symbol] = {1 -> 1};

This rule will be replaced as soon as symbol is assigned:


symbol = None;

OwnValues[symbol]



{HoldPattern[symbol] :> None}

Another approach is to define a context coloring for your Symbols, and specifically create all of them in that context. First define the coloring Option and add the context to the $ContextPath:


SetOptions[$FrontEndSession, 
AutoStyleOptions -> {"SymbolContextStyles" -> {"highlight`" -> Green}}]

AppendTo[$ContextPath, "highlight`"];


Then simply list your fully-qualified Symbols to create them:


{highlight`symbol1, highlight`symbol2, highlight`symbol3};

At this point the plain Symbol names will be highlighted as specified:


enter image description here


Comments

Popular posts from this blog

functions - Get leading series expansion term?

Given a function f[x] , I would like to have a function leadingSeries that returns just the leading term in the series around x=0 . For example: leadingSeries[(1/x + 2)/(4 + 1/x^2 + x)] x and leadingSeries[(1/x + 2 + (1 - 1/x^3)/4)/(4 + x)] -(1/(16 x^3)) Is there such a function in Mathematica? Or maybe one can implement it efficiently? EDIT I finally went with the following implementation, based on Carl Woll 's answer: lds[ex_,x_]:=( (ex/.x->(x+O[x]^2))/.SeriesData[U_,Z_,L_List,Mi_,Ma_,De_]:>SeriesData[U,Z,{L[[1]]},Mi,Mi+1,De]//Quiet//Normal) The advantage is, that this one also properly works with functions whose leading term is a constant: lds[Exp[x],x] 1 Answer Update 1 Updated to eliminate SeriesData and to not return additional terms Perhaps you could use: leadingSeries[expr_, x_] := Normal[expr /. x->(x+O[x]^2) /. a_List :> Take[a, 1]] Then for your examples: leadingSeries[(1/x + 2)/(4 + 1/x^2 + x), x] leadingSeries[Exp[x], x] leadingSeries[(1/x + 2 + (1 - 1/x...

mathematical optimization - Minimizing using indices, error: Part::pkspec1: The expression cannot be used as a part specification

I want to use Minimize where the variables to minimize are indices pointing into an array. Here a MWE that hopefully shows what my problem is. vars = u@# & /@ Range[3]; cons = Flatten@ { Table[(u[j] != #) & /@ vars[[j + 1 ;; -1]], {j, 1, 3 - 1}], 1 vec1 = {1, 2, 3}; vec2 = {1, 2, 3}; Minimize[{Total@((vec1[[#]] - vec2[[u[#]]])^2 & /@ Range[1, 3]), cons}, vars, Integers] The error I get: Part::pkspec1: The expression u[1] cannot be used as a part specification. >> Answer Ok, it seems that one can get around Mathematica trying to evaluate vec2[[u[1]]] too early by using the function Indexed[vec2,u[1]] . The working MWE would then look like the following: vars = u@# & /@ Range[3]; cons = Flatten@{ Table[(u[j] != #) & /@ vars[[j + 1 ;; -1]], {j, 1, 3 - 1}], 1 vec1 = {1, 2, 3}; vec2 = {1, 2, 3}; NMinimize[ {Total@((vec1[[#]] - Indexed[vec2, u[#]])^2 & /@ R...

What is and isn't a valid variable specification for Manipulate?

I have an expression whose terms have arguments (representing subscripts), like this: myExpr = A[0] + V[1,T] I would like to put it inside a Manipulate to see its value as I move around the parameters. (The goal is eventually to plot it wrt one of the variables inside.) However, Mathematica complains when I set V[1,T] as a manipulated variable: Manipulate[Evaluate[myExpr], {A[0], 0, 1}, {V[1, T], 0, 1}] (*Manipulate::vsform: Manipulate argument {V[1,T],0,1} does not have the correct form for a variable specification. >> *) As a workaround, if I get rid of the symbol T inside the argument, it works fine: Manipulate[ Evaluate[myExpr /. T -> 15], {A[0], 0, 1}, {V[1, 15], 0, 1}] Why this behavior? Can anyone point me to the documentation that says what counts as a valid variable? And is there a way to get Manpiulate to accept an expression with a symbolic argument as a variable? Investigations I've done so far: I tried using variableQ from this answer , but it says V[1...