Skip to main content

The PreTeXt Guide

Subsection 7.1.3 PG code in Problems

To have randomization in problems or otherwise take advantage of the algorithmic programming capabilities of Perl and WeBWorK’s PG language requires using a <pg-code> tag. Having at least a little familiarity with coding problems in WeBWorK is necessary, although for simpler problems you could get away with mimicking the sample article in mathbook/examples/webwork/. A <statement>, optional <hint>, and optional <solution> follow.
<webwork>

  <pg-code>
  </pg-code>

  <statement>
  </statement>

  <hint>
  </hint>

  <solution>
  </solution>

</webwork>
If you are familiar with code for WeBWorK PG problems, the <pg-code> contains lines of PG code that would appear in the “setup” portion of the problem. Typically, this is the code that precedes the first BEGIN_TEXT or BEGIN_PGML. If your code needs any special WeBWorK macro libraries, you may load them in a <pg-macros> tag prior to <pg-code>, with each such .pl file’s name inside a <macro-file> tag. However many of the most common macro libraries will be loaded automatically based on the content and attributes you use in the rest of your problem.
Here is a small example. Following the example, we’ll continue discussing <statement> and <solution>.
<webwork>
  <pg-code>
    Context("LimitedNumeric");
    $a = Compute(random(1, 9, 1));
    $b = Compute(random(1, 9, 1));
    $c = $a + $b;
  </pg-code>

  <statement>
    <p>Compute <m><var name="$a"/> + <var name="$b"/></m>.</p>
    <instruction>Type your answer without using the <c>+</c> sign.</instruction>
    <p>The sum is <var name="$c" width="2"/>.</p>
  </statement>

  <solution>
    <p><m><var name="$a"/> + <var name="$b"/> = <var name="$c"/></m>.</p>
  </solution>
</webwork>
Within a <statement>, <hint>, or <solution>, reference <var> tags by @name.
Within the <statement>, a <var> tag with either a @width or @form attribute creates an input field answer blank that expects the variable with that @name to be the answer.
A <var> can have @form with value essay, in which case it need not have a @name attribute. This is for open-ended questions that must be graded by a human. The form field will be an expandable input block if the question is served to an authenticated user within WeBWorK. But for the WeBWorK cells in PreTeXt HTML output, there will just be a message explaining that there is no place to enter an answer.
A <var> can have @form with value array. You would use this when the answer is a Matrix or Vector MathObject (a WeBWorK classification) to cause the input form to be an array of smaller fields instead of one big field.
A <var> can have @form with value popup, buttons, or checkboxes for multiple choice questions.
If you are familiar with PG, then in your <pg-code> you might write a custom evaluator (a combination of a custom answer checker, post filters, pre filters, etc.). If you store this similar to
$my_evaluator = $answer -> cmp(...);
then the <var> can have @evaluator with value $my_evaluator.
An <instruction> is specific instructions for how the reader might type or otherwise electronically submit their answer. Contents of an <instruction> will be omitted from print and other static output forms. The <instruction> is a peer to <p>, but may only contain “short text” children.
Some general information on authoring WeBWorK problems can be found in a set of videos at webwork.maa.org/wiki/Problem_Authoring_Videos 1 . Not all of this is relevant to authoring within PreTeXt, but there are parts that will be helpful for constructing the Perl code necessary for randomized problems.
webwork.maa.org/wiki/Problem_Authoring_Videos