Subsection 7.1.2 Perl-free Problems
If youโd just like to rattle off a quick question with no randomization, you can do as in this example.
<exercise>
<webwork>
<statement>
<p><m>1+2=</m><var name="'3'" width="5" /></p>
</statement>
</webwork>
</exercise>
The
<exercise>
above could be given an optional
<title>
,
<introduction>
, and
<conclusion>
. The
<webwork>
inside could be given a
<hint>
and
<solution>
. These are discussed in
Subsectionย 7.1.3.
In the above example,
'3'
is the
@name
attribute to a
<var>
element. There is actually no โvariableโ named โ3โ; we are just using the slot where more complicated exercises would place a Perl variable answer.
So the above is how to create an answer blank that is expecting \(3\) as the answer. What you give as a @name
attribute will be passed to PGโs Compute()
constructor, so it needs to be valid input for Compute()
. Note that you could pass a string encased in quotes, or a perl expression. Just be mindful of the difference:
-
8**2
will process a perl real using exponentiation and lead to the MathObject Real 64.
-
'8^2'
will process a perl string and lead to the MathObject Real 64.
-
8^2
will process the perl real using bitwise XOR and lead to the MathObject Real 10.
The default context is
Numeric
, which understands numerical expressions and formulaic expressions in the variable
\(x\text{.}\) You can activate some other context as in this example.
<exercise>
<webwork>
<pg-code>
Context("ImplicitPlane");
</pg-code>
<statement>
<p>The answer is <m>x+y=1</m>.</p>
<p><var name="'x+y=1'" width="8" /></p>
</statement>
</webwork>
</exercise>
Many special contexts are automatically detected by PreTeXt, and it loads the appropriate macro file into the PG problem. However you may need to explicitly load a macro file as described in
Subsectionย 7.1.3.
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
pretext/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.
Subsection 7.1.4 WeBWorK in an <exercisegroup>
An
<exercisegroup>
is a collection of exercises with common instructions that are put into an
<introduction>
. If you put WeBWorK exercises in an exercisegroup, then when the exercises are exported to
.pg
problem files for use as online homework from a WeBWorK server it makes sense that the instructions from the
<exercisegroup>
โs
<introduction>
should be included in the
.pg
file. And so they are included there. Note that they are
not included when you are building
HTML or
LaTeX output for your project. (Rather, the
<exercisegroup>
โs
<introduction>
appears in its normal place.)
You should be aware of this when you write the
<exercisegroup>
โs
<introduction>
. It impacts the specific language you should use. For example, if you write โDifferentiate the following functions.โ or โDifferentiate each of the functions below.โ, then you have language that doesnโt fit the individual problem when it is used for homework on a WeBWorK server. Instead you might write โDifferentiate the functionโ. It makes sense as common instructions for the
<exercisegroup>
as well as the instructions for an individual exercise.
Subsection 7.1.6 Reusing a <webwork>
by @xml:id
If a
<webwork>
has an
@xml:id
, then another
<webwork>
can โcopyโ the first one simply by using a
@copy
attribute whose value is the first
<webwork>
โs
@xml:id
. The
@seed
of the first
<webwork>
is ignored, and the second
<webwork>
may set its own
@seed
. For example:
<exercise>
<webwork xml:id="foo" seed="1">
<pg-code>
$a = random(1,9,1);
$answer = $a+1;
</pg-code>
<statement>
<p>
Enter <m><var name="$a"/>+1</m>. <var name="$answer" width="10"/>
</p>
</statement>
</webwork>
</exercise>
<exercise>
<webwork copy="foo" seed="2"/>
</exercise>
The
@copy
attribute should point to a
<webwork>
that has PreTeXt-authored source, not to a
<webwork>
with a
@source
attribute. (If you want to copy one with a
@source
attribute, just reuse the same
@source
value.)