<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="default.xsl"?>
<fr:tree
toc="true"
numbered="true"
show-heading="true"
show-metadata="true"
expanded="true"
root="false"
xmlns:fr="http://www.jonmsterling.com/jms-005P.xml"><fr:frontmatter><fr:anchor>2997</fr:anchor><fr:addr>lc-0002</fr:addr><fr:route>lc-0002.xml</fr:route><fr:title>Forester for the Woodland Skeptic</fr:title><fr:date><fr:year>2024</fr:year><fr:month>2</fr:month><fr:day>18</fr:day></fr:date><fr:authors><fr:author><fr:link
type="local"
href="owen-lynch.xml"
addr="owen-lynch"
title="Owen Lynch">Owen Lynch</fr:link></fr:author></fr:authors><fr:meta
name="comments">true</fr:meta></fr:frontmatter><fr:mainmatter><fr:blockquote><fr:p>What I don’t understand about Forest (and what is keeping me from just go ahead and write everything there) is the syntax… why a new one? Why not Markdown or LaTeX or a reasonable hybrid like the nLab?</fr:p>

<fr:p>-- <fr:link
type="external"
href="https://www.localcharts.org/t/double-category-theory-from-a-double-categorical-perspective/14659/3?u=owenlynch">Matteo Capucci</fr:link></fr:p></fr:blockquote><fr:p>This is a tutorial aimed at people who want to get started writing on the LocalCharts forest, but don't know how <fr:link
type="external"
href="https://www.jonmsterling.com/foreign-forester-index.xml">forester</fr:link> works/are frustrated at how forester is different from tools they may be used to. This is intended to be a direct introduction than the <fr:link
type="external"
href="https://www.jonmsterling.com/foreign-forester-jms-0052.xml">official tutorial</fr:link> (which has more motivation for forester), and also has some localcharts-specific content.</fr:p><fr:tree
toc="true"
numbered="true"
show-heading="true"
show-metadata="false"
expanded="true"
root="false"
xmlns:fr="http://www.jonmsterling.com/jms-005P.xml"><fr:frontmatter><fr:anchor>2775</fr:anchor><fr:addr>lc-0003</fr:addr><fr:route>lc-0003.xml</fr:route><fr:title>Forester in 30 seconds</fr:title><fr:authors /></fr:frontmatter><fr:mainmatter><fr:p><fr:link
type="external"
href="http://www.jonmsterling.com/jms-005P.xml">Forester</fr:link> is a tool for writing large quantities of professional quality mathematics on the web. To support large quantities, it has extensive interlinking/backlink/transclusion support. To support professional quality, it has a uniform, LaTeX-like syntax with macros that work the same in prose, KaTeX-based math equations, and LaTeX-produced figures.</fr:p><fr:p>An example forester document showcasing basic features looks like this:</fr:p><fr:pre><![CDATA[\title{Example document}
\author{owen-lynch}
\import{macros} % the localcharts macro library
\date{1970-01-01}

% A comment
\p{A paragraph with inline math: #{a+b}, and then display math}

##{\int_a^b f(x)}

\p{\strong{bold} and \em{italics}}

\ul{
  \li{a}
  \li{bulleted}
  \li{list}
}

\ol{
  \li{a}
  \li{numbered}
  \li{list}
}

\quiver{
  \begin{tikzcd}
    A \ar[r, "f"] & B
  \end{tikzcd}
}

\def\my-macro[arg]{Called \code{my-macro} with argument \arg}

\p{\my-macro{tweedle}}

\transclude{lc-0005} % a subsection]]></fr:pre><fr:p>and would be rendered like this:</fr:p><fr:tree
toc="true"
numbered="true"
show-heading="true"
show-metadata="false"
expanded="true"
root="false"
xmlns:fr="http://www.jonmsterling.com/jms-005P.xml"><fr:frontmatter><fr:anchor>2776</fr:anchor><fr:addr>lc-0006</fr:addr><fr:route>lc-0006.xml</fr:route><fr:title>Example document</fr:title><fr:date><fr:year>1970</fr:year><fr:month>1</fr:month><fr:day>1</fr:day></fr:date><fr:authors><fr:author><fr:link
type="local"
href="owen-lynch.xml"
addr="owen-lynch"
title="Owen Lynch">Owen Lynch</fr:link></fr:author></fr:authors></fr:frontmatter><fr:mainmatter><fr:p>A paragraph with inline math: <fr:tex
display="inline"><![CDATA[a+b]]></fr:tex>, and then display math</fr:p><fr:tex
display="block"><![CDATA[\int _a^b f(x)]]></fr:tex><fr:p><fr:strong>bold</fr:strong> and <fr:em>italics</fr:em></fr:p><fr:ul><fr:li>a</fr:li>
  <fr:li>bulleted</fr:li>
  <fr:li>list</fr:li></fr:ul><fr:ol><fr:li>a</fr:li>
  <fr:li>numbered</fr:li>
  <fr:li>list</fr:li></fr:ol>
  <html:center
xmlns:html="http://www.w3.org/1999/xhtml"><fr:embedded-tex
hash="16775f2be4677dea69253f25ef9ba53e"><fr:embedded-tex-preamble><![CDATA[\usepackage {quiver, amsopn, amssymb, mathrsfs}]]></fr:embedded-tex-preamble><fr:embedded-tex-body><![CDATA[
  \begin {tikzcd}
    A \ar [r, "f"] & B
  \end {tikzcd}
]]></fr:embedded-tex-body></fr:embedded-tex></html:center>
<fr:p>Called <fr:code>my-macro</fr:code> with argument tweedle</fr:p><fr:tree
toc="true"
numbered="true"
show-heading="true"
show-metadata="false"
expanded="true"
root="false"
xmlns:fr="http://www.jonmsterling.com/jms-005P.xml"><fr:frontmatter><fr:anchor>2779</fr:anchor><fr:addr>lc-0005</fr:addr><fr:route>lc-0005.xml</fr:route><fr:title>A subsection</fr:title><fr:authors /></fr:frontmatter><fr:mainmatter><fr:p>More stuff</fr:p></fr:mainmatter><fr:backmatter /></fr:tree></fr:mainmatter><fr:backmatter /></fr:tree><fr:p>Forester is written in <fr:code>.tree</fr:code> files in the <fr:code>trees/</fr:code> directory. Trees are named <fr:code>namespace-XXXX</fr:code>, where <fr:code>XXXX</fr:code> is a number in base 36 (using digits 0-9 then A-Z), and <fr:code>namespace</fr:code> is typically something like the initials of the person writing.</fr:p></fr:mainmatter><fr:backmatter /></fr:tree><fr:p>Now that you've seen the overview, I encourage you to try writing a page. Instructions for setting up the localcharts forest are in the <fr:link
type="external"
href="https://github.com/LocalCharts/forest/blob/main/README.md">README</fr:link> for the localcharts forest. Once you've done that, you can come back here and learn forester in some more depth.</fr:p><fr:p>But before you go on, four things.</fr:p><fr:ol><fr:li>There is a convenient script for making new trees numbered in base-36: <fr:code>new &lt;namespace&gt;</fr:code>. For instance <fr:code>new ocl</fr:code> produces a new file <fr:code>trees/ocl-XXXX.tree</fr:code>, where <fr:code>XXXX</fr:code> is the least strict upper bound of the set of <fr:code>YYYY</fr:code> such that <fr:code>ocl-YYYY</fr:code> exists in the forest. We use this for most prose, but we also use the <fr:code>authors/</fr:code>, <fr:code>institutions/</fr:code>, etc. directories to put bibliographic trees, named after their contents instead of automatically named.</fr:li>
  <fr:li>If you have any questions or complaints about this tutorial, please comment below. If you have general questions about forester, I encourage you to join the <fr:link
type="external"
href="https://lists.sr.ht/~jonsterling/forester-discuss">mailing list</fr:link>.</fr:li>
  <fr:li>Don't be afraid to poke around at either the <fr:link
type="external"
href="https://github.com/LocalCharts/forest/tree/main/trees">source code for localcharts</fr:link> or the <fr:link
type="external"
href="https://git.sr.ht/~jonsterling/public-trees/tree">source code for Jon Sterling's webpage</fr:link>; you may find some interesting features!</fr:li>
  <fr:li>Be aware that forester is new software in active development, and Jon Sterling is not afraid to make breaking changes. This is a blessing and a curse; he might write something which breaks things, but he also might write the feature that you really want if you <fr:link
type="external"
href="https://lists.sr.ht/~jonsterling/forester-discuss">ask nicely on the mailing list</fr:link>!</fr:li></fr:ol><fr:tree
toc="true"
numbered="true"
show-heading="true"
show-metadata="false"
expanded="true"
root="false"
xmlns:fr="http://www.jonmsterling.com/jms-005P.xml"><fr:frontmatter><fr:anchor>2780</fr:anchor><fr:addr>lc-0004</fr:addr><fr:route>lc-0004.xml</fr:route><fr:title>Basic Typography</fr:title><fr:authors><fr:author><fr:link
type="local"
href="owen-lynch.xml"
addr="owen-lynch"
title="Owen Lynch">Owen Lynch</fr:link></fr:author></fr:authors></fr:frontmatter><fr:mainmatter><fr:p>Forester has a lot of interesting features around large-scale organization of documents, but it's worth reviewing the nuts and bolts of basic typographical constructions first, so that you have tools in your toolbox for when we move to the large-scale stuff.</fr:p><fr:p>Forester's syntax is a little bit unfamiliar, however I hope by the end of this section, you will see that the design decisions leading to this were not unreasonable, and lead to a quite usable and simple language. This is because there is mainly just one syntactic construct in forester: the command. The syntax is <fr:code><![CDATA[\commandname{argument}]]></fr:code>, which should be familiar to anyone who has used LaTeX.</fr:p><fr:tree
toc="true"
numbered="true"
show-heading="true"
show-metadata="false"
expanded="true"
root="false"
xmlns:fr="http://www.jonmsterling.com/jms-005P.xml"><fr:frontmatter><fr:anchor>2782</fr:anchor><fr:addr>lc-0009</fr:addr><fr:route>lc-0009.xml</fr:route><fr:title>HTML Tags</fr:title><fr:authors /></fr:frontmatter><fr:mainmatter><fr:p>The most basic commands just produce html tags, as can be found in the table below.</fr:p><html:table
xmlns:html="http://www.w3.org/1999/xhtml">
  <html:tr><html:th>Name</html:th> <html:th>HTML</html:th> <html:th>Forester</html:th></html:tr>
  <html:tr><html:td><fr:link
type="external"
href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/p">Paragraph</fr:link></html:td> <html:td><fr:code><![CDATA[<p>...</p>]]></fr:code></html:td> <html:td><fr:code><![CDATA[\p{...}]]></fr:code></html:td></html:tr>
  <html:tr><html:td><fr:link
type="external"
href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/ul">Unordered list</fr:link></html:td> <html:td><fr:code><![CDATA[<ul><li>...</li><li>...</li></ul>]]></fr:code></html:td> <html:td><fr:code><![CDATA[\ul{\li{...}\li{...}}]]></fr:code></html:td></html:tr>
  <html:tr><html:td><fr:link
type="external"
href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/ol">Ordered list</fr:link></html:td> <html:td><fr:code><![CDATA[<ol><li>...</li><li>...</li></ol>]]></fr:code></html:td> <html:td><fr:code><![CDATA[\ol{\li{...}\li{...}}]]></fr:code></html:td></html:tr>
  <html:tr><html:td><fr:link
type="external"
href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/em">Emphasis</fr:link></html:td> <html:td><fr:code><![CDATA[<em>...</em>]]></fr:code></html:td> <html:td><fr:code><![CDATA[\em{...}]]></fr:code></html:td></html:tr>
  <html:tr><html:td><fr:link
type="external"
href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/strong">Strong</fr:link></html:td> <html:td><fr:code><![CDATA[<strong>...</strong>]]></fr:code></html:td> <html:td><fr:code><![CDATA[\strong{...}]]></fr:code></html:td></html:tr>
  <html:tr><html:td><fr:link
type="external"
href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/code">Code</fr:link></html:td> <html:td><fr:code><![CDATA[<code>...</code>]]></fr:code></html:td> <html:td><fr:code><![CDATA[\code{...}]]></fr:code></html:td></html:tr>
  <html:tr><html:td><fr:link
type="external"
href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/pre">Pre</fr:link></html:td> <html:td><fr:code><![CDATA[<pre>...</pre>]]></fr:code></html:td> <html:td><fr:code><![CDATA[\pre{...}]]></fr:code></html:td></html:tr>
  <html:tr><html:td><fr:link
type="external"
href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/blockquote">Blockquote</fr:link></html:td> <html:td><fr:code><![CDATA[<blockquote>...</blockquote>]]></fr:code></html:td> <html:td><fr:code><![CDATA[\blockquote{...}]]></fr:code></html:td></html:tr>
</html:table><fr:p>Note that unlike in markdown or LaTeX, paragraphs must be explicitly designated via <fr:code><![CDATA[\p{...}]]></fr:code>, rather than being implicit from newlines.</fr:p><fr:p>Also note the conspicuous absence of the <fr:link
type="external"
href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/a">anchor tag</fr:link>: we will cover links in <fr:ref
addr="lc-0007" />.</fr:p><fr:p>It is also possible to output any other HTML tag via the <fr:code><![CDATA[\xml]]></fr:code> command. For instance, I used <fr:code><![CDATA[\xml{table}{...}]]></fr:code> to produce the table above.</fr:p><fr:p>So to sum up, basic typography in forester is just a LaTeX-flavored wrapper around HTML elements. Given that we have to use LaTeX for math (because it's too much effort to relearn how to typeset math euations), it makes sense to just have a single syntax throughout the whole document.</fr:p></fr:mainmatter><fr:backmatter /></fr:tree><fr:tree
toc="true"
numbered="true"
show-heading="true"
show-metadata="false"
expanded="true"
root="false"
xmlns:fr="http://www.jonmsterling.com/jms-005P.xml"><fr:frontmatter><fr:anchor>2820</fr:anchor><fr:addr>lc-000A</fr:addr><fr:route>lc-000A.xml</fr:route><fr:title>Math Typesetting</fr:title><fr:authors /></fr:frontmatter><fr:mainmatter><fr:p>To produce inline mathematics, use <fr:code><![CDATA[ #{...}]]></fr:code>. Math mode uses <fr:link
type="external"
href="https://katex.org/">KaTeX</fr:link>, so anything supported in KaTeX will work in forester. Note that math mode is idempotent: <fr:code><![CDATA[ #{a + b}]]></fr:code> produces the same result as <fr:code><![CDATA[ #{#{a} + b}]]></fr:code>. Display mathematics can be made with <fr:code><![CDATA[ ##{...}]]></fr:code>.</fr:p><fr:p>The killer feature of forester is the ability to include LaTeX figures as svgs. This is done by compiling the figure with the <fr:link
type="external"
href="https://ctan.org/pkg/standalone?lang=en">standalone</fr:link> package, and then running <fr:link
type="external"
href="https://dvisvgm.de/">dvisvgm</fr:link>. The results are cached, so that when you make changes elsewhere in your document, the figures do not have to be recompiled.</fr:p><fr:p>You can access this feature with the <fr:code><![CDATA[\tex{...}{...}]]></fr:code> command. The first argument is the preamble, where you can put your <fr:code><![CDATA[\usepackage{...}]]></fr:code> statements. The second argument is the code for your figure, using TikZ or similar packages. The localcharts macro package (accessed with <fr:code><![CDATA[\import{macros}]]></fr:code>) also provides a command <fr:code><![CDATA[\quiver{...}]]></fr:code> which has the right preamble for copy-pasting <fr:link
type="external"
href="https://q.uiver.app/">quiver</fr:link> diagrams. Note that you must remove the surrounding <fr:code><![CDATA[\[...\]]]></fr:code> from the quiver export, or you will get weird LaTeX errors.</fr:p></fr:mainmatter><fr:backmatter /></fr:tree></fr:mainmatter><fr:backmatter /></fr:tree><fr:tree
toc="true"
numbered="true"
show-heading="true"
show-metadata="false"
expanded="true"
root="false"
xmlns:fr="http://www.jonmsterling.com/jms-005P.xml"><fr:frontmatter><fr:anchor>2821</fr:anchor><fr:addr>lc-0007</fr:addr><fr:route>lc-0007.xml</fr:route><fr:title>References and Transclusions</fr:title><fr:authors><fr:author><fr:link
type="local"
href="owen-lynch.xml"
addr="owen-lynch"
title="Owen Lynch">Owen Lynch</fr:link></fr:author></fr:authors></fr:frontmatter><fr:mainmatter><fr:p>In this section, we discuss how to handle ideas that are not contained in a single file in quiver.</fr:p><fr:tree
toc="true"
numbered="true"
show-heading="true"
show-metadata="false"
expanded="true"
root="false"
xmlns:fr="http://www.jonmsterling.com/jms-005P.xml"><fr:frontmatter><fr:anchor>2823</fr:anchor><fr:addr>lc-000B</fr:addr><fr:route>lc-000B.xml</fr:route><fr:title>Links</fr:title><fr:authors /></fr:frontmatter><fr:mainmatter><fr:p>The easiest way to connect ideas is via links! Forester supports several different types of links. The simplest is markdown-style links, written like <fr:code><![CDATA[[link title](https://linkaddress.com)]]></fr:code>. Because linking to the nlab is so common in localcharts, we also have a special macro <fr:code><![CDATA[\nlab{...}]]></fr:code> (when you have <fr:code><![CDATA[\import{macros}]]></fr:code> at the top of your file) for linking to nlab pages by their title, tastefully colored in that special nlab green like so: <html:span
xmlns:html="http://www.w3.org/1999/xhtml"
class="nlab"><fr:link
type="external"
href="https://ncatlab.org/nlab/show/Double%20category">Double category</fr:link></html:span>.</fr:p><fr:p>Additionally, pages within the same forest can be referenced just by their tag, as in <fr:code><![CDATA[[Home page](lc-0001)]]></fr:code>, or "wikilink style" with <fr:code><![CDATA[[[lc-0001]]]]></fr:code>, which produces a link titled by the title of the referred page, like so: <fr:link
type="local"
href="lc-0001.xml"
addr="lc-0001"
title="LocalCharts Forest">LocalCharts Forest</fr:link>. Note that internal links have a dotted underline. Moreover, on a given page <fr:tex
display="inline"><![CDATA[X]]></fr:tex>, one can see all of the other pages that point to <fr:tex
display="inline"><![CDATA[X]]></fr:tex> via internal links.</fr:p></fr:mainmatter><fr:backmatter /></fr:tree><fr:tree
toc="true"
numbered="true"
show-heading="true"
show-metadata="false"
expanded="true"
root="false"
xmlns:fr="http://www.jonmsterling.com/jms-005P.xml"><fr:frontmatter><fr:anchor>2825</fr:anchor><fr:addr>lc-000C</fr:addr><fr:route>lc-000C.xml</fr:route><fr:title>Transclusion</fr:title><fr:authors /></fr:frontmatter><fr:mainmatter><fr:p>Transclusion includes the content of one file into another file. The basic command for transcludes is <fr:code><![CDATA[\transclude{namespace-XXXX}]]></fr:code>. This is similar to the <fr:link
type="external"
href="https://www.overleaf.com/learn/latex/Multi-file_LaTeX_projects">LaTeX support for multi-file projects</fr:link>, but is used much more pervasively in forester. For instance, instead of a <fr:code><![CDATA[\section{...}]]></fr:code> command, the general practice is to make each section a separate <fr:code>.tree</fr:code> file, and have the larger document <fr:code><![CDATA[\transclude]]></fr:code> them.</fr:p><fr:p>This is also how mathematical environments are supported. What in LaTeX would be something like:</fr:p><fr:pre><![CDATA[\begin{definition}
  ....
\end{definition}]]></fr:pre><fr:p>in forester is generally accomplished by creating separate <fr:code>.tree</fr:code> file with <fr:code><![CDATA[\taxon{definition}]]></fr:code> at the top. When transcluded, this looks like a definition environment. For example:</fr:p><fr:tree
toc="true"
numbered="true"
show-heading="true"
show-metadata="false"
expanded="true"
root="false"
xmlns:fr="http://www.jonmsterling.com/jms-005P.xml"><fr:frontmatter><fr:anchor>2826</fr:anchor><fr:addr>ocl-0015</fr:addr><fr:route>ocl-0015.xml</fr:route><fr:title>Discrete Interval Category</fr:title><fr:taxon>Definition</fr:taxon><fr:date><fr:year>2024</fr:year><fr:month>2</fr:month><fr:day>1</fr:day></fr:date><fr:authors /></fr:frontmatter><fr:mainmatter><fr:p>The <fr:strong>discrete interval category</fr:strong> <fr:tex
display="inline"><![CDATA[\mathbb {I}_0]]></fr:tex> is the category where objects are sets <fr:tex
display="inline"><![CDATA[\{0,\ldots ,n\}]]></fr:tex>, and a morphism from <fr:tex
display="inline"><![CDATA[\{0,\ldots ,n\}]]></fr:tex> to <fr:tex
display="inline"><![CDATA[\{0,\ldots ,m\}]]></fr:tex> is a choice <fr:tex
display="inline"><![CDATA[0 \leq  k \leq  m]]></fr:tex> such that <fr:tex
display="inline"><![CDATA[k + n \leq  m]]></fr:tex>. In other words, it is a map that preserves the linear order and metric structure.</fr:p></fr:mainmatter><fr:backmatter /></fr:tree><fr:p>In general, <fr:code><![CDATA[\taxon{...}]]></fr:code> is used to designate the type of a tree, like definition, lemma, theorem, etc., but also non-standard ones like person, institute, reference. You can search for <fr:code>taxon</fr:code> in the LocalCharts forest to see how it is used.</fr:p><fr:p>Splitting up your writing between so many files can be a pain, but there is a reason behind it. The philosophy behind forester is that in order to pedagogically present mathematics, it is necessary to order the web of linked concepts in some logical manner. However, this order is non-canonical. Therefore, we should support multiple orderings.</fr:p><fr:p>From a more practical perspective, one gets tired at a certain point of clearing one's throat in the same manner every time one starts a new paper or blog post, reviewing similar definitions to get the reader up to speed. Being able to reuse parts of a document can alleviate this.</fr:p><fr:p>With transcludes, there is also yet another type of linking: a <fr:link
type="external"
href="https://ctan.org/pkg/cleveref?lang=en">cleveref</fr:link> style <fr:code><![CDATA[\ref{...}]]></fr:code> command, which produces references like <fr:ref
addr="ocl-0015"
taxon="Definition" /> when the referenced item is contained within the current tree, and <fr:ref
addr="ocl-000O"
taxon="Definition" /> when the referenced item is not contained within the current tree.</fr:p></fr:mainmatter><fr:backmatter /></fr:tree><fr:tree
toc="true"
numbered="true"
show-heading="true"
show-metadata="false"
expanded="true"
root="false"
xmlns:fr="http://www.jonmsterling.com/jms-005P.xml"><fr:frontmatter><fr:anchor>2827</fr:anchor><fr:addr>lc-000D</fr:addr><fr:route>lc-000D.xml</fr:route><fr:title>Bibliographies</fr:title><fr:authors /></fr:frontmatter><fr:mainmatter><fr:p>Bibliographic citations are just trees with <fr:code><![CDATA[\taxon{reference}]]></fr:code> at the top. See <fr:link
type="external"
href="https://github.com/LocalCharts/forest/tree/main/trees/refs">here</fr:link> for examples of how to write these. Whenever a reference is linked to in a tree, the bibliographic information appears at the bottom of the page. For instance, I can link to <fr:link
type="local"
href="anel-joyal-topo-logie-2021.xml"
addr="anel-joyal-topo-logie-2021"
title="Topo-logie">Topo-logie</fr:link> and the formatted citation should appear at the bottom of this page.</fr:p></fr:mainmatter><fr:backmatter /></fr:tree></fr:mainmatter><fr:backmatter /></fr:tree><fr:tree
toc="true"
numbered="true"
show-heading="true"
show-metadata="false"
expanded="true"
root="false"
xmlns:fr="http://www.jonmsterling.com/jms-005P.xml"><fr:frontmatter><fr:anchor>2828</fr:anchor><fr:addr>lc-0008</fr:addr><fr:route>lc-0008.xml</fr:route><fr:title>Macros</fr:title><fr:authors><fr:author><fr:link
type="local"
href="owen-lynch.xml"
addr="owen-lynch"
title="Owen Lynch">Owen Lynch</fr:link></fr:author></fr:authors></fr:frontmatter><fr:mainmatter><fr:p>One of the main reasons that I chose forester of all the ways of writing math on the web was its support for macros. It pains the soul to have to write <fr:code><![CDATA[\mathsf{Cat}]]></fr:code> all the time; I just want to write <fr:code><![CDATA[\Cat]]></fr:code>!</fr:p><fr:p>Macro definition is similar to LaTeX, but with two changes. The first change is that it uses <fr:code><![CDATA[\def]]></fr:code> instead of <fr:code><![CDATA[\newcommand]]></fr:code>. Recall that <fr:code><![CDATA[\def]]></fr:code> was the original syntax in TeX, but had some warts, so LaTeX had to change to <fr:code><![CDATA[\newcommand]]></fr:code>, so this is really just going back to the roots of TeX. The second change is that arguments are named instead of numbered. For instance, instead of</fr:p><fr:pre><![CDATA[\newcommand\innerproduct[2]{\langle #1, #2 \rangle}]]></fr:pre><fr:p>you would use</fr:p><fr:pre><![CDATA[\def\innerproduct[x][y]{\langle \x, \y \rangle}]]></fr:pre><fr:p>You can take a look at <fr:link
type="external"
href="https://github.com/LocalCharts/forest/blob/main/trees/macros.tree">macros.tree</fr:link> for the LocalCharts "macro standard library". To use this in one of your trees, you must have <fr:code><![CDATA[\import{macros}]]></fr:code> at the top. Finally, note that the same macro definition works in prose, within <fr:code><![CDATA[ #{...}]]></fr:code> or <fr:code><![CDATA[ ##{...}]]></fr:code>, and also within <fr:code><![CDATA[\tex{...}{...}]]></fr:code>, so you can use the same math abbreviations in your inline equations and in your commutative diagrams, just like you would in a real LaTeX document.</fr:p></fr:mainmatter><fr:backmatter /></fr:tree><fr:tree
toc="true"
numbered="true"
show-heading="true"
show-metadata="false"
expanded="true"
root="false"
xmlns:fr="http://www.jonmsterling.com/jms-005P.xml"><fr:frontmatter><fr:anchor>2830</fr:anchor><fr:addr>lc-000E</fr:addr><fr:route>lc-000E.xml</fr:route><fr:title>Frontmatter</fr:title><fr:authors /></fr:frontmatter><fr:mainmatter><fr:p>You may have noticed that there are certain commands that tend to go at the top of documents, like <fr:code><![CDATA[\title{...}]]></fr:code>, <fr:code><![CDATA[\author{...}]]></fr:code>, etc. These are the <fr:em>frontmatter</fr:em> of the document, and provide metadata for the content.</fr:p><fr:p>Most frontmatter commands can be found <fr:link
type="external"
href="http://www.jonmsterling.com/jms-007P.xml">here</fr:link>.</fr:p><fr:p>In this section, we document some other useful frontmatter commands not covered in the above.</fr:p><fr:p>One important command for bibliographical trees is <fr:code><![CDATA[\meta{...}{...}]]></fr:code>. This is used for many sorts of metadata, like <fr:code>doi</fr:code>, <fr:code>institution</fr:code> (used on author pages), <fr:code>external</fr:code> (used to provide an external url, such as a link to a pdf). Particularly important for localcharts is <fr:code><![CDATA[\meta{comments}{true}]]></fr:code>, which enables the discourse integration on a particular tree so that the tree is automatically crossposted the first time it is visited, and comments from the forum show up beneath it.</fr:p><fr:p>Another useful command is <fr:code><![CDATA[\tag{...}]]></fr:code>. This command is used to add "tags" to a page which might give some hints as to the subject matter. Tags are not displayed on the page, but pages can be <fr:link
type="external"
href="http://www.jonmsterling.com/jms-006A.xml">queried</fr:link> by tag. This is very useful for producing bibliographies of references on a certain subject, as I did <fr:link
type="local"
href="ocl-000I.xml"
addr="ocl-000I"
title="Resources and References for Data Definition Languages">here</fr:link>.</fr:p></fr:mainmatter><fr:backmatter /></fr:tree><fr:p>That's all for now; it's time for you to go forth and write some math!</fr:p></fr:mainmatter><fr:backmatter><fr:tree
toc="false"
numbered="false"
show-heading="true"
show-metadata="false"
expanded="true"
root="false"
xmlns:fr="http://www.jonmsterling.com/jms-005P.xml"><fr:frontmatter><fr:title>References</fr:title><fr:authors /></fr:frontmatter><fr:mainmatter><fr:tree
toc="true"
numbered="false"
show-heading="true"
show-metadata="true"
expanded="false"
root="false"
xmlns:fr="http://www.jonmsterling.com/jms-005P.xml"><fr:frontmatter><fr:anchor>2999</fr:anchor><fr:addr>anel-joyal-topo-logie-2021</fr:addr><fr:route>anel-joyal-topo-logie-2021.xml</fr:route><fr:title>Topo-logie</fr:title><fr:taxon>Reference</fr:taxon><fr:authors><fr:author><fr:link
type="local"
href="mathieu-anel.xml"
addr="mathieu-anel"
title="Mathieu Anel">Mathieu Anel</fr:link></fr:author><fr:author><fr:link
type="local"
href="andre-joyal.xml"
addr="andre-joyal"
title="André Joyal">André Joyal</fr:link></fr:author></fr:authors><fr:meta
name="doi">10.1017/9781108854429.007 </fr:meta></fr:frontmatter><fr:mainmatter>
  <fr:tree
toc="true"
numbered="true"
show-heading="true"
show-metadata="false"
expanded="true"
root="false"
xmlns:fr="http://www.jonmsterling.com/jms-005P.xml"><fr:frontmatter><fr:anchor>3002</fr:anchor><fr:addr>#947</fr:addr><fr:route>unstable-947.xml</fr:route><fr:title>Notes.</fr:title><fr:authors><fr:author><fr:link
type="local"
href="mathieu-anel.xml"
addr="mathieu-anel"
title="Mathieu Anel">Mathieu Anel</fr:link></fr:author><fr:author><fr:link
type="local"
href="andre-joyal.xml"
addr="andre-joyal"
title="André Joyal">André Joyal</fr:link></fr:author></fr:authors><fr:parent>anel-joyal-topo-logie-2021</fr:parent></fr:frontmatter><fr:mainmatter>
  <fr:ul><fr:li>Great translation table between logic and logoi. (pg. 9)</fr:li>
    <fr:li>The Sierpinski locale is the free frame on one generator. (pg. 13)</fr:li>
    <fr:li>The poset of open subsets of a closed set <fr:tex
display="inline"><![CDATA[Z \subset  X]]></fr:tex>, where <fr:tex
display="inline"><![CDATA[Z = X \setminus  U]]></fr:tex>, is the coslice of <fr:tex
display="inline"><![CDATA[\mathcal {O}(X)]]></fr:tex> under <fr:tex
display="inline"><![CDATA[U]]></fr:tex>: open subsets of <fr:tex
display="inline"><![CDATA[Z]]></fr:tex> are in canonical bijection with open subsets of <fr:tex
display="inline"><![CDATA[X]]></fr:tex> containing <fr:tex
display="inline"><![CDATA[U]]></fr:tex>. (pg. 15)</fr:li></fr:ul>
</fr:mainmatter><fr:backmatter /></fr:tree>
</fr:mainmatter><fr:backmatter /></fr:tree></fr:mainmatter><fr:backmatter /></fr:tree><fr:tree
toc="false"
numbered="false"
show-heading="true"
show-metadata="false"
expanded="true"
root="false"
xmlns:fr="http://www.jonmsterling.com/jms-005P.xml"><fr:frontmatter><fr:title>Backlinks</fr:title><fr:authors /></fr:frontmatter><fr:mainmatter><fr:tree
toc="true"
numbered="false"
show-heading="true"
show-metadata="true"
expanded="false"
root="false"
xmlns:fr="http://www.jonmsterling.com/jms-005P.xml"><fr:frontmatter><fr:anchor>3005</fr:anchor><fr:addr>aria-0001</fr:addr><fr:route>aria-0001.xml</fr:route><fr:title>Formal and Informal Collaboration</fr:title><fr:date><fr:year>2024</fr:year><fr:month>3</fr:month><fr:day>4</fr:day></fr:date><fr:authors><fr:author><fr:link
type="local"
href="owen-lynch.xml"
addr="owen-lynch"
title="Owen Lynch">Owen Lynch</fr:link></fr:author></fr:authors><fr:meta
name="institute">Topos Institute</fr:meta><fr:meta
name="subtitle">A presentation at Davidad's second ARIA workshop</fr:meta><fr:meta
name="comments">true</fr:meta></fr:frontmatter><fr:mainmatter><fr:tree
toc="true"
numbered="true"
show-heading="true"
show-metadata="false"
expanded="true"
root="false"
xmlns:fr="http://www.jonmsterling.com/jms-005P.xml"><fr:frontmatter><fr:anchor>2591</fr:anchor><fr:addr>#249</fr:addr><fr:route>unstable-249.xml</fr:route><fr:title>Overview</fr:title><fr:taxon>Slide</fr:taxon><fr:date><fr:year>2024</fr:year><fr:month>3</fr:month><fr:day>4</fr:day></fr:date><fr:authors><fr:author><fr:link
type="local"
href="owen-lynch.xml"
addr="owen-lynch"
title="Owen Lynch">Owen Lynch</fr:link></fr:author></fr:authors><fr:parent>aria-0001</fr:parent></fr:frontmatter><fr:mainmatter>
  <fr:p>Follow along at <fr:link
type="external"
href="https://forest.localcharts.org/aria-0001.xml">forest.localcharts.org/aria-0001.xml</fr:link>!</fr:p>

  <fr:ol><fr:li>Motivation</fr:li>
    <fr:li>Informal collaboration</fr:li>
    <fr:li>Formal collaboration</fr:li></fr:ol>

  <fr:tree
toc="true"
numbered="true"
show-heading="true"
show-metadata="false"
expanded="true"
root="false"
xmlns:fr="http://www.jonmsterling.com/jms-005P.xml"><fr:frontmatter><fr:anchor>2593</fr:anchor><fr:addr>#248</fr:addr><fr:route>unstable-248.xml</fr:route><fr:taxon>Notes</fr:taxon><fr:date><fr:year>2024</fr:year><fr:month>3</fr:month><fr:day>4</fr:day></fr:date><fr:authors><fr:author><fr:link
type="local"
href="owen-lynch.xml"
addr="owen-lynch"
title="Owen Lynch">Owen Lynch</fr:link></fr:author></fr:authors><fr:parent>aria-0001</fr:parent><fr:meta
name="toc">false</fr:meta></fr:frontmatter><fr:mainmatter>
    <fr:p>This is the source document for my talk at Davidad's second ARIA workshop in Birmingham on safe-by-design AI. From this document, I produce the <fr:link
type="external"
href="/aria-0001.pdf">pdf presentation slides</fr:link> and this HTML forester page.</fr:p>
  </fr:mainmatter><fr:backmatter /></fr:tree>
</fr:mainmatter><fr:backmatter /></fr:tree><fr:tree
toc="true"
numbered="true"
show-heading="true"
show-metadata="false"
expanded="true"
root="false"
xmlns:fr="http://www.jonmsterling.com/jms-005P.xml"><fr:frontmatter><fr:anchor>2595</fr:anchor><fr:addr>#251</fr:addr><fr:route>unstable-251.xml</fr:route><fr:title>Motivation: What does success mean?</fr:title><fr:taxon>Slide</fr:taxon><fr:date><fr:year>2024</fr:year><fr:month>3</fr:month><fr:day>4</fr:day></fr:date><fr:authors><fr:author><fr:link
type="local"
href="owen-lynch.xml"
addr="owen-lynch"
title="Owen Lynch">Owen Lynch</fr:link></fr:author></fr:authors><fr:parent>aria-0001</fr:parent></fr:frontmatter><fr:mainmatter>

  
  <fr:p>Successful implementation of <fr:link
type="external"
href="https://www.aria.org.uk/wp-content/uploads/2024/01/ARIA-Safeguarded-AI-Programme-Thesis-V1.pdf">Davidad's program thesis</fr:link> over the next 3 years implies something like</fr:p>

  <fr:ul><fr:li>Several new fields worth of novel math research</fr:li>
    <fr:li><fr:tex
display="inline"><![CDATA[>]]></fr:tex>1,000,000 lines of code</fr:li></fr:ul>

  <html:pause
xmlns:html="http://www.w3.org/1999/xhtml" />

  <fr:p>This is only possible if we either:</fr:p>

  <fr:ul><fr:li>Clone Urs and ekmett a couple of times and form them into an (aligned) borg-like mindmass, or</fr:li>
    <html:pause
xmlns:html="http://www.w3.org/1999/xhtml" />
    <fr:li>Get really good at collaboration.</fr:li></fr:ul>

  <fr:tree
toc="true"
numbered="true"
show-heading="true"
show-metadata="false"
expanded="true"
root="false"
xmlns:fr="http://www.jonmsterling.com/jms-005P.xml"><fr:frontmatter><fr:anchor>2599</fr:anchor><fr:addr>#250</fr:addr><fr:route>unstable-250.xml</fr:route><fr:taxon>Notes</fr:taxon><fr:date><fr:year>2024</fr:year><fr:month>3</fr:month><fr:day>4</fr:day></fr:date><fr:authors><fr:author><fr:link
type="local"
href="owen-lynch.xml"
addr="owen-lynch"
title="Owen Lynch">Owen Lynch</fr:link></fr:author></fr:authors><fr:parent>aria-0001</fr:parent><fr:meta
name="toc">false</fr:meta></fr:frontmatter><fr:mainmatter>
    <fr:p>The code also needs to be correct and efficient.</fr:p>
  </fr:mainmatter><fr:backmatter /></fr:tree>
</fr:mainmatter><fr:backmatter /></fr:tree><fr:tree
toc="true"
numbered="true"
show-heading="true"
show-metadata="false"
expanded="true"
root="false"
xmlns:fr="http://www.jonmsterling.com/jms-005P.xml"><fr:frontmatter><fr:anchor>2601</fr:anchor><fr:addr>#253</fr:addr><fr:route>unstable-253.xml</fr:route><fr:title>Motivation: Current de-facto standards for collaboration</fr:title><fr:taxon>Slide</fr:taxon><fr:date><fr:year>2024</fr:year><fr:month>3</fr:month><fr:day>4</fr:day></fr:date><fr:authors><fr:author><fr:link
type="local"
href="owen-lynch.xml"
addr="owen-lynch"
title="Owen Lynch">Owen Lynch</fr:link></fr:author></fr:authors><fr:parent>aria-0001</fr:parent></fr:frontmatter><fr:mainmatter>
  <fr:ul><fr:li>Informal technical writing: overleaf+arXiv</fr:li>
    <fr:li>Technical computing: github repositories containing arbitrary code</fr:li></fr:ul>

  <fr:tree
toc="true"
numbered="true"
show-heading="true"
show-metadata="false"
expanded="true"
root="false"
xmlns:fr="http://www.jonmsterling.com/jms-005P.xml"><fr:frontmatter><fr:anchor>2603</fr:anchor><fr:addr>#252</fr:addr><fr:route>unstable-252.xml</fr:route><fr:taxon>Notes</fr:taxon><fr:date><fr:year>2024</fr:year><fr:month>3</fr:month><fr:day>4</fr:day></fr:date><fr:authors><fr:author><fr:link
type="local"
href="owen-lynch.xml"
addr="owen-lynch"
title="Owen Lynch">Owen Lynch</fr:link></fr:author></fr:authors><fr:parent>aria-0001</fr:parent><fr:meta
name="toc">false</fr:meta></fr:frontmatter><fr:mainmatter>
    <fr:p>If you are really lucky, the github repository will be a maintained package installable through a package manager, and if you are really really lucky, the maintainer won't graduate in a year and forget about it.</fr:p>
  </fr:mainmatter><fr:backmatter /></fr:tree>
</fr:mainmatter><fr:backmatter /></fr:tree><fr:tree
toc="true"
numbered="true"
show-heading="true"
show-metadata="false"
expanded="true"
root="false"
xmlns:fr="http://www.jonmsterling.com/jms-005P.xml"><fr:frontmatter><fr:anchor>2605</fr:anchor><fr:addr>#255</fr:addr><fr:route>unstable-255.xml</fr:route><fr:title>Informal collaboration: options</fr:title><fr:taxon>Hiddenslide</fr:taxon><fr:date><fr:year>2024</fr:year><fr:month>3</fr:month><fr:day>4</fr:day></fr:date><fr:authors><fr:author><fr:link
type="local"
href="owen-lynch.xml"
addr="owen-lynch"
title="Owen Lynch">Owen Lynch</fr:link></fr:author></fr:authors><fr:parent>aria-0001</fr:parent></fr:frontmatter><fr:mainmatter>
  <fr:ul><fr:li>Papers: too slow, standalone.</fr:li>
    <fr:li>Blog posts: better as advertisements/summaries for a larger audience. Also usually fairly standalone.</fr:li>
    <fr:li>Slack/zulip: too fragmented, too short</fr:li>
    <fr:li><fr:link
type="external"
href="https://roamresearch.com/">Roam Research</fr:link>: not designed for real <html:inquotes
xmlns:html="http://www.w3.org/1999/xhtml">book-length</html:inquotes> mathematics.</fr:li>
    <fr:li><fr:link
type="external"
href="https://ncatlab.org/nlab/show/HomePage">nLab</fr:link>: past attempts to encourage people other than Urs to do novel math on the nLab have failed, unclear why</fr:li>
    <fr:li><fr:link
type="external"
href="https://gerby-project.github.io/">Gerby</fr:link> (stacks project software): powers arguably one of the most successful giant mathematical collaborations in history. Not explorative, janky</fr:li>
    <fr:li><fr:link
type="external"
href="link">Forester</fr:link>... just might work??</fr:li></fr:ul>


  <fr:tree
toc="true"
numbered="true"
show-heading="true"
show-metadata="false"
expanded="true"
root="false"
xmlns:fr="http://www.jonmsterling.com/jms-005P.xml"><fr:frontmatter><fr:anchor>2608</fr:anchor><fr:addr>#254</fr:addr><fr:route>unstable-254.xml</fr:route><fr:taxon>Notes</fr:taxon><fr:date><fr:year>2024</fr:year><fr:month>3</fr:month><fr:day>4</fr:day></fr:date><fr:authors><fr:author><fr:link
type="local"
href="owen-lynch.xml"
addr="owen-lynch"
title="Owen Lynch">Owen Lynch</fr:link></fr:author></fr:authors><fr:parent>aria-0001</fr:parent><fr:meta
name="toc">false</fr:meta></fr:frontmatter><fr:mainmatter>
    <fr:p>I've thought about this a lot: see a more complete survey <fr:link
type="external"
href="https://www.localcharts.org/t/desiderata-for-an-adequate-scientific-publishing-platform/11367">here</fr:link>.</fr:p>
  </fr:mainmatter><fr:backmatter /></fr:tree>
</fr:mainmatter><fr:backmatter /></fr:tree><fr:tree
toc="true"
numbered="true"
show-heading="true"
show-metadata="false"
expanded="true"
root="false"
xmlns:fr="http://www.jonmsterling.com/jms-005P.xml"><fr:frontmatter><fr:anchor>2610</fr:anchor><fr:addr>#257</fr:addr><fr:route>unstable-257.xml</fr:route><fr:title>Informal collaboration: A dream</fr:title><fr:taxon>Slide</fr:taxon><fr:date><fr:year>2024</fr:year><fr:month>3</fr:month><fr:day>4</fr:day></fr:date><fr:authors><fr:author><fr:link
type="local"
href="owen-lynch.xml"
addr="owen-lynch"
title="Owen Lynch">Owen Lynch</fr:link></fr:author></fr:authors><fr:parent>aria-0001</fr:parent></fr:frontmatter><fr:mainmatter>
  <fr:ul><fr:li>Monday morning (UK time): DJM writes down new definition</fr:li>
    <fr:li>Monday afternoon (EU time): Matteo adds some key lemmas</fr:li>
    <fr:li>Monday afternoon (Pacific time): Sophie spots hole</fr:li>
    <fr:li>Tuesday morning (EU time): A long-time lurker comments for the first time on idea for patching hole</fr:li>
    <fr:li>... <html:pause
xmlns:html="http://www.w3.org/1999/xhtml" /></fr:li>
    <fr:li>By Thursday night: Enough material for a paper</fr:li>
    <fr:li>Friday morning (UK time): Organize material into a paper by writing an abstract, collating background+new material into a reasonable order, and then exporting to arXiv-compatible LaTeX. All authors of transcluded material notified and given a chance to review.</fr:li>
    <fr:li>Friday afternoon (UK time): pub.</fr:li></fr:ul>
  <fr:tree
toc="true"
numbered="true"
show-heading="true"
show-metadata="false"
expanded="true"
root="false"
xmlns:fr="http://www.jonmsterling.com/jms-005P.xml"><fr:frontmatter><fr:anchor>2613</fr:anchor><fr:addr>#256</fr:addr><fr:route>unstable-256.xml</fr:route><fr:taxon>Notes</fr:taxon><fr:date><fr:year>2024</fr:year><fr:month>3</fr:month><fr:day>4</fr:day></fr:date><fr:authors><fr:author><fr:link
type="local"
href="owen-lynch.xml"
addr="owen-lynch"
title="Owen Lynch">Owen Lynch</fr:link></fr:author></fr:authors><fr:parent>aria-0001</fr:parent><fr:meta
name="toc">false</fr:meta></fr:frontmatter><fr:mainmatter>
    <fr:p>AND THEN WE DO IT AGAIN THE NEXT WEEK.</fr:p>
  </fr:mainmatter><fr:backmatter /></fr:tree>
</fr:mainmatter><fr:backmatter /></fr:tree><fr:tree
toc="true"
numbered="true"
show-heading="true"
show-metadata="false"
expanded="true"
root="false"
xmlns:fr="http://www.jonmsterling.com/jms-005P.xml"><fr:frontmatter><fr:anchor>2615</fr:anchor><fr:addr>#259</fr:addr><fr:route>unstable-259.xml</fr:route><fr:title>Informal collaboration: How does forester work?</fr:title><fr:taxon>Slide</fr:taxon><fr:date><fr:year>2024</fr:year><fr:month>3</fr:month><fr:day>4</fr:day></fr:date><fr:authors><fr:author><fr:link
type="local"
href="owen-lynch.xml"
addr="owen-lynch"
title="Owen Lynch">Owen Lynch</fr:link></fr:author></fr:authors><fr:parent>aria-0001</fr:parent></fr:frontmatter><fr:mainmatter>
  <fr:p><fr:link
type="external"
href="http://www.jonmsterling.com/jms-005P.xml">Forester</fr:link> takes a collection of files with TeX-like syntax and produces both a static website and LaTeX.</fr:p>

  <fr:p>Key features:</fr:p>

  <fr:ul><fr:li>Transclusion</fr:li>
    <fr:li>Linking, backlinking, and citation</fr:li>
    <fr:li>Macros</fr:li>
    <fr:li>TikZ<fr:tex
display="inline"><![CDATA[\to ]]></fr:tex>SVG</fr:li>
    <fr:li>Customizable LaTeX export</fr:li>
    <fr:li>Better error messages than LaTeX</fr:li></fr:ul>

  <fr:tree
toc="true"
numbered="true"
show-heading="true"
show-metadata="false"
expanded="true"
root="false"
xmlns:fr="http://www.jonmsterling.com/jms-005P.xml"><fr:frontmatter><fr:anchor>2617</fr:anchor><fr:addr>#258</fr:addr><fr:route>unstable-258.xml</fr:route><fr:taxon>Notes</fr:taxon><fr:date><fr:year>2024</fr:year><fr:month>3</fr:month><fr:day>4</fr:day></fr:date><fr:authors><fr:author><fr:link
type="local"
href="owen-lynch.xml"
addr="owen-lynch"
title="Owen Lynch">Owen Lynch</fr:link></fr:author></fr:authors><fr:parent>aria-0001</fr:parent><fr:meta
name="toc">false</fr:meta></fr:frontmatter><fr:mainmatter>
    <fr:p><fr:link
type="local"
href="lc-0002.xml"
addr="lc-0002"
title="Forester for the Woodland Skeptic">Forester for the Woodland Skeptic</fr:link> is an introduction to forester for localcharts, and the official introduction is <fr:link
type="external"
href="http://www.jonmsterling.com/jms-0052.xml">Build your own Stacks Project in 10 minutes</fr:link>. You can see the <fr:link
type="external"
href="https://codeberg.org/LocalCharts/forest">README</fr:link></fr:p>

    <fr:ul><fr:li>Transclusion: the operad of writing</fr:li>
      <fr:li>Linking, backlinking, and citation: the best organization method known to humanity</fr:li>
      <fr:li>Macros: separation of intent from style</fr:li>
      <fr:li>TikZ<fr:tex
display="inline"><![CDATA[\to ]]></fr:tex>SVG: diagrams, diagrams everywhere</fr:li>
      <fr:li>Customizable LaTeX export: the magic of XML</fr:li>
      <fr:li>Better error messages than LaTeX</fr:li></fr:ul>

    <fr:p>Definitions, theorems, sections, references, etc. are all separate units (called trees) in Forester which can be freely included into other documents via <fr:em>transclusion</fr:em>, possibly recursively.</fr:p>

    <fr:p>In addition to transclusion, you can also just link other pages, which will automatically show up as a link to, say, Definition 3.4 if it happens to be on the same page, or Definition [double-category] if not. Each tree records which other trees link to it, and displays those trees at the bottom.</fr:p>

    <fr:p>Forester mimics the LaTeX macro system, and expands a single macro definition within text, inline math (which is displayed via KaTeX), and TikZ that gets compiled to svg. Macros also are tree-local rather than global to the whole forest, though one tree can import the macros from another tree.</fr:p>

    <fr:p>Specifically, you can just copy-paste commutative diagrams from quiver into forester.</fr:p>
  </fr:mainmatter><fr:backmatter /></fr:tree>
</fr:mainmatter><fr:backmatter /></fr:tree><fr:tree
toc="true"
numbered="true"
show-heading="true"
show-metadata="false"
expanded="true"
root="false"
xmlns:fr="http://www.jonmsterling.com/jms-005P.xml"><fr:frontmatter><fr:anchor>2619</fr:anchor><fr:addr>#261</fr:addr><fr:route>unstable-261.xml</fr:route><fr:title>Informal collaboration: Just add (more) users</fr:title><fr:taxon>Slide</fr:taxon><fr:date><fr:year>2024</fr:year><fr:month>3</fr:month><fr:day>4</fr:day></fr:date><fr:authors><fr:author><fr:link
type="local"
href="owen-lynch.xml"
addr="owen-lynch"
title="Owen Lynch">Owen Lynch</fr:link></fr:author></fr:authors><fr:parent>aria-0001</fr:parent></fr:frontmatter><fr:mainmatter>
  <fr:p><fr:link
type="external"
href="https://www.localcharts.org/t/localcharts-is-live/5714">LocalCharts is live!</fr:link></fr:p>

  <fr:ul><fr:li>Medium-sized forum</fr:li>
    <fr:li>Small but growing forester instance</fr:li>
    <fr:li>This talk built via forester</fr:li>
    <fr:li>Compatible with UK law for government projects</fr:li></fr:ul>
  <fr:tree
toc="true"
numbered="true"
show-heading="true"
show-metadata="false"
expanded="true"
root="false"
xmlns:fr="http://www.jonmsterling.com/jms-005P.xml"><fr:frontmatter><fr:anchor>2621</fr:anchor><fr:addr>#260</fr:addr><fr:route>unstable-260.xml</fr:route><fr:taxon>Notes</fr:taxon><fr:date><fr:year>2024</fr:year><fr:month>3</fr:month><fr:day>4</fr:day></fr:date><fr:authors><fr:author><fr:link
type="local"
href="owen-lynch.xml"
addr="owen-lynch"
title="Owen Lynch">Owen Lynch</fr:link></fr:author></fr:authors><fr:parent>aria-0001</fr:parent><fr:meta
name="toc">false</fr:meta></fr:frontmatter><fr:mainmatter>
    <fr:p>I have spent the last year (actually funnily enough starting with the first time I met Davidad) setting up the <fr:link
type="external"
href="link%20localcharts%20is%20live">localcharts</fr:link> ecosystem, which includes a <fr:link
type="external"
href="https://docs.localcharts.org">collaborative markdown editor</fr:link>, a <fr:link
type="external"
href="https://www.localcharts.org">discourse server</fr:link>, and an automated build system for forester which builds <fr:link
type="external"
href="https://forest.localcharts.org">the localcharts forest</fr:link> from its <fr:link
type="external"
href="https://github.com/LocalCharts/forest">git repository</fr:link>.</fr:p>
    <fr:p>We have <fr:link
type="local"
href="lc-0002.xml"
addr="lc-0002"
title="Forester for the Woodland Skeptic">docs on how to use the localcharts forest</fr:link>.</fr:p>
    <fr:p>And the whole system runs on (EU/UK)-hosted services, fit for use in a program sponsored by the UK government.</fr:p>
  </fr:mainmatter><fr:backmatter /></fr:tree>
</fr:mainmatter><fr:backmatter /></fr:tree><fr:tree
toc="true"
numbered="true"
show-heading="true"
show-metadata="false"
expanded="true"
root="false"
xmlns:fr="http://www.jonmsterling.com/jms-005P.xml"><fr:frontmatter><fr:anchor>2623</fr:anchor><fr:addr>#263</fr:addr><fr:route>unstable-263.xml</fr:route><fr:title>Formal collaboration: Math on the computer</fr:title><fr:taxon>Slide</fr:taxon><fr:date><fr:year>2024</fr:year><fr:month>3</fr:month><fr:day>4</fr:day></fr:date><fr:authors><fr:author><fr:link
type="local"
href="owen-lynch.xml"
addr="owen-lynch"
title="Owen Lynch">Owen Lynch</fr:link></fr:author></fr:authors><fr:parent>aria-0001</fr:parent></fr:frontmatter><fr:mainmatter>
  <fr:p>What does it mean to do math on the computer?</fr:p>

  <fr:ul><fr:li>Logician: propositions as types.
      <fr:ul><fr:li>Characteristic Algorithms: Martin-Lof type checking</fr:li>
        <fr:li>Programming languages: Isabelle, Lean, Coq, Agda</fr:li></fr:ul></fr:li>
    <fr:li>Algebraist: Symbolic rewriting
      <fr:ul><fr:li>Characteristic Algorithms: Groebner bases, e-graphs</fr:li>
        <fr:li>Programming languages: Mathematica, Macaulay2, OBJ3, Z3</fr:li></fr:ul></fr:li>
    <fr:li>Engineer/statistician: Numerical computing
      <fr:ul><fr:li>Characteristic Algorithms: Euler's method, MCMC, gradient descent</fr:li>
        <fr:li>Programming languages: Fortran, MATLAB, Julia</fr:li></fr:ul></fr:li></fr:ul>

  <fr:tree
toc="true"
numbered="true"
show-heading="true"
show-metadata="false"
expanded="true"
root="false"
xmlns:fr="http://www.jonmsterling.com/jms-005P.xml"><fr:frontmatter><fr:anchor>2625</fr:anchor><fr:addr>#262</fr:addr><fr:route>unstable-262.xml</fr:route><fr:taxon>Notes</fr:taxon><fr:date><fr:year>2024</fr:year><fr:month>3</fr:month><fr:day>4</fr:day></fr:date><fr:authors><fr:author><fr:link
type="local"
href="owen-lynch.xml"
addr="owen-lynch"
title="Owen Lynch">Owen Lynch</fr:link></fr:author></fr:authors><fr:parent>aria-0001</fr:parent><fr:meta
name="toc">false</fr:meta></fr:frontmatter><fr:mainmatter>
    We are going to be <html:inquotes
xmlns:html="http://www.w3.org/1999/xhtml">doing math on the computer</html:inquotes> a lot in this program. But what does that actually mean?
      <fr:ul><fr:li>To a logician, that means turning propositions into types, and proofs into terms of those types, in a language like Agda, Coq, Lean, etc. In this way of <html:inquotes
xmlns:html="http://www.w3.org/1999/xhtml">doing math</html:inquotes>, however, the only algorithm is the type-checking algorithm. Of course, by the Curry-Howard correspondence constructive proofs are equivalent to functions, and those functions might be interesting algorithms. But there is a significant difference between the use cases of <html:inquotes
xmlns:html="http://www.w3.org/1999/xhtml">formal verification of an algorithm</html:inquotes> and <html:inquotes
xmlns:html="http://www.w3.org/1999/xhtml">proof by typechecking.</html:inquotes> It's nice to formally verify your algorithms, but when your task is <html:inquotes
xmlns:html="http://www.w3.org/1999/xhtml">write an algorithm for a task</html:inquotes>, the constraint that your program has to also be a proof of that program's correctness slows things down. And there are many algorithms other than the typechecking algorithm that we care about. For instance...</fr:li>
        <fr:li>To an algebraist, doing math on a computer means <html:inquotes
xmlns:html="http://www.w3.org/1999/xhtml">using a variety of algorithms to rewrite symbolic equations.</html:inquotes> One could see this as tactics for proof, but I have yet to see a <html:inquotes
xmlns:html="http://www.w3.org/1999/xhtml">Groebner base</html:inquotes> tactic or an <html:inquotes
xmlns:html="http://www.w3.org/1999/xhtml">e-graph</html:inquotes> tactic implemented in a proof assistant. It could be an interesting research task to build such a proof assistant, but this is somewhat of a distraction when prototyping new symbolic algorithms. And additionally, the task of <html:inquotes
xmlns:html="http://www.w3.org/1999/xhtml">writing a tactic engine</html:inquotes> is significantly enough different from <html:inquotes
xmlns:html="http://www.w3.org/1999/xhtml">writing proofs using that tactic engine</html:inquotes> that it's worth thinking about as a <html:inquotes
xmlns:html="http://www.w3.org/1999/xhtml">different way of doing math on the computer</html:inquotes>. Classically computer algebra is often done in in dialects of LISP, or special-purpose solvers written in high-performance languages like C++; we might want to do it in Rust or Julia. But that is not the extent of math on a computer.</fr:li>
        <fr:li>To an analyst, <html:inquotes
xmlns:html="http://www.w3.org/1999/xhtml">math on a computer</html:inquotes> means numerical methods. In the glorious future, we will have numerical methods written in Lean that compile to the GPU. But we are not yet in the glorious future. Especially for experimentation, we will want to use languages suited for high-performance which classically meant Fortran or C, but now includes Julia, Rust, <html:inquotes
xmlns:html="http://www.w3.org/1999/xhtml">the ecosystem of prewritten Fortran/C/C++ that has python wrappers,</html:inquotes> and Haskell DSLs that compile down to Fortran/C/C++/CUDA (which is how Ed Kmett 100xed state of the art performance for ray tracers).</fr:li></fr:ul>
    And then there is another task that requires a different set of tools: the task of having a UI that is not <html:inquotes
xmlns:html="http://www.w3.org/1999/xhtml">a github of script files,</html:inquotes> which is the current state of the art for scientific computing. Now, <html:inquotes
xmlns:html="http://www.w3.org/1999/xhtml">a github of script files</html:inquotes> is actually a pretty excellent UI; I'd take a github of script files over an opaque, half-baked web UI any day of the week. But if we want something like <html:inquotes
xmlns:html="http://www.w3.org/1999/xhtml">a database of models,</html:inquotes> then we may end up with UI that is not just <html:inquotes
xmlns:html="http://www.w3.org/1999/xhtml">writing scripts and putting them in git.</html:inquotes> All of these types of <html:inquotes
xmlns:html="http://www.w3.org/1999/xhtml">doing math on the computer</html:inquotes> are important for the program.
  </fr:mainmatter><fr:backmatter /></fr:tree>
</fr:mainmatter><fr:backmatter /></fr:tree><fr:tree
toc="true"
numbered="true"
show-heading="true"
show-metadata="false"
expanded="true"
root="false"
xmlns:fr="http://www.jonmsterling.com/jms-005P.xml"><fr:frontmatter><fr:anchor>2645</fr:anchor><fr:addr>#265</fr:addr><fr:route>unstable-265.xml</fr:route><fr:title>Formal Collaboration: Polyglot Scientific Models</fr:title><fr:taxon>Slide</fr:taxon><fr:date><fr:year>2024</fr:year><fr:month>3</fr:month><fr:day>4</fr:day></fr:date><fr:authors><fr:author><fr:link
type="local"
href="owen-lynch.xml"
addr="owen-lynch"
title="Owen Lynch">Owen Lynch</fr:link></fr:author></fr:authors><fr:parent>aria-0001</fr:parent></fr:frontmatter><fr:mainmatter>
  <fr:p>Dilemna:</fr:p>

  <fr:ol><fr:li>Don't want to rewrite tensorflow</fr:li>
    <fr:li>Don't want to write everything in Python</fr:li></fr:ol>

  <fr:p>Solution: Models should be language-independent <html:inquotes
xmlns:html="http://www.w3.org/1999/xhtml">initial algebras</html:inquotes> of <fr:link
type="local"
href="st-0001.xml"
addr="st-0001"
title="Categorical Systems Theory">systems doctrines</fr:link>.</fr:p>

  <fr:p>Algorithms are <html:inquotes
xmlns:html="http://www.w3.org/1999/xhtml">model semantics</html:inquotes> that apply over large classes of models.</fr:p>

  <fr:tree
toc="true"
numbered="true"
show-heading="true"
show-metadata="false"
expanded="true"
root="false"
xmlns:fr="http://www.jonmsterling.com/jms-005P.xml"><fr:frontmatter><fr:anchor>2649</fr:anchor><fr:addr>#264</fr:addr><fr:route>unstable-264.xml</fr:route><fr:taxon>Notes</fr:taxon><fr:date><fr:year>2024</fr:year><fr:month>3</fr:month><fr:day>4</fr:day></fr:date><fr:authors><fr:author><fr:link
type="local"
href="owen-lynch.xml"
addr="owen-lynch"
title="Owen Lynch">Owen Lynch</fr:link></fr:author></fr:authors><fr:parent>aria-0001</fr:parent><fr:meta
name="toc">false</fr:meta></fr:frontmatter><fr:mainmatter>
    <fr:p>We don't want to rewrite tensorflow, but we also don't want to write <fr:em>everything</fr:em> in python.</fr:p>

    <fr:p>Eventually, we should just develop a language which <html:inquotes
xmlns:html="http://www.w3.org/1999/xhtml">does it all.</html:inquotes> But we have to figure out what <html:inquotes
xmlns:html="http://www.w3.org/1999/xhtml">it all</html:inquotes> consists of first. And <fr:em>engineering is research</fr:em>; even though the final product might be a clean reimplementation of research prototypes, it's still important to surface engineering problems in research prototypes. These research prototypes by necessity will be in extant programming languages, using extant libraries, and there is not a single choice of extant programming language which completely covers all of the ways of <html:inquotes
xmlns:html="http://www.w3.org/1999/xhtml">doing math on a computer</html:inquotes>. In any case, we should be learning from the technological state of the art in different domains, and this necessitates multiple programming languages.</fr:p>

    <fr:p>Even if we manage to build the next great mathematical programming language, it will still be good to have language-independent models, because we aren't going to convince the entire world to use a single programming language, but we want to have safe AI for the entire world.</fr:p>

    <fr:p>Fortunately, we have <fr:link
type="local"
href="st-0001.xml"
addr="st-0001"
title="Categorical Systems Theory">Categorical Systems Theory</fr:link>, which tells us that a model is an initial algebra in some doctrine of systems. Elements of this initial algebra are just data that is independent of any particular computational paradigm.</fr:p>

    <fr:p>Of course, in order to implement all the operations of categorical systems theory, we will need to write functions for editing, composition, simplification, analysis, simulation, etc. These will operate on language-independent data, but will not themselves be language-independent data. Ideally, we write basic operations like editing, composition, simplification, etc. in a single language (Rust perhaps), and then offer some kind of ffi.</fr:p>
  </fr:mainmatter><fr:backmatter /></fr:tree>
</fr:mainmatter><fr:backmatter /></fr:tree><fr:tree
toc="true"
numbered="true"
show-heading="true"
show-metadata="false"
expanded="true"
root="false"
xmlns:fr="http://www.jonmsterling.com/jms-005P.xml"><fr:frontmatter><fr:anchor>2654</fr:anchor><fr:addr>#267</fr:addr><fr:route>unstable-267.xml</fr:route><fr:title>Formal Collaboration: Models as Data</fr:title><fr:taxon>Slide</fr:taxon><fr:date><fr:year>2024</fr:year><fr:month>3</fr:month><fr:day>4</fr:day></fr:date><fr:authors><fr:author><fr:link
type="local"
href="owen-lynch.xml"
addr="owen-lynch"
title="Owen Lynch">Owen Lynch</fr:link></fr:author></fr:authors><fr:parent>aria-0001</fr:parent></fr:frontmatter><fr:mainmatter>
  <fr:p>What can be cross-language?</fr:p>

  <fr:ul><fr:li>Algebraic Data Types</fr:li>
    <fr:li>Generic types</fr:li>
    <fr:li>Multidimensional Arrays</fr:li>
    <fr:li>Presentations of algebraic structures (i.e. ring presentations by generator and relations).</fr:li>
    <fr:li>Knowledge bases, i.e. collections of <html:inquotes
xmlns:html="http://www.w3.org/1999/xhtml">facts</html:inquotes> in the style of prolog.</fr:li></fr:ul>
  
  <fr:p>What can't?</fr:p>

  <fr:ul><fr:li>Arbitrary functions</fr:li>
    <fr:li>Arbitrary dependent types</fr:li></fr:ul>

  <fr:tree
toc="true"
numbered="true"
show-heading="true"
show-metadata="false"
expanded="true"
root="false"
xmlns:fr="http://www.jonmsterling.com/jms-005P.xml"><fr:frontmatter><fr:anchor>2657</fr:anchor><fr:addr>#266</fr:addr><fr:route>unstable-266.xml</fr:route><fr:taxon>Notes</fr:taxon><fr:date><fr:year>2024</fr:year><fr:month>3</fr:month><fr:day>4</fr:day></fr:date><fr:authors><fr:author><fr:link
type="local"
href="owen-lynch.xml"
addr="owen-lynch"
title="Owen Lynch">Owen Lynch</fr:link></fr:author></fr:authors><fr:parent>aria-0001</fr:parent><fr:meta
name="toc">false</fr:meta></fr:frontmatter><fr:mainmatter>
    Given that we want to use multiple languages, how can we nonetheless build off each other's work? One way is <html:inquotes
xmlns:html="http://www.w3.org/1999/xhtml">remote procedure calls</html:inquotes>. But there's a hard limit to what remote procedure calls can convey cross-language: that limit is the expressivity of the serialization format. You can't just serialize a function in a probabilistic programming language and ship it off somewhere. If you want to produce a scientific model in one language and then run analysis tasks on it with other languages, you need to be able to seamlessly serialize complex scientific models. So we need to carefully choose an integration strategy based on what is reasonable to serialize, that encompasses types complex enough to convey scientific models.
  </fr:mainmatter><fr:backmatter /></fr:tree>
</fr:mainmatter><fr:backmatter /></fr:tree><fr:tree
toc="true"
numbered="true"
show-heading="true"
show-metadata="false"
expanded="true"
root="false"
xmlns:fr="http://www.jonmsterling.com/jms-005P.xml"><fr:frontmatter><fr:anchor>2660</fr:anchor><fr:addr>#269</fr:addr><fr:route>unstable-269.xml</fr:route><fr:title>Formal Collaboration: Implementation of <html:inquotes
xmlns:html="http://www.w3.org/1999/xhtml">Models as Data</html:inquotes></fr:title><fr:taxon>Slide</fr:taxon><fr:date><fr:year>2024</fr:year><fr:month>3</fr:month><fr:day>4</fr:day></fr:date><fr:authors><fr:author><fr:link
type="local"
href="owen-lynch.xml"
addr="owen-lynch"
title="Owen Lynch">Owen Lynch</fr:link></fr:author></fr:authors><fr:parent>aria-0001</fr:parent></fr:frontmatter><fr:mainmatter>
  <fr:ol><fr:li>Type theory for data</fr:li>
    <fr:li>Embed into existing languages</fr:li>
    <fr:li>Build storage system</fr:li></fr:ol>
  <fr:tree
toc="true"
numbered="true"
show-heading="true"
show-metadata="false"
expanded="true"
root="false"
xmlns:fr="http://www.jonmsterling.com/jms-005P.xml"><fr:frontmatter><fr:anchor>2663</fr:anchor><fr:addr>#268</fr:addr><fr:route>unstable-268.xml</fr:route><fr:taxon>Notes</fr:taxon><fr:date><fr:year>2024</fr:year><fr:month>3</fr:month><fr:day>4</fr:day></fr:date><fr:authors><fr:author><fr:link
type="local"
href="owen-lynch.xml"
addr="owen-lynch"
title="Owen Lynch">Owen Lynch</fr:link></fr:author></fr:authors><fr:parent>aria-0001</fr:parent><fr:meta
name="toc">false</fr:meta></fr:frontmatter><fr:mainmatter>
    <fr:ol><fr:li>Make a type theory expressive enough for the models we want, and such that all well-formed types <html:inquotes
xmlns:html="http://www.w3.org/1999/xhtml">make sense to serialize cross-language</html:inquotes>. I have some clever ideas for how to do this that I won't go into right now, but can be found (links)</fr:li>
      <fr:li>Write a compiler that compiles type definitions to produce wrapper types in all relevant languages, similar to protobuf.</fr:li>
      <fr:li>Build systems for storing serialized models that can be accessed programmatically.</fr:li></fr:ol>
    <fr:p>It would look something like:</fr:p>
    <fr:pre>struct Graph {
  V: fintype;
  E: fintype;
  src: E -&gt; V;
  tgt: E -&gt; V;
};  </fr:pre>
  </fr:mainmatter><fr:backmatter /></fr:tree>
</fr:mainmatter><fr:backmatter /></fr:tree><fr:tree
toc="true"
numbered="true"
show-heading="true"
show-metadata="false"
expanded="true"
root="false"
xmlns:fr="http://www.jonmsterling.com/jms-005P.xml"><fr:frontmatter><fr:anchor>2666</fr:anchor><fr:addr>#271</fr:addr><fr:route>unstable-271.xml</fr:route><fr:title>Formal Collaboration: Version the Source of Truth, Cache Everything Else</fr:title><fr:taxon>Slide</fr:taxon><fr:date><fr:year>2024</fr:year><fr:month>3</fr:month><fr:day>4</fr:day></fr:date><fr:authors><fr:author><fr:link
type="local"
href="owen-lynch.xml"
addr="owen-lynch"
title="Owen Lynch">Owen Lynch</fr:link></fr:author></fr:authors><fr:parent>aria-0001</fr:parent></fr:frontmatter><fr:mainmatter>
  <fr:ul><fr:li>Structured version control for models?</fr:li>
    <fr:li>Version control the source of truth, which could be
      <fr:ul><fr:li>The model itself</fr:li>
        <fr:li>Stochastic model search + random seed</fr:li>
        <fr:li>Textual DSL</fr:li>
        <fr:li>A composition diagram with other models inserted</fr:li></fr:ul></fr:li>
    <fr:li>Everything downstream of source of truth: deterministically cache</fr:li>
    <fr:li>Nix is current state-of-the-art.</fr:li></fr:ul>

  <fr:tree
toc="true"
numbered="true"
show-heading="true"
show-metadata="false"
expanded="true"
root="false"
xmlns:fr="http://www.jonmsterling.com/jms-005P.xml"><fr:frontmatter><fr:anchor>2668</fr:anchor><fr:addr>#270</fr:addr><fr:route>unstable-270.xml</fr:route><fr:taxon>Notes</fr:taxon><fr:date><fr:year>2024</fr:year><fr:month>3</fr:month><fr:day>4</fr:day></fr:date><fr:authors><fr:author><fr:link
type="local"
href="owen-lynch.xml"
addr="owen-lynch"
title="Owen Lynch">Owen Lynch</fr:link></fr:author></fr:authors><fr:parent>aria-0001</fr:parent><fr:meta
name="toc">false</fr:meta></fr:frontmatter><fr:mainmatter>
    <fr:p>Originally, the idea was that we would version-control this data, directly. I still think that this is a good idea, but I think that there is a larger picture. Namely, you should version-control the <html:inquotes
xmlns:html="http://www.w3.org/1999/xhtml">source of truth</html:inquotes> for your scientific models. If that source of truth is a modeler directly editing the data of the model via some interface, then you should version-control the model. However, if the source of truth is an algorithm that did a <html:inquotes
xmlns:html="http://www.w3.org/1999/xhtml">model search</html:inquotes> to find that model, you should cache the model and attach it to a hash of <html:inquotes
xmlns:html="http://www.w3.org/1999/xhtml">this code+this random seed</html:inquotes>. If the source of truth is a handwritten textual DSL that gets compiled into the model, then you shouldn't check the result of that compilation process into version control. You should instead cache the model, keyed on the hash of the DSL.</fr:p>

    <fr:p>The state-of-the-art current system for caching the results of arbitrary computation is Nix. It is not the most ideal platform for a variety of reasons, including speed, but we have to at least learn from how it works if we want to do better.</fr:p>

    <fr:p>We can hack version control of structured data into Nix via hashing the <html:inquotes
xmlns:html="http://www.w3.org/1999/xhtml">patch application process.</html:inquotes> That is, we can make a Nix derivation with inputs <html:inquotes
xmlns:html="http://www.w3.org/1999/xhtml">the previous state</html:inquotes> and <html:inquotes
xmlns:html="http://www.w3.org/1999/xhtml">the patch</html:inquotes> which outputs the result of applying a patch to the previous state. Whether or not this is a <fr:em>good</fr:em> idea is not yet clear to me, but it is <fr:em>an</fr:em> idea.</fr:p>

    <fr:p>Interestingly enough, this would <fr:em>also</fr:em> be keyed on the hash of the versioning software, so every update to the versioning software would also cause all caches to be invalidated, and patches applied from scratch. Fortunately this is not too expensive: git does this every time you clone.</fr:p>

    <fr:p>Another sidenote: the difference between nix and content-addressed stores is that content-addressed stores are keyed by the hash of the thing that is stored, while nix is keyed by the hash of the inputs to a (more or less) pure function (the nix evaluator).</fr:p>
  </fr:mainmatter><fr:backmatter /></fr:tree>
</fr:mainmatter><fr:backmatter /></fr:tree><fr:tree
toc="true"
numbered="true"
show-heading="true"
show-metadata="false"
expanded="true"
root="false"
xmlns:fr="http://www.jonmsterling.com/jms-005P.xml"><fr:frontmatter><fr:anchor>2676</fr:anchor><fr:addr>#273</fr:addr><fr:route>unstable-273.xml</fr:route><fr:title>Informal+Formal Collaboration: literate programming?</fr:title><fr:taxon>Slide</fr:taxon><fr:date><fr:year>2024</fr:year><fr:month>3</fr:month><fr:day>4</fr:day></fr:date><fr:authors><fr:author><fr:link
type="local"
href="owen-lynch.xml"
addr="owen-lynch"
title="Owen Lynch">Owen Lynch</fr:link></fr:author></fr:authors><fr:parent>aria-0001</fr:parent></fr:frontmatter><fr:mainmatter>
  <fr:ul><fr:li>I thought literate programming is dead... but is it?
      <fr:ul><fr:li><fr:link
type="external"
href="https://doc.rust-lang.org/rustdoc/index.html">Rustdoc</fr:link> is literate programming</fr:li>
        <fr:li><fr:link
type="external"
href="https://1lab.dev">1lab</fr:link> is literate programming</fr:li>
        <fr:li><fr:link
type="external"
href="https://www.pbrt.org/">PBRT</fr:link> is literate programming</fr:li>
        <fr:li><fr:link
type="external"
href="https://jupyter.org/">Jupyter</fr:link> is literate programming</fr:li></fr:ul></fr:li>
    <fr:li>Caching enables principled notebook computing</fr:li>
    <fr:li>Explainable AI involves AI... and explanations!</fr:li></fr:ul>
  <fr:tree
toc="true"
numbered="true"
show-heading="true"
show-metadata="false"
expanded="true"
root="false"
xmlns:fr="http://www.jonmsterling.com/jms-005P.xml"><fr:frontmatter><fr:anchor>2678</fr:anchor><fr:addr>#272</fr:addr><fr:route>unstable-272.xml</fr:route><fr:taxon>Notes</fr:taxon><fr:date><fr:year>2024</fr:year><fr:month>3</fr:month><fr:day>4</fr:day></fr:date><fr:authors><fr:author><fr:link
type="local"
href="owen-lynch.xml"
addr="owen-lynch"
title="Owen Lynch">Owen Lynch</fr:link></fr:author></fr:authors><fr:parent>aria-0001</fr:parent><fr:meta
name="toc">false</fr:meta></fr:frontmatter><fr:mainmatter>
    <fr:p>Literate programming has a long history, starting with Knuth's implementation of TeX. One might argue that the traditional noweb style of literate programming has died out to some extent. But to a certain extent, if you consider notebooks or "documentation generators" like rustdoc to be literate programming, then literate programming is still going very strong.</fr:p>

    <fr:p>Also, the <fr:link
type="external"
href="1lab">1lab</fr:link> is a really interesting project: it combines formal mathematics with informal mathematics via literate agda.</fr:p>

    <fr:p>One of the Achilles heels of writing scientific documents as, say, Jupyter notebooks is that caching is hard. If you want a live-refreshing preview, then you can't rerun the notebook from scratch on every change. But if you want to avoid issues related to out-of-order cell execution, you have to rerun the notebook from scratch. And if you want to build notebooks in CI, then not having a cache system can mean &gt;30 minute CI times, which is a massive drain on productivity.</fr:p>

    <fr:p>However, if your scientific system is built from the ground up to have fine-grained caching, including for simulation runs and figures, then it becomes practical to offer a live-reloading compilation server for your document, which only reruns cells when necessary. And by cache-sharing, someone else can edit your document without having to run your (potentially extremely expensive) simulations. You can also delegate computation to server farms and just pull in the result (link to post on this)</fr:p>

    <fr:p>Finally, a significant part of scientific modeling <fr:em>is</fr:em> informal explanation! Human language should be a first class citizen in the modeling workbench.</fr:p>
  </fr:mainmatter><fr:backmatter /></fr:tree>
</fr:mainmatter><fr:backmatter /></fr:tree><fr:tree
toc="true"
numbered="true"
show-heading="true"
show-metadata="false"
expanded="true"
root="false"
xmlns:fr="http://www.jonmsterling.com/jms-005P.xml"><fr:frontmatter><fr:anchor>2680</fr:anchor><fr:addr>#274</fr:addr><fr:route>unstable-274.xml</fr:route><fr:title>Conclusion</fr:title><fr:taxon>Slide</fr:taxon><fr:date><fr:year>2024</fr:year><fr:month>3</fr:month><fr:day>4</fr:day></fr:date><fr:authors><fr:author><fr:link
type="local"
href="owen-lynch.xml"
addr="owen-lynch"
title="Owen Lynch">Owen Lynch</fr:link></fr:author></fr:authors><fr:parent>aria-0001</fr:parent></fr:frontmatter><fr:mainmatter>
  <fr:ul><fr:li>Success requires scaling our development via more effective collaboration</fr:li>
    <fr:li>Informal collaboration needs to scale beyond <html:inquotes
xmlns:html="http://www.w3.org/1999/xhtml">couple of mathematicians write standalone paper</html:inquotes></fr:li>
    <fr:li>Formal collaboration needs to scale beyond <html:inquotes
xmlns:html="http://www.w3.org/1999/xhtml">software package for single type of model in a single language</html:inquotes></fr:li>
    <fr:li>Next steps: <fr:link
type="external"
href="https://github.com/AlgebraicJulia/intertypes">intertypes</fr:link></fr:li></fr:ul>
  <fr:blockquote><fr:p>We shape technology for public benefit by advancing sciences of connection and integration.</fr:p>

    <fr:p>-- Topos Institute</fr:p></fr:blockquote>
</fr:mainmatter><fr:backmatter /></fr:tree></fr:mainmatter><fr:backmatter /></fr:tree><fr:tree
toc="true"
numbered="false"
show-heading="true"
show-metadata="true"
expanded="false"
root="false"
xmlns:fr="http://www.jonmsterling.com/jms-005P.xml"><fr:frontmatter><fr:anchor>3007</fr:anchor><fr:addr>lc-000H</fr:addr><fr:route>lc-000H.xml</fr:route><fr:title>Tips and Tricks</fr:title><fr:authors /></fr:frontmatter><fr:mainmatter><fr:p>If you haven't used forester before (which is most people), you can start by reading <fr:link
type="local"
href="lc-0002.xml"
addr="lc-0002"
title="Forester for the Woodland Skeptic">Forester for the Woodland Skeptic</fr:link>, which will get you started quickly and hopefully give you a sense of why to use forester.</fr:p><fr:p>There are some useful macros for math/category theory in <fr:link
type="external"
href="https://github.com/LocalCharts/forest/blob/main/trees/macros.tree">macros.tree</fr:link>. Hopefully as the forest grows, we will have some flame wars about notation and end up with some semi-productive standardization via this macros file.</fr:p><fr:p>Comments (and by extension, automatic cross-posting to the forum) are opt-in. If you would like comments, then you must put <fr:code><![CDATA[\meta{comments}{true}]]></fr:code> at the top of your page.</fr:p></fr:mainmatter><fr:backmatter /></fr:tree></fr:mainmatter><fr:backmatter /></fr:tree></fr:backmatter></fr:tree>