Sage in WeBWorK
Sage is an open source, online symbolic mathematical system. Details on Sage can be found at http://www.sagemath.org .
For use within WebWork, a special "single-cell" version of Sage is located at http://aleph.sagemath.org
## Template for calling Sage from within a WebWork pg file DOCUMENT(); loadMacros( "PGstandard.pl", "PGchoicemacros.pl", "MathObjects.pl", ); TEXT(beginproblem()); # Regular WebWork setup $funct = Compute("x**4"); $funct_diff = $funct->D('x'); TEXT(<<SAGE_CODE); <div id="singlecell-test"> <script type="text/code"> var('x') ~~@interact def _(f = ($funct)): df = diff(f,x,1) html('\( f \prime (x) = %s \)'%str(latex(df)) ) </script> </div> SAGE_CODE TEXT(<<'SAGE_SCRIPT'); <script type="text/javascript" src="http://sagemath.org:5467/static/jquery-1.5.min.js"></script> <script type="text/javascript" src="http://sagemath.org:5467/embedded_singlecell.js"></script> <script type="text/javascript"> $(function() { // load only when the page is loaded var makecells = function() { singlecell.makeSinglecell({ inputLocation: "#singlecell-test", editor: "codemirror", hide: ["editor","computationID","files","messages","sageMode"], evalButtonText: "Start/Restart", replaceOutput: true}); } singlecell.init(makecells); // load Single Cell libraries and then // initialize Single Cell instances }); </script> SAGE_SCRIPT # Continue pg file as normal BEGIN_TEXT $PAR Using Sage above, determine the derivative of \[ f(x) = $funct \]. $PAR \(f '(x) = \) \{ ans_rule(20) \} END_TEXT Context()->normalStrings; ANS($funct_diff->cmp() ); ENDDOCUMENT();
The example show how to pass perl variables from the problem initialization into the sage block.
- TEXT(<<SAGE_CODE);
where << SAGE_CODE without single quotes is necessary. However, the Sage code will not execute if no variables are actually passed in. Since $ and @ within the Sage code are now interpreted by perl, all latex delimiters should be converted from $ signs to \ ( and \ ) pairs. Additionally, any @interact needs to be escaped and written as ~~@interact
If you are not passing any variables, use:
- TEXT(<<'SAGE_CODE');
where <<'SAGE_CODE' tells perl not to interpret variables. Sage code can then be pasted in verbatim without any need to convert formatting or escaping other characters.