The ADAPT WeBWorK Handbook
- Page ID
- 483324
\( \newcommand{\vecs}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \)
\( \newcommand{\vecd}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash {#1}}} \)
\( \newcommand{\dsum}{\displaystyle\sum\limits} \)
\( \newcommand{\dint}{\displaystyle\int\limits} \)
\( \newcommand{\dlim}{\displaystyle\lim\limits} \)
\( \newcommand{\id}{\mathrm{id}}\) \( \newcommand{\Span}{\mathrm{span}}\)
( \newcommand{\kernel}{\mathrm{null}\,}\) \( \newcommand{\range}{\mathrm{range}\,}\)
\( \newcommand{\RealPart}{\mathrm{Re}}\) \( \newcommand{\ImaginaryPart}{\mathrm{Im}}\)
\( \newcommand{\Argument}{\mathrm{Arg}}\) \( \newcommand{\norm}[1]{\| #1 \|}\)
\( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\)
\( \newcommand{\Span}{\mathrm{span}}\)
\( \newcommand{\id}{\mathrm{id}}\)
\( \newcommand{\Span}{\mathrm{span}}\)
\( \newcommand{\kernel}{\mathrm{null}\,}\)
\( \newcommand{\range}{\mathrm{range}\,}\)
\( \newcommand{\RealPart}{\mathrm{Re}}\)
\( \newcommand{\ImaginaryPart}{\mathrm{Im}}\)
\( \newcommand{\Argument}{\mathrm{Arg}}\)
\( \newcommand{\norm}[1]{\| #1 \|}\)
\( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\)
\( \newcommand{\Span}{\mathrm{span}}\) \( \newcommand{\AA}{\unicode[.8,0]{x212B}}\)
\( \newcommand{\vectorA}[1]{\vec{#1}} % arrow\)
\( \newcommand{\vectorAt}[1]{\vec{\text{#1}}} % arrow\)
\( \newcommand{\vectorB}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \)
\( \newcommand{\vectorC}[1]{\textbf{#1}} \)
\( \newcommand{\vectorD}[1]{\overrightarrow{#1}} \)
\( \newcommand{\vectorDt}[1]{\overrightarrow{\text{#1}}} \)
\( \newcommand{\vectE}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash{\mathbf {#1}}}} \)
\( \newcommand{\vecs}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \)
\(\newcommand{\longvect}{\overrightarrow}\)
\( \newcommand{\vecd}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash {#1}}} \)
\(\newcommand{\avec}{\mathbf a}\) \(\newcommand{\bvec}{\mathbf b}\) \(\newcommand{\cvec}{\mathbf c}\) \(\newcommand{\dvec}{\mathbf d}\) \(\newcommand{\dtil}{\widetilde{\mathbf d}}\) \(\newcommand{\evec}{\mathbf e}\) \(\newcommand{\fvec}{\mathbf f}\) \(\newcommand{\nvec}{\mathbf n}\) \(\newcommand{\pvec}{\mathbf p}\) \(\newcommand{\qvec}{\mathbf q}\) \(\newcommand{\svec}{\mathbf s}\) \(\newcommand{\tvec}{\mathbf t}\) \(\newcommand{\uvec}{\mathbf u}\) \(\newcommand{\vvec}{\mathbf v}\) \(\newcommand{\wvec}{\mathbf w}\) \(\newcommand{\xvec}{\mathbf x}\) \(\newcommand{\yvec}{\mathbf y}\) \(\newcommand{\zvec}{\mathbf z}\) \(\newcommand{\rvec}{\mathbf r}\) \(\newcommand{\mvec}{\mathbf m}\) \(\newcommand{\zerovec}{\mathbf 0}\) \(\newcommand{\onevec}{\mathbf 1}\) \(\newcommand{\real}{\mathbb R}\) \(\newcommand{\twovec}[2]{\left[\begin{array}{r}#1 \\ #2 \end{array}\right]}\) \(\newcommand{\ctwovec}[2]{\left[\begin{array}{c}#1 \\ #2 \end{array}\right]}\) \(\newcommand{\threevec}[3]{\left[\begin{array}{r}#1 \\ #2 \\ #3 \end{array}\right]}\) \(\newcommand{\cthreevec}[3]{\left[\begin{array}{c}#1 \\ #2 \\ #3 \end{array}\right]}\) \(\newcommand{\fourvec}[4]{\left[\begin{array}{r}#1 \\ #2 \\ #3 \\ #4 \end{array}\right]}\) \(\newcommand{\cfourvec}[4]{\left[\begin{array}{c}#1 \\ #2 \\ #3 \\ #4 \end{array}\right]}\) \(\newcommand{\fivevec}[5]{\left[\begin{array}{r}#1 \\ #2 \\ #3 \\ #4 \\ #5 \\ \end{array}\right]}\) \(\newcommand{\cfivevec}[5]{\left[\begin{array}{c}#1 \\ #2 \\ #3 \\ #4 \\ #5 \\ \end{array}\right]}\) \(\newcommand{\mattwo}[4]{\left[\begin{array}{rr}#1 \amp #2 \\ #3 \amp #4 \\ \end{array}\right]}\) \(\newcommand{\laspan}[1]{\text{Span}\{#1\}}\) \(\newcommand{\bcal}{\cal B}\) \(\newcommand{\ccal}{\cal C}\) \(\newcommand{\scal}{\cal S}\) \(\newcommand{\wcal}{\cal W}\) \(\newcommand{\ecal}{\cal E}\) \(\newcommand{\coords}[2]{\left\{#1\right\}_{#2}}\) \(\newcommand{\gray}[1]{\color{gray}{#1}}\) \(\newcommand{\lgray}[1]{\color{lightgray}{#1}}\) \(\newcommand{\rank}{\operatorname{rank}}\) \(\newcommand{\row}{\text{Row}}\) \(\newcommand{\col}{\text{Col}}\) \(\renewcommand{\row}{\text{Row}}\) \(\newcommand{\nul}{\text{Nul}}\) \(\newcommand{\var}{\text{Var}}\) \(\newcommand{\corr}{\text{corr}}\) \(\newcommand{\len}[1]{\left|#1\right|}\) \(\newcommand{\bbar}{\overline{\bvec}}\) \(\newcommand{\bhat}{\widehat{\bvec}}\) \(\newcommand{\bperp}{\bvec^\perp}\) \(\newcommand{\xhat}{\widehat{\xvec}}\) \(\newcommand{\vhat}{\widehat{\vvec}}\) \(\newcommand{\uhat}{\widehat{\uvec}}\) \(\newcommand{\what}{\widehat{\wvec}}\) \(\newcommand{\Sighat}{\widehat{\Sigma}}\) \(\newcommand{\lt}{<}\) \(\newcommand{\gt}{>}\) \(\newcommand{\amp}{&}\) \(\definecolor{fillinmathshade}{gray}{0.9}\)WebWork in ADAPT is a practical, end-to-end guide to creating, testing, and publishing interactive problems in WeBWorK within the ADAPT homework platform. It introduces the platform’s purpose, terminology, and core features before walking readers through editing their first problem. The text then develops mastery of Problem Generation (PG) and PGML, explaining file structure, metadata, macros, answer handling, layout tools, and common patterns, while also addressing legacy code and emerging features. It systematically breaks down every component of a problem—from header to solution—and covers all major question types, including multiple choice, matching, numerical entry, multipart, ordered list, and workflow-based formats. Advanced chapters explore formatting, graphing, structured tables, sophisticated randomization, chemical rendering, and automation with the PG renderer, followed by comprehensive testing and debugging practices. The book concludes with guidance on using AI agents to assist in WeBWorK authoring, along with templates, troubleshooting checklists, macro demonstrations, making it both a training manual and a long-term reference for scalable, high-quality assessment design.
- 1: Introduction
- Introduces the book with a section map and a practical PG vs PGML split for science-first authoring, based on the PG 2.17 subset in ADAPT and webwork-pg-renderer. After finishing, you can pick a task-based starting point, know where PGML belongs, and understand that some macros from full PG are unavailable. Use it as your orientation page before jumping into terms, quickstart, or templates, and see Section 2.5 for the macro allowlist reference.
- 2: Problem Generation (PG)
- Sets expectations that regular PG is discouraged and treated as scaffolding for PGML, acknowledges the five-section reality, and adds a task-first menu for when to use each section. After finishing, you can keep setup code focused, understand that library-quality problems need metadata headers, and put student-facing text in the PGML block. Use it to keep your problems short, readable, consistent, and searchable.
- 3: PGML (PG Markup Language)
- Introduces the PGML chapter as the core authoring layer for student-facing prompts and adds a task-first menu plus a quick patterns table. After finishing, you can identify which PGML topic you need next and keep your work PGML-first. Use it as the entry point before writing or revising any prompt text.
- 4: Breaking Down the Components of a WeBWorK Problem
- Explains that this chapter is a single worked problem sliced into five sections: OPL Header, Preamble, Setup, Statement, Solution, plus a Put it together workflow page. After finishing, you can use the section map and anatomy tables to locate where edits belong and what usually breaks. Use it as the navigation page before you touch the full file and when ADAPT errors need a quick local render via the Testing and Debugging sections.
- 5: Different Question Types in WeBWorK
- Frames the chapter as a bridge between WeBWorK authoring and using WeBWorK inside ADAPT, with life-science-first examples and a boundary between PGML-first work and portable interaction types. After finishing, you can choose between interaction patterns, workflow habits, and QA checks depending on what you are trying to ship. Use it to start this chapter and pick the subsection you need next.
- 6: Advanced PGML Techniques
- Introduces advanced PGML authoring patterns including CSS-based coloring, niceTables, matching layouts with MODES wrappers, multiple choice statements, display graphs, and chemical structure rendering. After finishing, you can choose which advanced technique fits your needs and understand the PG 2.17 subset constraints. Use it as your entry point when basic PGML patterns are not enough and you need richer formatting or more complex interactions.
- 7: Testing and Debugging
- Helps you find the right section when something goes wrong using a symptom-based decision table that maps common failures to sections and a "Start here" guide for new, broken, or pre-publish users. After finishing, you can jump directly to the section that matches your situation instead of reading front to back. Use it as the entry point whenever you need to debug, lint, test randomization, or do a final QA pass.
- 8: Using AI Agents to Write WeBWorK
- Provides a goal-based decision table, section map, prerequisites, and start-here guide for the AI agent workflow chapter. After finishing, you can jump to the right section based on whether you need to choose an agent, set up documentation, connect to the renderer, or improve prompt quality. Use it as the entry point for this chapter when you want AI assistance writing WeBWorK problems.
- 9: Appendices
- Introduces the appendices as quick-reference material including minimal templates, a concise glossary, and a troubleshooting checklist. After finishing, you can navigate to resources when you need a starting template, a term definition, or a diagnostic path for common failures. Use it as your reference hub when you need fast lookup rather than sequential learning, noting that worked examples are integrated into the main chapters where the techniques are taught.


