<html> <head> <title>Gri: creating a complicated new command</title> </head> <body bgcolor="#FFFFFF" text="#000000" link="#0000EE" vlink="#551A8B" alink="FF0000"> <!-- newfile ComplicatedNewCommand.html "Gri: creating a complicated new command" "Programming Gri" --> <!-- @node Complicated New Command, Changeable Command Arguments, Simple New Command, Adding New Commands --> <a name="ComplicatedNewCommand" ></a> <img src="./resources/top_banner.gif" usemap="#navigate_top" border="0"> <table summary="top banner" border="0" cellspacing="0" cellpadding="0"> <tr> <td width="150" valign="top"> <font size=-1> <br> Chapters: </br> <a href="Introduction.html">1: Introduction</a><br> <a href="SimpleExample.html">2: Simple example</a><br> <a href="InvokingGri.html">3: Invocation</a><br> <a href="GettingMoreControl.html">4: Finer Control</a><br> <a href="X-Y.html">5: X-Y Plots</a><br> <a href="ContourPlots.html">6: Contour Plots</a><br> <a href="Images.html">7: Image Plots</a><br> <a href="Examples.html">8: Examples</a><br> <a href="Commands.html">9: Gri Commands</a><br> <a href="Programming.html">10: Programming</a><br> <a href="Environment.html">11: Environment</a><br> <a href="Emacs.html">12: Emacs Mode</a><br> <a href="History.html">13: History</a><br> <a href="Installation.html">14: Installation</a><br> <a href="Bugs.html">15: Gri Bugs</a><br> <a href="TestSuite.html">16: Test Suite</a><br> <a href="Acknowledgments.html">17: Acknowledgments</a><br> <a href="License.html">18: License</a><br> <br> Indices:</br> <a href="ConceptIndex.html"><i>Concepts</i></a><br> <a href="CommandIndex.html"><i>Commands</i></a><br> <a href="BuiltinIndex.html"><i>Variables</i></a><br> </font> <td width="500" valign="top"> <map name="navigate_top"> <area alt="index.html#Top" shape="rect" coords="5,2,218,24" href="index.html#Top"> <area alt="NewCommands.html#AddingNewCommands" shape="rect" coords="516,2,532,24" href="NewCommands.html#AddingNewCommands"> <area alt="Gri: creating a simple new command" shape="rect" coords="557,2,573,24" href="SimpleNewCommand.html"> <area alt="Gri: making a newcommand change its arguments" shape="rect" coords="581,2,599,24" href="ChangeableCommandArguments.html"> </map> <map name="navigate_bottom"> <area alt="index.html#Top" shape="rect" coords="5,2,218,24" href="index.html#Top"> <area alt="Gri: making a newcommand change its arguments" shape="rect" coords="581,2,599,24" href="ChangeableCommandArguments.html"></map> <h3>10.11.4: Complicated example of a new command</h3> The following example from the global `<font color="#82140F"><samp>gri.cmd</samp></font>' file illustrates how to parse/check the commandline (see <a href="Synonyms.html#LocalSynonyms">Local Synonyms</a>), which is a good practice in any code you expect to re-use. The first `<font color="#82140F"><code>if</code></font>' statement checks that the word `<font color="#82140F"><code>at</code></font>' is in the right place (this would not have been checked by the syntax matcher, the word having followed a string). The presence of the keyword `<font color="#82140F"><code>cm</code></font>' is checked for, and user units or cm units are used accordingly. Local variables are created (`<font color="#82140F"><code>new</code></font>') and then destroyed (`<font color="#82140F"><code>delete</code></font>') so that this new command cannot affect outside code. <p> <TABLE SUMMARY="Example" BORDER="0" BGCOLOR="#efefef" WIDTH="100%"> <TR> <TD> <PRE> <font color="#82140F"> `draw label whiteunder "\string" at .ll_x. .ll_y. [cm]' Draw label for plot, located with lower-left corner at indicated (x,y) position (specified in user units or in cm on the page). Whiteout is used to clean up the area under the label. BUGS: Cannot handle angled text; doesn't check for super/subscripts. { if {rpn "\.word4." "at" !=} show "ERROR: 5th word must be `at', not `\.word4.'" show traceback quit end if new .x. .y. .oldgray. .space. if {rpn \.words. 7 ==} .x. = {rpn \.word5. xusertocm} .y. = {rpn \.word6. yusertocm} else if {rpn \.words. 8 ==} if {rpn "\.word7." "cm" !=} show "ERROR: Require 8th word to be `cm'" show traceback quit end if .x. = \.word5. .y. = \.word6. else show "ERROR: Require 7 or 8 words, not \.words." show traceback quit end if # Coordinates now in cm. Next, white out a box # under the text (and .space. centimetres # beyond text), then draw label. .space. = 0.1 # Space of 1mm .oldgray. = ..graylevel.. set graylevel white draw box filled \ {rpn .x. .space. -} \ {rpn .y. .space. -} \ {rpn .x. "\.word3." width + .space. +} \ {rpn .y. "M" ascent + .space. + } cm set graylevel .oldgray. draw label "\.word3." at .x. .y. cm delete .x. .y. .oldgray. .space. } </font></PRE> </TD> </TR> </TABLE> <p> </table> <img src="./resources/bottom_banner.gif" usemap="#navigate_bottom" border="0"> </body> </html>