%% %% This is file `acroflex.sty', %% generated with the docstrip utility. %% %% The original source files were: %% %% acroflex.dtx (with options: `copyright,package') %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Acroflex.sty package, %% %% Copyright (C) 2008 -- 2016 D. P. Story %% %% dpstory@acrotex.net %% %% %% %% This program can redistributed and/or modified under %% %% the terms of the LaTeX Project Public License %% %% Distributed from CTAN archives in directory %% %% macros/latex/base/lppl.txt; either version 1 of the %% %% License, or (at your option) any later version. %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \NeedsTeXFormat{LaTeX2e}[1997/12/01] \ProvidesPackage{acroflex} [2016/08/29 v1.6c AcroFLeX: AcroTeX and Adobe Flex (dps)] \RequirePackage{rmannot}[2016/02/01] \edef\af@subscriptCat{\the\catcode`\_} \edef\af@superscriptCat{\the\catcode`\^} \def\af@restoreCats{% \catcode`\_=\af@subscriptCat \catcode`\^=\af@superscriptCat } \catcode`\_=12\relax \catcode`\^=12\relax \def\AcroFLeX{% AcroF\kern-.1667em\lower.5ex\hbox{L}\kern-.3eme\kern-.125emX\@} \newcommand{\pathToAcroFlex}[1]{\def\af@pathToAcroFlex{#1}% \ifx\af@pathToAcroFlex\@empty \PackageError{acroflex}{% You must specify a full path to AcroFlex.swf}{}\else \saveNamedPath{acroflexWidget}{\af@pathToAcroFlex/AcroFlex.swf}\fi } \def\af@pathToAcroFlex{} \@onlypreamble{\pathToAcroFlex} \define@choicekey*+{acroflex.sty}{lang}[\val\nr]{english,german} {% \ifcase\nr\relax \def\af@lang@type{afcustom_us.def} \or \def\af@lang@type{afcustom_de.def} \else \def\af@lang@type{afcustom.def} \fi }{\PackageWarning{acroflex}{Bad choice for lang, permissible values are english and german. No lang key is equivalent to english. Try again}} \def\af@lang@type{afcustom.def} \ProcessOptionsX \InputIfFileExists{acroflex.cfg}{}{} \newcommand{\dimScreenGraph}[2]{{% \setlength{\dimen@}{#1}\xdef\hScreenGraph{\the\dimen@}% \setlength{\dimen@}{#2}\xdef\vScreenGraph{\the\dimen@}% }} \newcommand{\graphName}[1]{\def\afgraphName{#1}} \newcommand{\defaultFunction}[1]{\def\af@DefaultFunction{#1}} \defaultFunction{x^2} \def\defaultDomRng#1#2#3#4{% \def\af@DefaultDomMin{#1}\def\af@DefaultDomMax{#2}% \def\af@DefaultRngMin{#3}\def\af@DefaultRngMax{#4}% } \def\defaultDomP#1#2{% \def\af@DefaultDomMint{#1}\def\af@DefaultDomMaxt{#2}% } \defaultDomRng{-2}{2}{0}{4} \defaultDomP{0}{2*PI} \newcommand{\graphScreen}[3][]{\rmAnnot[#1,% name=afRM\afgraphName]{#2}{#3}{acroflexWidget}}% \newcommand{\allowFSFloatGS}{\def\af@passcontext{\@gobble}} \newcommand{\defaultFloatGS}{\def\af@passcontext{passcontext}} \defaultFloatGS \newcommand{\iconFloatGraphScreen}[3][]{% \makebox[0pt][l]{% \resizebox{#2}{#3}{% \graphScreen[#1,windowed,\af@passcontext,deactivated=pageclose ]{\hScreenGraph}{\vScreenGraph}}}% \resizebox{#2}{#3}{% \pushButton[\S{S}\H{N}\autoCenter{n}\W0\BG{}\BC{} \TU{\tt@iconFloatGraphScreen}\A{\JS{% var rm = this.getAnnotRichMedia(% this.pageNum, "afRM\afgraphName");\r rm.activated=!rm.activated; }}]{float\afgraphName Btn-\therm@Cnt}{\hScreenGraph} {\vScreenGraph}}% } \newcommand{\tticonFloatGraphScreen}[1]{% \def\tt@iconFloatGraphScreen{#1}} \tticonFloatGraphScreen{Click to view graphing screen, click again to hide graphing screen.} \newcommand{\funcInputField}[3][]{\makebox[0pt][l]{% \textField[% \nuDV{\af@DefaultFunction}\nuV{\af@DefaultFunction} \F{\FHidden}\Ff{\FfReadOnly} ]{\afgraphName theHiddenFunction}{1bp}{1bp}}% \textField[% \BC{0 0 0}\nuDV{\af@DefaultFunction}\nuV{\af@DefaultFunction} \TU{\tt@funcInputField}#1\AA{\AAFormat{% \formatFunctionInput{"\afgraphName theHiddenFunction"}} \AAKeystroke{\keystrokeFunctionInput} }% ]{\afgraphName theFunction}{#2}{#3}% } \newcommand{\ttfuncInputField}[1]{% \def\tt@funcInputField{#1}} \ttfuncInputField{Enter any of the following for expressions:\r \space\space1. A function of x of the form f(x);\r \space\space2. A polar function of t of the form f(t);\r \space\space3. A set of parametric functions of t of the form f(t);g(t) \r\space\space\space\space\space(separated by a semi-colon);\r \space\space4. A list of points, (a1,b1);(a2,b2);...;(an,bn)\r \space\space\space\space\space(separated by semi-colons). } \let\fileInputField\funcInputField \def\formatFunctionInput#1{% try{ formatFunctionInput(#1) } catch(e){}; } \def\keystrokeFunctionInput{% try{ keystrokeFunctionInput() } catch(e){}; } \newcommand{\afCurve}[1]{\def\afcurve{#1 }\def\afcurvei{#1}} \afCurve{Curve} \newcommand{\afPoint}[1]{\def\afpoint{#1 }\def\afploti{#1}} \afPoint{Point} \newcommand{\afUnused}[1]{\def\afunused{#1}} \afUnused{--unused} \@onlypreamble\afCurve \@onlypreamble\afPoint \@onlypreamble\afUnused \newcommand{\initFuncSelect}[1]{\def\af@initializeFuncSelect{#1}} \initFuncSelect{% [(\af@DefaultFunction)(\afcurve1)]% [(<\afcurve2\afunused>)(\afcurve2)]% [(<\afcurve3\afunused>)(\afcurve3)]% [(<\afcurve4\afunused>)(\afcurve4)]% [(<\afpoint1\afunused>)(\afpoint1)]% [(<\afpoint2\afunused>)(\afpoint2)]% [(<\afpoint3\afunused>)(\afpoint3)]% [(<\afpoint4\afunused>)(\afpoint4)]} \newcommand{\functionSelect}[3][]{% \comboBox[\TU{\tt@functionSelect}#1\Ff{\FfCommitOnSelChange} \nuDV{\af@DefaultFunction}\nuV{\af@DefaultFunction} \AA{\AAKeystroke{% if (!event.willCommit) {\r\t this.getField( "\afgraphName theFunction").value=event.changeEx;\r }}}]{\afgraphName ComboSelect}{#2}{#3}{\af@initializeFuncSelect}% } \newcommand{\ttfunctionSelect}[1]{% \def\tt@functionSelect{#1}} \ttfunctionSelect{Enter a function on \afcurvei1--\afcurvei4, or a list of points on \afploti1--\afploti4.} \newcommand{\savedelSelBtn}[3][]{% \pushButton[\TU{\tt@savedelSelBtn}#1 \A{\JS{saveDelSelAction("\afgraphName"); }}]{\afgraphName savedelSelectBtn}{#2}{#3}% } \newcommand{\ttsavedelSelBtn}[1]{\def\tt@savedelSelBtn{#1}} \ttsavedelSelBtn{Click to save current function to list, shift-click to delete the current function from list} \newcommand{\graphBtn}[3][]{% \pushButton [\BC{0 0 0}\CA{Graph It!}\TU{\tt@graphBtn}#1 \A{\JS{graphBtnAction("\afgraphName",this.pageNum); }}]{\afgraphName graphIt}{#2}{#3}% } \newcommand{\ttgraphBtn}[1]{\def\tt@graphBtn{#1}} \ttgraphBtn{Press to graph the function} \newcommand{\clearGraphJS}{% clearGraph("all","\afgraphName",this.pageNum);} \newcommand{\graphClrBtn}[3][]{\pushButton[\BC{0 0 0}\CA{Clear} \A{\JS{\clearGraphJS}}\TU{\tt@graphClrBtn}#1 ]{\afgraphName clearIt}{#2}{#3}% } \newcommand{\ttgraphClrBtn}[1]{\def\tt@graphClrBtn{#1}} \ttgraphClrBtn{Click to clear graph, shift-click to deactivate the graphing screen} \newcommand{\domMin}[3][]{\makebox[0pt][l]{% \textField[\nuDV{\af@DefaultDomMin}\nuV{\af@DefaultDomMin} \F{\FHidden}\Ff{\FfReadOnly} ]{\afgraphName theHiddenDom.min}{1bp}{1bp}}% \textField[\textSize{0}\nuV{\af@DefaultDomMin} \nuDV{\af@DefaultDomMin}\BC{0 0 0}\TU{\tt@domMin}#1\AA{% \AAKeystroke{\keystrokeDomRng{"\afgraphName theHiddenDom.min"}} \AAFormat{\formatVarIntervals{"\afgraphName theHiddenDom.min"}} }]{\afgraphName theDom.min}{#2}{#3}% } \newcommand{\ttdomMin}[1]{\def\tt@domMin{#1}} \ttdomMin{Enter the minimum value for the variable x} \newcommand{\domMax}[3][]{\makebox[0pt][l]{% \textField[\nuDV{\af@DefaultDomMax}\nuV{\af@DefaultDomMax} \F{\FHidden}\Ff{\FfReadOnly} ]{\afgraphName theHiddenDom.max}{1bp}{1bp}}% \textField[\textSize{0}\nuV{\af@DefaultDomMax} \nuDV{\af@DefaultDomMax}\BC{0 0 0}\TU{\tt@domMax}#1\AA{% \AAKeystroke{\keystrokeDomRng{"\afgraphName theHiddenDom.max"}} \AAFormat{\formatVarIntervals{"\afgraphName theHiddenDom.max"}} }]{\afgraphName theDom.max}{#2}{#3}% } \newcommand{\ttdomMax}[1]{\def\tt@domMax{#1}} \ttdomMax{Enter the maximum value for the variable x} \newcommand{\rngMin}[3][]{\makebox[0pt][l]{% \textField[\nuDV{\af@DefaultRngMin}\nuV{\af@DefaultRngMin} \F{\FHidden}\Ff{\FfReadOnly} ]{\afgraphName theHiddenRng.min}{1bp}{1bp}}% \textField[\textSize{0}\nuV{\af@DefaultRngMin} \nuDV{\af@DefaultRngMin}\BC{0 0 0}\TU{\tt@rngMin}#1\AA{% \AAKeystroke{\keystrokeDomRng{"\afgraphName theHiddenRng.min"}} \AAFormat{\formatVarIntervals{"\afgraphName theHiddenRng.min"}} }]{\afgraphName theRng.min}{#2}{#3}% } \newcommand{\ttrngMin}[1]{\def\tt@rngMin{#1}} \ttrngMin{Enter the minimum value for the variable y} \newcommand{\rngMax}[3][]{\makebox[0pt][l]{% \textField[\nuDV{\af@DefaultRngMax}\nuV{\af@DefaultRngMax} \F{\FHidden}\Ff{\FfReadOnly} ]{\afgraphName theHiddenRng.max}{1bp}{1bp}}% \textField[\textSize{0}\nuV{\af@DefaultRngMax} \nuDV{\af@DefaultRngMax}\BC{0 0 0}\TU{\tt@rngMax}#1\AA{% \AAKeystroke{\keystrokeDomRng{"\afgraphName theHiddenRng.max"}} \AAFormat{\formatVarIntervals{"\afgraphName theHiddenRng.max"}} }]{\afgraphName theRng.max}{#2}{#3}% } \newcommand{\ttrngMax}[1]{\def\tt@rngMax{#1}} \ttrngMax{Enter the maximum value for the variable y} \newcommand{\domMinP}[3][]{\makebox[0pt][l]{% \textField[\nuDV{\af@DefaultDomMint}\nuV{\af@DefaultDomMint} \F{\FHidden}\Ff{\FfReadOnly} ]{\afgraphName theHiddenDom_t.min}{1bp}{1bp}}% \textField[\textSize{0}\nuV{\af@DefaultDomMint} \nuDV{\af@DefaultDomMint}\BC{0 0 0}\TU{\tt@domMinP}#1\AA{% \AAKeystroke{\keystrokeDomRng{"\afgraphName theHiddenDom_t.min"}} \AAFormat{\formatVarIntervals{"\afgraphName theHiddenDom_t.min"}} }]{\afgraphName theDom_t.min}{#2}{#3}% } \newcommand{\ttdomMinP}[1]{\def\tt@domMinP{#1}} \ttdomMinP{Enter the minimum value for the variable t} \newcommand{\domMaxP}[3][]{\makebox[0pt][l]{% \textField[\nuDV{\af@DefaultDomMaxt}\nuV{\af@DefaultDomMaxt} \F{\FHidden}\Ff{\FfReadOnly} ]{\afgraphName theHiddenDom_t.max}{1bp}{1bp}}% \textField[\textSize{0}\nuV{\af@DefaultDomMaxt} \nuDV{\af@DefaultDomMaxt}\BC{0 0 0}\TU{\tt@domMaxP}#1\AA{% \AAKeystroke{\keystrokeDomRng{"\afgraphName theHiddenDom_t.max"}} \AAFormat{\formatVarIntervals{"\afgraphName theHiddenDom_t.max"}} }]{\afgraphName theDom_t.max}{#2}{#3}% } \newcommand{\ttdomMaxP}[1]{\def\tt@domMaxP{#1}} \ttdomMaxP{Enter the maximum value for the variable t} \def\formatVarIntervals#1{% try{ formatVarIntervals(#1) } catch(e){}; } \def\keystrokeDomRng#1{% if (event.willCommit) keystrokeDomRng(#1); } \newcommand{\defaultNumPoints}[1]{% \def\af@defaultNumPoints{#1}} \defaultNumPoints{40} \newcommand\numPoints[3][]{% \textField[\nuV{\af@defaultNumPoints}\nuDV{\af@defaultNumPoints} \Q1\BC{0 0 0}\TU{\tt@numPoints}#1\AA{% \AAKeystroke{if (event.willCommit) keystrokeNumPoints();}} ]{\afgraphName numNodes}{#2}{#3}% } \newcommand{\ttnumPoints}[1]{\def\tt@numPoints{#1}} \ttnumPoints{Enter the number of points to plot} \newcommand{\defaultShiftAmt}[1]{% \def\af@defaultShiftAmt{#1}} \defaultShiftAmt{1} \newcommand{\amtShift}[3][]{% \textField[\nuV{\af@defaultShiftAmt}\nuDV{\af@defaultShiftAmt}\Q1 \BC{0 0 0}\TU{\tt@amtShift}#1\AA{\AAKeystroke{% if (event.willCommit) keystrokeAmtShift(); }}]{\afgraphName amtshift}{#2}{#3}% } \newcommand{\ttamtShift}[1]{\def\tt@amtShift{#1}} \ttamtShift{Enter the amount to shift, horizontally or vertically} \newcommand{\hShiftL}[2][]{% \setLinkText[#1\A{\JS{% shiftHorVert ("\afgraphName",this.pageNum,"h","-"); }}]{#2}% } \newcommand{\hShiftR}[2][]{% \setLinkText[#1\A{\JS{% shiftHorVert ("\afgraphName",this.pageNum,"h","+"); }}]{#2}% } \newcommand{\vShiftD}[2][]{% \setLinkText[#1\A{\JS{% shiftHorVert ("\afgraphName",this.pageNum,"v","-"); }}]{#2}% } \newcommand{\vShiftU}[2][]{% \setLinkText[#1\A{\JS{% shiftHorVert ("\afgraphName",this.pageNum,"v","+"); }}]{#2}% } \newcommand{\zoomInOut}[3][]{% \pushButton[\BC{0 0 0}\CA{Zoom}\TU{\tt@zoomInOut}#1 \A{\JS{% var shiftType = (event.shift) ? "+" : "-";\r zoomInOut ("\afgraphName",this.pageNum,shiftType); }} ]{\afgraphName zoominout}{#2}{#3}% } \newcommand{\ttzoomInOut}[1]{\def\tt@zoomInOut{#1}} \ttzoomInOut{Click to zoom out, shift-click to zoom in} \define@choicekey+{afsl}{graph}{c1,c2,c3,c4,p1,p2,p3,p4,% a1,a2,a3,a4}[c1]{\edef\afsl@graph{#1}}{\PackageWarning{acroflex} {Bad choice for the graph key, permissible values are c1, c2, c3,c4, p1, p2, p3, p4, a1, a2, a3, a4. Try again}} \define@choicekey+{afsl}{type}{cart,para,polar}[cart]{% \edef\afsl@type{#1}}{\PackageWarning{acroflex} {Bad choice for the type key, permissible values are cart, para, and polar. Try again}} \let\afsl@type\@empty \define@choicekey+{afsl}{connectwith}{curve,segment}[curve]{% \edef\afsl@form{#1}}{\PackageWarning{acroflex} {Bad choice for the connectwith key, permissible values are curve and segment. Try again}} \let\afsl@form\@empty \define@choicekey+{afsl}{noquotes}[\val\nr]{true,false}[true]{% \ifcase\nr\relax\def\af@quotes{}\or\def\af@quotes{"}\fi} {\PackageWarning{acroflex} {Bad choice for the noquotes key, permissible values are true and false. Try again}} \define@key{afsl}{points}[0]{\edef\afsl@nPoints{#1}} \define@key{afsl}{xInterval}[]{\edef\afsl@xInterval{#1}} \define@key{afsl}{xPlot}[]{\edef\afsl@xPlot{#1}} \define@key{afsl}{yInterval}[]{\edef\afsl@yInterval{#1}} \define@key{afsl}{tInterval}[]{\edef\afsl@tInterval{#1}} \define@choicekey+{afsl}{populate}{true,false}[true]{% \edef\afsl@populate{#1}}{\PackageWarning{acroflex} {Bad choice for the populate key, permissible values are true and false. Try again}} \define@choicekey+{afsl}{wait}{true,false}[true]{% \edef\afsl@wait{#1}}{\PackageWarning{acroflex} {Bad choice for the wait key, permissible values are true and false. Try again}} \setkeys{afsl}{graph,points,xInterval,xPlot,yInterval,tInterval,% populate=false,type,connectwith,noquotes=false,wait=false} \newcommand{\sgraphLink}[4][]{{% \defineGraphJS{#2}{#3}{\af@sglnkAction}% \setLinkText[#1\A{\JS{\af@sglnkAction}}]{#4}% }} \newcommand{\defineGraphJS}{\@ifstar{\let\AF@exDEF\edef\af@defineGraphJS} {\let\AF@exDEF\xdef\af@defineGraphJS}} \newcommand{\af@defineGraphJS}[3]{{\makeJSspecials \edef\af@tmp@exp{\noexpand\setkeys{afsl}{#1}}\af@tmp@exp \ifx\afsl@xPlot\@empty\let\afsl@xPlot\afsl@xInterval\fi \AF@exDEF#3{Graph_xytJS (\af@quotes#2\af@quotes,"\afsl@xInterval",% "\afsl@yInterval","\afsl@xPlot","\afsl@tInterval","\afsl@graph",% \afsl@populate,\afsl@wait,"\afsl@type","\afsl@form","\afgraphName",% \afsl@nPoints)}% }} \defineJSStr{\af@badNumberMsg}{% The value input does not appear to be a number, please enter a number, or an expression that evaluates to a number.} \defineJSStr{\af@negNumberMsg}{% The number of points is a positive integer, changing to a positive integer.} \defineJSStr{\af@zeroNumberMsg}{% The number of points is a positive integer, changing to the default value of \af@defaultNumPoints.} \defineJSStr{\af@negShiftMsg}{% The amount of shift is a positive number, changing to a positive number.} \defineJSStr{\af@zeroShiftMsg}{% The amount of shift is a positive number, changing to the default value of 1.} \defineJSStr{\af@saveDelSelAlerti}{% There is nothing in the function input text field.} \defineJSStr{\af@saveDelSelAlertii}{% You have not defined any points to plot} \defineJSStr{\af@graphBtnAlerti}{Undefined graph types} \begin{insDLJS*}[acroflexLoaded]{afgrfJS} \begin{newsegment}{AF: AcroFLeX Graphing Bundle} /* Document Level JavaScript AcroFLeX Graphing Bundle D. P. Story copyright 2008-\the\year */ var acroflexLoaded = true; var _mathVars="xt"; var aGraphData = new Array(); var ck4PtsRe = /\(.+,.+\)/; var badNumberMsg=\af@badNumberMsg; var negNumberMsg=\af@negNumberMsg; var zeroNumberMsg=\af@zeroNumberMsg; var negShiftMsg=\af@negShiftMsg; var zeroShiftMsg=\af@zeroShiftMsg; var saveDelSelAlerti=\af@saveDelSelAlerti; var saveDelSelAlertii=\af@saveDelSelAlertii; var graphBtnAlerti=\af@graphBtnAlerti; var scratchCounter=0; var aTimeOutArray = new Array(); var afSuffixes = new Array("ComboSelect","theFunction", "amtShift","theDom","theRng", "theDom_t", "Rng_t","numNodes"); \end{newsegment} \begin{newsegment}{AF: Graphing Functions} function Graph_xy(graph_props, baseName, pNum) { _mathVars="x"; var afInteractive = (arguments.length <= 3); if (afInteractive) { var f = this.getField(baseName+"theHiddenFunction").value; if ( !ck4PtsRe.test(f) && (f.indexOf(";")!=-1) ) { var dt = this.getField(baseName+"theDom_t.min"); if ( dt == null ) { syntaxError(); return; } Graph_xyt(graph_props, baseName, pNum); return; } f = this.getField(baseName+"theHiddenFunction").value; } createGraphData(baseName); var which_graph=graph_props.graph; var populate = false; graph_props.type="cart"; var aWhichGraph=/(c|p|a)(\d)/.exec(which_graph); if ( aWhichGraph==null ) aWhichGraph=["","c","1"]; var isGraph = (aWhichGraph[1]=="c" || aWhichGraph[1]=="a"); var connectPoints=false; var plotPoints=false; var wait = false; switch(aWhichGraph[1]) { case "p": var which_series="p"+aWhichGraph[2]; plotPoints=true; break; case "a": var which_series="a"+aWhichGraph[2]; break; default: var which_series="c"+aWhichGraph[2]; } graph_props.graph=which_series; if (afInteractive) var oDR = getDomRng (baseName); else { wait=graph_props.wait; populate = graph_props.populate; var oDR = arguments[5]; if (populate) populateDomRng(baseName,oDR); for ( var o in oDR ) oDR[o] = EvalParse(oDR[o]); } aGraphData[baseName].aDomRngs = oDR; var rng_x = (typeof oDR.x_u=="undefined") ? (oDR.x_max - oDR.x_min) : (oDR.x_u - oDR.x_l); /* Get the function and calculated the plotted points */ if (afInteractive) { var n = Number(this.getField(baseName+"numNodes").value); if ( isNaN(n) || n <=0 ) n = \af@defaultNumPoints; } else { var f = ParseInput(arguments[2+1]); var n = Number(arguments[2+2]); if (populate) { this.getField(baseName+"theFunction").value=arguments[2+1]; this.getField(baseName+"numNodes").value=n; } if (isGraph) { connectPoints = ( n <= 0 ); if ( connectPoints ) plotPoints = true; // passing points to be plotted, not connected } else plotPoints = true; } if (afInteractive || populate) updateGraphData(graph_props,baseName,f); var plot_x, plot_y; var x = (typeof oDR.x_u=="undefined") ? oDR.x_min : oDR.x_l; var h = rng_x / n; var thismax = (typeof oDR.x_u=="undefined") ? oDR.x_max : oDR.x_u; var cPlotData=; var aSearchResults=/(([a-zA-Z])\s*=\s*)/.exec(f); if ( aSearchResults != null) { if ( aSearchResults[2] != "y" && aSearchResults[2] != "r" ) { syntaxError(); return; } } f = f.replace(/(([a-zA-Z])\s*=\s*)/g,""); if ( isGraph && !plotPoints ) { for (var i=0; i<=n; i++) { try { with(Math) {_y = eval(f);} } catch(e) { var paraEqs = "("+f+")*Math.cos(t);("+f+")*Math.sin(t)"; graph_props.type="polar"; this.getField(baseName +"theHiddenFunction").value=paraEqs; Graph_xyt(graph_props, baseName, pNum); return; } // If not a number then skip over. if (isFinite(_y)) { plot_x = util.printf("\%.10f", x); plot_y = util.printf("\%.10f", _y); cPlotData.points[cPlotData..point.length()]= {plot_x}{plot_y} } x += h; } } else { // prepare to data for plotting var afBegin = (f.indexOf("\(")+1); var afEnd = f.lastIndexOf("\)"); cPlotData=f.substring(afBegin,afEnd); var re = /\)\s*;\s*\(/; aPlotData= cPlotData.split(re); var cPlotData=; with (Math) { for ( var i=0; i{aTmp[0]}{aTmp[1]} } } } cPlotData=cPlotData.toXMLString(); var annot = this.getAnnotRichMedia(pNum,"afRM"+baseName); if ( annot ) { if (!annot.activated || wait ) { annot.activated=true; afWait4Activation( graph_props,baseName,pNum,oDR,cPlotData,50); } else annot.callAS("getPlotData", graph_props, oDR, cPlotData); } } function Graph_xyt(graph_props, baseName, pNum) { _mathVars="t"; var which_graph=graph_props.graph; var populate = false; var afInteractive = (arguments.length <= 3); if (afInteractive) { var f = this.getField(baseName+"theHiddenFunction").value; if ( ck4PtsRe.test(f) || (f.indexOf(";")==-1) ) { Graph_xy(graph_props, baseName, pNum); return; } f = this.getField(baseName+"theHiddenFunction").value; } createGraphData(baseName); if ( graph_props.type!="polar") graph_props.type="para"; var aWhichGraph=/(c|p|a)(\d)/.exec(which_graph); if ( aWhichGraph==null ) aWhichGraph=["","c","1"]; var isGraph = (aWhichGraph[1]=="c" || aWhichGraph[1]=="a"); var connectPoints=false; var plotPoints=false; var wait=false; switch(aWhichGraph[1]) { case "p": var which_series="p"+aWhichGraph[2]; plotPoints=true; break; case "a": var which_series="a"+aWhichGraph[2]; break; default: var which_series="c"+aWhichGraph[2]; } graph_props.graph=which_series; if (afInteractive) { var oDR = getDomRng (baseName); var oDp = getParaDom (baseName); } else { wait=graph_props.wait; populate = graph_props.populate; var oDR = arguments[5]; if (populate) populateDomRng(baseName,oDR); for ( var o in oDR ) oDR[o] = EvalParse(oDR[o]); var oDp = arguments[6]; if (populate) populateParaDom(baseName,oDp); for ( var o in oDp ) oDp[o] = EvalParse(oDp[o]); } aGraphData[baseName].aDomRngs = oDR; aGraphData[baseName].aDom_P = oDp; var rng_t = oDp.t_max - oDp.t_min; /* Get the function and calculated the plotted points */ if (afInteractive) { var n = Number(this.getField(baseName+"numNodes").value); if ( isNaN(n) || n <=0 ) n = \af@defaultNumPoints; } else { var f = arguments[2+1]; if ( graph_props.type=="polar") { if(f.indexOf(";")==-1) { f = "("+f+")*cos(t);("+f+")*sin(t)"; f = ParseInput(f); } } else f = ParseInput(f); var n = Number(arguments[2+2]); if (populate) { this.getField(baseName+"theHiddenFunction").value=f; this.getField(baseName+"theFunction").value=arguments[2+1]; this.getField(baseName+"numNodes").value=n; } if (isGraph) { connectPoints = ( n <= 0 ); if ( connectPoints ) plotPoints = true; // passing points to be plotted, not connected } else plotPoints = true; } if (afInteractive || populate) updateGraphData(graph_props,baseName,f); var aFunction = f.split(";"); var x_function = aFunction[0]; var y_function = aFunction[1]; var aSearchResults=/(([a-zA-Z])\s*=\s*)/.exec(x_function); if ( aSearchResults != null && aSearchResults[2] != "x") { syntaxError(); return; } x_function = x_function.replace(/(([a-zA-Z])\s*=\s*)/g,""); aSearchResults=/(([a-zA-Z])\s*=\s*)/.exec(y_function); if ( aSearchResults != null && aSearchResults[2] != "y") { syntaxError(); return; } y_function = y_function.replace(/(([a-zA-Z])\s*=\s*)/,""); var plot_x, plot_y; var t = oDp.t_min; var h = rng_t / n; var thismax = oDp.t_max; var cPlotData=; if ( isGraph && !plotPoints ) { for (var i=0; i<=n; i++) { try { with(Math) { _x = eval(x_function); _y = eval(y_function); } } catch(e) { syntaxError(); return;} // If not a number then skip over. if (isFinite(_x)&&isFinite(_y)) { plot_x = util.printf("\%.10f", _x); plot_y = util.printf("\%.10f", _y); cPlotData.points[cPlotData..point.length()]= {plot_x}{plot_y} } t += h; } } else { // prepare to data for plotting var afBegin = (f.indexOf("\(")+1); var afEnd = f.lastIndexOf("\)"); cPlotData=f.substring(afBegin,afEnd); var re = /\)\s*;\s*\(/; aPlotData= cPlotData.split(re); var cPlotData=; with (Math) { for ( var i=0; i{aTmp[0]}{aTmp[1]} } } } cPlotData=cPlotData.toXMLString(); var annot = this.getAnnotRichMedia(pNum,"afRM"+baseName); if ( annot ) { if (!annot.activated || wait ) { annot.activated=true; afWait4Activation( graph_props,baseName,pNum,oDR,cPlotData,50); } else annot.callAS("getPlotData", graph_props, oDR, cPlotData); } } function createGraphData(baseName) { if( aGraphData[baseName] == undefined ) { aGraphData[baseName] = new Object(); aGraphData[baseName].aDomRngs=new Object(); aGraphData[baseName].aDom_P=new Object(); aGraphData[baseName].current = new Array(); } } function updateGraphData(graph_props,baseName,f) { var which_graph=graph_props.graph; if (aGraphData[baseName].current[which_graph] == undefined) aGraphData[baseName].current[which_graph]=new Object(); aGraphData[baseName].current[which_graph].appearFN =this.getField(baseName+"theFunction").value; aGraphData[baseName].current[which_graph].hiddenFN=f; aGraphData[baseName].current[which_graph].graph_props=graph_props; } \end{newsegment} \begin{newsegment}{AF: Supporting Form Fields} function clearGraph(graph_opts,baseName, pNum) { which_graph=graph_opts.graph; var aWhichGraph=/(c|p|a)(\d)/.exec(which_graph); if ( aWhichGraph==null ) aWhichGraph=["","c","1"]; var isGraph = (aWhichGraph[1]=="c" || aWhichGraph[1]=="a"); switch(aWhichGraph[1]) { case "p": var which_series="p"+aWhichGraph[2]; break; case "a": var which_series="a"+aWhichGraph[2]; break; default: var which_series="c"+aWhichGraph[2]; } ProcessIt = false; afResetForms = new Array (); for (var i=0; i"),nIndx); s.currentValueIndices=nIndx; f.value="<"+cAppearV+"\afunused>"; } else { var newFunc = f.value; var newFunc_tmp = newFunc.replace(/\s/g,""); if ( newFunc_tmp == "" ) { app.alert({cTitle:"AcroFLeX Graphing", cMsg:saveDelSelAlerti}); } else { // something there, let's test it if(/\afploti/.test(cAppearV) ) { if (ck4PtsRe.test(newFunc)) { // A set of points to plot s.deleteItemAt(s.currentValueIndices); s.insertItemAt(cAppearV,newFunc,nIndx); s.currentValueIndices=nIndx; } else {/* does not appear to be a point */ app.alert({cTitle:"AcroFLeX Graphing", cMsg:saveDelSelAlertii}); } } else {/* not plot, must be curve*/ s.deleteItemAt(s.currentValueIndices); s.insertItemAt(cAppearV,newFunc,nIndx); s.currentValueIndices=nIndx; } } } } } function graphBtnAction (baseName,pNum) { var s = this.getField(baseName+"ComboSelect"); var d; var d, plot_curve="c1"; if ( s != null ) { var nIndx = s.currentValueIndices; var cAppearV=s.getItemAt(s.currentValueIndices,false); if ( ( d = /\afploti\s+(\d)/.exec(cAppearV) ) != null ) { plot_curve="p"+d[1]; } else { if ( ( d = /\afcurvei\s+(\d)/.exec(cAppearV) ) != null ) { plot_curve="c"+d[1]; } else { app.alert({cTitle:"AcroFLeX Graphing", cMsg:graphBtnAlerti}); } } } Graph_xy({graph:plot_curve},baseName,pNum); } function afsplitInterval(cInterval) { var aDomTmp=stripBrackets(cInterval); aDomTmp=aDomTmp.split(","); return { LEP: aDomTmp[0], UEP: aDomTmp[1] }; } \end{newsegment} \begin{newsegment}{AF: Keystroke/Formatting Functions} function keystrokeDomRng (fname) { if (event.willCommit) { var retn = ParseInput(event.value); if ( !retn ) event.rc = false; else { try { eval ( retn ) } catch(e) { app.alert({cTitle:"AcroFLeX Graphing", cMsg:badNumberMsg}); event.rc=false; }; } } } function formatFileInput (fname) { this.getField(fname).value = ParseInput(event.value); } function formatVarIntervals (fname) { var val = Number(EvalParse(event.value)); this.getField(fname).value = val; } function formatFunctionInput (fname) { var val = ParseInput(event.value); this.getField(fname).value = val; } function keystrokeFunctionInput () { if (event.willCommit) { var str = event.value.replace(/\s/g,""); if ( str == "" ) { app.alert({cTitle:"AcroFleX Graphing", cMsg:saveDelSelAlerti}); event.rc = false; } } } function keystrokeNumPoints () { try{ var val = Number(EvalParse(event.value)); } catch(e) { app.alert({cTitle:"AcroFLeX Graphing", cMsg:badNumberMsg}); event.rc=false; return; } if ( val < 0 ) { app.alert({cTitle:"AcroFLeX Graphing", cMsg:negNumberMsg}); } else { if ( val == 0 ) { app.alert({cTitle:"AcroFLeX Graphing", cMsg:zeroNumberMsg}); val = \af@defaultNumPoints; } } event.value = Math.ceil(Math.abs(val)); } function keystrokeAmtShift() { try{ var val = Number(EvalParse(event.value)); } catch(e) { app.alert({cTitle:"AcroFLeX Graphing", cMsg:badNumberMsg}); event.rc=false; return; } if ( val < 0 ) { app.alert({cTitle:"AcroFLeX Graphing", cMsg:negShiftMsg}); } else { if ( val == 0 ) { app.alert({cTitle:"AcroFLeX Graphing", cMsg:zeroShiftMsg}); val = 1; } } event.value = Math.abs(val); } \end{newsegment} \begin{newsegment}{AF: Support for Custom Graphing Problems} function Graph_xytJS (func,xI,yI,xP,tI,graph,populate,wait,% type,form,gName,nPts) { var oDom = afsplitInterval(xI); var oRng = afsplitInterval(yI); var oPlotD = afsplitInterval(xP); var oP=new Object(), oD=new Object(), oDt=new Object(); oP.graph=graph; oP.populate=populate; oP.wait=wait; if (type!="") oP.type=type; if (form!="") oP.form=form; oD={x_min:oDom.LEP,x_max:oDom.UEP,y_min:oRng.LEP,y_max:oRng.UEP,x_l:oPlotD.LEP,x_u:oPlotD.UEP}; if ( tI=="") { Graph_xy(oP,gName,this.pageNum,func,nPts,oD); } else { var oDom_t = afsplitInterval(tI); oDt={t_min:oDom_t.LEP,t_max:oDom_t.UEP}; Graph_xyt(oP,gName,this.pageNum,func,nPts,oD,oDt); } } \end{newsegment} \end{insDLJS*} \begin{defineJS}{\af@WillClose} for (var n=0; n