Re: pattern match and formatting challenge
- To: mathgroup at smc.vnet.net
- Subject: [mg68977] Re: [mg68931] pattern match and formatting challenge
- From: "Chris Chiasson" <chris at chiasson.name>
- Date: Sat, 26 Aug 2006 02:04:01 -0400 (EDT)
- References: <200608231116.HAA25112@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
here is one that also handles superscipts and subscripts (as well as
the rowboxes from the previous example)
superScriptAndSubscriptPatternObject=SuperscriptBox|SubscriptBox;
boxesPatternObject=
Alternatives@@
ToExpression/@Cases[Names["System`*"],x_/;StringMatchQ[x,___~~"Box"]];
nonRowBoxesPatternObject=Module[{x},DeleteCases[boxesPatternObject,RowBox]];
nonRowSuperscriptOrSubscriptBoxesPatternObject=
DeleteCases[nonRowBoxesPatternObject,
superScriptAndSubscriptPatternObject];
stringFormattableQ[expr_]:=
Module[{subXpr,sewingTag},
And[FreeQ[ToBoxes[expr],nonRowSuperscriptOrSubscriptBoxesPatternObject],
Sequence@@
Flatten@Reap[
ToBoxes[
expr]/.(superScriptAndSubscriptPatternObject)[
subxpr__]\[RuleDelayed]
Sow[FreeQ[{subxpr},nonRowBoxesPatternObject],sewingTag],
sewingTag][[2]]]];
docBookSubscript[expr__String]:={expr}[[1]]<>
StringJoin@@Function["<subscript>"<>#<>"</subscript>"]/@Rest@{expr};
docBookSuperscript[expr__String]:={expr}[[1]]<>
StringJoin@@Function["<superscript>"<>#<>"</superscript>"]/@Rest@{expr};
toString[expr_?stringFormattableQ]:=
Module[{boxExpr=ToBoxes[expr],box},
Block[{SuperscriptBox=docBookSuperscript,SubscriptBox=docBookSubscript},
ToString@DisplayForm@boxExpr]]
toString[_]:=Abort[];
In[10]:=
toString[{1+Subscript[a,z],z^a}]//FullForm
Out[10]//FullForm=
"{1 + a<subscript>z</subscript>, z<superscript>a</superscript>}"
In[11]:=
toString[{1+Subscript[a,z],z^a}/2]//FullForm
Out[11]=
$Aborted
On 8/23/06, Chris Chiasson <chris at chiasson.name> wrote:
> I thought you might enjoy a pattern matching challenge and helping me
> out at the same time. :-)
>
> The challenge is, detect any expression that can be formatted as only
> a linear sequence of unnested superscripts and subscripts. For bonus
> "points", cause the expression to be formatted as mentioned here:
>
> http://www.docbook.org/tdg5/en/html/equation.html
>
> AFAIK, I have an expression that will do this, but only for a subset
> of the possible expressions:
>
> nonRowBoxBoxesPatternObject=Module[{x},Alternatives@@DeleteCases[ToExpression/@
> Cases[Names["System`*"],x_/;StringMatchQ[x,___~~"Box"]],RowBox]];
>
> stringFormattableQ[expr_]:=FreeQ[ToBoxes[expr],nonRowBoxBoxesPatternObject];
>
> If stringFormattableQ is true, then the formatting is done by via
> ToString[expr].
>
> --
> http://chris.chiasson.name/
>
>
--
http://chris.chiasson.name/
- References:
- pattern match and formatting challenge
- From: "Chris Chiasson" <chris@chiasson.name>
- pattern match and formatting challenge