Re: parenthesis in reactions...
- To: mathgroup at smc.vnet.net
- Subject: [mg69411] Re: parenthesis in reactions...
- From: "Chris Chiasson" <chris at chiasson.name>
- Date: Mon, 11 Sep 2006 05:39:08 -0400 (EDT)
- References: <acbec1a40605261652r5e126c9dg9b61561c44b86a6e@mail.gmail.com>
Here is a way to do it without the Notation package, though I had to
assign a Format value to Times to make it work.
MakeBoxes[ChemPlus,_]="+";
MakeBoxes[ChemMinus,_]="-";
Format[ChemSuperscript[z_?NumberQ]/;Element[z,Reals]&&z\[NotEqual]0]:=
Module[{abz=Abs[z]},
StyleForm[
SequenceForm[If[abz\[Equal]1,Unevaluated[Sequence[]],abz],
If[z>0,ChemPlus,ChemMinus]],AutoSpacing\[Rule]False]];
Format[ChemSubscript[y_]]=StyleForm[y,AutoSpacing\[Rule]False];
Format[ChemSuperscript[z_]]=StyleForm[z,AutoSpacing\[Rule]False];
SetElementFormat[x_Symbol]:=
Module[{y,z},Format[x[y_,z_]/;y\[Equal]1&&z\[Equal]0]=x;
Format[x[y_,z_]/;z\[Equal]0]=Subscript[x,ChemSubscript@y];
Format[x[y_,z_]/;y\[Equal]1]=Superscript[x,ChemSuperscript@z];
Format[x[y_,z_]]=Subsuperscript[x,ChemSubscript@y,ChemSuperscript@z]];
SetElementFormat[x_Symbol,abbrev_String]:=(SetElementFormat[x];
MakeBoxes[x,_]=abbrev;x);
Format[Molecule[element_]]=element;
Format[Molecule[elements__]]=
StyleForm[SequenceForm[elements],ZeroWidthTimes\[Rule]True];
Unprotect[Times];
Format[HoldPattern[Times[left___,Molecule[elements__],right___]]]=
Times[left,PrecedenceForm[Molecule[elements],1000],right];
Protect[Times];
elementnotations={{Hydrogen,"H"},{Chlorine,"Cl"},{Zinc,"Zn"}};
SetElementFormat@@@elementnotations
rxns[1]={2 Molecule[Hydrogen[1,0],
Chlorine[1,0]]\[Rule]2 Molecule[Hydrogen[1,1]]+2 Molecule[
Chlorine[1,-1]],
Zinc[1,0]+2 Hydrogen[1,1]+2 Chlorine[1,-1]\[Rule]
Zinc[1,2]+2 Chlorine[1,-1]+Hydrogen[2,0],
Zinc[1,2]+2 Chlorine[1,-1]+Hydrogen[2,0]\[Rule]
Molecule[Zinc[1,0],Chlorine[2,0]]+Hydrogen[2,0]}
On 5/26/06, Chris Chiasson <chris at chiasson.name> wrote:
> (side note: Google New won't let me reply to my post with the same
> subject from a little over a month ago, so I quoted it below)
>
> Here is the solution:
>
> Instructions:
> Remove the Format statement for Molecule in the previous post. Add a
> cell with the code below (use Ctrl+Shift+E). Now execute the reaction
> statement from the previous post; there should be no parenthesis in
> front of the first molecule this time.
>
> Notes:
> I derived this idea from section 1.7.3.2 of NotationSource.nb. I
> noticed that when makeHeldRowBoxOfBoxes created a RowBox, no
> parenthesis were added even when I had a multiplier on the Molecule.
> The only problem was that my elements had commas between them. When I
> changed the separator, the parenthesis returned. I already knew about
> the SyntaxForm option of TagBox, but I had been trying to use
> SyntaxForm->"*". Eventually, I put things together, using an
> \[InvisibleSpace] for the separator, and SyntaxForm->",". This works
> well. I have also tried to create an InfixNotation version, but to no
> avail. If you know how to create an InfixForm version, I'd like to
> hear it (using Block on NotationMakeExpression can be useful in this
> regard).
>
>
> Don't forget to load the Notation packge:
> Utilities`Notation`AutoLoadNotationPalette = False;
> << Utilities`Notation`
>
> Code:
>
> Cell[BoxData[
> RowBox[{"Notation", "[",
> RowBox[{
> RowBox[{
> TagBox[
> TagBox[
> RowBox[{"TagBox", "[",
> RowBox[{
> RowBox[{"RowBox", "[",
> RowBox[{
> RowBox[{
> RowBox[{"Drop", "[",
> RowBox[{"#", ",",
> RowBox[{"-", "1"}]}], "]"}], "&"}], "@",
> RowBox[{"Flatten", "@",
> RowBox[{"Thread", "@",
> RowBox[{"{",
> RowBox[{
> RowBox[{
> RowBox[{"Function", "[",
> RowBox[{
> RowBox[{"{", "term", "}"}], ",",
> RowBox[{"MakeBoxes", "[",
> RowBox[{"term", ",",
> "StandardForm"}], "]"}], ",",
> RowBox[{"{", "HoldAll", "}"}]}],
> "]"}], "/@",
> RowBox[{"Unevaluated", "@",
> RowBox[{"{", "blank__", "}"}]}]}],
> ",", "\"\<\[InvisibleSpace]\>\""}], "}"}]}]}]}], "]"}], ",",
> "MoleculeTag", ",",
> RowBox[{"SyntaxForm", "->", "\"\<,\>\""}]}], "]"}],
> NotationMadeBoxesTag,
> TagStyle->"NotationMadeBoxesWrapperStyle"],
> NotationBoxTag,
> TagStyle->"NotationTemplateStyle"], " ",
> "\[DoubleLongLeftArrow]", " ",
> TagBox[
> RowBox[{"Molecule", "[", "blank__", "]"}],
> NotationBoxTag,
> TagStyle->"NotationTemplateStyle"]}], ",",
> RowBox[{"WorkingForm", "\[Rule]", "StandardForm"}]}], "]"}]], "Input"]
>
>
> Old post quotation:
> What is the proper way to eliminate the (output) parenthesis generated
> around the first molecule as it is multiplied by the number two? I
> could change the data structure if need be.
>
> ElementSubscript[1|1.]:="";
> ElementSubscript[x_]:=x;
> ElementSuperscript[0|0.]:="";
> ElementSuperscriptMod[1|1.]:="";
> ElementSuperscriptMod[x_]:=x;
> ElementSuperscript[x_?NumericQ]:=
> RowBox[{ToBoxes@ElementSuperscriptMod@Abs@x,"+"}]/;x>0;
> ElementSuperscript[x_?NumericQ]:=
> RowBox[{ToBoxes@ElementSuperscriptMod@Abs@x,"-"}]/;x<0;
> ElementSuperscript[x_]:=x;
> ElementFormat[symblist:{{_Symbol,_Symbol}..}]:=
> Module[{x},
> ReleaseHold[
> Function[
> Hold[SetDelayed[Format[#1[x_,y_]],
> DisplayForm[
> Subsuperscript[#2,ElementSubscript[x],
> ElementSuperscript[y]]]]]]@@@symblist]];
> Format[Molecule[blah:_Symbol[_,_]..]]:=DisplayForm[RowBox[ToBoxes/@{blah}]]
> elementnotations={{Hydrogen,H},{Chlorine,Cl},{Zinc,Zn}};
> ElementFormat[elementnotations];
>
> rxns[1]={2 Molecule[Hydrogen[1,0],
> Chlorine[1,0]]\[Rule]2 Molecule[Hydrogen[1,1]]+2 Molecule[
> Chlorine[1,-1]],
> Zinc[1,0]+2 Hydrogen[1,1]+2 Chlorine[1,-1]\[Rule]
> Zinc[1,2]+2 Chlorine[1,-1]+Hydrogen[2,0],
> Zinc[1,2]+2 Chlorine[1,-1]+Hydrogen[2,0]\[Rule]
> Molecule[Zinc[1,0],Chlorine[2,0]]+Hydrogen[2,0]}
>
> --
> http://chris.chiasson.name/
>
--
http://chris.chiasson.name/