MJOTEX += mjo-proof_by_cases.tex mjo-theorem.tex mjo-theorem-star.tex
MJOTEX += mjo-topology.tex mjo.bst
+# Compile a list of raw source code listings (*.listing) and their
+# associated output files (*.py) that will be tested by check-sage.
+SAGE_LISTING_SRCS = $(wildcard sage_listings/*.listing)
+SAGE_LISTING_DSTS = $(patsubst %.listing,%.py,$(SAGE_LISTING_SRCS))
+
# Use kpsewhich (from the kpathsea suite) to find the absolute paths
# of the bibtex/mjotex files listed in in $(BIBS)/$(MJOTEX). The SRCS
# variable should contain all (Bib)TeX source files for the document.
$(MAKE) clean
$(MAKE)
+# How do we convert a raw listing into something testable by sage? We
+# append/prepend triple quotes to make the whole thing into a doctest.
+sage_listings/%.py: sage_listings/%.listing
+ echo '"""' > $@ && cat $< >> $@ && echo '"""' >> $@
+
# Ensure that there are no overfull or underfull boxes in the output
# document by parsing the log for said warnings.
.PHONY: check-boxes
check-undefined: $(PN).log
@! grep -i 'undefined' $<
+# Use sage to doctest any \sagelisting{}s in SAGE_LISTING_DSTS.
+# The actuall command is ifdef'd so that we can comment out
+# the definition of SAGE_LISTING_DSTS without breaking the
+# default definition of the "check" target.
+.PHONY: check-sage
+check-sage: $(SAGE_LISTING_DSTS)
+ifdef SAGE_LISTING_DSTS
+ PYTHONPATH="$(HOME)/src/sage.d" \
+ sage -t --timeout=0 --memlimit=0 \
+ $^
+endif
+
# Run a suite of checks.
.PHONY: check
-check: check-boxes check-chktex check-undefined
+check: check-boxes check-chktex check-undefined check-sage
# Clean up leftover junk. This only looks overcomplicated because
# the *.{foo,bar} syntax supported by Bash is not POSIX, and Make
clean:
for ext in $(JUNK_EXTENSIONS); do rm -f *.$$ext; done;
rm -rf dist/
+ rm -f $(SAGE_LISTING_DSTS)
# If this document will be published, the publisher isn't going to
# have your BibTeX database or your mjotex files. So, you need to
\end{section}
\begin{section}{Listing}
- Here's an interactive sage prompt:
+ Here's an interactive SageMath prompt:
\begin{tcblisting}{listing only,
colback=codebg,
[0 0], [0 0], [1 0], [0 1]
]
\end{tcblisting}
+
+ However, the smart way to display a SageMath listing is to load it
+ from an external file (under the ``listings'' subdirectory):
+
+ \sagelisting{example}
+
+ Keeping the listings in separate files makes it easy for the build
+ system to test them.
\end{section}
\begin{section}{Miscellaneous}
keywordstyle=\color{brilliantlavender},
stringstyle=\color{brilliantgreen}
}
+
+
+% Input a SageMath example code listing from a file. You generally
+% want these to be in separate files so that the build system can test
+% them automatically.
+%
+% The sole argument is the "name" of the listing, which ultimately
+% just identifies a file named "sage_listings/<name>.listing".
+\newcommand*{\sagelisting}[1]{\tcbinputlisting{listing only,%
+ colback=codebg,%
+ coltext=codefg,%
+ left=2em,%
+ listing options={language=sage,style=sage},%
+ listing file=sage_listings/#1.listing}}