solrub
Build the student, solution and rubric PDFs of a LaTeX assignment.
One .tex source carries all three copies. \sol marks what only the
answer key shows and \rub what only the grading rubric shows; each copy is
a pdflatex run defining a different subset of them.
pip install solrub
Use
solrub quiz1a # quiz1a.pdf, quiz1a_sol.pdf, quiz1a_rub.pdf
solrub quiz1* # every version at once
solrub quiz1/ # every document in a folder
solrub --no-sol --no-rub blank
All three copies are the default; --no-sol and --no-rub opt out.
Arguments are files, globs or directories, with the .tex suffix optional.
Globs are expanded by the tool rather than left to the shell, so quiz1*
works the same on Windows. Two filters keep a wide pattern honest: sibling
builds (quiz1a.pdf, quiz1a_sol.pdf) collapse onto the .tex they came
from, and a fragment with no \documentclass is skipped.
The pdflatex transcript is hidden, leaving one line per document:
==> quiz1a.tex
quiz1a.pdf quiz1a_sol.pdf quiz1a_rub.pdf
A failure prints the error pdflatex reported and keeps that document's
.log, but does not stop the rest of the batch; the failures are listed at
the end and the exit status is non-zero. -v restores the full transcript.
Counting points
-p sums the points per problem, using
sum-pts: pip install "solrub[pts]".
solrub -p quiz1a
The default expects a bracket at the front of a \prob{...} title, and
reads both spellings:
\prob{[20 pts (8, 12)]: Bayes Net}
\prob{[16 points (4 pts each)]: Ecology System}
If that is not your convention, a [points] table in a solrub.toml at your
repo root overrides it for every document underneath. The keys are sum-pts'
own parameters, so its documentation is the reference:
[points]
prefix = ' *\\question'
points = '(marks|pts?)'
When the patterns do not fit, solrub says so and links to
docs/points.md, which explains each key and the traps.
Points are read from the source, so -p still reports on a document that
failed to build.
In the document
Three macros divide the source. \sol and \rub are hidden by default and
revealed by their own build; \stud is the reverse, student-only content
such as the blank space left for the work, dropped from both keys.
\newcommand{\sol}[1]{}
\newcommand{\rub}[1]{}
\newcommand{\stud}[1]{#1}
\ifdefined\showsol
\renewcommand{\sol}[1]{#1}
\renewcommand{\stud}[1]{}
\fi
\ifdefined\showrub
\renewcommand{\rub}[1]{#1}
\renewcommand{\stud}[1]{}
\fi
\stud{\vfill}
\sol{The boundary is $x = 3$.}
\rub{6 pts: correct slope. 3 pts if the intercept is off.}
The flags solrub defines are \showsol and \showrub, deliberately not
\sol and \rub. A document cannot both define a macro and ask whether
it is defined: \newcommand{\sol} would make \ifdefined\sol true on
every build, so the student copy would silently print the answers.
Requires
pdflatex on the PATH, and Python 3.9 or newer.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file solrub-0.3.0.tar.gz.
File metadata
- Download URL: solrub-0.3.0.tar.gz
- Upload date:
- Size: 8.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/7.0.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
de0596ac57549c01d8217ddaae176332e44f9d3b3988215b17fbd18421921303
|
|
| MD5 |
bc5394d52b22242f46919adc2d270655
|
|
| BLAKE2b-256 |
f7d36cf112e41b8161c7a1260740a91353d99997bd86917e5ac6894aa47b2c10
|
File details
Details for the file solrub-0.3.0-py3-none-any.whl.
File metadata
- Download URL: solrub-0.3.0-py3-none-any.whl
- Upload date:
- Size: 8.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/7.0.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3e8ff5c22543e3098bbff880974096e1fa25d2f921d356bb267ee45a2085e89a
|
|
| MD5 |
82d57f348be08cd536833999672055a4
|
|
| BLAKE2b-256 |
b61862badeb896302418e52921ca510bb1e9a99fd1e7d36fdee277c4bbe01e4a
|