<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/default.xsl"?>
<fr:tree xmlns:fr="http://www.forester-notes.org" xmlns:html="http://www.w3.org/1999/xhtml" xmlns:xml="http://www.w3.org/XML/1998/namespace" root="true" base-url="/">
  <fr:frontmatter>
    <fr:authors />
    <fr:uri>https://www.forester-notes.org/index/</fr:uri>
    <fr:display-uri>index</fr:display-uri>
    <fr:route>/index/</fr:route>
    <fr:title text="Forester">Forester</fr:title>
  </fr:frontmatter>
  <fr:mainmatter>
    <html:p><html:em>Forester</html:em> is a tool for authoring, exploring, and sharing scientific and mathematical hypertexts. It is your lab notebook, your journal, your blackboard, and the home of your lecture notes.</html:p>
    <html:p>Forester is maintained by <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link> and <fr:link href="/kentookura/" title="Kento Okura" uri="https://www.forester-notes.org/kentookura/" display-uri="kentookura" type="local">Kento Okura</fr:link>.</html:p>
    <html:ul><html:li><fr:link href="/0065/" title="Project information" uri="https://www.forester-notes.org/0065/" display-uri="0065" type="local">Project information</fr:link></html:li>
  <html:li><fr:link href="/VNQA/" title="Forester Devlog" uri="https://www.forester-notes.org/VNQA/" display-uri="VNQA" type="local">Forester devlog</fr:link></html:li>
  <html:li><fr:link href="/30FM/" title="Forester Blog" uri="https://www.forester-notes.org/30FM/" display-uri="30FM" type="local">Forester blog</fr:link></html:li>
  <html:li><fr:link href="/5CDY/" title="Presentations" uri="https://www.forester-notes.org/5CDY/" display-uri="5CDY" type="local">Presentations</fr:link></html:li>
  <html:li><fr:link href="/005P/" title="Release notes" uri="https://www.forester-notes.org/005P/" display-uri="005P" type="local">Release notes</fr:link></html:li></html:ul>
  </fr:mainmatter>
  <fr:backmatter>
    <fr:tree show-metadata="false" hidden-when-empty="true">
      <fr:frontmatter>
        <fr:authors />
        <fr:title text="References">References</fr:title>
      </fr:frontmatter>
      <fr:mainmatter />
    </fr:tree>
    <fr:tree show-metadata="false" hidden-when-empty="true">
      <fr:frontmatter>
        <fr:authors />
        <fr:title text="Context">Context</fr:title>
      </fr:frontmatter>
      <fr:mainmatter />
    </fr:tree>
    <fr:tree show-metadata="false" hidden-when-empty="true">
      <fr:frontmatter>
        <fr:authors />
        <fr:title text="Backlinks">Backlinks</fr:title>
      </fr:frontmatter>
      <fr:mainmatter>
        <fr:tree show-metadata="true" expanded="false" toc="false" numbered="false">
          <fr:frontmatter>
            <fr:authors>
              <fr:author>
                <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
              </fr:author>
            </fr:authors>
            <fr:date>
              <fr:year>2025</fr:year>
              <fr:month>5</fr:month>
              <fr:day>27</fr:day>
            </fr:date>
            <fr:date>
              <fr:year>2025</fr:year>
              <fr:month>5</fr:month>
              <fr:day>30</fr:day>
            </fr:date>
            <fr:uri>https://www.forester-notes.org/QHXS/</fr:uri>
            <fr:display-uri>QHXS</fr:display-uri>
            <fr:route>/QHXS/</fr:route>
            <fr:title text="Intellectual junkyards">Intellectual junkyards</fr:title>
          </fr:frontmatter>
          <fr:mainmatter>
            <html:p>I was first inspired to create <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> after exploring the <fr:link href="/stacks-project/" title="The Stacks project" uri="https://www.forester-notes.org/stacks-project/" display-uri="stacks-project" type="local">Stacks Project</fr:link> and realising that what I most wanted most dearly was the ability and digital space to create my own—and feeling the pain when I tried to install the essentially defunct <fr:link href="/gerby/" title="Gerby" uri="https://www.forester-notes.org/gerby/" display-uri="gerby" type="local">Gerby</fr:link> software that runs it. <fr:link href="/paolobrasolin/" title="Paolo Brasolin" uri="https://www.forester-notes.org/paolobrasolin/" display-uri="paolobrasolin" type="local">Paolo Brasolin</fr:link> was kind enough to help me with this, by building <fr:link href="https://github.com/paolobrasolin/jekyll-sheafy" type="external">Sheafy</fr:link> on top of <fr:link href="https://jekyllrb.com/" type="external">Jekyll</fr:link>. I eventually reached the limits of that tool and created Forester on my own (first as a Hugo plugin, and finally as standalone OCaml software). Later I was joined by <fr:link href="/kentookura/" title="Kento Okura" uri="https://www.forester-notes.org/kentookura/" display-uri="kentookura" type="local">Kento Okura</fr:link> who has become a strong partner in designing and developing Forester.</html:p>
            <html:p>Whilst exploring the space of <html:em>tools for thought</html:em>, I became aware of a cluster of related and deeply inspiring ideas—starting with <fr:link href="/andymatuschak/" title="Andy Matuschak" uri="https://www.forester-notes.org/andymatuschak/" display-uri="andymatuschak" type="local">Andy Matuschak</fr:link>’s <fr:link href="/tfmt-0003/" title="Evergreen notes" uri="https://www.forester-notes.org/tfmt-0003/" display-uri="tfmt-0003" type="local">evergreen notes</fr:link> which led me to Niklas Luhmann’s <fr:link href="https://en.wikipedia.org/wiki/Zettelkasten" type="external">Zettelkasten</fr:link> and various kinds of digital gardening. Although all these trends are slightly different and shouldn’t be conflated, the common thread is to accumulate a bunch of small topical notes over many years in hypertext. (Luhmann’s Zettelkasten was of course a <html:em>physical</html:em> hypertext, where hyperlinks are hand-written and addressed to locations in his card box, whereas many Zettelkästen today are digital.) Matuschak’s “evergreen” concept refers to the practice of having notes evolve and remain up to date, as opposed to scratch notes that lose salience with time. I was interested enough in the idea that I spent some time thinking about how it might be adapted to the mathematical sciences, and I wrote a manifesto of sorts on the topic: <fr:link href="/tfmt-0001/" title="Designing tools for scientific thought" uri="https://www.forester-notes.org/tfmt-0001/" display-uri="tfmt-0001" type="local">Designing tools for scientific thought</fr:link>. This manifesto guided the design of Forester, whose name was itself inspired by Matuschak’s <fr:link href="https://notes.andymatuschak.org/Evergreen_notes" type="external">writings on evergreen notes</fr:link>.</html:p>
            <html:p>For some time now, however, I have been noticing a great deal of friction in my own use of <fr:link href="/tfmt-000W/" title="Evergreen notes in the sciences" uri="https://www.forester-notes.org/tfmt-000W/" display-uri="tfmt-000W" type="local">evergreen notes</fr:link> as a tool for advancing science; for this reason, I have been using my own <fr:link href="https://www.jonmsterling.com/index/" type="external">Forest</fr:link> in a different way for some time now.</html:p>
            <fr:tree show-metadata="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:date>
                  <fr:year>2025</fr:year>
                  <fr:month>5</fr:month>
                  <fr:day>27</fr:day>
                </fr:date>
                <fr:date>
                  <fr:year>2025</fr:year>
                  <fr:month>5</fr:month>
                  <fr:day>30</fr:day>
                </fr:date>
                <fr:uri>https://www.forester-notes.org/QHXT/</fr:uri>
                <fr:display-uri>QHXT</fr:display-uri>
                <fr:route>/QHXT/</fr:route>
                <fr:title text="Life in the junkyard after a few years">Life in the junkyard after a few years</fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <html:p>Let me describe how someone like me predictably starts building up their forest.</html:p>
                <html:ol><html:li>Because I’m interested in category theory, I start by creating a tree entitled <html:code>Category</html:code> with taxon <html:code>Definition</html:code>.</html:li>
    <html:li>I start doing the same for other important notions, like functors, natral transformations, etc. Eventually I prove the Yoneda lemma!</html:li>
    <html:li>I spend about a year building up a glorious forest full of category theory.</html:li>
    <html:li><html:em>Only then</html:em> do I realise that ordinary category theory, in which a category is defined to have a set (or a class) of objects, is a mess; I want to switch to <html:em>univalent</html:em> category theory which smooths over many of the rough edges.</html:li>
    <html:li>Unfortunately, univalent foundations is very different from set theoretic foundations in subtle ways. I have a plan to refactor my entire forest to account for this, but obviously I have to get my actual work done too. I’ll just hold off on that epic refactoring...</html:li>
    <html:li>I discover an interesting theorem or insight, and I want to write it down in my forest. But my motivation dies when I realise that it would mean <html:em>adding</html:em> to the old-and-busted notes, which would increase my future burden when I will definitely (not kidding) update my hundreds of notes. With my motivation killed, I forget about the insight and move on.</html:li>
    <html:li>By the way, not only do I want to switch to univalent categories, I also want to re-do everything in terms of displayed categories. Ouch. This happens enough times, and the forest dies and becomes a junkyard. The End.</html:li></html:ol>
                <html:p>I suspect this is a somewhat common negative experience with Zettelkästen, but not many people talk about it. In one brave exception, <fr:link href="https://forum.zettelkasten.de/discussion/3254/updating-a-whole-department-of-notes-because-apple-slightly-changed-the-meaning-of-things" type="external">Christian Tietze writes about a similar experience</fr:link> recently with his Zettelkasten, in which he has written a ton of now-outdated notes about subtleties of Apple’s SwiftUI and Observation frameworks. Keeping such things “evergreen” is almost impossible because Apple frameworks are a rapidly moving target. <html:mark>The point I want to make is that mathematics and the sciences are <html:em>also</html:em> rapidly moving targets, and if your outlook on them slows its roll long enough for it to become practical to keep a sizable forest evergreen, it may indicate intellectual stagnation more than intellectual wealth.</html:mark></html:p>
                <html:p>I must also point out that keeping a forest evergreen in this sense does not only amount to updating various trees periodically. One’s mathematical development over time tends to involve not only evolving definitions and proofs, but also an evolution of the entire ontology—which means that the very decision of what to put in one tree and what to put in another tree is difficult to commit to in the long term.</html:p>
              </fr:mainmatter>
            </fr:tree>
            <fr:tree show-metadata="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:date>
                  <fr:year>2025</fr:year>
                  <fr:month>5</fr:month>
                  <fr:day>27</fr:day>
                </fr:date>
                <fr:date>
                  <fr:year>2025</fr:year>
                  <fr:month>5</fr:month>
                  <fr:day>30</fr:day>
                </fr:date>
                <fr:uri>https://www.forester-notes.org/QHXU/</fr:uri>
                <fr:display-uri>QHXU</fr:display-uri>
                <fr:route>/QHXU/</fr:route>
                <fr:title text="Tree-rings and the dialectics of knowledge production">Tree-rings and the dialectics of knowledge production</fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <html:p>My own experience with the long-term maintenance of a forest or Zettelkasten is that the level of activity therein is uneven over time—there are periods of expansion followed by periods of quiet. In the former, trees tend to cluster around not only a group of related topics but <html:em>also</html:em> a particular approach to ontologising those topics. When you encounter one of those trees later on, you can kind of remember when it was written because of the <html:em>way</html:em> it was written and the particular relationships you chose to reify in hypertext.</html:p>
                <html:p>Seeing these distinct “rings of growth” emerging in my own forest brought me to the realisation that my viewpoint on evergreen notes might have been overly simplistic. <html:mark><html:strong>The question seems to be:</html:strong> should we resist the distinctness of intellectual growth rings by hewing to a <html:em>homogeneity of the present</html:em>, or should we embrace time and change as fundamental aspects of knowledge production?</html:mark></html:p>
              </fr:mainmatter>
            </fr:tree>
            <fr:tree show-metadata="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:date>
                  <fr:year>2025</fr:year>
                  <fr:month>5</fr:month>
                  <fr:day>27</fr:day>
                </fr:date>
                <fr:date>
                  <fr:year>2025</fr:year>
                  <fr:month>5</fr:month>
                  <fr:day>30</fr:day>
                </fr:date>
                <fr:uri>https://www.forester-notes.org/QHXV/</fr:uri>
                <fr:display-uri>QHXV</fr:display-uri>
                <fr:route>/QHXV/</fr:route>
                <fr:title text="Resist ontology and embrace time">Resist ontology and embrace time</fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <html:p>Coming back to the <fr:link href="/QHXT/" title="Intellectual junkyards › Life in the junkyard after a few years" uri="https://www.forester-notes.org/QHXT/" display-uri="QHXT" type="local">difficulty of maintaining a forest in a state of intellectual evolution</fr:link>, I have found that a good approach is to organise my notes around “tracker” trees—which pertain to a particular topic or project but have little content of their own, serving mainly as <html:em>backlink accumulators</html:em> for notes written in my private journal, my <fr:link href="https://www.jonmsterling.com/019X/" type="external">weeknotes</fr:link>, and my <fr:link href="https://www.jonmsterling.com/007W/" type="external">blog</fr:link>. For example, one thing I am working on is <fr:link href="https://www.jonmsterling.com/019E/" type="external">Project Pterosaur</fr:link>—which will be a new proof assistant that combines dependent type theory with ideas from Isabelle/HOL.</html:p>
                <html:p>As you can see, there is very little content to the <fr:link href="https://www.jonmsterling.com/019E/" type="external">Project Pterosaur</fr:link> tree, but in the private version of my forest there are many backlinks coming from journal entries. I can reconstruct the entire project in my mind by reading through these entries via the backlinks panel, and that to me is far more useful than a (high-churn) “evergreen” note that explains my vision for the project and its status, etc. Obviously this is not a new idea—many people use tools like Obsidian, Logseq, Roam, etc. in the way I am describing.</html:p>
              </fr:mainmatter>
            </fr:tree>
            <fr:tree show-metadata="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:date>
                  <fr:year>2025</fr:year>
                  <fr:month>5</fr:month>
                  <fr:day>27</fr:day>
                </fr:date>
                <fr:date>
                  <fr:year>2025</fr:year>
                  <fr:month>5</fr:month>
                  <fr:day>30</fr:day>
                </fr:date>
                <fr:uri>https://www.forester-notes.org/QHXX/</fr:uri>
                <fr:display-uri>QHXX</fr:display-uri>
                <fr:route>/QHXX/</fr:route>
                <fr:title text="Blogging is the accretion of temporal insight">Blogging is the accretion of temporal insight</fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <html:p>A few months ago, I had a very enlightening conversation with my colleague <fr:link href="https://anil.recoil.org/" type="external">Anil Madhavapeddy</fr:link> about blogging. Anil’s research group at Cambridge has a practice of internal blogging and weeknotes: pretty much everyone is writing about their work in blogs that are then syndicated into a Matrix channel. Then, discussion proceeds organically in the chat and in person. These blog posts are not the <fr:link href="https://notes.andymatuschak.org/zKGjQtsTKgscAoq271ZzKqw" type="external">transient/fleeting notes discussed by Matuschak</fr:link>, because they are not scraps—they are evergreen in the “free” sense of being permanent discourses on a moment in time.</html:p>
                <html:p>For more than a year, I had already been maintaining a personal journal of daily notes in my private forest, but there was always some tension in my writing practices there because I was perfunctorily accumulating “records” of what I did rather than insight. What had not clicked for me at the time was that I really <html:em>ought</html:em> to have been blogging (for myself). <html:mark>Journalling in the most progressive sense is simply <html:em>blogging</html:em> with a restricted audience, facilitating the <fr:link href="https://notes.andymatuschak.org/zTn3g4wTm1hbkNFUvLLjpev" type="external">accretion of insight</fr:link> more than the mere memory of what happened when.</html:mark> Since my chat with Anil, I have shifted my practice to emphasise semi-public <fr:link href="https://www.jonmsterling.com/019X/" type="external">weeknotes</fr:link> whose goal is to provoke and continue discussions that are unfolding within the community that reads them (mainly my colleagues in the Computer Laboratory). Of course, this was only possible after I had added <fr:link href="/30FO/" title="Forester 5.0 › Atom syndication support" uri="https://www.forester-notes.org/30FO/" display-uri="30FO" type="local">support for syndication to Forester</fr:link>!</html:p>
                <html:p>I still write private entries as well, of course, but not as many. Currently, Forester creates a lot of friction around access control and one of the goals in the coming year or two is to decrease this friction so that one does not have to think so carefully about where to put something that you want to write.</html:p>
              </fr:mainmatter>
            </fr:tree>
            <fr:tree show-metadata="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:date>
                  <fr:year>2025</fr:year>
                  <fr:month>5</fr:month>
                  <fr:day>27</fr:day>
                </fr:date>
                <fr:date>
                  <fr:year>2025</fr:year>
                  <fr:month>5</fr:month>
                  <fr:day>30</fr:day>
                </fr:date>
                <fr:uri>https://www.forester-notes.org/QHXW/</fr:uri>
                <fr:display-uri>QHXW</fr:display-uri>
                <fr:route>/QHXW/</fr:route>
                <fr:title text="Sprouting shoots, and the Hyperbook">Sprouting shoots, and the Hyperbook</fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <html:p>I <fr:link href="/QHXV/" title="Intellectual junkyards › Resist ontology and embrace time" uri="https://www.forester-notes.org/QHXV/" display-uri="QHXV" type="local">have</fr:link> <fr:link href="/QHXX/" title="Intellectual junkyards › Blogging is the accretion of temporal insight" uri="https://www.forester-notes.org/QHXX/" display-uri="QHXX" type="local">written above</fr:link> about a forestry practice that embeds time and the evolution of ideas at its core; this is achieved by resisting the packrat’s urge to ontologise every aspect of their intellectual life. This does not mean that static ontologisation has no place; for example, a textbook should not present an evolution of its own ideas (except insofar as it describes history), but should rather present a single unified viewpoint on a topic. Indeed, the original goal of Forester was to simplify the creation and deployment of resources like the <fr:link href="/stacks-project/" title="The Stacks project" uri="https://www.forester-notes.org/stacks-project/" display-uri="stacks-project" type="local">Stacks Project</fr:link> and <fr:link href="/kerodon/" title="Kerodon" uri="https://www.forester-notes.org/kerodon/" display-uri="kerodon" type="local">Kerodon</fr:link>, which I will hereafter refer to as <html:em>hyperbooks</html:em>.</html:p>
                <html:p>In the hyperbook, we can and must give full play to our instinct for ontologisation, and we are freed from the crushing obligation of permanence by treating a hyperbook in the same way that we treat a blog post: as a unified accretion of insight that pertains to a specific moment in time, making no pretensions as to the universality of the specific ontological approach. This should not surprise anyone who has written books or lecture notes before, but it does represent a retreat from what might now be viewed as an “extremist deviation” in the design of Forester.</html:p>
                <html:p>Prior to <fr:link href="/011P/" title="Forester 5.0" uri="https://www.forester-notes.org/011P/" display-uri="011P" type="local">Forester 5.0</fr:link>, each person was expected to have just a single forest and all their writings (including lecture notes and hyperbooks!) were expected to be part of that forest. I found that this approach, however, intensifies all the kinds of <fr:link href="/QHXT/" title="Intellectual junkyards › Life in the junkyard after a few years" uri="https://www.forester-notes.org/QHXT/" display-uri="QHXT" type="local">metal stress</fr:link> that kills motivation and hastens descent into the intellectual junkyard. <html:mark>A better way forward is to liberally split off hyperbooks as independent forests—which can then be <fr:link href="/30FN/" title="Forester 5.0 › Publishing and implanting forests" uri="https://www.forester-notes.org/30FN/" display-uri="30FN" type="local"><html:em>federated</html:em> with your own forest</fr:link></html:mark> (please note that this functionality is experimental and subject to change). The ability to federate forests is important, because otherwise one would have to choose between bidirectional linking and modularity; with federation, there is no need to make this choice.</html:p>
                <html:p>Splitting off forests in <fr:link href="/011P/" title="Forester 5.0" uri="https://www.forester-notes.org/011P/" display-uri="011P" type="local">Forester 5.0</fr:link> still involves some annoying points of friction; the biggest one is the <fr:link href="/OYOJ/" title="Towards Forester 5.0: a design for global identity" uri="https://www.forester-notes.org/OYOJ/" display-uri="OYOJ" type="local">need for global identity that spans all forests</fr:link>. A solution to this problem will not ship with 5.0, but I am preparing to work on it for a subsequent release.</html:p>
              </fr:mainmatter>
            </fr:tree>
            <fr:tree show-metadata="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:date>
                  <fr:year>2025</fr:year>
                  <fr:month>5</fr:month>
                  <fr:day>27</fr:day>
                </fr:date>
                <fr:date>
                  <fr:year>2025</fr:year>
                  <fr:month>5</fr:month>
                  <fr:day>30</fr:day>
                </fr:date>
                <fr:uri>https://www.forester-notes.org/QHXY/</fr:uri>
                <fr:display-uri>QHXY</fr:display-uri>
                <fr:route>/QHXY/</fr:route>
                <fr:title text="Renew life, have a forest fire!">Renew life, have a forest fire!</fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <html:p>The goal of the Forester project has always been to reduce mental stress and release untapped stores of creativity in the struggle for outlook and insight. In some sense, every iteration of Forester has been an experiment from which we are taking both positive and negative lessons.</html:p>
                <html:p>Some users of Forester have adopted extreme ontological practices (abetted, perhaps regrettably, by our <fr:link href="/013A/" title="Forester 5.0 › New datalog-based query engine" uri="https://www.forester-notes.org/013A/" display-uri="013A" type="local">dangerously powerful Datalog query engine</fr:link>). It is not my place to prescribe how people should use Forester, but I do care for people’s well-being and I strongly believe that these kinds of practices can destroy the mind over time. <html:mark>If you are feeling the weight of ontology in a heavy-laden forest, there is nothing wrong with a little <html:em>forest fire</html:em>.</html:mark> When the smoke clears, <fr:link href="/QHXX/" title="Intellectual junkyards › Blogging is the accretion of temporal insight" uri="https://www.forester-notes.org/QHXX/" display-uri="QHXX" type="local">start a blog</fr:link>.</html:p>
              </fr:mainmatter>
            </fr:tree>
          </fr:mainmatter>
        </fr:tree>
        <fr:tree show-metadata="true" expanded="false" toc="false" numbered="false">
          <fr:frontmatter>
            <fr:authors>
              <fr:author>
                <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
              </fr:author>
            </fr:authors>
            <fr:date>
              <fr:year>2023</fr:year>
              <fr:month>5</fr:month>
              <fr:day>14</fr:day>
            </fr:date>
            <fr:date>
              <fr:year>2024</fr:year>
              <fr:month>4</fr:month>
              <fr:day>25</fr:day>
            </fr:date>
            <fr:date>
              <fr:year>2025</fr:year>
              <fr:month>5</fr:month>
              <fr:day>26</fr:day>
            </fr:date>
            <fr:uri>https://www.forester-notes.org/0052/</fr:uri>
            <fr:display-uri>0052</fr:display-uri>
            <fr:route>/0052/</fr:route>
            <fr:title text="Build your own Stacks Project in 10 minutes">Build your own <fr:link href="/stacks-project/" title="The Stacks project" uri="https://www.forester-notes.org/stacks-project/" display-uri="stacks-project" type="local">Stacks Project</fr:link> in 10 minutes</fr:title>
          </fr:frontmatter>
          <fr:mainmatter>
            <html:p><fr:link href="/stacks-project/" title="The Stacks project" uri="https://www.forester-notes.org/stacks-project/" display-uri="stacks-project" type="local">The Stacks project</fr:link> is the most successful scientific hypertext project in history. Its goal is to lay the foundations for the theory of algebraic stacks; to facilitate its scalable and sustainable development, several important innovations have been introduced, with the <html:em>tags</html:em> system being the most striking.</html:p>
            <html:blockquote>
  Each tag refers to a unique item (section, lemma, theorem, etc.) in order for this project to be referenceable. These tags don't change even if the item moves within the text. (<fr:link href="https://stacks.math.columbia.edu/tags" type="external">Tags explained</fr:link>, <fr:link href="/stacks-project/" title="The Stacks project" uri="https://www.forester-notes.org/stacks-project/" display-uri="stacks-project" type="local">The Stacks Project</fr:link>).
</html:blockquote>
            <html:p>Many working scientists, students, and hobbyists have wished to create their own tag-based hypertext knowledge base, but the combination of tools historically required to make this happen are extremely daunting. Both the <fr:link href="/stacks-project/" title="The Stacks project" uri="https://www.forester-notes.org/stacks-project/" display-uri="stacks-project" type="local">Stacks project</fr:link> and <fr:link href="/kerodon/" title="Kerodon" uri="https://www.forester-notes.org/kerodon/" display-uri="kerodon" type="local">Kerodon</fr:link> use a cluster of software called <fr:link href="/gerby/" title="Gerby" uri="https://www.forester-notes.org/gerby/" display-uri="gerby" type="local">Gerby</fr:link>, but bitrot has set in and it is <fr:link href="https://github.com/gerby-project/plastex/issues/60" type="external">no longer possible</fr:link> to build its dependencies on a modern environment without significant difficulty, raising questions of longevity.</html:p>
            <html:p>Moreover, <fr:link href="/gerby/" title="Gerby" uri="https://www.forester-notes.org/gerby/" display-uri="gerby" type="local">Gerby</fr:link>’s deployment involves running a database on a server (in spite of the fact that almost the entire functionality is static HTML), an architecture that is incompatible with the constraints of the everyday working scientist or student who knows <html:em>at most</html:em> how to upload static files to their university-provided public storage. The recent experience of the <fr:link href="https://ncatlab.org/nlab/show/HomePage" type="external">nLab</fr:link>’s pandemic-era hiatus and near death experience has demonstrated with some urgency the pracarity faced by any project relying heavily on volunteer system administrators.</html:p>
            <fr:tree show-metadata="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:date>
                  <fr:year>2023</fr:year>
                  <fr:month>5</fr:month>
                  <fr:day>14</fr:day>
                </fr:date>
                <fr:uri>https://www.forester-notes.org/0053/</fr:uri>
                <fr:display-uri>0053</fr:display-uri>
                <fr:route>/0053/</fr:route>
                <fr:title text="Introducing Forester: a tool for scientific thought">Introducing <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local"><html:em>Forester</html:em></fr:link>: a <fr:link href="/tfmt-0002/" title="Tool for scientific thought" uri="https://www.forester-notes.org/tfmt-0002/" display-uri="tfmt-0002" type="local">tool for scientific thought</fr:link></fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <html:p>After spending two years exploring the <fr:link href="/tfmt-0001/" title="Designing tools for scientific thought" uri="https://www.forester-notes.org/tfmt-0001/" display-uri="tfmt-0001" type="local">design of tools for scientific thought</fr:link> that meet the unique needs of real, scalable scientific writing in hypertext, I have created a tool called <html:strong><fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link></html:strong> which has the following benefits:</html:p>
                <html:ol><html:li><fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> is tag-based like <fr:link href="/gerby/" title="Gerby" uri="https://www.forester-notes.org/gerby/" display-uri="gerby" type="local">Gerby</fr:link>, and can therefore power large-scale generational projects like <fr:link href="/stacks-project/" title="The Stacks project" uri="https://www.forester-notes.org/stacks-project/" display-uri="stacks-project" type="local">Stacks</fr:link> and <fr:link href="/kerodon/" title="Kerodon" uri="https://www.forester-notes.org/kerodon/" display-uri="kerodon" type="local">Kerodon</fr:link>.</html:li>
  <html:li><fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> produces static content that <fr:link href="/007R/" title="Deploying your forest to a web host" uri="https://www.forester-notes.org/007R/" display-uri="007R" type="local">can be uploaded to any web hosting service</fr:link> without needing to run or install any serverside software.</html:li>
  <html:li><fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> is <fr:link href="/006W/" title="Installing the Forester software" uri="https://www.forester-notes.org/006W/" display-uri="006W" type="local">easy to install</fr:link> on your own machine.</html:li>
  <html:li>To prevent bitrot, <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> is a single tool rather than a composition of several tools.</html:li>
  <html:li><fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> satisfies <html:em>all</html:em> the <fr:link href="/tfmt-000E/" title="Requirements for typesetting mathematics" uri="https://www.forester-notes.org/tfmt-000E/" display-uri="tfmt-000E" type="local">requirements of serious scientific writing</fr:link>, including sophisticated notational macros, typesetting of diagrams, etc.</html:li></html:ol>
                <html:p><fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> combines <fr:link href="/tfmt-0005/" title="Hierarchy in evergreen notes" uri="https://www.forester-notes.org/tfmt-0005/" display-uri="tfmt-0005" type="local">associative and hierarchical</fr:link> networks of <fr:link href="/tfmt-0003/" title="Evergreen notes" uri="https://www.forester-notes.org/tfmt-0003/" display-uri="tfmt-0003" type="local">evergreen notes</fr:link> (called “trees”) into hypertext sites called “forests”.</html:p>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2023</fr:year>
                      <fr:month>3</fr:month>
                      <fr:day>4</fr:day>
                    </fr:date>
                    <fr:uri>https://www.forester-notes.org/tfmt-000R/</fr:uri>
                    <fr:display-uri>tfmt-000R</fr:display-uri>
                    <fr:route>/tfmt-000R/</fr:route>
                    <fr:title text="Forests and trees of evergreen notes">Forests and trees of evergreen notes</fr:title>
                    <fr:taxon>Definition</fr:taxon>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>A <html:em>forest of <fr:link href="/tfmt-0003/" title="Evergreen notes" uri="https://www.forester-notes.org/tfmt-0003/" display-uri="tfmt-0003" type="local">evergreen notes</fr:link></html:em> (or a <html:em>forest</html:em> for short) is loosely defined to be a collection of <fr:link href="/tfmt-0003/" title="Evergreen notes" uri="https://www.forester-notes.org/tfmt-0003/" display-uri="tfmt-0003" type="local">evergreen notes</fr:link> in which multiple <fr:link href="/tfmt-0005/" title="Hierarchy in evergreen notes" uri="https://www.forester-notes.org/tfmt-0005/" display-uri="tfmt-0005" type="local">hierarchical structures</fr:link> are allowed to emerge and evolve over time. Concretely, one note may contextualize several other notes via transclusion within its textual structure; in the context of a forest, we refer to an individual note as a <html:em>tree</html:em>. Of course, a tree can be viewed as a forest that has a root node.</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <html:p>Trees correspond roughly to what are referred to as “tags” in the <fr:link href="/stacks-project/" title="The Stacks project" uri="https://www.forester-notes.org/stacks-project/" display-uri="stacks-project" type="local">Stacks Project</fr:link>.</html:p>
              </fr:mainmatter>
            </fr:tree>
            <html:p>In this article, I will show you how to set up your own <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link> using the <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> software. <html:mark>These instructions pertain to the <fr:link href="/011P/" title="Forester 5.0" uri="https://www.forester-notes.org/011P/" display-uri="011P" type="local">Forester 5.0</fr:link> version.</html:mark></html:p>
            <fr:tree show-metadata="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:date>
                  <fr:year>2023</fr:year>
                  <fr:month>8</fr:month>
                  <fr:day>13</fr:day>
                </fr:date>
                <fr:uri>https://www.forester-notes.org/006R/</fr:uri>
                <fr:display-uri>006R</fr:display-uri>
                <fr:route>/006R/</fr:route>
                <fr:title text="Preparing to run the Forester software">Preparing to run the <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> software</fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <html:p>In this section, we will walk through the installation of the <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> software.</html:p>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2023</fr:year>
                      <fr:month>8</fr:month>
                      <fr:day>13</fr:day>
                    </fr:date>
                    <fr:uri>https://www.forester-notes.org/006S/</fr:uri>
                    <fr:display-uri>006S</fr:display-uri>
                    <fr:route>/006S/</fr:route>
                    <fr:title text="System requirements of Forester">System requirements of <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link></fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <fr:tree show-metadata="false">
                      <fr:frontmatter>
                        <fr:authors>
                          <fr:author>
                            <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
                          </fr:author>
                        </fr:authors>
                        <fr:date>
                          <fr:year>2023</fr:year>
                          <fr:month>8</fr:month>
                          <fr:day>13</fr:day>
                        </fr:date>
                        <fr:uri>https://www.forester-notes.org/006T/</fr:uri>
                        <fr:display-uri>006T</fr:display-uri>
                        <fr:route>/006T/</fr:route>
                        <fr:title text="A unix-based system">A unix-based system</fr:title>
                        <fr:taxon>Requirement</fr:taxon>
                      </fr:frontmatter>
                      <fr:mainmatter>
                        <html:p><fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> requires a unix-based system to run; it has been tested on both macOS and Linux. Windows support is <fr:link href="https://todo.sr.ht/~jonsterling/forester/6" type="external">desirable</fr:link>, but there are no concrete plans to implement it at this time.</html:p>
                      </fr:mainmatter>
                    </fr:tree>
                    <fr:tree show-metadata="false">
                      <fr:frontmatter>
                        <fr:authors>
                          <fr:author>
                            <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
                          </fr:author>
                        </fr:authors>
                        <fr:date>
                          <fr:year>2023</fr:year>
                          <fr:month>8</fr:month>
                          <fr:day>13</fr:day>
                        </fr:date>
                        <fr:uri>https://www.forester-notes.org/006U/</fr:uri>
                        <fr:display-uri>006U</fr:display-uri>
                        <fr:route>/006U/</fr:route>
                        <fr:title text="A working OCaml 5 installation">A working OCaml 5 installation</fr:title>
                        <fr:taxon>Requirement</fr:taxon>
                      </fr:frontmatter>
                      <fr:mainmatter>
                        <html:p><fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> is written in the <fr:link href="https://www.ocaml.org/" type="external">OCaml</fr:link> programming language, and makes use of the latest features of OCaml 5. Most users should install <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> through OCaml's <fr:link href="https://opam.ocaml.org/" type="external">opam</fr:link> package manager; instructions to install opam and OCaml simultaneously can be found <fr:link href="https://opam.ocaml.org/" type="external">here</fr:link>.</html:p>
                      </fr:mainmatter>
                    </fr:tree>
                    <fr:tree show-metadata="false">
                      <fr:frontmatter>
                        <fr:authors>
                          <fr:author>
                            <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
                          </fr:author>
                        </fr:authors>
                        <fr:date>
                          <fr:year>2023</fr:year>
                          <fr:month>8</fr:month>
                          <fr:day>13</fr:day>
                        </fr:date>
                        <fr:uri>https://www.forester-notes.org/006V/</fr:uri>
                        <fr:display-uri>006V</fr:display-uri>
                        <fr:route>/006V/</fr:route>
                        <fr:title text="A working \LaTeX  installation">A working <fr:tex display="inline"><![CDATA[\LaTeX ]]></fr:tex> installation</fr:title>
                        <fr:taxon>Requirement</fr:taxon>
                      </fr:frontmatter>
                      <fr:mainmatter>
                        <html:p>If you intend to <fr:link href="/tfmt-000L/" title="Generating images statically using LaTeX" uri="https://www.forester-notes.org/tfmt-000L/" display-uri="tfmt-000L" type="local">embed <fr:tex display="inline"><![CDATA[\LaTeX ]]></fr:tex>-rendered diagrams</fr:link> in your <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link>, you will need to have a working installation of <fr:tex display="inline"><![CDATA[\LaTeX ]]></fr:tex> installed, such as <fr:link href="https://tug.org/texlive/" type="external">TeX Live</fr:link>. If all your mathematical expressions are supported by <fr:link href="https://katex.org/" type="external"><fr:tex display="inline"><![CDATA[\KaTeX ]]></fr:tex></fr:link>, this is not necessary.</html:p>
                      </fr:mainmatter>
                    </fr:tree>
                    <fr:tree show-metadata="false">
                      <fr:frontmatter>
                        <fr:authors>
                          <fr:author>
                            <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
                          </fr:author>
                        </fr:authors>
                        <fr:date>
                          <fr:year>2023</fr:year>
                          <fr:month>8</fr:month>
                          <fr:day>14</fr:day>
                        </fr:date>
                        <fr:uri>https://www.forester-notes.org/006Y/</fr:uri>
                        <fr:display-uri>006Y</fr:display-uri>
                        <fr:route>/006Y/</fr:route>
                        <fr:title text="The git distributed version control system">The <fr:link href="https://git-scm.com/" type="external">git</fr:link> distributed version control system</fr:title>
                        <fr:taxon>Requirement</fr:taxon>
                      </fr:frontmatter>
                      <fr:mainmatter>
                        <html:p>It is best practice to maintain your <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link> inside of <fr:link href="https://en.wikipedia.org/wiki/Distributed_version_control" type="external">distributed version control</fr:link>. This serves not only as a way to prevent data loss (because you will be pushing frequently to a remote repository); it also allows you to easily roll back to an earlier version of your <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link>, or to create “branches” in which you prepare <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">trees</fr:link> that are not yet ready to be integrated into the <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link>.</html:p>
                        <html:p>The recommended <fr:link href="https://en.wikipedia.org/wiki/Distributed_version_control" type="external">distributed version control</fr:link> system is <fr:link href="https://git-scm.com/" type="external">git</fr:link>, which comes preinstalled on many unix-based systems and is easy to install otherwise. <fr:link href="https://git-scm.com/" type="external">Git</fr:link> is not the most user-friendly piece of software, unfortunately, but it is ubiquitous. It is possible (but not recommended) to use <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> without version control, but note that the simplest way to <fr:link href="/006X/" title="Setting up your forest from the template" uri="https://www.forester-notes.org/006X/" display-uri="006X" type="local">initialize your own <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link></fr:link> involves cloning a <fr:link href="https://git-scm.com/" type="external">git</fr:link> repository.</html:p>
                      </fr:mainmatter>
                    </fr:tree>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2023</fr:year>
                      <fr:month>8</fr:month>
                      <fr:day>13</fr:day>
                    </fr:date>
                    <fr:uri>https://www.forester-notes.org/006W/</fr:uri>
                    <fr:display-uri>006W</fr:display-uri>
                    <fr:route>/006W/</fr:route>
                    <fr:title text="Installing the Forester software">Installing the <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> software</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>Once you have met the <fr:link href="/006S/" title="System requirements of Forester" uri="https://www.forester-notes.org/006S/" display-uri="006S" type="local">system requirements</fr:link>, installing <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> requires only a single shell command:</html:p>
                    <html:pre><![CDATA[opam install forester]]></html:pre>
                    <html:p>To verify that <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> is installed, please run <html:code>forester --version</html:code> in your shell.</html:p>
                  </fr:mainmatter>
                </fr:tree>
              </fr:mainmatter>
            </fr:tree>
            <fr:tree show-metadata="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:date>
                  <fr:year>2023</fr:year>
                  <fr:month>8</fr:month>
                  <fr:day>14</fr:day>
                </fr:date>
                <fr:date>
                  <fr:year>2024</fr:year>
                  <fr:month>4</fr:month>
                  <fr:day>25</fr:day>
                </fr:date>
                <fr:date>
                  <fr:year>2024</fr:year>
                  <fr:month>6</fr:month>
                  <fr:day>17</fr:day>
                </fr:date>
                <fr:uri>https://www.forester-notes.org/006X/</fr:uri>
                <fr:display-uri>006X</fr:display-uri>
                <fr:route>/006X/</fr:route>
                <fr:title text="Setting up your forest from the template">Setting up your <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link> from the template</fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <html:p>Now that you have <fr:link href="/006W/" title="Installing the Forester software" uri="https://www.forester-notes.org/006W/" display-uri="006W" type="local">installed</fr:link> the <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> software, it is time to set up your <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link>. <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> provides a simple command to initialise a fresh <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link> within a folder. We’ll call our folder <html:code>forest</html:code>, but you can call it anything you want.</html:p>
                <html:pre><![CDATA[mkdir forest
cd forest]]></html:pre>
                <html:p>Now that we are inside our new directory, we can instruct <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> to initialise a <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link>.</html:p>
                <html:pre>forester init</html:pre>
                <html:p>This command initialises a <fr:link href="https://git-scm.com/" type="external">git</fr:link> repository with the skeleton of a <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link>, which contains a configuration file named <html:code>forest.toml</html:code>; this file specifies the locations of your trees, assets, etc. There is also a <fr:link href="https://git-scm.com/" type="external">git</fr:link> submodule bound to the <html:code>theme/</html:code> directory (pointing to the <fr:link href="https://git.sr.ht/~jonsterling/forester-base-theme" type="external">base theme</fr:link> repository) that contains the stylesheets that web browsers will need in order to render your <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link> as HTML.</html:p>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2023</fr:year>
                      <fr:month>8</fr:month>
                      <fr:day>14</fr:day>
                    </fr:date>
                    <fr:date>
                      <fr:year>2024</fr:year>
                      <fr:month>6</fr:month>
                      <fr:day>17</fr:day>
                    </fr:date>
                    <fr:uri>https://www.forester-notes.org/0073/</fr:uri>
                    <fr:display-uri>0073</fr:display-uri>
                    <fr:route>/0073/</fr:route>
                    <fr:title text="Tree addresses in a forest">Tree addresses in a <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link></fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>A <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">tree</fr:link> in <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> is usually associated to an address of the form <html:code>NNNN</html:code> is a four-digit <fr:link href="/0074/" title="Base-36 identifiers in Forester" uri="https://www.forester-notes.org/0074/" display-uri="0074" type="local">base-36 number</fr:link>. The purpose of the <fr:link href="/0074/" title="Base-36 identifiers in Forester" uri="https://www.forester-notes.org/0074/" display-uri="0074" type="local">base-36</fr:link> code is to uniquely identify a <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">tree</fr:link> within your <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link> in such a way that you are not tempted to rename it, as you might be when titles or dates are embedded into filenames. A tree with address <html:code>NNNN</html:code> is stored in a file named <html:code>NNNN.tree</html:code> (unless it is emitted from inside another tree by means of the <fr:link href="/00O4/" title="Forester 3.1 › Inline subtrees" uri="https://www.forester-notes.org/00O4/" display-uri="00O4" type="local">inline subtrees</fr:link> feature).</html:p>
                    <html:p>Note that the format of <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">tree</fr:link> addresses is purely a matter of convention, and is not forced by the <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> tool. Users are free to use their own naming convention for tree addresses, and in some cases alternative (human-readable) formats may be desirable: this includes trees representing bibliographic references, as well as biographical trees. <html:mark>If you don’t like numerical tree addresses, nobody is forcing you to use them.</html:mark> The use of numerical addresses is suitable for projects like <fr:link href="/stacks-project/" title="The Stacks project" uri="https://www.forester-notes.org/stacks-project/" display-uri="stacks-project" type="local">The Stacks Project</fr:link>, but it may not be appropriate for your own use-case.</html:p>
                    <html:p>Addresses in <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> are not hierarchical: all resources are rendered at the root of the forest, no matter where their source files are kept. This limitation is intentional, but we might revisit it in the future.</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2023</fr:year>
                      <fr:month>8</fr:month>
                      <fr:day>15</fr:day>
                    </fr:date>
                    <fr:date>
                      <fr:year>2024</fr:year>
                      <fr:month>4</fr:month>
                      <fr:day>25</fr:day>
                    </fr:date>
                    <fr:uri>https://www.forester-notes.org/007D/</fr:uri>
                    <fr:display-uri>007D</fr:display-uri>
                    <fr:route>/007D/</fr:route>
                    <fr:title text="Building and viewing your forest for the first time">Building and viewing your <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link> for the first time</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>To build your <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link>, you can run the following command of <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link>'s executable in your shell:</html:p>
                    <html:pre>forester build forest.toml</html:pre>
                    <html:p>The <html:code>--dev</html:code> flag is optional, and when activated supplies metadata to the generated website to support an “edit button” on each tree; this flag is meant to be used when developing your <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link> locally, and should not be used when building the <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link> to be uploaded to your public web host.</html:p>
                    <fr:tree show-metadata="false">
                      <fr:frontmatter>
                        <fr:authors>
                          <fr:author>
                            <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
                          </fr:author>
                        </fr:authors>
                        <fr:date>
                          <fr:year>2023</fr:year>
                          <fr:month>8</fr:month>
                          <fr:day>15</fr:day>
                        </fr:date>
                        <fr:uri>https://www.forester-notes.org/007G/</fr:uri>
                        <fr:display-uri>007G</fr:display-uri>
                        <fr:route>/007G/</fr:route>
                        <fr:title text="Forester renders each tree to an XML document"><fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> renders each tree to an XML document</fr:title>
                      </fr:frontmatter>
                      <fr:mainmatter>
                        <html:p><fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> renders your <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link> to some XML files in the <html:code>output/</html:code> directory; XML is, like HTML, a format for structured documents that can be displayed by web browsers. The <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link> template comes equipped with a built-in XSLT stylesheet (<html:code>theme/default.xsl</html:code>) which is used to instruct web browsers how to render your <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link> into a pleasing and readable format.</html:p>
                      </fr:mainmatter>
                    </fr:tree>
                    <fr:tree show-metadata="false">
                      <fr:frontmatter>
                        <fr:authors>
                          <fr:author>
                            <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
                          </fr:author>
                        </fr:authors>
                        <fr:date>
                          <fr:year>2023</fr:year>
                          <fr:month>8</fr:month>
                          <fr:day>15</fr:day>
                        </fr:date>
                        <fr:uri>https://www.forester-notes.org/007I/</fr:uri>
                        <fr:display-uri>007I</fr:display-uri>
                        <fr:route>/007I/</fr:route>
                        <fr:title text="Serving and viewing your forest from a local web server">Serving and viewing your <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link> from a local web server</fr:title>
                      </fr:frontmatter>
                      <fr:mainmatter>
                        <html:p>To view your <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link> while editing it, you must <html:em>serve</html:em> it from a local web server..To do this, first ensure that you have <fr:link href="https://www.python.org/downloads/" type="external">Python 3</fr:link> correctly installed. Then run the following command from the root directory of your <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link>:</html:p>
                        <html:pre>python3 -m http.server 1313 -d output</html:pre>
                        <html:p>(You could replace <html:code>1313</html:code> with whatever port you prefer.) While this command is running, you will be able to access your <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link> by navigating to <fr:link href="http://localhost:1313/" type="external"><html:code>localhost:1313</html:code></fr:link> in your preferred web browser.</html:p>
                        <html:p>In the future, <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> <fr:link href="https://todo.sr.ht/~jonsterling/forester/15" type="external">may be able to run its own local server</fr:link> to avoid the dependency on external tools like Python.</html:p>
                      </fr:mainmatter>
                    </fr:tree>
                  </fr:mainmatter>
                </fr:tree>
              </fr:mainmatter>
            </fr:tree>
            <fr:tree show-metadata="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:date>
                  <fr:year>2023</fr:year>
                  <fr:month>8</fr:month>
                  <fr:day>15</fr:day>
                </fr:date>
                <fr:uri>https://www.forester-notes.org/007K/</fr:uri>
                <fr:display-uri>007K</fr:display-uri>
                <fr:route>/007K/</fr:route>
                <fr:title text="Creating your personal biographical tree">Creating your personal biographical <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">tree</fr:link></fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <html:p>The first <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">tree</fr:link> that you should create is a biographical tree to represent your own identity; ultimately you will link to this tree when you set the <fr:link href="/tfmt-000S/" title="Author of a tree" uri="https://www.forester-notes.org/tfmt-000S/" display-uri="tfmt-000S" type="local">authors</fr:link> of other <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">trees</fr:link> that you create later on. It is convenient to simply use a person’s full name to address a biographical <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">tree</fr:link>. <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">My own biographical tree</fr:link> is located at <html:code>trees/people/jonmsterling.tree</html:code> and contains the following source code:</html:p>
                <html:pre><![CDATA[\title{Jon Sterling}
\taxon{Person}
\meta{external}{https://www.jonmsterling.com/}
\meta{institution}{[[ucam]]}
\meta{orcid}{0000-0002-0585-5564}
\meta{position}{Associate Professor}

\p{Associate Professor in Logical Foundations and Formal Methods at University of Cambridge. Formerly a [Marie Skłodowska-Curie Postdoctoral Fellow](0061) hosted at Aarhus University by [Lars Birkedal](larsbirkedal), and before this a PhD student of [Robert Harper](robertharper).}]]></html:pre>
                <html:p>Let’s break this code down to understand what it does.</html:p>
                <html:ol><html:li>The declaration <html:code><![CDATA[\title{Jon Sterling}]]></html:code> sets the title of the <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">tree</fr:link> to my name.</html:li>
  <html:li>The <html:code><![CDATA[\taxon{Person}]]></html:code> declaration informs <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> that the <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">tree</fr:link> is biographical. Not ever <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">tree</fr:link> needs to have a taxon; common taxa include <html:code>Person</html:code>, <html:code>Theorem</html:code>, <html:code>Definition</html:code>, <html:code>Lemma</html:code>, etc. You are free to use whatever you want, but some taxa are treated specially by <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link>.</html:li>
  <html:li>The subsequent <html:code><![CDATA[\meta]]></html:code> declarations attach additional information to the tree that can be used during rendering. These declarations are optional, and you are free to put whatever metadata you want.</html:li>
  <html:li>Like in HTML, paragraphs must be wrapped in <html:code><![CDATA[\p{...}]]></html:code>.</html:li></html:ol>
                <html:p>Do not hard-wrap your text, as this can have visible impact on how <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">trees</fr:link> are rendered; it is recommended that you use a text editor with good support for soft-wrapping, like <fr:link href="https://code.visualstudio.com/" type="external">Visual Studio Code</fr:link>.</html:p>
                <html:p>You can see that the <fr:link href="/007N/" title="The Forester markup language" uri="https://www.forester-notes.org/007N/" display-uri="007N" type="local">concrete syntax of <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link>'s <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">trees</fr:link></fr:link> looks superficially like a combination of <fr:tex display="inline"><![CDATA[\LaTeX ]]></fr:tex> and Markdown; Markdown-style links are used both for links to other trees <html:em>and</html:em> for links to external URLs. <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link>'s concrete syntax is not fully documented, but it is less ambiguous than both <fr:tex display="inline"><![CDATA[\LaTeX ]]></fr:tex> and Markdown.</html:p>
              </fr:mainmatter>
            </fr:tree>
            <fr:tree show-metadata="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:date>
                  <fr:year>2023</fr:year>
                  <fr:month>8</fr:month>
                  <fr:day>15</fr:day>
                </fr:date>
                <fr:date>
                  <fr:year>2024</fr:year>
                  <fr:month>4</fr:month>
                  <fr:day>25</fr:day>
                </fr:date>
                <fr:uri>https://www.forester-notes.org/007H/</fr:uri>
                <fr:display-uri>007H</fr:display-uri>
                <fr:route>/007H/</fr:route>
                <fr:title text="Creating a new tree using forester new">Creating a new <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">tree</fr:link> using <html:code>forester new</html:code></fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <html:p>Creating a new <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">tree</fr:link> in your <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link> is as simple as adding a <html:code>.tree</html:code> file to the <html:code>trees</html:code> folder. Because it is hard to manually choose the <fr:link href="/0073/" title="Tree addresses in a forest" uri="https://www.forester-notes.org/0073/" display-uri="0073" type="local">next incremental tree address</fr:link>, <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> provides a command to do this automatically:</html:p>
                <html:pre>forester new forest.toml --dest=trees</html:pre>
                <html:p>In return, <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> should output the location of the new tree, e.g. <html:code>trees/0002.tree</html:code>. If we look at the contents of this new file, we will see that it is empty except for metadata assigning a date to the tree:</html:p>
                <html:pre><![CDATA[\date{2023-08-15}]]></html:pre>
                <html:p>You may prefer to use <html:em>randomised</html:em> addresses over sequential addresses; this can be particularly useful if multiple people are contributing to a <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link>. In that case, pass the <html:code>--random</html:code> option to <html:code>forester new</html:code>.</html:p>
                <html:p><html:strong>Most <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">trees</fr:link> should have a <html:code><![CDATA[\date]]></html:code> annotation;</html:strong> this date is meant to be the date of the <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">tree</fr:link>'s creation; you can have more than one date, if you like to keep track of when a tree has been updated. You should proceed by adding further metadata: the title and the <fr:link href="/tfmt-000S/" title="Author of a tree" uri="https://www.forester-notes.org/tfmt-000S/" display-uri="tfmt-000S" type="local">author</fr:link>; for the latter, you will use the address of your <fr:link href="/007K/" title="Creating your personal biographical tree" uri="https://www.forester-notes.org/007K/" display-uri="007K" type="local">personal biographical tree</fr:link>.</html:p>
                <html:pre><![CDATA[\title{My first tree}
\author{jonmsterling}]]></html:pre>
                <html:p><fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">Tree</fr:link> titles should be given in lower case (except for proper names, etc.); these titles will be <html:em>rendered</html:em> by <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> in sentence case. A <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">tree</fr:link> can have as many <html:code><![CDATA[\author]]></html:code> declarations as it has <fr:link href="/tfmt-000S/" title="Author of a tree" uri="https://www.forester-notes.org/tfmt-000S/" display-uri="tfmt-000S" type="local">authors</fr:link>; these will be rendered in their order of appearance.</html:p>
                <html:p>Now you can begin to populate the tree with its content, written in the <fr:link href="/007N/" title="The Forester markup language" uri="https://www.forester-notes.org/007N/" display-uri="007N" type="local"><fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> markup language</fr:link>. <fr:link href="/tfmt-0007/" title="Atomicity of scientific notes" uri="https://www.forester-notes.org/tfmt-0007/" display-uri="tfmt-0007" type="local">Think carefully about keeping each tree relatively independent and atomic</fr:link>.</html:p>
              </fr:mainmatter>
            </fr:tree>
            <fr:tree show-metadata="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:date>
                  <fr:year>2023</fr:year>
                  <fr:month>8</fr:month>
                  <fr:day>15</fr:day>
                </fr:date>
                <fr:uri>https://www.forester-notes.org/007L/</fr:uri>
                <fr:display-uri>007L</fr:display-uri>
                <fr:route>/007L/</fr:route>
                <fr:title text="Bottom-up hierarchy via transclusion">Bottom-up hierarchy via <html:em>transclusion</html:em></fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <html:p>You may be used to writing <fr:tex display="inline"><![CDATA[\LaTeX ]]></fr:tex> documents, where you work from the top down: you create some section headings, put some text under those headings, make some deeper section headings, put more text, etc. <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">Forests</fr:link> work in the opposite way, from the bottom up: you start by writing independent, <fr:link href="/tfmt-0007/" title="Atomicity of scientific notes" uri="https://www.forester-notes.org/tfmt-0007/" display-uri="tfmt-0007" type="local">atomic</fr:link> notes/<fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">trees</fr:link> and then only later start to (sparingly) assemble these into a hierarchy in order to reify the emerging structure.</html:p>
                <html:p><fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link>’s bottom-up approach to section hierarchy works via something called <html:em>transclusion</html:em>. The idea is that at any time, you can include (“transclude”) the full contents of another <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">tree</fr:link> into the current tree as a subsection by adding the following code:</html:p>
                <html:pre><![CDATA[\transclude{address}]]></html:pre>
                <html:p>This is kind of like <fr:tex display="inline"><![CDATA[\LaTeX ]]></fr:tex>’s <html:code><![CDATA[\input]]></html:code> command, but much better behaved: for instance, section levels are computed on the fly depending on the position in the hierarchy. This <fr:link href="/0052/" title="Build your own Stacks Project in 10 minutes" uri="https://www.forester-notes.org/0052/" display-uri="0052" type="local">entire tutorial</fr:link> is cobbled together by transcluding many smaller <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">trees</fr:link>, each with their own independent existence. For example, the following two sections are transcluded from an <fr:link href="/tfmt-0001/" title="Designing tools for scientific thought" uri="https://www.forester-notes.org/tfmt-0001/" display-uri="tfmt-0001" type="local">entirely different part</fr:link> of my forest:</html:p>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2022</fr:year>
                      <fr:month>12</fr:month>
                      <fr:day>27</fr:day>
                    </fr:date>
                    <fr:uri>https://www.forester-notes.org/tfmt-0009/</fr:uri>
                    <fr:display-uri>tfmt-0009</fr:display-uri>
                    <fr:route>/tfmt-0009/</fr:route>
                    <fr:title text="The best structure to impose is relatively flat">The best structure to impose is relatively flat</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>It is easy to make the mistake of prematurely imposing a complex hierarchical structure on a network of notes, which leads to excessive refactoring. Hierarchy should be used sparingly, and its strength is for the large-scale organization of ideas. The best structure to impose on a network of many small related ideas is a relatively flat one. I believe that this is one of the mistakes made in the writing of the <html:em>foundations of relative category theory</html:em>, whose hierarchical nesting was too complex and quite beholden to my experience with pre-hypertext media.</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <html:p>One of the immediate impacts and strengths of <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link>’s transclusion model is that a given <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">tree</fr:link> has no canonical “geographic” location in the <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link>. One <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">tree</fr:link> can appear as a child of many other <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">trees</fr:link>, which allows the same content to be incorporated into different textual and intellectual narratives.</html:p>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2022</fr:year>
                      <fr:month>12</fr:month>
                      <fr:day>26</fr:day>
                    </fr:date>
                    <fr:uri>https://www.forester-notes.org/tfmt-0006/</fr:uri>
                    <fr:display-uri>tfmt-0006</fr:display-uri>
                    <fr:route>/tfmt-0006/</fr:route>
                    <fr:title text="Hierarchical structure as non-unique narrative">Hierarchical structure as non-unique narrative</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>Multiple hierarchical structures can be imposed on the same associative network of nodes; a hierarchical structure amounts to a “narrative” that contextualizes a given subgraph of the network. One example could be the construction of lecture notes; another example could be a homework sheet; a further example could be a book chapter or scientific article. Although these may draw from the same body of definitions, theorems, examples, and exercises, these objects are contextualized within a different narrative, often toward fundamentally different ends.</html:p>
                    <html:p>As a result, any interface for navigating the neighbor-relation in hierarchically organized notes would need to take account of the multiplicity of parent nodes. Most hypertext tools assume that the position of a node in the hierarchy is unique, and therefore have a single “next/previous” navigation interface; we must investigate the design of interfaces that surface all parent/neighbor relations.</html:p>
                  </fr:mainmatter>
                </fr:tree>
              </fr:mainmatter>
            </fr:tree>
            <fr:tree show-metadata="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:date>
                  <fr:year>2023</fr:year>
                  <fr:month>8</fr:month>
                  <fr:day>16</fr:day>
                </fr:date>
                <fr:uri>https://www.forester-notes.org/007N/</fr:uri>
                <fr:display-uri>007N</fr:display-uri>
                <fr:route>/007N/</fr:route>
                <fr:title text="The Forester markup language">The <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> markup language</fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <html:p>A <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">tree</fr:link> in <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> is a single file written in a markup language designed specifically for scientific writing <fr:link href="/007L/" title="Bottom-up hierarchy via transclusion" uri="https://www.forester-notes.org/007L/" display-uri="007L" type="local">with bottom-up hierarchy via transclusion</fr:link>. A <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">tree</fr:link> has two components: the <fr:link href="/007P/" title="Forester markup: frontmatter" uri="https://www.forester-notes.org/007P/" display-uri="007P" type="local">frontmatter</fr:link> and the <fr:link href="/007O/" title="Forester markup: mainmatter" uri="https://www.forester-notes.org/007O/" display-uri="007O" type="local">mainmatter</fr:link>.</html:p>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2023</fr:year>
                      <fr:month>8</fr:month>
                      <fr:day>16</fr:day>
                    </fr:date>
                    <fr:uri>https://www.forester-notes.org/007P/</fr:uri>
                    <fr:display-uri>007P</fr:display-uri>
                    <fr:route>/007P/</fr:route>
                    <fr:title text="Forester markup: frontmatter"><fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> markup: frontmatter</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter><html:p>The frontmatter of a <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">tree</fr:link> is a sequence of declarations that we summarize below.</html:p>
  <html:table>
  
  <html:tr>
    
  <html:th>Declaration</html:th>

    
  <html:th>Meaning</html:th>

  </html:tr>

  
 <html:tr>
  <html:td style="white-space:nowrap">
   <html:code><![CDATA[\title{...}]]></html:code>
  </html:td>
  <html:td>
    sets the title of the <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">tree</fr:link>; can contain <fr:link href="/007O/" title="Forester markup: mainmatter" uri="https://www.forester-notes.org/007O/" display-uri="007O" type="local">mainmatter</fr:link> markup
  </html:td>
 </html:tr>

  
 <html:tr>
  <html:td style="white-space:nowrap">
   <html:code><![CDATA[\author{name}]]></html:code>
  </html:td>
  <html:td>
    sets the <fr:link href="/tfmt-000S/" title="Author of a tree" uri="https://www.forester-notes.org/tfmt-000S/" display-uri="tfmt-000S" type="local">author</fr:link> of the <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">tree</fr:link> to be the biographical tree at address <html:code>name</html:code>
  </html:td>
 </html:tr>

  
 <html:tr>
  <html:td style="white-space:nowrap">
   <html:code><![CDATA[\date{YYYY-MM-DD}]]></html:code>
  </html:td>
  <html:td>sets the creation date of the <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">tree</fr:link>; full ISO 8601 date-times are supported.</html:td>
 </html:tr>

  
 <html:tr>
  <html:td style="white-space:nowrap">
   <html:code><![CDATA[\taxon{Taxon}]]></html:code>
  </html:td>
  <html:td>sets the taxon of the <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">tree</fr:link>; example taxa include <html:code>lemma</html:code>, <html:code>theorem</html:code>, <html:code>person</html:code>, <html:code>reference</html:code>; the latter two taxa are treated specially by <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> for tracking biographical and bibliographical <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">trees</fr:link> respectively</html:td>
 </html:tr>

  
 <html:tr>
  <html:td style="white-space:nowrap">
   <html:code><![CDATA[\def\ident[x][y]{body}]]></html:code>
  </html:td>
  <html:td>
    defines and exports from the current <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">tree</fr:link> a function named <html:code><![CDATA[\ident]]></html:code> with two arguments; subsequently, the expression <html:code><![CDATA[\ident{u}{v}]]></html:code> would expand to <html:code>body</html:code> with the values of <html:code>u,v</html:code> substituted for <html:code><![CDATA[\x,\y]]></html:code>
  </html:td>
 </html:tr>

  
 <html:tr>
  <html:td style="white-space:nowrap">
   <html:code><![CDATA[\import{address}]]></html:code>
  </html:td>
  <html:td>
    brings the functions exported by the tree <html:code>address</html:code> into scope
  </html:td>
 </html:tr>

  
 <html:tr>
  <html:td style="white-space:nowrap">
   <html:code><![CDATA[\export{address}]]></html:code>
  </html:td>
  <html:td>
    brings the functions exported by the tree <html:code>address</html:code> into scope, and exports them from the current tree
  </html:td>
 </html:tr>

</html:table>
</fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2023</fr:year>
                      <fr:month>8</fr:month>
                      <fr:day>16</fr:day>
                    </fr:date>
                    <fr:uri>https://www.forester-notes.org/007O/</fr:uri>
                    <fr:display-uri>007O</fr:display-uri>
                    <fr:route>/007O/</fr:route>
                    <fr:title text="Forester markup: mainmatter"><fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> markup: mainmatter</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter><html:p>Below we summarize the concrete syntax of the <html:em>mainmatter</html:em> in a <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">tree</fr:link>.</html:p>
  <html:table>
  
  <html:tr>
    
  <html:th>Function</html:th>

    
  <html:th>Meaning</html:th>

  </html:tr>

  
 <html:tr>
  <html:td style="white-space:nowrap">
   <html:code><![CDATA[\p{...}]]></html:code>
  </html:td>
  <html:td>creates a paragraph containing <html:code>...</html:code>; unlike Markdown, it is mandatory to annotate paragraphs explicitly</html:td>
 </html:tr>

  
 <html:tr>
  <html:td style="white-space:nowrap">
   <html:code><![CDATA[\em{...}]]></html:code>
  </html:td>
  <html:td>typesets the content in italics</html:td>
 </html:tr>

  
 <html:tr>
  <html:td style="white-space:nowrap">
   <html:code><![CDATA[\strong{...}]]></html:code>
  </html:td>
  <html:td>typesets the content in boldface</html:td>
 </html:tr>


  
 <html:tr>
  <html:td style="white-space:nowrap">
   <html:code><![CDATA[\ol{...}]]></html:code>
  </html:td>
  <html:td>creates an ordered list</html:td>
 </html:tr>


  
 <html:tr>
  <html:td style="white-space:nowrap">
   <html:code><![CDATA[\ul{...}]]></html:code>
  </html:td>
  <html:td>creates an unordered list</html:td>
 </html:tr>


  
 <html:tr>
  <html:td style="white-space:nowrap">
   <html:code><![CDATA[\li{...}]]></html:code>
  </html:td>
  <html:td>creates a list item</html:td>
 </html:tr>


  
 <html:tr>
  <html:td style="white-space:nowrap">
   <html:code><![CDATA[ #{...}]]></html:code>
  </html:td>
  <html:td>typesets the content in (inline) math mode using <fr:tex display="inline"><![CDATA[\KaTeX ]]></fr:tex>; note that math mode is idempotent in <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link></html:td>
 </html:tr>

  
 <html:tr>
  <html:td style="white-space:nowrap">
   <html:code><![CDATA[ ##{...}]]></html:code>
  </html:td>
  <html:td>typesets the content in (display) math mode using <fr:tex display="inline"><![CDATA[\KaTeX ]]></fr:tex></html:td>
 </html:tr>

  
 <html:tr>
  <html:td style="white-space:nowrap">
   <html:code><![CDATA[\transclude{address}]]></html:code>
  </html:td>
  <html:td><fr:link href="/007L/" title="Bottom-up hierarchy via transclusion" uri="https://www.forester-notes.org/007L/" display-uri="007L" type="local">transcludes</fr:link> the <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">tree</fr:link> at address <html:code>address</html:code> as a subsection</html:td>
 </html:tr>

  
 <html:tr>
  <html:td style="white-space:nowrap">
   <html:code><![CDATA[[title](address)]]></html:code>
  </html:td>
  <html:td>
    formats the text <html:code>title</html:code> as a hyperlink to address <html:code>address</html:code>; if <html:code>address</html:code> is the address of a <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">tree</fr:link>, the link will point to that tree, and otherwise it is treated as a URL
  </html:td>
 </html:tr>

  
 <html:tr>
  <html:td style="white-space:nowrap">
   <html:code><![CDATA[\let\ident[x][y]{body}]]></html:code>
  </html:td>
  <html:td>
    defines a local function named <html:code><![CDATA[\ident]]></html:code> with two arguments; subsequently, the expression <html:code><![CDATA[\ident{u}{v}]]></html:code> would expand to <html:code>body</html:code> with the values of <html:code>u,v</html:code> substituted for <html:code><![CDATA[\x,\y]]></html:code>.
  </html:td>
 </html:tr>

  
 <html:tr>
  <html:td style="white-space:nowrap">
   <html:code><![CDATA[\code{...}]]></html:code>
  </html:td>
  <html:td>typesets the content in monospace</html:td>
 </html:tr>

  
 <html:tr>
  <html:td style="white-space:nowrap">
   <html:code><![CDATA[\tex{preamble}{body}]]></html:code>
  </html:td>
  <html:td>typesets the <html:code>body</html:code> externally using <fr:tex display="inline"><![CDATA[\LaTeX ]]></fr:tex> using <html:code>preamble</html:code> as preamble code (e.g. to set up tikz packages, etc.). It can be useful to wrap this in your own macro in order to insert your preamble code automatically.</html:td>
 </html:tr>

</html:table>
</fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2023</fr:year>
                      <fr:month>8</fr:month>
                      <fr:day>16</fr:day>
                    </fr:date>
                    <fr:uri>https://www.forester-notes.org/007Q/</fr:uri>
                    <fr:display-uri>007Q</fr:display-uri>
                    <fr:route>/007Q/</fr:route>
                    <fr:title text="An complete worked example tree in Forester">An complete worked example <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">tree</fr:link> in <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link></fr:title>
                    <fr:taxon>Example</fr:taxon>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>An example of a complete <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">tree</fr:link> in the <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> markup language can be seen below.</html:p>
                    <html:pre><![CDATA[\title{Creation of (co)limits}
\date{2023-02-11}
\taxon{Definition}
\author{jonmsterling}

\def\CCat{#{\mathcal{C}}}
\def\DCat{#{\mathcal{D}}}
\def\ICat{#{\mathcal{I}}}
\def\Mor[arg1][arg2][arg3]{#{{\arg2}\xrightarrow{\arg1}{\arg3}}}

\p{Let \Mor{U}{\CCat}{\DCat} be a functor and let \ICat be a category. The functor #{U} is said to \em{create (co)limits of #{\ICat}-figures} when for any diagram \Mor{C_\bullet}{\ICat}{\CCat} such that #{\ICat\xrightarrow{C_\bullet}\CCat\xrightarrow{F}\DCat} has a (co)limit, then #{C_\bullet} has a (co)limit that is both preserved and reflected by #{F}.}]]></html:pre>
                    <html:p>The code above results in the following tree:</html:p>
                    <fr:tree show-metadata="true" toc="false">
                      <fr:frontmatter>
                        <fr:authors>
                          <fr:author>
                            <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
                          </fr:author>
                        </fr:authors>
                        <fr:date>
                          <fr:year>2023</fr:year>
                          <fr:month>2</fr:month>
                          <fr:day>11</fr:day>
                        </fr:date>
                        <fr:uri>https://www.forester-notes.org/001H/</fr:uri>
                        <fr:display-uri>001H</fr:display-uri>
                        <fr:route>/001H/</fr:route>
                        <fr:title text="Creation of (co)limits">Creation of (co)limits</fr:title>
                        <fr:taxon>Definition</fr:taxon>
                      </fr:frontmatter>
                      <fr:mainmatter>
                        <html:p>Let <fr:tex display="inline"><![CDATA[{\mathcal {C}}\xrightarrow {U}{\mathcal {D}}]]></fr:tex> be a functor and let <fr:tex display="inline"><![CDATA[\mathcal {I}]]></fr:tex> be a category. The functor <fr:tex display="inline"><![CDATA[U]]></fr:tex> is said to <html:em>create (co)limits of <fr:tex display="inline"><![CDATA[\mathcal {I}]]></fr:tex>-figures</html:em> when for any diagram <fr:tex display="inline"><![CDATA[{\mathcal {I}}\xrightarrow {C_\bullet }{\mathcal {C}}]]></fr:tex> such that <fr:tex display="inline"><![CDATA[\mathcal {I}\xrightarrow {C_\bullet }\mathcal {C}\xrightarrow {F}\mathcal {D}]]></fr:tex> has a (co)limit, then <fr:tex display="inline"><![CDATA[C_\bullet ]]></fr:tex> has a (co)limit that is both preserved and reflected by <fr:tex display="inline"><![CDATA[F]]></fr:tex>.</html:p>
                      </fr:mainmatter>
                    </fr:tree>
                  </fr:mainmatter>
                </fr:tree>
              </fr:mainmatter>
            </fr:tree>
            <fr:tree show-metadata="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:date>
                  <fr:year>2023</fr:year>
                  <fr:month>8</fr:month>
                  <fr:day>16</fr:day>
                </fr:date>
                <fr:uri>https://www.forester-notes.org/007R/</fr:uri>
                <fr:display-uri>007R</fr:display-uri>
                <fr:route>/007R/</fr:route>
                <fr:title text="Deploying your forest to a web host">Deploying your <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link> to a web host</fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <html:p>Now that you have <fr:link href="/006X/" title="Setting up your forest from the template" uri="https://www.forester-notes.org/006X/" display-uri="006X" type="local">created your <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link></fr:link> and <fr:link href="/007K/" title="Creating your personal biographical tree" uri="https://www.forester-notes.org/007K/" display-uri="007K" type="local">added a few</fr:link> <fr:link href="/007H/" title="Creating a new tree using forester new" uri="https://www.forester-notes.org/007H/" display-uri="007H" type="local"><fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">trees</fr:link> of your own</fr:link>, it is time to upload it to your web host. Many users of <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> will have university-supplied static web hosting, and others may prefer to use GitHub pages; deploying a <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link> works the same way in either case.</html:p>
                <html:ol><html:li>First, make sure your <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link> is built using <fr:link href="/007D/" title="Building and viewing your forest for the first time" uri="https://www.forester-notes.org/007D/" display-uri="007D" type="local">the earlier instructions</fr:link>.</html:li>
  <html:li>Then take the entire contents of your <html:code>output</html:code> directory and upload them to your preferred web host.</html:li></html:ol>
              </fr:mainmatter>
            </fr:tree>
            <fr:tree show-metadata="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:date>
                  <fr:year>2023</fr:year>
                  <fr:month>8</fr:month>
                  <fr:day>16</fr:day>
                </fr:date>
                <fr:uri>https://www.forester-notes.org/007S/</fr:uri>
                <fr:display-uri>007S</fr:display-uri>
                <fr:route>/007S/</fr:route>
                <fr:title text="Let a hundred forests bloom!">Let a hundred <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forests</fr:link> bloom!</fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <html:p>I am eager to see the new <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forests</fr:link> that people create using <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link>. I am happy to offer personal assistance via the <fr:link href="https://lists.sr.ht/~jonsterling/forester-discuss" type="external">mailing list</fr:link>.</html:p>
                <html:p>Many aspects of <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> are in flux and not fully documented; it will often be instructive to consult the source of existings <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forests</fr:link>, such as <fr:link href="https://git.sr.ht/~jonsterling/forester-notes.org" type="external">this one</fr:link>.</html:p>
                <html:p>Have fun, and be sure to send me links to your <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forests</fr:link> when you have made them!</html:p>
              </fr:mainmatter>
            </fr:tree>
          </fr:mainmatter>
        </fr:tree>
        <fr:tree show-metadata="true" expanded="false" toc="false" numbered="false">
          <fr:frontmatter>
            <fr:authors>
              <fr:author>
                <fr:link href="/kentookura/" title="Kento Okura" uri="https://www.forester-notes.org/kentookura/" display-uri="kentookura" type="local">Kento Okura</fr:link>
              </fr:author>
              <fr:contributor>
                <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
              </fr:contributor>
            </fr:authors>
            <fr:date>
              <fr:year>2025</fr:year>
              <fr:month>3</fr:month>
              <fr:day>28</fr:day>
            </fr:date>
            <fr:uri>https://www.forester-notes.org/MZSF/</fr:uri>
            <fr:display-uri>MZSF</fr:display-uri>
            <fr:route>/MZSF/</fr:route>
            <fr:title text="The Forester language server">The <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> language server</fr:title>
          </fr:frontmatter>
          <fr:mainmatter>
            <html:p>Forester provides an implementation of the Language Server Protocol (LSP). Developers of editor plugins can consult <html:code>forester lsp --help</html:code>.</html:p>
            <fr:tree show-metadata="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
                  </fr:author>
                  <fr:contributor>
                    <fr:link href="/kentookura/" title="Kento Okura" uri="https://www.forester-notes.org/kentookura/" display-uri="kentookura" type="local">Kento Okura</fr:link>
                  </fr:contributor>
                </fr:authors>
                <fr:date>
                  <fr:year>2025</fr:year>
                  <fr:month>5</fr:month>
                  <fr:day>26</fr:day>
                </fr:date>
                <fr:uri>https://www.forester-notes.org/24B1/</fr:uri>
                <fr:display-uri>24B1</fr:display-uri>
                <fr:route>/24B1/</fr:route>
                <fr:title text="Features of the Forester language server">Features of the <fr:link href="/MZSF/" title="The Forester language server" uri="https://www.forester-notes.org/MZSF/" display-uri="MZSF" type="local">Forester language server</fr:link></fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <html:p>Forester’s implementation of the language server protocol supports several standard features to varying degrees. At the moment we support some code actions (e.g. creating a new tree), inlay hints, syntax error diagnostics, document symbols, workspace symbols, and link completion.</html:p>
                <html:p>There may be limitations in the implementations of these features, which we will continue to improve; we appreciate user feedback.</html:p>
                <html:p>(Please note that LSP features are surfaced differently in every editor (language server client); although we <fr:link href="/LN6D/" title="Neovim configuration" uri="https://www.forester-notes.org/LN6D/" display-uri="LN6D" type="local">provide</fr:link> a sample configuration for Neovim, for example, not all features of the LSP have been surfaced to the user in that configuration.)</html:p>
              </fr:mainmatter>
            </fr:tree>
            <fr:tree show-metadata="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="/kentookura/" title="Kento Okura" uri="https://www.forester-notes.org/kentookura/" display-uri="kentookura" type="local">Kento Okura</fr:link>
                  </fr:author>
                  <fr:contributor>
                    <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
                  </fr:contributor>
                </fr:authors>
                <fr:uri>https://www.forester-notes.org/QLG4/</fr:uri>
                <fr:display-uri>QLG4</fr:display-uri>
                <fr:route>/QLG4/</fr:route>
                <fr:title text="Example configurations">Example configurations</fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <html:p>Users of other text editors are encouraged to contribute to this section.</html:p>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors />
                    <fr:uri>https://www.forester-notes.org/LN6D/</fr:uri>
                    <fr:display-uri>LN6D</fr:display-uri>
                    <fr:route>/LN6D/</fr:route>
                    <fr:title text="Neovim configuration"><fr:link href="https://neovim.io/" type="external">Neovim</fr:link> configuration</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>Since <fr:link href="https://github.com/neovim/neovim/releases/tag/v0.11.0" type="external">Neovim version 0.11</fr:link>, you can configure language servers by simply adding the following snippet to your configuration:</html:p>
                    <html:pre><![CDATA[vim.filetype.add({ extension = { tree = "forester" } })

vim.lsp.config["forester-lsp"] = {
  cmd = { "forester", "lsp"},
  filetypes = { "forester" },
}

vim.lsp.enable("forester-lsp")]]></html:pre>
                    <html:p>For a more complete configuration that includes keybinds to various features, you can use <fr:link href="https://github.com/kentookura/forester-nvim-config/" type="external">this template</fr:link> as a starting point.</html:p>
                    <html:p>If you are not yet using version 0.11, please refer to the <fr:link href="https://github.com/neovim/nvim-lspconfig/blob/master/CONTRIBUTING.md" type="external">documentation of nvim-lspconfig</fr:link></html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/kentookura/" title="Kento Okura" uri="https://www.forester-notes.org/kentookura/" display-uri="kentookura" type="local">Kento Okura</fr:link>
                      </fr:author>
                      <fr:contributor>
                        <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
                      </fr:contributor>
                    </fr:authors>
                    <fr:uri>https://www.forester-notes.org/6Y7J/</fr:uri>
                    <fr:display-uri>6Y7J</fr:display-uri>
                    <fr:route>/6Y7J/</fr:route>
                    <fr:title text="Helix configuration"><fr:link href="https://helix-editor.com/" type="external">Helix</fr:link> configuration</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>You must add the following to <html:code>languages.toml</html:code> in your Helix configuration directory, following <fr:link href="https://docs.helix-editor.com/languages.html" type="external">the documentation</fr:link>.</html:p>
                    <html:pre><![CDATA[[language-server.forester-lsp]
command = "forester"
args = ["lsp"]

[[language]]
name = "forester"
scope = "source.forester"
file-types = ["tree"]
comment-tokens = "%"
language-servers = [ "forester-lsp" ]]]></html:pre>
                  </fr:mainmatter>
                </fr:tree>
              </fr:mainmatter>
            </fr:tree>
            <fr:tree show-metadata="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="/kentookura/" title="Kento Okura" uri="https://www.forester-notes.org/kentookura/" display-uri="kentookura" type="local">Kento Okura</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:date>
                  <fr:year>2025</fr:year>
                  <fr:month>3</fr:month>
                  <fr:day>28</fr:day>
                </fr:date>
                <fr:title text="Known issues">Known issues</fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <html:ul><html:li>While the language server does not yet support semantic syntax highlighting, you may try to use <fr:link href="https://github.com/kentookura/tree-sitter-forester" type="external"><html:code>tree-sitter-forester</html:code></fr:link>, although it is currently not officially supported</html:li>
    <html:li>Neovim does not handle WorkspaceEdit notifications. This means that after creating a new tree via a code action, the language server will become out of sync.</html:li>
    <html:li><fr:link href="https://github.com/RedPRL/asai/issues/192" type="external">VSCode issue</fr:link></html:li>
    <html:li>Inlay hints do not properly refresh upon changes. Toggling the feature on and off seems to resolve this in Neovim</html:li>
    <html:li>The server will not be aware of any trees or assets added in file system after startup.</html:li></html:ul>
              </fr:mainmatter>
            </fr:tree>
          </fr:mainmatter>
        </fr:tree>
        <fr:tree show-metadata="true" expanded="false" toc="false" numbered="false">
          <fr:frontmatter>
            <fr:authors>
              <fr:author>
                <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
              </fr:author>
            </fr:authors>
            <fr:date>
              <fr:year>2023</fr:year>
              <fr:month>8</fr:month>
              <fr:day>14</fr:day>
            </fr:date>
            <fr:date>
              <fr:year>2024</fr:year>
              <fr:month>4</fr:month>
              <fr:day>25</fr:day>
            </fr:date>
            <fr:date>
              <fr:year>2024</fr:year>
              <fr:month>6</fr:month>
              <fr:day>17</fr:day>
            </fr:date>
            <fr:uri>https://www.forester-notes.org/006X/</fr:uri>
            <fr:display-uri>006X</fr:display-uri>
            <fr:route>/006X/</fr:route>
            <fr:title text="Setting up your forest from the template">Setting up your <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link> from the template</fr:title>
          </fr:frontmatter>
          <fr:mainmatter>
            <html:p>Now that you have <fr:link href="/006W/" title="Installing the Forester software" uri="https://www.forester-notes.org/006W/" display-uri="006W" type="local">installed</fr:link> the <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> software, it is time to set up your <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link>. <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> provides a simple command to initialise a fresh <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link> within a folder. We’ll call our folder <html:code>forest</html:code>, but you can call it anything you want.</html:p>
            <html:pre><![CDATA[mkdir forest
cd forest]]></html:pre>
            <html:p>Now that we are inside our new directory, we can instruct <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> to initialise a <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link>.</html:p>
            <html:pre>forester init</html:pre>
            <html:p>This command initialises a <fr:link href="https://git-scm.com/" type="external">git</fr:link> repository with the skeleton of a <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link>, which contains a configuration file named <html:code>forest.toml</html:code>; this file specifies the locations of your trees, assets, etc. There is also a <fr:link href="https://git-scm.com/" type="external">git</fr:link> submodule bound to the <html:code>theme/</html:code> directory (pointing to the <fr:link href="https://git.sr.ht/~jonsterling/forester-base-theme" type="external">base theme</fr:link> repository) that contains the stylesheets that web browsers will need in order to render your <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link> as HTML.</html:p>
            <fr:tree show-metadata="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:date>
                  <fr:year>2023</fr:year>
                  <fr:month>8</fr:month>
                  <fr:day>14</fr:day>
                </fr:date>
                <fr:date>
                  <fr:year>2024</fr:year>
                  <fr:month>6</fr:month>
                  <fr:day>17</fr:day>
                </fr:date>
                <fr:uri>https://www.forester-notes.org/0073/</fr:uri>
                <fr:display-uri>0073</fr:display-uri>
                <fr:route>/0073/</fr:route>
                <fr:title text="Tree addresses in a forest">Tree addresses in a <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link></fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <html:p>A <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">tree</fr:link> in <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> is usually associated to an address of the form <html:code>NNNN</html:code> is a four-digit <fr:link href="/0074/" title="Base-36 identifiers in Forester" uri="https://www.forester-notes.org/0074/" display-uri="0074" type="local">base-36 number</fr:link>. The purpose of the <fr:link href="/0074/" title="Base-36 identifiers in Forester" uri="https://www.forester-notes.org/0074/" display-uri="0074" type="local">base-36</fr:link> code is to uniquely identify a <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">tree</fr:link> within your <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link> in such a way that you are not tempted to rename it, as you might be when titles or dates are embedded into filenames. A tree with address <html:code>NNNN</html:code> is stored in a file named <html:code>NNNN.tree</html:code> (unless it is emitted from inside another tree by means of the <fr:link href="/00O4/" title="Forester 3.1 › Inline subtrees" uri="https://www.forester-notes.org/00O4/" display-uri="00O4" type="local">inline subtrees</fr:link> feature).</html:p>
                <html:p>Note that the format of <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">tree</fr:link> addresses is purely a matter of convention, and is not forced by the <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> tool. Users are free to use their own naming convention for tree addresses, and in some cases alternative (human-readable) formats may be desirable: this includes trees representing bibliographic references, as well as biographical trees. <html:mark>If you don’t like numerical tree addresses, nobody is forcing you to use them.</html:mark> The use of numerical addresses is suitable for projects like <fr:link href="/stacks-project/" title="The Stacks project" uri="https://www.forester-notes.org/stacks-project/" display-uri="stacks-project" type="local">The Stacks Project</fr:link>, but it may not be appropriate for your own use-case.</html:p>
                <html:p>Addresses in <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> are not hierarchical: all resources are rendered at the root of the forest, no matter where their source files are kept. This limitation is intentional, but we might revisit it in the future.</html:p>
              </fr:mainmatter>
            </fr:tree>
            <fr:tree show-metadata="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:date>
                  <fr:year>2023</fr:year>
                  <fr:month>8</fr:month>
                  <fr:day>15</fr:day>
                </fr:date>
                <fr:date>
                  <fr:year>2024</fr:year>
                  <fr:month>4</fr:month>
                  <fr:day>25</fr:day>
                </fr:date>
                <fr:uri>https://www.forester-notes.org/007D/</fr:uri>
                <fr:display-uri>007D</fr:display-uri>
                <fr:route>/007D/</fr:route>
                <fr:title text="Building and viewing your forest for the first time">Building and viewing your <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link> for the first time</fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <html:p>To build your <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link>, you can run the following command of <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link>'s executable in your shell:</html:p>
                <html:pre>forester build forest.toml</html:pre>
                <html:p>The <html:code>--dev</html:code> flag is optional, and when activated supplies metadata to the generated website to support an “edit button” on each tree; this flag is meant to be used when developing your <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link> locally, and should not be used when building the <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link> to be uploaded to your public web host.</html:p>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2023</fr:year>
                      <fr:month>8</fr:month>
                      <fr:day>15</fr:day>
                    </fr:date>
                    <fr:uri>https://www.forester-notes.org/007G/</fr:uri>
                    <fr:display-uri>007G</fr:display-uri>
                    <fr:route>/007G/</fr:route>
                    <fr:title text="Forester renders each tree to an XML document"><fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> renders each tree to an XML document</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p><fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> renders your <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link> to some XML files in the <html:code>output/</html:code> directory; XML is, like HTML, a format for structured documents that can be displayed by web browsers. The <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link> template comes equipped with a built-in XSLT stylesheet (<html:code>theme/default.xsl</html:code>) which is used to instruct web browsers how to render your <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link> into a pleasing and readable format.</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2023</fr:year>
                      <fr:month>8</fr:month>
                      <fr:day>15</fr:day>
                    </fr:date>
                    <fr:uri>https://www.forester-notes.org/007I/</fr:uri>
                    <fr:display-uri>007I</fr:display-uri>
                    <fr:route>/007I/</fr:route>
                    <fr:title text="Serving and viewing your forest from a local web server">Serving and viewing your <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link> from a local web server</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>To view your <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link> while editing it, you must <html:em>serve</html:em> it from a local web server..To do this, first ensure that you have <fr:link href="https://www.python.org/downloads/" type="external">Python 3</fr:link> correctly installed. Then run the following command from the root directory of your <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link>:</html:p>
                    <html:pre>python3 -m http.server 1313 -d output</html:pre>
                    <html:p>(You could replace <html:code>1313</html:code> with whatever port you prefer.) While this command is running, you will be able to access your <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link> by navigating to <fr:link href="http://localhost:1313/" type="external"><html:code>localhost:1313</html:code></fr:link> in your preferred web browser.</html:p>
                    <html:p>In the future, <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> <fr:link href="https://todo.sr.ht/~jonsterling/forester/15" type="external">may be able to run its own local server</fr:link> to avoid the dependency on external tools like Python.</html:p>
                  </fr:mainmatter>
                </fr:tree>
              </fr:mainmatter>
            </fr:tree>
          </fr:mainmatter>
        </fr:tree>
        <fr:tree show-metadata="true" expanded="false" toc="false" numbered="false">
          <fr:frontmatter>
            <fr:authors>
              <fr:author>
                <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
              </fr:author>
            </fr:authors>
            <fr:date>
              <fr:year>2023</fr:year>
              <fr:month>8</fr:month>
              <fr:day>14</fr:day>
            </fr:date>
            <fr:date>
              <fr:year>2024</fr:year>
              <fr:month>6</fr:month>
              <fr:day>17</fr:day>
            </fr:date>
            <fr:uri>https://www.forester-notes.org/0073/</fr:uri>
            <fr:display-uri>0073</fr:display-uri>
            <fr:route>/0073/</fr:route>
            <fr:title text="Tree addresses in a forest">Tree addresses in a <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link></fr:title>
          </fr:frontmatter>
          <fr:mainmatter>
            <html:p>A <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">tree</fr:link> in <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> is usually associated to an address of the form <html:code>NNNN</html:code> is a four-digit <fr:link href="/0074/" title="Base-36 identifiers in Forester" uri="https://www.forester-notes.org/0074/" display-uri="0074" type="local">base-36 number</fr:link>. The purpose of the <fr:link href="/0074/" title="Base-36 identifiers in Forester" uri="https://www.forester-notes.org/0074/" display-uri="0074" type="local">base-36</fr:link> code is to uniquely identify a <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">tree</fr:link> within your <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link> in such a way that you are not tempted to rename it, as you might be when titles or dates are embedded into filenames. A tree with address <html:code>NNNN</html:code> is stored in a file named <html:code>NNNN.tree</html:code> (unless it is emitted from inside another tree by means of the <fr:link href="/00O4/" title="Forester 3.1 › Inline subtrees" uri="https://www.forester-notes.org/00O4/" display-uri="00O4" type="local">inline subtrees</fr:link> feature).</html:p>
            <html:p>Note that the format of <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">tree</fr:link> addresses is purely a matter of convention, and is not forced by the <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> tool. Users are free to use their own naming convention for tree addresses, and in some cases alternative (human-readable) formats may be desirable: this includes trees representing bibliographic references, as well as biographical trees. <html:mark>If you don’t like numerical tree addresses, nobody is forcing you to use them.</html:mark> The use of numerical addresses is suitable for projects like <fr:link href="/stacks-project/" title="The Stacks project" uri="https://www.forester-notes.org/stacks-project/" display-uri="stacks-project" type="local">The Stacks Project</fr:link>, but it may not be appropriate for your own use-case.</html:p>
            <html:p>Addresses in <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> are not hierarchical: all resources are rendered at the root of the forest, no matter where their source files are kept. This limitation is intentional, but we might revisit it in the future.</html:p>
          </fr:mainmatter>
        </fr:tree>
        <fr:tree show-metadata="true" expanded="false" toc="false" numbered="false">
          <fr:frontmatter>
            <fr:authors>
              <fr:author>
                <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
              </fr:author>
            </fr:authors>
            <fr:date>
              <fr:year>2023</fr:year>
              <fr:month>8</fr:month>
              <fr:day>15</fr:day>
            </fr:date>
            <fr:date>
              <fr:year>2024</fr:year>
              <fr:month>4</fr:month>
              <fr:day>25</fr:day>
            </fr:date>
            <fr:uri>https://www.forester-notes.org/007D/</fr:uri>
            <fr:display-uri>007D</fr:display-uri>
            <fr:route>/007D/</fr:route>
            <fr:title text="Building and viewing your forest for the first time">Building and viewing your <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link> for the first time</fr:title>
          </fr:frontmatter>
          <fr:mainmatter>
            <html:p>To build your <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link>, you can run the following command of <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link>'s executable in your shell:</html:p>
            <html:pre>forester build forest.toml</html:pre>
            <html:p>The <html:code>--dev</html:code> flag is optional, and when activated supplies metadata to the generated website to support an “edit button” on each tree; this flag is meant to be used when developing your <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link> locally, and should not be used when building the <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link> to be uploaded to your public web host.</html:p>
            <fr:tree show-metadata="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:date>
                  <fr:year>2023</fr:year>
                  <fr:month>8</fr:month>
                  <fr:day>15</fr:day>
                </fr:date>
                <fr:uri>https://www.forester-notes.org/007G/</fr:uri>
                <fr:display-uri>007G</fr:display-uri>
                <fr:route>/007G/</fr:route>
                <fr:title text="Forester renders each tree to an XML document"><fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> renders each tree to an XML document</fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <html:p><fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> renders your <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link> to some XML files in the <html:code>output/</html:code> directory; XML is, like HTML, a format for structured documents that can be displayed by web browsers. The <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link> template comes equipped with a built-in XSLT stylesheet (<html:code>theme/default.xsl</html:code>) which is used to instruct web browsers how to render your <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link> into a pleasing and readable format.</html:p>
              </fr:mainmatter>
            </fr:tree>
            <fr:tree show-metadata="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:date>
                  <fr:year>2023</fr:year>
                  <fr:month>8</fr:month>
                  <fr:day>15</fr:day>
                </fr:date>
                <fr:uri>https://www.forester-notes.org/007I/</fr:uri>
                <fr:display-uri>007I</fr:display-uri>
                <fr:route>/007I/</fr:route>
                <fr:title text="Serving and viewing your forest from a local web server">Serving and viewing your <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link> from a local web server</fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <html:p>To view your <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link> while editing it, you must <html:em>serve</html:em> it from a local web server..To do this, first ensure that you have <fr:link href="https://www.python.org/downloads/" type="external">Python 3</fr:link> correctly installed. Then run the following command from the root directory of your <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link>:</html:p>
                <html:pre>python3 -m http.server 1313 -d output</html:pre>
                <html:p>(You could replace <html:code>1313</html:code> with whatever port you prefer.) While this command is running, you will be able to access your <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link> by navigating to <fr:link href="http://localhost:1313/" type="external"><html:code>localhost:1313</html:code></fr:link> in your preferred web browser.</html:p>
                <html:p>In the future, <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> <fr:link href="https://todo.sr.ht/~jonsterling/forester/15" type="external">may be able to run its own local server</fr:link> to avoid the dependency on external tools like Python.</html:p>
              </fr:mainmatter>
            </fr:tree>
          </fr:mainmatter>
        </fr:tree>
        <fr:tree show-metadata="true" expanded="false" toc="false" numbered="false">
          <fr:frontmatter>
            <fr:authors>
              <fr:author>
                <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
              </fr:author>
            </fr:authors>
            <fr:date>
              <fr:year>2023</fr:year>
              <fr:month>8</fr:month>
              <fr:day>15</fr:day>
            </fr:date>
            <fr:date>
              <fr:year>2024</fr:year>
              <fr:month>4</fr:month>
              <fr:day>25</fr:day>
            </fr:date>
            <fr:uri>https://www.forester-notes.org/007H/</fr:uri>
            <fr:display-uri>007H</fr:display-uri>
            <fr:route>/007H/</fr:route>
            <fr:title text="Creating a new tree using forester new">Creating a new <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">tree</fr:link> using <html:code>forester new</html:code></fr:title>
          </fr:frontmatter>
          <fr:mainmatter>
            <html:p>Creating a new <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">tree</fr:link> in your <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link> is as simple as adding a <html:code>.tree</html:code> file to the <html:code>trees</html:code> folder. Because it is hard to manually choose the <fr:link href="/0073/" title="Tree addresses in a forest" uri="https://www.forester-notes.org/0073/" display-uri="0073" type="local">next incremental tree address</fr:link>, <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> provides a command to do this automatically:</html:p>
            <html:pre>forester new forest.toml --dest=trees</html:pre>
            <html:p>In return, <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> should output the location of the new tree, e.g. <html:code>trees/0002.tree</html:code>. If we look at the contents of this new file, we will see that it is empty except for metadata assigning a date to the tree:</html:p>
            <html:pre><![CDATA[\date{2023-08-15}]]></html:pre>
            <html:p>You may prefer to use <html:em>randomised</html:em> addresses over sequential addresses; this can be particularly useful if multiple people are contributing to a <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link>. In that case, pass the <html:code>--random</html:code> option to <html:code>forester new</html:code>.</html:p>
            <html:p><html:strong>Most <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">trees</fr:link> should have a <html:code><![CDATA[\date]]></html:code> annotation;</html:strong> this date is meant to be the date of the <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">tree</fr:link>'s creation; you can have more than one date, if you like to keep track of when a tree has been updated. You should proceed by adding further metadata: the title and the <fr:link href="/tfmt-000S/" title="Author of a tree" uri="https://www.forester-notes.org/tfmt-000S/" display-uri="tfmt-000S" type="local">author</fr:link>; for the latter, you will use the address of your <fr:link href="/007K/" title="Creating your personal biographical tree" uri="https://www.forester-notes.org/007K/" display-uri="007K" type="local">personal biographical tree</fr:link>.</html:p>
            <html:pre><![CDATA[\title{My first tree}
\author{jonmsterling}]]></html:pre>
            <html:p><fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">Tree</fr:link> titles should be given in lower case (except for proper names, etc.); these titles will be <html:em>rendered</html:em> by <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> in sentence case. A <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">tree</fr:link> can have as many <html:code><![CDATA[\author]]></html:code> declarations as it has <fr:link href="/tfmt-000S/" title="Author of a tree" uri="https://www.forester-notes.org/tfmt-000S/" display-uri="tfmt-000S" type="local">authors</fr:link>; these will be rendered in their order of appearance.</html:p>
            <html:p>Now you can begin to populate the tree with its content, written in the <fr:link href="/007N/" title="The Forester markup language" uri="https://www.forester-notes.org/007N/" display-uri="007N" type="local"><fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> markup language</fr:link>. <fr:link href="/tfmt-0007/" title="Atomicity of scientific notes" uri="https://www.forester-notes.org/tfmt-0007/" display-uri="tfmt-0007" type="local">Think carefully about keeping each tree relatively independent and atomic</fr:link>.</html:p>
          </fr:mainmatter>
        </fr:tree>
        <fr:tree show-metadata="true" expanded="false" toc="false" numbered="false">
          <fr:frontmatter>
            <fr:authors>
              <fr:author>
                <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
              </fr:author>
            </fr:authors>
            <fr:date>
              <fr:year>2023</fr:year>
              <fr:month>8</fr:month>
              <fr:day>16</fr:day>
            </fr:date>
            <fr:uri>https://www.forester-notes.org/007Q/</fr:uri>
            <fr:display-uri>007Q</fr:display-uri>
            <fr:route>/007Q/</fr:route>
            <fr:title text="An complete worked example tree in Forester">An complete worked example <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">tree</fr:link> in <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link></fr:title>
            <fr:taxon>Example</fr:taxon>
          </fr:frontmatter>
          <fr:mainmatter>
            <html:p>An example of a complete <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">tree</fr:link> in the <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> markup language can be seen below.</html:p>
            <html:pre><![CDATA[\title{Creation of (co)limits}
\date{2023-02-11}
\taxon{Definition}
\author{jonmsterling}

\def\CCat{#{\mathcal{C}}}
\def\DCat{#{\mathcal{D}}}
\def\ICat{#{\mathcal{I}}}
\def\Mor[arg1][arg2][arg3]{#{{\arg2}\xrightarrow{\arg1}{\arg3}}}

\p{Let \Mor{U}{\CCat}{\DCat} be a functor and let \ICat be a category. The functor #{U} is said to \em{create (co)limits of #{\ICat}-figures} when for any diagram \Mor{C_\bullet}{\ICat}{\CCat} such that #{\ICat\xrightarrow{C_\bullet}\CCat\xrightarrow{F}\DCat} has a (co)limit, then #{C_\bullet} has a (co)limit that is both preserved and reflected by #{F}.}]]></html:pre>
            <html:p>The code above results in the following tree:</html:p>
            <fr:tree show-metadata="true" toc="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:date>
                  <fr:year>2023</fr:year>
                  <fr:month>2</fr:month>
                  <fr:day>11</fr:day>
                </fr:date>
                <fr:uri>https://www.forester-notes.org/001H/</fr:uri>
                <fr:display-uri>001H</fr:display-uri>
                <fr:route>/001H/</fr:route>
                <fr:title text="Creation of (co)limits">Creation of (co)limits</fr:title>
                <fr:taxon>Definition</fr:taxon>
              </fr:frontmatter>
              <fr:mainmatter>
                <html:p>Let <fr:tex display="inline"><![CDATA[{\mathcal {C}}\xrightarrow {U}{\mathcal {D}}]]></fr:tex> be a functor and let <fr:tex display="inline"><![CDATA[\mathcal {I}]]></fr:tex> be a category. The functor <fr:tex display="inline"><![CDATA[U]]></fr:tex> is said to <html:em>create (co)limits of <fr:tex display="inline"><![CDATA[\mathcal {I}]]></fr:tex>-figures</html:em> when for any diagram <fr:tex display="inline"><![CDATA[{\mathcal {I}}\xrightarrow {C_\bullet }{\mathcal {C}}]]></fr:tex> such that <fr:tex display="inline"><![CDATA[\mathcal {I}\xrightarrow {C_\bullet }\mathcal {C}\xrightarrow {F}\mathcal {D}]]></fr:tex> has a (co)limit, then <fr:tex display="inline"><![CDATA[C_\bullet ]]></fr:tex> has a (co)limit that is both preserved and reflected by <fr:tex display="inline"><![CDATA[F]]></fr:tex>.</html:p>
              </fr:mainmatter>
            </fr:tree>
          </fr:mainmatter>
        </fr:tree>
        <fr:tree show-metadata="true" expanded="false" toc="false" numbered="false">
          <fr:frontmatter>
            <fr:authors>
              <fr:author>
                <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
              </fr:author>
            </fr:authors>
            <fr:date>
              <fr:year>2023</fr:year>
              <fr:month>8</fr:month>
              <fr:day>16</fr:day>
            </fr:date>
            <fr:uri>https://www.forester-notes.org/007R/</fr:uri>
            <fr:display-uri>007R</fr:display-uri>
            <fr:route>/007R/</fr:route>
            <fr:title text="Deploying your forest to a web host">Deploying your <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link> to a web host</fr:title>
          </fr:frontmatter>
          <fr:mainmatter>
            <html:p>Now that you have <fr:link href="/006X/" title="Setting up your forest from the template" uri="https://www.forester-notes.org/006X/" display-uri="006X" type="local">created your <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link></fr:link> and <fr:link href="/007K/" title="Creating your personal biographical tree" uri="https://www.forester-notes.org/007K/" display-uri="007K" type="local">added a few</fr:link> <fr:link href="/007H/" title="Creating a new tree using forester new" uri="https://www.forester-notes.org/007H/" display-uri="007H" type="local"><fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">trees</fr:link> of your own</fr:link>, it is time to upload it to your web host. Many users of <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> will have university-supplied static web hosting, and others may prefer to use GitHub pages; deploying a <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link> works the same way in either case.</html:p>
            <html:ol><html:li>First, make sure your <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link> is built using <fr:link href="/007D/" title="Building and viewing your forest for the first time" uri="https://www.forester-notes.org/007D/" display-uri="007D" type="local">the earlier instructions</fr:link>.</html:li>
  <html:li>Then take the entire contents of your <html:code>output</html:code> directory and upload them to your preferred web host.</html:li></html:ol>
          </fr:mainmatter>
        </fr:tree>
        <fr:tree show-metadata="true" expanded="false" toc="false" numbered="false">
          <fr:frontmatter>
            <fr:authors>
              <fr:author>
                <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
              </fr:author>
            </fr:authors>
            <fr:date>
              <fr:year>2023</fr:year>
              <fr:month>8</fr:month>
              <fr:day>16</fr:day>
            </fr:date>
            <fr:uri>https://www.forester-notes.org/007P/</fr:uri>
            <fr:display-uri>007P</fr:display-uri>
            <fr:route>/007P/</fr:route>
            <fr:title text="Forester markup: frontmatter"><fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> markup: frontmatter</fr:title>
          </fr:frontmatter>
          <fr:mainmatter><html:p>The frontmatter of a <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">tree</fr:link> is a sequence of declarations that we summarize below.</html:p>
  <html:table>
  
  <html:tr>
    
  <html:th>Declaration</html:th>

    
  <html:th>Meaning</html:th>

  </html:tr>

  
 <html:tr>
  <html:td style="white-space:nowrap">
   <html:code><![CDATA[\title{...}]]></html:code>
  </html:td>
  <html:td>
    sets the title of the <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">tree</fr:link>; can contain <fr:link href="/007O/" title="Forester markup: mainmatter" uri="https://www.forester-notes.org/007O/" display-uri="007O" type="local">mainmatter</fr:link> markup
  </html:td>
 </html:tr>

  
 <html:tr>
  <html:td style="white-space:nowrap">
   <html:code><![CDATA[\author{name}]]></html:code>
  </html:td>
  <html:td>
    sets the <fr:link href="/tfmt-000S/" title="Author of a tree" uri="https://www.forester-notes.org/tfmt-000S/" display-uri="tfmt-000S" type="local">author</fr:link> of the <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">tree</fr:link> to be the biographical tree at address <html:code>name</html:code>
  </html:td>
 </html:tr>

  
 <html:tr>
  <html:td style="white-space:nowrap">
   <html:code><![CDATA[\date{YYYY-MM-DD}]]></html:code>
  </html:td>
  <html:td>sets the creation date of the <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">tree</fr:link>; full ISO 8601 date-times are supported.</html:td>
 </html:tr>

  
 <html:tr>
  <html:td style="white-space:nowrap">
   <html:code><![CDATA[\taxon{Taxon}]]></html:code>
  </html:td>
  <html:td>sets the taxon of the <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">tree</fr:link>; example taxa include <html:code>lemma</html:code>, <html:code>theorem</html:code>, <html:code>person</html:code>, <html:code>reference</html:code>; the latter two taxa are treated specially by <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> for tracking biographical and bibliographical <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">trees</fr:link> respectively</html:td>
 </html:tr>

  
 <html:tr>
  <html:td style="white-space:nowrap">
   <html:code><![CDATA[\def\ident[x][y]{body}]]></html:code>
  </html:td>
  <html:td>
    defines and exports from the current <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">tree</fr:link> a function named <html:code><![CDATA[\ident]]></html:code> with two arguments; subsequently, the expression <html:code><![CDATA[\ident{u}{v}]]></html:code> would expand to <html:code>body</html:code> with the values of <html:code>u,v</html:code> substituted for <html:code><![CDATA[\x,\y]]></html:code>
  </html:td>
 </html:tr>

  
 <html:tr>
  <html:td style="white-space:nowrap">
   <html:code><![CDATA[\import{address}]]></html:code>
  </html:td>
  <html:td>
    brings the functions exported by the tree <html:code>address</html:code> into scope
  </html:td>
 </html:tr>

  
 <html:tr>
  <html:td style="white-space:nowrap">
   <html:code><![CDATA[\export{address}]]></html:code>
  </html:td>
  <html:td>
    brings the functions exported by the tree <html:code>address</html:code> into scope, and exports them from the current tree
  </html:td>
 </html:tr>

</html:table>
</fr:mainmatter>
        </fr:tree>
        <fr:tree show-metadata="true" expanded="false" toc="false" numbered="false">
          <fr:frontmatter>
            <fr:authors>
              <fr:author>
                <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
              </fr:author>
            </fr:authors>
            <fr:date>
              <fr:year>2023</fr:year>
              <fr:month>8</fr:month>
              <fr:day>16</fr:day>
            </fr:date>
            <fr:uri>https://www.forester-notes.org/007O/</fr:uri>
            <fr:display-uri>007O</fr:display-uri>
            <fr:route>/007O/</fr:route>
            <fr:title text="Forester markup: mainmatter"><fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> markup: mainmatter</fr:title>
          </fr:frontmatter>
          <fr:mainmatter><html:p>Below we summarize the concrete syntax of the <html:em>mainmatter</html:em> in a <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">tree</fr:link>.</html:p>
  <html:table>
  
  <html:tr>
    
  <html:th>Function</html:th>

    
  <html:th>Meaning</html:th>

  </html:tr>

  
 <html:tr>
  <html:td style="white-space:nowrap">
   <html:code><![CDATA[\p{...}]]></html:code>
  </html:td>
  <html:td>creates a paragraph containing <html:code>...</html:code>; unlike Markdown, it is mandatory to annotate paragraphs explicitly</html:td>
 </html:tr>

  
 <html:tr>
  <html:td style="white-space:nowrap">
   <html:code><![CDATA[\em{...}]]></html:code>
  </html:td>
  <html:td>typesets the content in italics</html:td>
 </html:tr>

  
 <html:tr>
  <html:td style="white-space:nowrap">
   <html:code><![CDATA[\strong{...}]]></html:code>
  </html:td>
  <html:td>typesets the content in boldface</html:td>
 </html:tr>


  
 <html:tr>
  <html:td style="white-space:nowrap">
   <html:code><![CDATA[\ol{...}]]></html:code>
  </html:td>
  <html:td>creates an ordered list</html:td>
 </html:tr>


  
 <html:tr>
  <html:td style="white-space:nowrap">
   <html:code><![CDATA[\ul{...}]]></html:code>
  </html:td>
  <html:td>creates an unordered list</html:td>
 </html:tr>


  
 <html:tr>
  <html:td style="white-space:nowrap">
   <html:code><![CDATA[\li{...}]]></html:code>
  </html:td>
  <html:td>creates a list item</html:td>
 </html:tr>


  
 <html:tr>
  <html:td style="white-space:nowrap">
   <html:code><![CDATA[ #{...}]]></html:code>
  </html:td>
  <html:td>typesets the content in (inline) math mode using <fr:tex display="inline"><![CDATA[\KaTeX ]]></fr:tex>; note that math mode is idempotent in <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link></html:td>
 </html:tr>

  
 <html:tr>
  <html:td style="white-space:nowrap">
   <html:code><![CDATA[ ##{...}]]></html:code>
  </html:td>
  <html:td>typesets the content in (display) math mode using <fr:tex display="inline"><![CDATA[\KaTeX ]]></fr:tex></html:td>
 </html:tr>

  
 <html:tr>
  <html:td style="white-space:nowrap">
   <html:code><![CDATA[\transclude{address}]]></html:code>
  </html:td>
  <html:td><fr:link href="/007L/" title="Bottom-up hierarchy via transclusion" uri="https://www.forester-notes.org/007L/" display-uri="007L" type="local">transcludes</fr:link> the <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">tree</fr:link> at address <html:code>address</html:code> as a subsection</html:td>
 </html:tr>

  
 <html:tr>
  <html:td style="white-space:nowrap">
   <html:code><![CDATA[[title](address)]]></html:code>
  </html:td>
  <html:td>
    formats the text <html:code>title</html:code> as a hyperlink to address <html:code>address</html:code>; if <html:code>address</html:code> is the address of a <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">tree</fr:link>, the link will point to that tree, and otherwise it is treated as a URL
  </html:td>
 </html:tr>

  
 <html:tr>
  <html:td style="white-space:nowrap">
   <html:code><![CDATA[\let\ident[x][y]{body}]]></html:code>
  </html:td>
  <html:td>
    defines a local function named <html:code><![CDATA[\ident]]></html:code> with two arguments; subsequently, the expression <html:code><![CDATA[\ident{u}{v}]]></html:code> would expand to <html:code>body</html:code> with the values of <html:code>u,v</html:code> substituted for <html:code><![CDATA[\x,\y]]></html:code>.
  </html:td>
 </html:tr>

  
 <html:tr>
  <html:td style="white-space:nowrap">
   <html:code><![CDATA[\code{...}]]></html:code>
  </html:td>
  <html:td>typesets the content in monospace</html:td>
 </html:tr>

  
 <html:tr>
  <html:td style="white-space:nowrap">
   <html:code><![CDATA[\tex{preamble}{body}]]></html:code>
  </html:td>
  <html:td>typesets the <html:code>body</html:code> externally using <fr:tex display="inline"><![CDATA[\LaTeX ]]></fr:tex> using <html:code>preamble</html:code> as preamble code (e.g. to set up tikz packages, etc.). It can be useful to wrap this in your own macro in order to insert your preamble code automatically.</html:td>
 </html:tr>

</html:table>
</fr:mainmatter>
        </fr:tree>
        <fr:tree show-metadata="true" expanded="false" toc="false" numbered="false">
          <fr:frontmatter>
            <fr:authors>
              <fr:author>
                <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
              </fr:author>
            </fr:authors>
            <fr:date>
              <fr:year>2023</fr:year>
              <fr:month>8</fr:month>
              <fr:day>16</fr:day>
            </fr:date>
            <fr:uri>https://www.forester-notes.org/007S/</fr:uri>
            <fr:display-uri>007S</fr:display-uri>
            <fr:route>/007S/</fr:route>
            <fr:title text="Let a hundred forests bloom!">Let a hundred <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forests</fr:link> bloom!</fr:title>
          </fr:frontmatter>
          <fr:mainmatter>
            <html:p>I am eager to see the new <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forests</fr:link> that people create using <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link>. I am happy to offer personal assistance via the <fr:link href="https://lists.sr.ht/~jonsterling/forester-discuss" type="external">mailing list</fr:link>.</html:p>
            <html:p>Many aspects of <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> are in flux and not fully documented; it will often be instructive to consult the source of existings <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forests</fr:link>, such as <fr:link href="https://git.sr.ht/~jonsterling/forester-notes.org" type="external">this one</fr:link>.</html:p>
            <html:p>Have fun, and be sure to send me links to your <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forests</fr:link> when you have made them!</html:p>
          </fr:mainmatter>
        </fr:tree>
        <fr:tree show-metadata="true" expanded="false" toc="false" numbered="false">
          <fr:frontmatter>
            <fr:authors>
              <fr:author>
                <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
              </fr:author>
            </fr:authors>
            <fr:date>
              <fr:year>2023</fr:year>
              <fr:month>8</fr:month>
              <fr:day>16</fr:day>
            </fr:date>
            <fr:uri>https://www.forester-notes.org/007N/</fr:uri>
            <fr:display-uri>007N</fr:display-uri>
            <fr:route>/007N/</fr:route>
            <fr:title text="The Forester markup language">The <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> markup language</fr:title>
          </fr:frontmatter>
          <fr:mainmatter>
            <html:p>A <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">tree</fr:link> in <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> is a single file written in a markup language designed specifically for scientific writing <fr:link href="/007L/" title="Bottom-up hierarchy via transclusion" uri="https://www.forester-notes.org/007L/" display-uri="007L" type="local">with bottom-up hierarchy via transclusion</fr:link>. A <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">tree</fr:link> has two components: the <fr:link href="/007P/" title="Forester markup: frontmatter" uri="https://www.forester-notes.org/007P/" display-uri="007P" type="local">frontmatter</fr:link> and the <fr:link href="/007O/" title="Forester markup: mainmatter" uri="https://www.forester-notes.org/007O/" display-uri="007O" type="local">mainmatter</fr:link>.</html:p>
            <fr:tree show-metadata="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:date>
                  <fr:year>2023</fr:year>
                  <fr:month>8</fr:month>
                  <fr:day>16</fr:day>
                </fr:date>
                <fr:uri>https://www.forester-notes.org/007P/</fr:uri>
                <fr:display-uri>007P</fr:display-uri>
                <fr:route>/007P/</fr:route>
                <fr:title text="Forester markup: frontmatter"><fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> markup: frontmatter</fr:title>
              </fr:frontmatter>
              <fr:mainmatter><html:p>The frontmatter of a <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">tree</fr:link> is a sequence of declarations that we summarize below.</html:p>
  <html:table>
  
  <html:tr>
    
  <html:th>Declaration</html:th>

    
  <html:th>Meaning</html:th>

  </html:tr>

  
 <html:tr>
  <html:td style="white-space:nowrap">
   <html:code><![CDATA[\title{...}]]></html:code>
  </html:td>
  <html:td>
    sets the title of the <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">tree</fr:link>; can contain <fr:link href="/007O/" title="Forester markup: mainmatter" uri="https://www.forester-notes.org/007O/" display-uri="007O" type="local">mainmatter</fr:link> markup
  </html:td>
 </html:tr>

  
 <html:tr>
  <html:td style="white-space:nowrap">
   <html:code><![CDATA[\author{name}]]></html:code>
  </html:td>
  <html:td>
    sets the <fr:link href="/tfmt-000S/" title="Author of a tree" uri="https://www.forester-notes.org/tfmt-000S/" display-uri="tfmt-000S" type="local">author</fr:link> of the <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">tree</fr:link> to be the biographical tree at address <html:code>name</html:code>
  </html:td>
 </html:tr>

  
 <html:tr>
  <html:td style="white-space:nowrap">
   <html:code><![CDATA[\date{YYYY-MM-DD}]]></html:code>
  </html:td>
  <html:td>sets the creation date of the <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">tree</fr:link>; full ISO 8601 date-times are supported.</html:td>
 </html:tr>

  
 <html:tr>
  <html:td style="white-space:nowrap">
   <html:code><![CDATA[\taxon{Taxon}]]></html:code>
  </html:td>
  <html:td>sets the taxon of the <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">tree</fr:link>; example taxa include <html:code>lemma</html:code>, <html:code>theorem</html:code>, <html:code>person</html:code>, <html:code>reference</html:code>; the latter two taxa are treated specially by <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> for tracking biographical and bibliographical <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">trees</fr:link> respectively</html:td>
 </html:tr>

  
 <html:tr>
  <html:td style="white-space:nowrap">
   <html:code><![CDATA[\def\ident[x][y]{body}]]></html:code>
  </html:td>
  <html:td>
    defines and exports from the current <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">tree</fr:link> a function named <html:code><![CDATA[\ident]]></html:code> with two arguments; subsequently, the expression <html:code><![CDATA[\ident{u}{v}]]></html:code> would expand to <html:code>body</html:code> with the values of <html:code>u,v</html:code> substituted for <html:code><![CDATA[\x,\y]]></html:code>
  </html:td>
 </html:tr>

  
 <html:tr>
  <html:td style="white-space:nowrap">
   <html:code><![CDATA[\import{address}]]></html:code>
  </html:td>
  <html:td>
    brings the functions exported by the tree <html:code>address</html:code> into scope
  </html:td>
 </html:tr>

  
 <html:tr>
  <html:td style="white-space:nowrap">
   <html:code><![CDATA[\export{address}]]></html:code>
  </html:td>
  <html:td>
    brings the functions exported by the tree <html:code>address</html:code> into scope, and exports them from the current tree
  </html:td>
 </html:tr>

</html:table>
</fr:mainmatter>
            </fr:tree>
            <fr:tree show-metadata="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:date>
                  <fr:year>2023</fr:year>
                  <fr:month>8</fr:month>
                  <fr:day>16</fr:day>
                </fr:date>
                <fr:uri>https://www.forester-notes.org/007O/</fr:uri>
                <fr:display-uri>007O</fr:display-uri>
                <fr:route>/007O/</fr:route>
                <fr:title text="Forester markup: mainmatter"><fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> markup: mainmatter</fr:title>
              </fr:frontmatter>
              <fr:mainmatter><html:p>Below we summarize the concrete syntax of the <html:em>mainmatter</html:em> in a <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">tree</fr:link>.</html:p>
  <html:table>
  
  <html:tr>
    
  <html:th>Function</html:th>

    
  <html:th>Meaning</html:th>

  </html:tr>

  
 <html:tr>
  <html:td style="white-space:nowrap">
   <html:code><![CDATA[\p{...}]]></html:code>
  </html:td>
  <html:td>creates a paragraph containing <html:code>...</html:code>; unlike Markdown, it is mandatory to annotate paragraphs explicitly</html:td>
 </html:tr>

  
 <html:tr>
  <html:td style="white-space:nowrap">
   <html:code><![CDATA[\em{...}]]></html:code>
  </html:td>
  <html:td>typesets the content in italics</html:td>
 </html:tr>

  
 <html:tr>
  <html:td style="white-space:nowrap">
   <html:code><![CDATA[\strong{...}]]></html:code>
  </html:td>
  <html:td>typesets the content in boldface</html:td>
 </html:tr>


  
 <html:tr>
  <html:td style="white-space:nowrap">
   <html:code><![CDATA[\ol{...}]]></html:code>
  </html:td>
  <html:td>creates an ordered list</html:td>
 </html:tr>


  
 <html:tr>
  <html:td style="white-space:nowrap">
   <html:code><![CDATA[\ul{...}]]></html:code>
  </html:td>
  <html:td>creates an unordered list</html:td>
 </html:tr>


  
 <html:tr>
  <html:td style="white-space:nowrap">
   <html:code><![CDATA[\li{...}]]></html:code>
  </html:td>
  <html:td>creates a list item</html:td>
 </html:tr>


  
 <html:tr>
  <html:td style="white-space:nowrap">
   <html:code><![CDATA[ #{...}]]></html:code>
  </html:td>
  <html:td>typesets the content in (inline) math mode using <fr:tex display="inline"><![CDATA[\KaTeX ]]></fr:tex>; note that math mode is idempotent in <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link></html:td>
 </html:tr>

  
 <html:tr>
  <html:td style="white-space:nowrap">
   <html:code><![CDATA[ ##{...}]]></html:code>
  </html:td>
  <html:td>typesets the content in (display) math mode using <fr:tex display="inline"><![CDATA[\KaTeX ]]></fr:tex></html:td>
 </html:tr>

  
 <html:tr>
  <html:td style="white-space:nowrap">
   <html:code><![CDATA[\transclude{address}]]></html:code>
  </html:td>
  <html:td><fr:link href="/007L/" title="Bottom-up hierarchy via transclusion" uri="https://www.forester-notes.org/007L/" display-uri="007L" type="local">transcludes</fr:link> the <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">tree</fr:link> at address <html:code>address</html:code> as a subsection</html:td>
 </html:tr>

  
 <html:tr>
  <html:td style="white-space:nowrap">
   <html:code><![CDATA[[title](address)]]></html:code>
  </html:td>
  <html:td>
    formats the text <html:code>title</html:code> as a hyperlink to address <html:code>address</html:code>; if <html:code>address</html:code> is the address of a <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">tree</fr:link>, the link will point to that tree, and otherwise it is treated as a URL
  </html:td>
 </html:tr>

  
 <html:tr>
  <html:td style="white-space:nowrap">
   <html:code><![CDATA[\let\ident[x][y]{body}]]></html:code>
  </html:td>
  <html:td>
    defines a local function named <html:code><![CDATA[\ident]]></html:code> with two arguments; subsequently, the expression <html:code><![CDATA[\ident{u}{v}]]></html:code> would expand to <html:code>body</html:code> with the values of <html:code>u,v</html:code> substituted for <html:code><![CDATA[\x,\y]]></html:code>.
  </html:td>
 </html:tr>

  
 <html:tr>
  <html:td style="white-space:nowrap">
   <html:code><![CDATA[\code{...}]]></html:code>
  </html:td>
  <html:td>typesets the content in monospace</html:td>
 </html:tr>

  
 <html:tr>
  <html:td style="white-space:nowrap">
   <html:code><![CDATA[\tex{preamble}{body}]]></html:code>
  </html:td>
  <html:td>typesets the <html:code>body</html:code> externally using <fr:tex display="inline"><![CDATA[\LaTeX ]]></fr:tex> using <html:code>preamble</html:code> as preamble code (e.g. to set up tikz packages, etc.). It can be useful to wrap this in your own macro in order to insert your preamble code automatically.</html:td>
 </html:tr>

</html:table>
</fr:mainmatter>
            </fr:tree>
            <fr:tree show-metadata="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:date>
                  <fr:year>2023</fr:year>
                  <fr:month>8</fr:month>
                  <fr:day>16</fr:day>
                </fr:date>
                <fr:uri>https://www.forester-notes.org/007Q/</fr:uri>
                <fr:display-uri>007Q</fr:display-uri>
                <fr:route>/007Q/</fr:route>
                <fr:title text="An complete worked example tree in Forester">An complete worked example <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">tree</fr:link> in <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link></fr:title>
                <fr:taxon>Example</fr:taxon>
              </fr:frontmatter>
              <fr:mainmatter>
                <html:p>An example of a complete <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">tree</fr:link> in the <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> markup language can be seen below.</html:p>
                <html:pre><![CDATA[\title{Creation of (co)limits}
\date{2023-02-11}
\taxon{Definition}
\author{jonmsterling}

\def\CCat{#{\mathcal{C}}}
\def\DCat{#{\mathcal{D}}}
\def\ICat{#{\mathcal{I}}}
\def\Mor[arg1][arg2][arg3]{#{{\arg2}\xrightarrow{\arg1}{\arg3}}}

\p{Let \Mor{U}{\CCat}{\DCat} be a functor and let \ICat be a category. The functor #{U} is said to \em{create (co)limits of #{\ICat}-figures} when for any diagram \Mor{C_\bullet}{\ICat}{\CCat} such that #{\ICat\xrightarrow{C_\bullet}\CCat\xrightarrow{F}\DCat} has a (co)limit, then #{C_\bullet} has a (co)limit that is both preserved and reflected by #{F}.}]]></html:pre>
                <html:p>The code above results in the following tree:</html:p>
                <fr:tree show-metadata="true" toc="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2023</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>11</fr:day>
                    </fr:date>
                    <fr:uri>https://www.forester-notes.org/001H/</fr:uri>
                    <fr:display-uri>001H</fr:display-uri>
                    <fr:route>/001H/</fr:route>
                    <fr:title text="Creation of (co)limits">Creation of (co)limits</fr:title>
                    <fr:taxon>Definition</fr:taxon>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>Let <fr:tex display="inline"><![CDATA[{\mathcal {C}}\xrightarrow {U}{\mathcal {D}}]]></fr:tex> be a functor and let <fr:tex display="inline"><![CDATA[\mathcal {I}]]></fr:tex> be a category. The functor <fr:tex display="inline"><![CDATA[U]]></fr:tex> is said to <html:em>create (co)limits of <fr:tex display="inline"><![CDATA[\mathcal {I}]]></fr:tex>-figures</html:em> when for any diagram <fr:tex display="inline"><![CDATA[{\mathcal {I}}\xrightarrow {C_\bullet }{\mathcal {C}}]]></fr:tex> such that <fr:tex display="inline"><![CDATA[\mathcal {I}\xrightarrow {C_\bullet }\mathcal {C}\xrightarrow {F}\mathcal {D}]]></fr:tex> has a (co)limit, then <fr:tex display="inline"><![CDATA[C_\bullet ]]></fr:tex> has a (co)limit that is both preserved and reflected by <fr:tex display="inline"><![CDATA[F]]></fr:tex>.</html:p>
                  </fr:mainmatter>
                </fr:tree>
              </fr:mainmatter>
            </fr:tree>
          </fr:mainmatter>
        </fr:tree>
        <fr:tree show-metadata="true" expanded="false" toc="false" numbered="false">
          <fr:frontmatter>
            <fr:authors>
              <fr:author>
                <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
              </fr:author>
            </fr:authors>
            <fr:date>
              <fr:year>2023</fr:year>
              <fr:month>8</fr:month>
              <fr:day>15</fr:day>
            </fr:date>
            <fr:uri>https://www.forester-notes.org/007L/</fr:uri>
            <fr:display-uri>007L</fr:display-uri>
            <fr:route>/007L/</fr:route>
            <fr:title text="Bottom-up hierarchy via transclusion">Bottom-up hierarchy via <html:em>transclusion</html:em></fr:title>
          </fr:frontmatter>
          <fr:mainmatter>
            <html:p>You may be used to writing <fr:tex display="inline"><![CDATA[\LaTeX ]]></fr:tex> documents, where you work from the top down: you create some section headings, put some text under those headings, make some deeper section headings, put more text, etc. <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">Forests</fr:link> work in the opposite way, from the bottom up: you start by writing independent, <fr:link href="/tfmt-0007/" title="Atomicity of scientific notes" uri="https://www.forester-notes.org/tfmt-0007/" display-uri="tfmt-0007" type="local">atomic</fr:link> notes/<fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">trees</fr:link> and then only later start to (sparingly) assemble these into a hierarchy in order to reify the emerging structure.</html:p>
            <html:p><fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link>’s bottom-up approach to section hierarchy works via something called <html:em>transclusion</html:em>. The idea is that at any time, you can include (“transclude”) the full contents of another <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">tree</fr:link> into the current tree as a subsection by adding the following code:</html:p>
            <html:pre><![CDATA[\transclude{address}]]></html:pre>
            <html:p>This is kind of like <fr:tex display="inline"><![CDATA[\LaTeX ]]></fr:tex>’s <html:code><![CDATA[\input]]></html:code> command, but much better behaved: for instance, section levels are computed on the fly depending on the position in the hierarchy. This <fr:link href="/0052/" title="Build your own Stacks Project in 10 minutes" uri="https://www.forester-notes.org/0052/" display-uri="0052" type="local">entire tutorial</fr:link> is cobbled together by transcluding many smaller <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">trees</fr:link>, each with their own independent existence. For example, the following two sections are transcluded from an <fr:link href="/tfmt-0001/" title="Designing tools for scientific thought" uri="https://www.forester-notes.org/tfmt-0001/" display-uri="tfmt-0001" type="local">entirely different part</fr:link> of my forest:</html:p>
            <fr:tree show-metadata="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:date>
                  <fr:year>2022</fr:year>
                  <fr:month>12</fr:month>
                  <fr:day>27</fr:day>
                </fr:date>
                <fr:uri>https://www.forester-notes.org/tfmt-0009/</fr:uri>
                <fr:display-uri>tfmt-0009</fr:display-uri>
                <fr:route>/tfmt-0009/</fr:route>
                <fr:title text="The best structure to impose is relatively flat">The best structure to impose is relatively flat</fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <html:p>It is easy to make the mistake of prematurely imposing a complex hierarchical structure on a network of notes, which leads to excessive refactoring. Hierarchy should be used sparingly, and its strength is for the large-scale organization of ideas. The best structure to impose on a network of many small related ideas is a relatively flat one. I believe that this is one of the mistakes made in the writing of the <html:em>foundations of relative category theory</html:em>, whose hierarchical nesting was too complex and quite beholden to my experience with pre-hypertext media.</html:p>
              </fr:mainmatter>
            </fr:tree>
            <html:p>One of the immediate impacts and strengths of <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link>’s transclusion model is that a given <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">tree</fr:link> has no canonical “geographic” location in the <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link>. One <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">tree</fr:link> can appear as a child of many other <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">trees</fr:link>, which allows the same content to be incorporated into different textual and intellectual narratives.</html:p>
            <fr:tree show-metadata="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:date>
                  <fr:year>2022</fr:year>
                  <fr:month>12</fr:month>
                  <fr:day>26</fr:day>
                </fr:date>
                <fr:uri>https://www.forester-notes.org/tfmt-0006/</fr:uri>
                <fr:display-uri>tfmt-0006</fr:display-uri>
                <fr:route>/tfmt-0006/</fr:route>
                <fr:title text="Hierarchical structure as non-unique narrative">Hierarchical structure as non-unique narrative</fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <html:p>Multiple hierarchical structures can be imposed on the same associative network of nodes; a hierarchical structure amounts to a “narrative” that contextualizes a given subgraph of the network. One example could be the construction of lecture notes; another example could be a homework sheet; a further example could be a book chapter or scientific article. Although these may draw from the same body of definitions, theorems, examples, and exercises, these objects are contextualized within a different narrative, often toward fundamentally different ends.</html:p>
                <html:p>As a result, any interface for navigating the neighbor-relation in hierarchically organized notes would need to take account of the multiplicity of parent nodes. Most hypertext tools assume that the position of a node in the hierarchy is unique, and therefore have a single “next/previous” navigation interface; we must investigate the design of interfaces that surface all parent/neighbor relations.</html:p>
              </fr:mainmatter>
            </fr:tree>
          </fr:mainmatter>
        </fr:tree>
        <fr:tree show-metadata="true" expanded="false" toc="false" numbered="false">
          <fr:frontmatter>
            <fr:authors>
              <fr:author>
                <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
              </fr:author>
            </fr:authors>
            <fr:date>
              <fr:year>2023</fr:year>
              <fr:month>8</fr:month>
              <fr:day>15</fr:day>
            </fr:date>
            <fr:uri>https://www.forester-notes.org/007K/</fr:uri>
            <fr:display-uri>007K</fr:display-uri>
            <fr:route>/007K/</fr:route>
            <fr:title text="Creating your personal biographical tree">Creating your personal biographical <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">tree</fr:link></fr:title>
          </fr:frontmatter>
          <fr:mainmatter>
            <html:p>The first <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">tree</fr:link> that you should create is a biographical tree to represent your own identity; ultimately you will link to this tree when you set the <fr:link href="/tfmt-000S/" title="Author of a tree" uri="https://www.forester-notes.org/tfmt-000S/" display-uri="tfmt-000S" type="local">authors</fr:link> of other <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">trees</fr:link> that you create later on. It is convenient to simply use a person’s full name to address a biographical <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">tree</fr:link>. <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">My own biographical tree</fr:link> is located at <html:code>trees/people/jonmsterling.tree</html:code> and contains the following source code:</html:p>
            <html:pre><![CDATA[\title{Jon Sterling}
\taxon{Person}
\meta{external}{https://www.jonmsterling.com/}
\meta{institution}{[[ucam]]}
\meta{orcid}{0000-0002-0585-5564}
\meta{position}{Associate Professor}

\p{Associate Professor in Logical Foundations and Formal Methods at University of Cambridge. Formerly a [Marie Skłodowska-Curie Postdoctoral Fellow](0061) hosted at Aarhus University by [Lars Birkedal](larsbirkedal), and before this a PhD student of [Robert Harper](robertharper).}]]></html:pre>
            <html:p>Let’s break this code down to understand what it does.</html:p>
            <html:ol><html:li>The declaration <html:code><![CDATA[\title{Jon Sterling}]]></html:code> sets the title of the <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">tree</fr:link> to my name.</html:li>
  <html:li>The <html:code><![CDATA[\taxon{Person}]]></html:code> declaration informs <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> that the <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">tree</fr:link> is biographical. Not ever <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">tree</fr:link> needs to have a taxon; common taxa include <html:code>Person</html:code>, <html:code>Theorem</html:code>, <html:code>Definition</html:code>, <html:code>Lemma</html:code>, etc. You are free to use whatever you want, but some taxa are treated specially by <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link>.</html:li>
  <html:li>The subsequent <html:code><![CDATA[\meta]]></html:code> declarations attach additional information to the tree that can be used during rendering. These declarations are optional, and you are free to put whatever metadata you want.</html:li>
  <html:li>Like in HTML, paragraphs must be wrapped in <html:code><![CDATA[\p{...}]]></html:code>.</html:li></html:ol>
            <html:p>Do not hard-wrap your text, as this can have visible impact on how <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">trees</fr:link> are rendered; it is recommended that you use a text editor with good support for soft-wrapping, like <fr:link href="https://code.visualstudio.com/" type="external">Visual Studio Code</fr:link>.</html:p>
            <html:p>You can see that the <fr:link href="/007N/" title="The Forester markup language" uri="https://www.forester-notes.org/007N/" display-uri="007N" type="local">concrete syntax of <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link>'s <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">trees</fr:link></fr:link> looks superficially like a combination of <fr:tex display="inline"><![CDATA[\LaTeX ]]></fr:tex> and Markdown; Markdown-style links are used both for links to other trees <html:em>and</html:em> for links to external URLs. <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link>'s concrete syntax is not fully documented, but it is less ambiguous than both <fr:tex display="inline"><![CDATA[\LaTeX ]]></fr:tex> and Markdown.</html:p>
          </fr:mainmatter>
        </fr:tree>
        <fr:tree show-metadata="true" expanded="false" toc="false" numbered="false">
          <fr:frontmatter>
            <fr:authors>
              <fr:author>
                <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
              </fr:author>
            </fr:authors>
            <fr:date>
              <fr:year>2023</fr:year>
              <fr:month>8</fr:month>
              <fr:day>15</fr:day>
            </fr:date>
            <fr:uri>https://www.forester-notes.org/007G/</fr:uri>
            <fr:display-uri>007G</fr:display-uri>
            <fr:route>/007G/</fr:route>
            <fr:title text="Forester renders each tree to an XML document"><fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> renders each tree to an XML document</fr:title>
          </fr:frontmatter>
          <fr:mainmatter>
            <html:p><fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> renders your <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link> to some XML files in the <html:code>output/</html:code> directory; XML is, like HTML, a format for structured documents that can be displayed by web browsers. The <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link> template comes equipped with a built-in XSLT stylesheet (<html:code>theme/default.xsl</html:code>) which is used to instruct web browsers how to render your <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link> into a pleasing and readable format.</html:p>
          </fr:mainmatter>
        </fr:tree>
        <fr:tree show-metadata="true" expanded="false" toc="false" numbered="false">
          <fr:frontmatter>
            <fr:authors>
              <fr:author>
                <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
              </fr:author>
            </fr:authors>
            <fr:date>
              <fr:year>2023</fr:year>
              <fr:month>8</fr:month>
              <fr:day>15</fr:day>
            </fr:date>
            <fr:uri>https://www.forester-notes.org/007I/</fr:uri>
            <fr:display-uri>007I</fr:display-uri>
            <fr:route>/007I/</fr:route>
            <fr:title text="Serving and viewing your forest from a local web server">Serving and viewing your <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link> from a local web server</fr:title>
          </fr:frontmatter>
          <fr:mainmatter>
            <html:p>To view your <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link> while editing it, you must <html:em>serve</html:em> it from a local web server..To do this, first ensure that you have <fr:link href="https://www.python.org/downloads/" type="external">Python 3</fr:link> correctly installed. Then run the following command from the root directory of your <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link>:</html:p>
            <html:pre>python3 -m http.server 1313 -d output</html:pre>
            <html:p>(You could replace <html:code>1313</html:code> with whatever port you prefer.) While this command is running, you will be able to access your <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link> by navigating to <fr:link href="http://localhost:1313/" type="external"><html:code>localhost:1313</html:code></fr:link> in your preferred web browser.</html:p>
            <html:p>In the future, <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> <fr:link href="https://todo.sr.ht/~jonsterling/forester/15" type="external">may be able to run its own local server</fr:link> to avoid the dependency on external tools like Python.</html:p>
          </fr:mainmatter>
        </fr:tree>
        <fr:tree show-metadata="true" expanded="false" toc="false" numbered="false">
          <fr:frontmatter>
            <fr:authors>
              <fr:author>
                <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
              </fr:author>
            </fr:authors>
            <fr:date>
              <fr:year>2023</fr:year>
              <fr:month>8</fr:month>
              <fr:day>14</fr:day>
            </fr:date>
            <fr:uri>https://www.forester-notes.org/0074/</fr:uri>
            <fr:display-uri>0074</fr:display-uri>
            <fr:route>/0074/</fr:route>
            <fr:title text="Base-36 identifiers in Forester">Base-36 identifiers in <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link></fr:title>
          </fr:frontmatter>
          <fr:mainmatter>
            <html:p>Base-36 numbers are encoded in <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> using the alphabet <html:code>0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ</html:code>. For example, the base-10 number <fr:tex display="inline"><![CDATA[270]]></fr:tex> can be written <html:code>007I</html:code> in the encoding. The purpose of using base-36 rather than a more familiar counting base is that a great many distinct numbers can be fit into a very small number of digits: in just four digits, base-36 can count to <fr:tex display="inline"><![CDATA[1679615]]></fr:tex> — which is far higher than the anticipated number of <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">trees</fr:link> in <html:em>any</html:em> <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link>.</html:p>
          </fr:mainmatter>
        </fr:tree>
        <fr:tree show-metadata="true" expanded="false" toc="false" numbered="false">
          <fr:frontmatter>
            <fr:authors>
              <fr:author>
                <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
              </fr:author>
            </fr:authors>
            <fr:date>
              <fr:year>2023</fr:year>
              <fr:month>8</fr:month>
              <fr:day>14</fr:day>
            </fr:date>
            <fr:uri>https://www.forester-notes.org/006Y/</fr:uri>
            <fr:display-uri>006Y</fr:display-uri>
            <fr:route>/006Y/</fr:route>
            <fr:title text="The git distributed version control system">The <fr:link href="https://git-scm.com/" type="external">git</fr:link> distributed version control system</fr:title>
            <fr:taxon>Requirement</fr:taxon>
          </fr:frontmatter>
          <fr:mainmatter>
            <html:p>It is best practice to maintain your <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link> inside of <fr:link href="https://en.wikipedia.org/wiki/Distributed_version_control" type="external">distributed version control</fr:link>. This serves not only as a way to prevent data loss (because you will be pushing frequently to a remote repository); it also allows you to easily roll back to an earlier version of your <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link>, or to create “branches” in which you prepare <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">trees</fr:link> that are not yet ready to be integrated into the <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link>.</html:p>
            <html:p>The recommended <fr:link href="https://en.wikipedia.org/wiki/Distributed_version_control" type="external">distributed version control</fr:link> system is <fr:link href="https://git-scm.com/" type="external">git</fr:link>, which comes preinstalled on many unix-based systems and is easy to install otherwise. <fr:link href="https://git-scm.com/" type="external">Git</fr:link> is not the most user-friendly piece of software, unfortunately, but it is ubiquitous. It is possible (but not recommended) to use <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> without version control, but note that the simplest way to <fr:link href="/006X/" title="Setting up your forest from the template" uri="https://www.forester-notes.org/006X/" display-uri="006X" type="local">initialize your own <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link></fr:link> involves cloning a <fr:link href="https://git-scm.com/" type="external">git</fr:link> repository.</html:p>
          </fr:mainmatter>
        </fr:tree>
        <fr:tree show-metadata="true" expanded="false" toc="false" numbered="false">
          <fr:frontmatter>
            <fr:authors>
              <fr:author>
                <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
              </fr:author>
            </fr:authors>
            <fr:date>
              <fr:year>2023</fr:year>
              <fr:month>8</fr:month>
              <fr:day>13</fr:day>
            </fr:date>
            <fr:uri>https://www.forester-notes.org/006T/</fr:uri>
            <fr:display-uri>006T</fr:display-uri>
            <fr:route>/006T/</fr:route>
            <fr:title text="A unix-based system">A unix-based system</fr:title>
            <fr:taxon>Requirement</fr:taxon>
          </fr:frontmatter>
          <fr:mainmatter>
            <html:p><fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> requires a unix-based system to run; it has been tested on both macOS and Linux. Windows support is <fr:link href="https://todo.sr.ht/~jonsterling/forester/6" type="external">desirable</fr:link>, but there are no concrete plans to implement it at this time.</html:p>
          </fr:mainmatter>
        </fr:tree>
        <fr:tree show-metadata="true" expanded="false" toc="false" numbered="false">
          <fr:frontmatter>
            <fr:authors>
              <fr:author>
                <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
              </fr:author>
            </fr:authors>
            <fr:date>
              <fr:year>2023</fr:year>
              <fr:month>8</fr:month>
              <fr:day>13</fr:day>
            </fr:date>
            <fr:uri>https://www.forester-notes.org/006U/</fr:uri>
            <fr:display-uri>006U</fr:display-uri>
            <fr:route>/006U/</fr:route>
            <fr:title text="A working OCaml 5 installation">A working OCaml 5 installation</fr:title>
            <fr:taxon>Requirement</fr:taxon>
          </fr:frontmatter>
          <fr:mainmatter>
            <html:p><fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> is written in the <fr:link href="https://www.ocaml.org/" type="external">OCaml</fr:link> programming language, and makes use of the latest features of OCaml 5. Most users should install <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> through OCaml's <fr:link href="https://opam.ocaml.org/" type="external">opam</fr:link> package manager; instructions to install opam and OCaml simultaneously can be found <fr:link href="https://opam.ocaml.org/" type="external">here</fr:link>.</html:p>
          </fr:mainmatter>
        </fr:tree>
        <fr:tree show-metadata="true" expanded="false" toc="false" numbered="false">
          <fr:frontmatter>
            <fr:authors>
              <fr:author>
                <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
              </fr:author>
            </fr:authors>
            <fr:date>
              <fr:year>2023</fr:year>
              <fr:month>8</fr:month>
              <fr:day>13</fr:day>
            </fr:date>
            <fr:uri>https://www.forester-notes.org/006W/</fr:uri>
            <fr:display-uri>006W</fr:display-uri>
            <fr:route>/006W/</fr:route>
            <fr:title text="Installing the Forester software">Installing the <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> software</fr:title>
          </fr:frontmatter>
          <fr:mainmatter>
            <html:p>Once you have met the <fr:link href="/006S/" title="System requirements of Forester" uri="https://www.forester-notes.org/006S/" display-uri="006S" type="local">system requirements</fr:link>, installing <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> requires only a single shell command:</html:p>
            <html:pre><![CDATA[opam install forester]]></html:pre>
            <html:p>To verify that <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> is installed, please run <html:code>forester --version</html:code> in your shell.</html:p>
          </fr:mainmatter>
        </fr:tree>
        <fr:tree show-metadata="true" expanded="false" toc="false" numbered="false">
          <fr:frontmatter>
            <fr:authors>
              <fr:author>
                <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
              </fr:author>
            </fr:authors>
            <fr:date>
              <fr:year>2023</fr:year>
              <fr:month>8</fr:month>
              <fr:day>13</fr:day>
            </fr:date>
            <fr:uri>https://www.forester-notes.org/006R/</fr:uri>
            <fr:display-uri>006R</fr:display-uri>
            <fr:route>/006R/</fr:route>
            <fr:title text="Preparing to run the Forester software">Preparing to run the <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> software</fr:title>
          </fr:frontmatter>
          <fr:mainmatter>
            <html:p>In this section, we will walk through the installation of the <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> software.</html:p>
            <fr:tree show-metadata="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:date>
                  <fr:year>2023</fr:year>
                  <fr:month>8</fr:month>
                  <fr:day>13</fr:day>
                </fr:date>
                <fr:uri>https://www.forester-notes.org/006S/</fr:uri>
                <fr:display-uri>006S</fr:display-uri>
                <fr:route>/006S/</fr:route>
                <fr:title text="System requirements of Forester">System requirements of <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link></fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2023</fr:year>
                      <fr:month>8</fr:month>
                      <fr:day>13</fr:day>
                    </fr:date>
                    <fr:uri>https://www.forester-notes.org/006T/</fr:uri>
                    <fr:display-uri>006T</fr:display-uri>
                    <fr:route>/006T/</fr:route>
                    <fr:title text="A unix-based system">A unix-based system</fr:title>
                    <fr:taxon>Requirement</fr:taxon>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p><fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> requires a unix-based system to run; it has been tested on both macOS and Linux. Windows support is <fr:link href="https://todo.sr.ht/~jonsterling/forester/6" type="external">desirable</fr:link>, but there are no concrete plans to implement it at this time.</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2023</fr:year>
                      <fr:month>8</fr:month>
                      <fr:day>13</fr:day>
                    </fr:date>
                    <fr:uri>https://www.forester-notes.org/006U/</fr:uri>
                    <fr:display-uri>006U</fr:display-uri>
                    <fr:route>/006U/</fr:route>
                    <fr:title text="A working OCaml 5 installation">A working OCaml 5 installation</fr:title>
                    <fr:taxon>Requirement</fr:taxon>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p><fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> is written in the <fr:link href="https://www.ocaml.org/" type="external">OCaml</fr:link> programming language, and makes use of the latest features of OCaml 5. Most users should install <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> through OCaml's <fr:link href="https://opam.ocaml.org/" type="external">opam</fr:link> package manager; instructions to install opam and OCaml simultaneously can be found <fr:link href="https://opam.ocaml.org/" type="external">here</fr:link>.</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2023</fr:year>
                      <fr:month>8</fr:month>
                      <fr:day>13</fr:day>
                    </fr:date>
                    <fr:uri>https://www.forester-notes.org/006V/</fr:uri>
                    <fr:display-uri>006V</fr:display-uri>
                    <fr:route>/006V/</fr:route>
                    <fr:title text="A working \LaTeX  installation">A working <fr:tex display="inline"><![CDATA[\LaTeX ]]></fr:tex> installation</fr:title>
                    <fr:taxon>Requirement</fr:taxon>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>If you intend to <fr:link href="/tfmt-000L/" title="Generating images statically using LaTeX" uri="https://www.forester-notes.org/tfmt-000L/" display-uri="tfmt-000L" type="local">embed <fr:tex display="inline"><![CDATA[\LaTeX ]]></fr:tex>-rendered diagrams</fr:link> in your <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link>, you will need to have a working installation of <fr:tex display="inline"><![CDATA[\LaTeX ]]></fr:tex> installed, such as <fr:link href="https://tug.org/texlive/" type="external">TeX Live</fr:link>. If all your mathematical expressions are supported by <fr:link href="https://katex.org/" type="external"><fr:tex display="inline"><![CDATA[\KaTeX ]]></fr:tex></fr:link>, this is not necessary.</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2023</fr:year>
                      <fr:month>8</fr:month>
                      <fr:day>14</fr:day>
                    </fr:date>
                    <fr:uri>https://www.forester-notes.org/006Y/</fr:uri>
                    <fr:display-uri>006Y</fr:display-uri>
                    <fr:route>/006Y/</fr:route>
                    <fr:title text="The git distributed version control system">The <fr:link href="https://git-scm.com/" type="external">git</fr:link> distributed version control system</fr:title>
                    <fr:taxon>Requirement</fr:taxon>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>It is best practice to maintain your <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link> inside of <fr:link href="https://en.wikipedia.org/wiki/Distributed_version_control" type="external">distributed version control</fr:link>. This serves not only as a way to prevent data loss (because you will be pushing frequently to a remote repository); it also allows you to easily roll back to an earlier version of your <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link>, or to create “branches” in which you prepare <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">trees</fr:link> that are not yet ready to be integrated into the <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link>.</html:p>
                    <html:p>The recommended <fr:link href="https://en.wikipedia.org/wiki/Distributed_version_control" type="external">distributed version control</fr:link> system is <fr:link href="https://git-scm.com/" type="external">git</fr:link>, which comes preinstalled on many unix-based systems and is easy to install otherwise. <fr:link href="https://git-scm.com/" type="external">Git</fr:link> is not the most user-friendly piece of software, unfortunately, but it is ubiquitous. It is possible (but not recommended) to use <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> without version control, but note that the simplest way to <fr:link href="/006X/" title="Setting up your forest from the template" uri="https://www.forester-notes.org/006X/" display-uri="006X" type="local">initialize your own <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link></fr:link> involves cloning a <fr:link href="https://git-scm.com/" type="external">git</fr:link> repository.</html:p>
                  </fr:mainmatter>
                </fr:tree>
              </fr:mainmatter>
            </fr:tree>
            <fr:tree show-metadata="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:date>
                  <fr:year>2023</fr:year>
                  <fr:month>8</fr:month>
                  <fr:day>13</fr:day>
                </fr:date>
                <fr:uri>https://www.forester-notes.org/006W/</fr:uri>
                <fr:display-uri>006W</fr:display-uri>
                <fr:route>/006W/</fr:route>
                <fr:title text="Installing the Forester software">Installing the <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> software</fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <html:p>Once you have met the <fr:link href="/006S/" title="System requirements of Forester" uri="https://www.forester-notes.org/006S/" display-uri="006S" type="local">system requirements</fr:link>, installing <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> requires only a single shell command:</html:p>
                <html:pre><![CDATA[opam install forester]]></html:pre>
                <html:p>To verify that <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> is installed, please run <html:code>forester --version</html:code> in your shell.</html:p>
              </fr:mainmatter>
            </fr:tree>
          </fr:mainmatter>
        </fr:tree>
        <fr:tree show-metadata="true" expanded="false" toc="false" numbered="false">
          <fr:frontmatter>
            <fr:authors>
              <fr:author>
                <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
              </fr:author>
            </fr:authors>
            <fr:date>
              <fr:year>2023</fr:year>
              <fr:month>8</fr:month>
              <fr:day>13</fr:day>
            </fr:date>
            <fr:uri>https://www.forester-notes.org/006S/</fr:uri>
            <fr:display-uri>006S</fr:display-uri>
            <fr:route>/006S/</fr:route>
            <fr:title text="System requirements of Forester">System requirements of <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link></fr:title>
          </fr:frontmatter>
          <fr:mainmatter>
            <fr:tree show-metadata="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:date>
                  <fr:year>2023</fr:year>
                  <fr:month>8</fr:month>
                  <fr:day>13</fr:day>
                </fr:date>
                <fr:uri>https://www.forester-notes.org/006T/</fr:uri>
                <fr:display-uri>006T</fr:display-uri>
                <fr:route>/006T/</fr:route>
                <fr:title text="A unix-based system">A unix-based system</fr:title>
                <fr:taxon>Requirement</fr:taxon>
              </fr:frontmatter>
              <fr:mainmatter>
                <html:p><fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> requires a unix-based system to run; it has been tested on both macOS and Linux. Windows support is <fr:link href="https://todo.sr.ht/~jonsterling/forester/6" type="external">desirable</fr:link>, but there are no concrete plans to implement it at this time.</html:p>
              </fr:mainmatter>
            </fr:tree>
            <fr:tree show-metadata="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:date>
                  <fr:year>2023</fr:year>
                  <fr:month>8</fr:month>
                  <fr:day>13</fr:day>
                </fr:date>
                <fr:uri>https://www.forester-notes.org/006U/</fr:uri>
                <fr:display-uri>006U</fr:display-uri>
                <fr:route>/006U/</fr:route>
                <fr:title text="A working OCaml 5 installation">A working OCaml 5 installation</fr:title>
                <fr:taxon>Requirement</fr:taxon>
              </fr:frontmatter>
              <fr:mainmatter>
                <html:p><fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> is written in the <fr:link href="https://www.ocaml.org/" type="external">OCaml</fr:link> programming language, and makes use of the latest features of OCaml 5. Most users should install <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> through OCaml's <fr:link href="https://opam.ocaml.org/" type="external">opam</fr:link> package manager; instructions to install opam and OCaml simultaneously can be found <fr:link href="https://opam.ocaml.org/" type="external">here</fr:link>.</html:p>
              </fr:mainmatter>
            </fr:tree>
            <fr:tree show-metadata="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:date>
                  <fr:year>2023</fr:year>
                  <fr:month>8</fr:month>
                  <fr:day>13</fr:day>
                </fr:date>
                <fr:uri>https://www.forester-notes.org/006V/</fr:uri>
                <fr:display-uri>006V</fr:display-uri>
                <fr:route>/006V/</fr:route>
                <fr:title text="A working \LaTeX  installation">A working <fr:tex display="inline"><![CDATA[\LaTeX ]]></fr:tex> installation</fr:title>
                <fr:taxon>Requirement</fr:taxon>
              </fr:frontmatter>
              <fr:mainmatter>
                <html:p>If you intend to <fr:link href="/tfmt-000L/" title="Generating images statically using LaTeX" uri="https://www.forester-notes.org/tfmt-000L/" display-uri="tfmt-000L" type="local">embed <fr:tex display="inline"><![CDATA[\LaTeX ]]></fr:tex>-rendered diagrams</fr:link> in your <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link>, you will need to have a working installation of <fr:tex display="inline"><![CDATA[\LaTeX ]]></fr:tex> installed, such as <fr:link href="https://tug.org/texlive/" type="external">TeX Live</fr:link>. If all your mathematical expressions are supported by <fr:link href="https://katex.org/" type="external"><fr:tex display="inline"><![CDATA[\KaTeX ]]></fr:tex></fr:link>, this is not necessary.</html:p>
              </fr:mainmatter>
            </fr:tree>
            <fr:tree show-metadata="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:date>
                  <fr:year>2023</fr:year>
                  <fr:month>8</fr:month>
                  <fr:day>14</fr:day>
                </fr:date>
                <fr:uri>https://www.forester-notes.org/006Y/</fr:uri>
                <fr:display-uri>006Y</fr:display-uri>
                <fr:route>/006Y/</fr:route>
                <fr:title text="The git distributed version control system">The <fr:link href="https://git-scm.com/" type="external">git</fr:link> distributed version control system</fr:title>
                <fr:taxon>Requirement</fr:taxon>
              </fr:frontmatter>
              <fr:mainmatter>
                <html:p>It is best practice to maintain your <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link> inside of <fr:link href="https://en.wikipedia.org/wiki/Distributed_version_control" type="external">distributed version control</fr:link>. This serves not only as a way to prevent data loss (because you will be pushing frequently to a remote repository); it also allows you to easily roll back to an earlier version of your <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link>, or to create “branches” in which you prepare <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">trees</fr:link> that are not yet ready to be integrated into the <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link>.</html:p>
                <html:p>The recommended <fr:link href="https://en.wikipedia.org/wiki/Distributed_version_control" type="external">distributed version control</fr:link> system is <fr:link href="https://git-scm.com/" type="external">git</fr:link>, which comes preinstalled on many unix-based systems and is easy to install otherwise. <fr:link href="https://git-scm.com/" type="external">Git</fr:link> is not the most user-friendly piece of software, unfortunately, but it is ubiquitous. It is possible (but not recommended) to use <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> without version control, but note that the simplest way to <fr:link href="/006X/" title="Setting up your forest from the template" uri="https://www.forester-notes.org/006X/" display-uri="006X" type="local">initialize your own <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link></fr:link> involves cloning a <fr:link href="https://git-scm.com/" type="external">git</fr:link> repository.</html:p>
              </fr:mainmatter>
            </fr:tree>
          </fr:mainmatter>
        </fr:tree>
        <fr:tree show-metadata="true" expanded="false" toc="false" numbered="false">
          <fr:frontmatter>
            <fr:authors>
              <fr:author>
                <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
              </fr:author>
            </fr:authors>
            <fr:date>
              <fr:year>2023</fr:year>
              <fr:month>5</fr:month>
              <fr:day>14</fr:day>
            </fr:date>
            <fr:uri>https://www.forester-notes.org/0053/</fr:uri>
            <fr:display-uri>0053</fr:display-uri>
            <fr:route>/0053/</fr:route>
            <fr:title text="Introducing Forester: a tool for scientific thought">Introducing <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local"><html:em>Forester</html:em></fr:link>: a <fr:link href="/tfmt-0002/" title="Tool for scientific thought" uri="https://www.forester-notes.org/tfmt-0002/" display-uri="tfmt-0002" type="local">tool for scientific thought</fr:link></fr:title>
          </fr:frontmatter>
          <fr:mainmatter>
            <html:p>After spending two years exploring the <fr:link href="/tfmt-0001/" title="Designing tools for scientific thought" uri="https://www.forester-notes.org/tfmt-0001/" display-uri="tfmt-0001" type="local">design of tools for scientific thought</fr:link> that meet the unique needs of real, scalable scientific writing in hypertext, I have created a tool called <html:strong><fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link></html:strong> which has the following benefits:</html:p>
            <html:ol><html:li><fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> is tag-based like <fr:link href="/gerby/" title="Gerby" uri="https://www.forester-notes.org/gerby/" display-uri="gerby" type="local">Gerby</fr:link>, and can therefore power large-scale generational projects like <fr:link href="/stacks-project/" title="The Stacks project" uri="https://www.forester-notes.org/stacks-project/" display-uri="stacks-project" type="local">Stacks</fr:link> and <fr:link href="/kerodon/" title="Kerodon" uri="https://www.forester-notes.org/kerodon/" display-uri="kerodon" type="local">Kerodon</fr:link>.</html:li>
  <html:li><fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> produces static content that <fr:link href="/007R/" title="Deploying your forest to a web host" uri="https://www.forester-notes.org/007R/" display-uri="007R" type="local">can be uploaded to any web hosting service</fr:link> without needing to run or install any serverside software.</html:li>
  <html:li><fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> is <fr:link href="/006W/" title="Installing the Forester software" uri="https://www.forester-notes.org/006W/" display-uri="006W" type="local">easy to install</fr:link> on your own machine.</html:li>
  <html:li>To prevent bitrot, <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> is a single tool rather than a composition of several tools.</html:li>
  <html:li><fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> satisfies <html:em>all</html:em> the <fr:link href="/tfmt-000E/" title="Requirements for typesetting mathematics" uri="https://www.forester-notes.org/tfmt-000E/" display-uri="tfmt-000E" type="local">requirements of serious scientific writing</fr:link>, including sophisticated notational macros, typesetting of diagrams, etc.</html:li></html:ol>
            <html:p><fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> combines <fr:link href="/tfmt-0005/" title="Hierarchy in evergreen notes" uri="https://www.forester-notes.org/tfmt-0005/" display-uri="tfmt-0005" type="local">associative and hierarchical</fr:link> networks of <fr:link href="/tfmt-0003/" title="Evergreen notes" uri="https://www.forester-notes.org/tfmt-0003/" display-uri="tfmt-0003" type="local">evergreen notes</fr:link> (called “trees”) into hypertext sites called “forests”.</html:p>
            <fr:tree show-metadata="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:date>
                  <fr:year>2023</fr:year>
                  <fr:month>3</fr:month>
                  <fr:day>4</fr:day>
                </fr:date>
                <fr:uri>https://www.forester-notes.org/tfmt-000R/</fr:uri>
                <fr:display-uri>tfmt-000R</fr:display-uri>
                <fr:route>/tfmt-000R/</fr:route>
                <fr:title text="Forests and trees of evergreen notes">Forests and trees of evergreen notes</fr:title>
                <fr:taxon>Definition</fr:taxon>
              </fr:frontmatter>
              <fr:mainmatter>
                <html:p>A <html:em>forest of <fr:link href="/tfmt-0003/" title="Evergreen notes" uri="https://www.forester-notes.org/tfmt-0003/" display-uri="tfmt-0003" type="local">evergreen notes</fr:link></html:em> (or a <html:em>forest</html:em> for short) is loosely defined to be a collection of <fr:link href="/tfmt-0003/" title="Evergreen notes" uri="https://www.forester-notes.org/tfmt-0003/" display-uri="tfmt-0003" type="local">evergreen notes</fr:link> in which multiple <fr:link href="/tfmt-0005/" title="Hierarchy in evergreen notes" uri="https://www.forester-notes.org/tfmt-0005/" display-uri="tfmt-0005" type="local">hierarchical structures</fr:link> are allowed to emerge and evolve over time. Concretely, one note may contextualize several other notes via transclusion within its textual structure; in the context of a forest, we refer to an individual note as a <html:em>tree</html:em>. Of course, a tree can be viewed as a forest that has a root node.</html:p>
              </fr:mainmatter>
            </fr:tree>
            <html:p>Trees correspond roughly to what are referred to as “tags” in the <fr:link href="/stacks-project/" title="The Stacks project" uri="https://www.forester-notes.org/stacks-project/" display-uri="stacks-project" type="local">Stacks Project</fr:link>.</html:p>
          </fr:mainmatter>
        </fr:tree>
        <fr:tree show-metadata="true" expanded="false" toc="false" numbered="false">
          <fr:frontmatter>
            <fr:authors>
              <fr:author>
                <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
              </fr:author>
            </fr:authors>
            <fr:date>
              <fr:year>2023</fr:year>
              <fr:month>1</fr:month>
              <fr:day>7</fr:day>
            </fr:date>
            <fr:uri>https://www.forester-notes.org/tfmt-000L/</fr:uri>
            <fr:display-uri>tfmt-000L</fr:display-uri>
            <fr:route>/tfmt-000L/</fr:route>
            <fr:title text="Generating images statically using LaTeX">Generating images statically using LaTeX</fr:title>
          </fr:frontmatter>
          <fr:mainmatter>
            <html:p>Because of the <fr:link href="/tfmt-000J/" title="Commutative diagrams in KaTeX" uri="https://www.forester-notes.org/tfmt-000J/" display-uri="tfmt-000J" type="local">general</fr:link> <fr:link href="/tfmt-000K/" title="Commutative diagrams in MathJax" uri="https://www.forester-notes.org/tfmt-000K/" display-uri="tfmt-000K" type="local">inadequacy</fr:link> <fr:link href="/tfmt-000I/" title="The quiver interactive diagramming tool" uri="https://www.forester-notes.org/tfmt-000I/" display-uri="tfmt-000I" type="local">of</fr:link> the other available tools, most authors of hypertext mathematics with diagramming needs tend to rely on the static generation of images from LaTeX code using a local LaTeX toolchain. It is not difficult to instrument <fr:link href="https://www.pandoc.org/" type="external">pandoc</fr:link> with a <fr:link href="https://pandoc.org/lua-filters.html" type="external">Lua filter to render tikz code to SVG images</fr:link>.</html:p>
            <html:p>There are also a variety of other tools that do something similar, which tend to be employed in static site generation:</html:p>
            <html:ul><html:li><fr:link href="https://github.com/paolobrasolin/antex" type="external">antex</fr:link> by <fr:link href="/paolobrasolin/" title="Paolo Brasolin" uri="https://www.forester-notes.org/paolobrasolin/" display-uri="paolobrasolin" type="local">Paolo Brasolin</fr:link> is used by <fr:link href="https://github.com/paolobrasolin/krater" type="external">Krater</fr:link> as well as <fr:link href="https://github.com/paolobrasolin/jekyll-sheafy" type="external">jekyll-sheafy</fr:link>, both via <fr:link href="https://github.com/paolobrasolin/jekyll-antex" type="external">jekyll-antex</fr:link>.</html:li>
  <html:li><fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> by <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jonathan Sterling</fr:link> is used by the present web site.</html:li></html:ul>
            <html:p>The basic architecture of such a tool is to scan for LaTeX blocks, and then identify them by a <html:em>hash</html:em> of their contents. This hash is used as a filename for <html:code><![CDATA[.tex]]></html:code> files, which are compiled to <html:code><![CDATA[ .dvi]]></html:code> and thence to <html:code><![CDATA[.svg]]></html:code> using the <html:code><![CDATA[ dvisvgm]]></html:code> tool; the resulting file is then embedded in HTML using an <html:code><![CDATA[<img>]]></html:code> tag. Alternatively,  is also possible to transclude the resulting <html:code><![CDATA[<svg>]]></html:code> element directly, but then <fr:link href="https://github.com/paolobrasolin/jekyll-antex/issues/26" type="external">one must be careful to rename all identifiers in the <html:code><![CDATA[<svg>]]></html:code> element uniquely</fr:link>, as it is possible for two different <html:code><![CDATA[<svg>]]></html:code> elements on a single page to interfere one each other.</html:p>
            <html:p>Both <fr:link href="https://github.com/paolobrasolin/antex" type="external">antex</fr:link> and <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> support passing a macro library to be used when rendering. Both <fr:link href="https://github.com/paolobrasolin/jekyll-sheafy" type="external">jekyll-sheafy</fr:link> and <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> set their macro libraries on a page-local basis.</html:p>
            <html:p>A serious downside of generating images from LaTeX code is the negative impact on accessibility tools. This seems only slightly mitigated by the transclusion of the <html:code><![CDATA[<svg>]]></html:code> element as opposed to using <html:code><![CDATA[<img>]]></html:code>. Ultimately accessibility for mathematical diagrams remains an unsolved problem, and it does not seem that the existing discussion on accessibility of hypertext mathematics has much to say about this problem.</html:p>
          </fr:mainmatter>
        </fr:tree>
        <fr:tree show-metadata="true" expanded="false" toc="false" numbered="false">
          <fr:frontmatter>
            <fr:authors>
              <fr:author>
                <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
              </fr:author>
            </fr:authors>
            <fr:uri>https://www.forester-notes.org/sterling-2024-cl-forester/</fr:uri>
            <fr:display-uri>sterling-2024-cl-forester</fr:display-uri>
            <fr:route>/sterling-2024-cl-forester/</fr:route>
            <fr:title text="Forester: networked science in hypertext"><fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link>: networked science in hypertext</fr:title>
            <fr:taxon>Reference</fr:taxon>
            <fr:meta name="venue">Computer Laboratory, University of Cambridge</fr:meta>
            <fr:meta name="slides">/bafkrmidpuo45tjd55ndfgg2ipcwgfaxby7paf6em5nw7tbfgo377gfm3re.pdf</fr:meta>
          </fr:frontmatter>
          <fr:mainmatter />
        </fr:tree>
      </fr:mainmatter>
    </fr:tree>
    <fr:tree show-metadata="false" hidden-when-empty="true">
      <fr:frontmatter>
        <fr:authors />
        <fr:title text="Related">Related</fr:title>
      </fr:frontmatter>
      <fr:mainmatter>
        <fr:tree show-metadata="true" expanded="false" toc="false" numbered="false">
          <fr:frontmatter>
            <fr:authors>
              <fr:author>
                <fr:link href="/kentookura/" title="Kento Okura" uri="https://www.forester-notes.org/kentookura/" display-uri="kentookura" type="local">Kento Okura</fr:link>
              </fr:author>
            </fr:authors>
            <fr:date>
              <fr:year>2026</fr:year>
              <fr:month>2</fr:month>
              <fr:day>12</fr:day>
            </fr:date>
            <fr:uri>https://www.forester-notes.org/VNQA/</fr:uri>
            <fr:display-uri>VNQA</fr:display-uri>
            <fr:route>/VNQA/</fr:route>
            <fr:title text="Forester Devlog">Forester Devlog</fr:title>
          </fr:frontmatter>
          <fr:mainmatter>
            <fr:tree show-metadata="true" expanded="false" numbered="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="/kentookura/" title="Kento Okura" uri="https://www.forester-notes.org/kentookura/" display-uri="kentookura" type="local">Kento Okura</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:date>
                  <fr:year>2026</fr:year>
                  <fr:month>2</fr:month>
                  <fr:day>19</fr:day>
                </fr:date>
                <fr:uri>https://www.forester-notes.org/6QYO/</fr:uri>
                <fr:display-uri>6QYO</fr:display-uri>
                <fr:route>/6QYO/</fr:route>
                <fr:title text="Devlog 2026-W08">Devlog 2026-W08</fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/kentookura/" title="Kento Okura" uri="https://www.forester-notes.org/kentookura/" display-uri="kentookura" type="local">Kento Okura</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>19</fr:day>
                    </fr:date>
                    <fr:uri>https://www.forester-notes.org/L3OL/</fr:uri>
                    <fr:display-uri>L3OL</fr:display-uri>
                    <fr:route>/L3OL/</fr:route>
                    <fr:title text="A setup for proper documentation">A setup for proper documentation</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>Last week I wrote about <fr:link href="/EQ74/" title="Devlog 2026-W07 › Built-in default theme" uri="https://www.forester-notes.org/EQ74/" display-uri="EQ74" type="local">shipping a default theme with forester</fr:link> using <fr:link href="https://dune.readthedocs.io/en/stable/reference/dune/install.html" type="external">dune's install mechanism</fr:link>. I realized that I could use this to bring a great offline documentation experience to forester. Achieving this ended being a simple exercise in some basic dune features.</html:p>
                    <fr:tree show-metadata="false">
                      <fr:frontmatter>
                        <fr:authors>
                          <fr:author>
                            <fr:link href="/kentookura/" title="Kento Okura" uri="https://www.forester-notes.org/kentookura/" display-uri="kentookura" type="local">Kento Okura</fr:link>
                          </fr:author>
                        </fr:authors>
                        <fr:date>
                          <fr:year>2026</fr:year>
                          <fr:month>2</fr:month>
                          <fr:day>19</fr:day>
                        </fr:date>
                        <fr:uri>https://www.forester-notes.org/JODH/</fr:uri>
                        <fr:display-uri>JODH</fr:display-uri>
                        <fr:route>/JODH/</fr:route>
                        <fr:title text="Building the documentation">Building the documentation</fr:title>
                      </fr:frontmatter>
                      <fr:mainmatter>
                        <html:p>I wrote some code that builds a <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link> and produces a JSON blob using the <fr:link href="/30FN/" title="Forester 5.0 › Publishing and implanting forests" uri="https://www.forester-notes.org/30FN/" display-uri="30FN" type="local">JSON syndication feature</fr:link>. Here is the relevant part:</html:p>
                        <html:pre><![CDATA[let syndication =
  let blob_uri = URI.of_string_exn "http://forester-docs/index" in
  let query = Datalog_expr.{ ... } in
  Types.{blob_uri; query}
  in
Forester.outputs_for_json_blob_syndication ~forest syndication]]></html:pre>
                      </fr:mainmatter>
                    </fr:tree>
                    <fr:tree show-metadata="false">
                      <fr:frontmatter>
                        <fr:authors>
                          <fr:author>
                            <fr:link href="/kentookura/" title="Kento Okura" uri="https://www.forester-notes.org/kentookura/" display-uri="kentookura" type="local">Kento Okura</fr:link>
                          </fr:author>
                        </fr:authors>
                        <fr:date>
                          <fr:year>2026</fr:year>
                          <fr:month>2</fr:month>
                          <fr:day>19</fr:day>
                        </fr:date>
                        <fr:uri>https://www.forester-notes.org/KVLS/</fr:uri>
                        <fr:display-uri>KVLS</fr:display-uri>
                        <fr:route>/KVLS/</fr:route>
                        <fr:title text="Installing the documentation using dune">Installing the documentation using dune</fr:title>
                      </fr:frontmatter>
                      <fr:mainmatter>
                        <html:p>Below is an abbreviated version of the <html:code>dune</html:code> file.</html:p>
                        <html:pre><![CDATA[(executable
 (public_name forester-docs)
 (name forester_docs)
 (libraries
  ...))

(rule
 (targets
  (dir output))
 (deps
  ./forester_docs.exe
  (source_tree trees))
 (action
  (run ./forester_docs.exe)))

(install
 (section
  (site
   (forester docs)))
 (dirs
  (output as forest)))]]></html:pre>
                        <html:p> The <html:code>rule</html:code> stanza tells dune to run the <html:code>forester_docs</html:code> executable, which builds the documentation. The <html:code>deps</html:code> stanza tells dune that this depends on the files contained in the <html:code>trees</html:code> directory. The result is this file: <html:code>_build/default/bin/docs/output/docs.json</html:code>.
    </html:p>
                        <html:p>The <html:code>install</html:code> stanza tells dune to copy the resulting file to the installation directory, which in this case is something like <html:code>$OPAM_DIR/man/docs/forest</html:code>.</html:p>
                      </fr:mainmatter>
                    </fr:tree>
                    <fr:tree show-metadata="false">
                      <fr:frontmatter>
                        <fr:authors>
                          <fr:author>
                            <fr:link href="/kentookura/" title="Kento Okura" uri="https://www.forester-notes.org/kentookura/" display-uri="kentookura" type="local">Kento Okura</fr:link>
                          </fr:author>
                        </fr:authors>
                        <fr:date>
                          <fr:year>2026</fr:year>
                          <fr:month>2</fr:month>
                          <fr:day>19</fr:day>
                        </fr:date>
                        <fr:uri>https://www.forester-notes.org/UNAU/</fr:uri>
                        <fr:display-uri>UNAU</fr:display-uri>
                        <fr:route>/UNAU/</fr:route>
                        <fr:title text="Delivering to the user">Delivering to the user</fr:title>
                      </fr:frontmatter>
                      <fr:mainmatter>
                        <html:p>Now that the documentation is installed on the user's system, we will use <fr:link href="https://dune.readthedocs.io/en/stable/sites.html" type="external">dune sites</fr:link> to implant the documentation into the users forest in <html:code>dev</html:code> mode.</html:p>
                        <html:pre><![CDATA[let config =
  if dev then
    let doc_json_blob =
      List.hd Theme_site.Sites.docs ^"/forest/docs.json"
    in
    {
      config with
      foreign =
        [
          {
            path = doc_json_blob;
            route_locally = true;
            include_in_manifest = true;
          };
        ];
    }
  else config]]></html:pre>
                        <html:p><html:code>include_in_manifest = true</html:code> means that the documentation is searchable using the familiar <html:code>CTRL-k</html:code> keybinding. In <html:code>dev</html:code> mode we render a link to the docs in the header:
<html:pre><![CDATA[let page_template =
  html []
    [
    ...
    conditional dev render_doc_button;
    ...
    ]]]></html:pre></html:p>
                      </fr:mainmatter>
                    </fr:tree>
                    <fr:tree show-metadata="false">
                      <fr:frontmatter>
                        <fr:authors>
                          <fr:author>
                            <fr:link href="/kentookura/" title="Kento Okura" uri="https://www.forester-notes.org/kentookura/" display-uri="kentookura" type="local">Kento Okura</fr:link>
                          </fr:author>
                        </fr:authors>
                        <fr:date>
                          <fr:year>2026</fr:year>
                          <fr:month>2</fr:month>
                          <fr:day>19</fr:day>
                        </fr:date>
                        <fr:uri>https://www.forester-notes.org/9UD6/</fr:uri>
                        <fr:display-uri>9UD6</fr:display-uri>
                        <fr:route>/9UD6/</fr:route>
                        <fr:title text="Future steps">Future steps</fr:title>
                      </fr:frontmatter>
                      <fr:mainmatter>
                        <html:p>Besides actually writing the documentation, I'd like to find a good solution for documenting Forester's features directly in the source code. An initial idea was to write a preprocessor that allows me to annotate Forester's source code with Forester syntax. <fr:link href="/anilmadhavapeddy/" title="Anil Madhavapeddy" uri="https://www.forester-notes.org/anilmadhavapeddy/" display-uri="anilmadhavapeddy" type="local">Anil</fr:link> has kindly made me aware of <fr:link href="https://jon.recoil.org/index.html" type="external">Jon Ludlam's</fr:link> <fr:link href="https://jon.recoil.org/blog/2026/01/weeknotes-2026-04-05.html#plugins" type="external">work on <html:code>odoc</html:code></fr:link>. Having had a cursory look at <fr:link href="https://jon.recoil.org/reference/odoc-dot-extension/index.html" type="external">what is possible</fr:link> makes me hopeful that we can come up with a system that easily allows us to keep the Forester's documentation up to date at all times.</html:p>
                      </fr:mainmatter>
                    </fr:tree>
                  </fr:mainmatter>
                </fr:tree>
              </fr:mainmatter>
            </fr:tree>
            <fr:tree show-metadata="true" expanded="false" numbered="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="/kentookura/" title="Kento Okura" uri="https://www.forester-notes.org/kentookura/" display-uri="kentookura" type="local">Kento Okura</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:date>
                  <fr:year>2026</fr:year>
                  <fr:month>2</fr:month>
                  <fr:day>12</fr:day>
                </fr:date>
                <fr:uri>https://www.forester-notes.org/VNQC/</fr:uri>
                <fr:display-uri>VNQC</fr:display-uri>
                <fr:route>/VNQC/</fr:route>
                <fr:title text="Devlog 2026-W07">Devlog 2026-W07</fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/kentookura/" title="Kento Okura" uri="https://www.forester-notes.org/kentookura/" display-uri="kentookura" type="local">Kento Okura</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>12</fr:day>
                    </fr:date>
                    <fr:uri>https://www.forester-notes.org/8FD3/</fr:uri>
                    <fr:display-uri>8FD3</fr:display-uri>
                    <fr:route>/8FD3/</fr:route>
                    <fr:title text="Direct emission of HTML">Direct emission of HTML</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>For reasons outlined <fr:link href="/0127/" title="Forester 5.0 › The future of Forester’s XML format" uri="https://www.forester-notes.org/0127/" display-uri="0127" type="local">here</fr:link> and <fr:link href="https://jonmsterling.com/01DI" type="external">here</fr:link>, we need to abandon XSLT for our HTML output. <fr:link href="https://developer.chrome.com/docs/web-platform/deprecating-xslt#timeline_for_chrome" type="external">Apparently</fr:link>, we have until November 17, 2026 to achieve this! Starting with the next release, Forester will emit HTML directly. To this end, I have been reimplementing the functionality of Forester's XSL stylesheet in OCaml. We will retain emission of Forester's XML format behind a feature flag, as not to break legacy workflows. However, users will no longer be able to rely on the browser to apply the stylesheet. The XML format will also cease to receive updates, which perhaps is for the better anyway.</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/kentookura/" title="Kento Okura" uri="https://www.forester-notes.org/kentookura/" display-uri="kentookura" type="local">Kento Okura</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>12</fr:day>
                    </fr:date>
                    <fr:uri>https://www.forester-notes.org/EQ74/</fr:uri>
                    <fr:display-uri>EQ74</fr:display-uri>
                    <fr:route>/EQ74/</fr:route>
                    <fr:title text="Built-in default theme">Built-in default theme</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>
    Forester's handling of themes using git submodules introduced in <fr:link href="/NRTU/" title="Forester 2.5 › Theme and asset directories" uri="https://www.forester-notes.org/NRTU/" display-uri="NRTU" type="local">version 2.5</fr:link> have long been a source of trouble. 
    <html:ul><html:li>It made getting started more difficult. I have implemented the <html:code>forester init</html:code> subcommand to help with this, but I feel as though that command was too brittle for my liking.</html:li>
      <html:li>It made updating to a new version to forester troublesome, especially when heavy customization of the theme was involved.</html:li></html:ul></html:p>
                    <html:p>From now on, Forester will ship with a default theme. Any changes to the theme will incur a minor version bump and users will be able to update to the new version by simply running <html:code>opam update forester &amp;&amp; opam upgrade forester</html:code>. This won't affect users who customize their theme, but will greatly improve the user experience for everyone else, since it is no longer required to keep a copy of the theme inside of the base directory. For users who customized their theme, the <html:code>forest.theme</html:code> key has been restored. Setting <html:code>[forest.theme] = theme</html:code> will restore the behavior of previous versions of forester.
  </html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/kentookura/" title="Kento Okura" uri="https://www.forester-notes.org/kentookura/" display-uri="kentookura" type="local">Kento Okura</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>12</fr:day>
                    </fr:date>
                    <fr:uri>https://www.forester-notes.org/4QMB/</fr:uri>
                    <fr:display-uri>4QMB</fr:display-uri>
                    <fr:route>/4QMB/</fr:route>
                    <fr:title text="Hand-rolled ninja-keys replacement">Hand-rolled ninja-keys replacement</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>To lessen our dependency on the NPM ecosystem, I have crudely reimplemented <fr:link href="https://github.com/ssleptsov/ninja-keys" type="external">ninja-keys</fr:link> using <fr:link href="https://ocsigen.org/js_of_ocaml/latest/manual/overview" type="external">Js_of_ocaml</fr:link> and the excellent <fr:link href="https://erratique.ch/software/brr" type="external">BRR</fr:link> toolkit by <fr:link href="https://erratique.ch/profile" type="external">Daniel Bünzli</fr:link>. I have not yet achieved feature parity, and there is lots of room for improvement. I am looking forward to hacking around in this area. Any suggestions or feature requests for the new search menu are most welcome!</html:p>
                  </fr:mainmatter>
                </fr:tree>
              </fr:mainmatter>
            </fr:tree>
          </fr:mainmatter>
        </fr:tree>
        <fr:tree show-metadata="true" expanded="false" toc="false" numbered="false">
          <fr:frontmatter>
            <fr:authors>
              <fr:contributor>
                <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
              </fr:contributor>
            </fr:authors>
            <fr:date>
              <fr:year>2024</fr:year>
              <fr:month>11</fr:month>
              <fr:day>27</fr:day>
            </fr:date>
            <fr:uri>https://www.forester-notes.org/5CDY/</fr:uri>
            <fr:display-uri>5CDY</fr:display-uri>
            <fr:route>/5CDY/</fr:route>
            <fr:title text="Presentations">Presentations</fr:title>
          </fr:frontmatter>
          <fr:mainmatter>
            <fr:tree show-metadata="true" expanded="false" toc="false" numbered="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:uri>https://www.forester-notes.org/sterling-2024-cl-forester/</fr:uri>
                <fr:display-uri>sterling-2024-cl-forester</fr:display-uri>
                <fr:route>/sterling-2024-cl-forester/</fr:route>
                <fr:title text="Forester: networked science in hypertext"><fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link>: networked science in hypertext</fr:title>
                <fr:taxon>Reference</fr:taxon>
                <fr:meta name="venue">Computer Laboratory, University of Cambridge</fr:meta>
                <fr:meta name="slides">/bafkrmidpuo45tjd55ndfgg2ipcwgfaxby7paf6em5nw7tbfgo377gfm3re.pdf</fr:meta>
              </fr:frontmatter>
              <fr:mainmatter />
            </fr:tree>
          </fr:mainmatter>
        </fr:tree>
        <fr:tree show-metadata="true" expanded="false" toc="false" numbered="false">
          <fr:frontmatter>
            <fr:authors>
              <fr:contributor>
                <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
              </fr:contributor>
            </fr:authors>
            <fr:date>
              <fr:year>2024</fr:year>
              <fr:month>10</fr:month>
              <fr:day>23</fr:day>
            </fr:date>
            <fr:uri>https://www.forester-notes.org/30FM/</fr:uri>
            <fr:display-uri>30FM</fr:display-uri>
            <fr:route>/30FM/</fr:route>
            <fr:title text="Forester Blog">Forester Blog</fr:title>
          </fr:frontmatter>
          <fr:mainmatter>
            <fr:tree show-metadata="true" expanded="false" toc="false" numbered="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:date>
                  <fr:year>2025</fr:year>
                  <fr:month>6</fr:month>
                  <fr:day>15</fr:day>
                </fr:date>
                <fr:uri>https://www.forester-notes.org/VNQ9/</fr:uri>
                <fr:display-uri>VNQ9</fr:display-uri>
                <fr:route>/VNQ9/</fr:route>
                <fr:title text="Rewriting is where the magic happens">Rewriting is where the magic happens</fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <html:p>One question I repeatedly get about Forester is:</html:p>
                <html:blockquote>
  How do I export a paper written in Forester to a format that I can submit to a journal?
</html:blockquote>
                <html:p>It is technically possible to convert Forester’s output XML to LaTeX, using XSLT. There is an outdated stylesheet for that purpose that could be brought up to date. I think this misses something important, though. First of all, what you’ve written in your forest is probably, in form and structure, not a good fit for a journal or conference publication. Second of all, typesetting a publication  requires a lot of special-casing and even rewording to avoid things like bad line breaks, etc.; none of that is reflected in the naïve idea of just “exporting your forest to a journal”, but that stuff is very important.</html:p>
                <html:p>I recommend writing in your forest to develop the ideas and explore the space. Then when it is time to fork off a publication, write that story <html:em>from scratch</html:em> using a tool that is suited for old-fashioned publication typesetting, like LaTeX. <html:mark>Writing from scratch is not a waste of time; it is the most important part</html:mark>, because you now get to weave together all your insights into a coherent and self-contained narrative that speaks directly to the intended audience of the work in their language; in this process you may adopt notations that are good <html:em>specifically</html:em> for that publication, but which you would not wish to expose to (e.g.) a more technical audience, etc. The goals of publishing a traditional article are in total contrast to the goals of writing a forest, which is to leverage the accumulation of interconnected insight (in a necessarily <html:em>non</html:em>-self-contained way).</html:p>
                <html:p>There is nothing that I love more about my <fr:link href="https://www.cst.cam.ac.uk/people/js2878" type="external">job as a researcher</fr:link> than taking something I’ve written extensive technical notes on, and then writing the story out <html:em>linearly</html:em> from scratch, choosing what to keep and what to omit, how to explain, in what order, and with what notations, for a specific audience. This is where the magic happens.</html:p>
              </fr:mainmatter>
            </fr:tree>
            <fr:tree show-metadata="true" expanded="false" toc="false" numbered="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:date>
                  <fr:year>2025</fr:year>
                  <fr:month>5</fr:month>
                  <fr:day>27</fr:day>
                </fr:date>
                <fr:date>
                  <fr:year>2025</fr:year>
                  <fr:month>5</fr:month>
                  <fr:day>30</fr:day>
                </fr:date>
                <fr:uri>https://www.forester-notes.org/QHXS/</fr:uri>
                <fr:display-uri>QHXS</fr:display-uri>
                <fr:route>/QHXS/</fr:route>
                <fr:title text="Intellectual junkyards">Intellectual junkyards</fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <html:p>I was first inspired to create <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> after exploring the <fr:link href="/stacks-project/" title="The Stacks project" uri="https://www.forester-notes.org/stacks-project/" display-uri="stacks-project" type="local">Stacks Project</fr:link> and realising that what I most wanted most dearly was the ability and digital space to create my own—and feeling the pain when I tried to install the essentially defunct <fr:link href="/gerby/" title="Gerby" uri="https://www.forester-notes.org/gerby/" display-uri="gerby" type="local">Gerby</fr:link> software that runs it. <fr:link href="/paolobrasolin/" title="Paolo Brasolin" uri="https://www.forester-notes.org/paolobrasolin/" display-uri="paolobrasolin" type="local">Paolo Brasolin</fr:link> was kind enough to help me with this, by building <fr:link href="https://github.com/paolobrasolin/jekyll-sheafy" type="external">Sheafy</fr:link> on top of <fr:link href="https://jekyllrb.com/" type="external">Jekyll</fr:link>. I eventually reached the limits of that tool and created Forester on my own (first as a Hugo plugin, and finally as standalone OCaml software). Later I was joined by <fr:link href="/kentookura/" title="Kento Okura" uri="https://www.forester-notes.org/kentookura/" display-uri="kentookura" type="local">Kento Okura</fr:link> who has become a strong partner in designing and developing Forester.</html:p>
                <html:p>Whilst exploring the space of <html:em>tools for thought</html:em>, I became aware of a cluster of related and deeply inspiring ideas—starting with <fr:link href="/andymatuschak/" title="Andy Matuschak" uri="https://www.forester-notes.org/andymatuschak/" display-uri="andymatuschak" type="local">Andy Matuschak</fr:link>’s <fr:link href="/tfmt-0003/" title="Evergreen notes" uri="https://www.forester-notes.org/tfmt-0003/" display-uri="tfmt-0003" type="local">evergreen notes</fr:link> which led me to Niklas Luhmann’s <fr:link href="https://en.wikipedia.org/wiki/Zettelkasten" type="external">Zettelkasten</fr:link> and various kinds of digital gardening. Although all these trends are slightly different and shouldn’t be conflated, the common thread is to accumulate a bunch of small topical notes over many years in hypertext. (Luhmann’s Zettelkasten was of course a <html:em>physical</html:em> hypertext, where hyperlinks are hand-written and addressed to locations in his card box, whereas many Zettelkästen today are digital.) Matuschak’s “evergreen” concept refers to the practice of having notes evolve and remain up to date, as opposed to scratch notes that lose salience with time. I was interested enough in the idea that I spent some time thinking about how it might be adapted to the mathematical sciences, and I wrote a manifesto of sorts on the topic: <fr:link href="/tfmt-0001/" title="Designing tools for scientific thought" uri="https://www.forester-notes.org/tfmt-0001/" display-uri="tfmt-0001" type="local">Designing tools for scientific thought</fr:link>. This manifesto guided the design of Forester, whose name was itself inspired by Matuschak’s <fr:link href="https://notes.andymatuschak.org/Evergreen_notes" type="external">writings on evergreen notes</fr:link>.</html:p>
                <html:p>For some time now, however, I have been noticing a great deal of friction in my own use of <fr:link href="/tfmt-000W/" title="Evergreen notes in the sciences" uri="https://www.forester-notes.org/tfmt-000W/" display-uri="tfmt-000W" type="local">evergreen notes</fr:link> as a tool for advancing science; for this reason, I have been using my own <fr:link href="https://www.jonmsterling.com/index/" type="external">Forest</fr:link> in a different way for some time now.</html:p>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2025</fr:year>
                      <fr:month>5</fr:month>
                      <fr:day>27</fr:day>
                    </fr:date>
                    <fr:date>
                      <fr:year>2025</fr:year>
                      <fr:month>5</fr:month>
                      <fr:day>30</fr:day>
                    </fr:date>
                    <fr:uri>https://www.forester-notes.org/QHXT/</fr:uri>
                    <fr:display-uri>QHXT</fr:display-uri>
                    <fr:route>/QHXT/</fr:route>
                    <fr:title text="Life in the junkyard after a few years">Life in the junkyard after a few years</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>Let me describe how someone like me predictably starts building up their forest.</html:p>
                    <html:ol><html:li>Because I’m interested in category theory, I start by creating a tree entitled <html:code>Category</html:code> with taxon <html:code>Definition</html:code>.</html:li>
    <html:li>I start doing the same for other important notions, like functors, natral transformations, etc. Eventually I prove the Yoneda lemma!</html:li>
    <html:li>I spend about a year building up a glorious forest full of category theory.</html:li>
    <html:li><html:em>Only then</html:em> do I realise that ordinary category theory, in which a category is defined to have a set (or a class) of objects, is a mess; I want to switch to <html:em>univalent</html:em> category theory which smooths over many of the rough edges.</html:li>
    <html:li>Unfortunately, univalent foundations is very different from set theoretic foundations in subtle ways. I have a plan to refactor my entire forest to account for this, but obviously I have to get my actual work done too. I’ll just hold off on that epic refactoring...</html:li>
    <html:li>I discover an interesting theorem or insight, and I want to write it down in my forest. But my motivation dies when I realise that it would mean <html:em>adding</html:em> to the old-and-busted notes, which would increase my future burden when I will definitely (not kidding) update my hundreds of notes. With my motivation killed, I forget about the insight and move on.</html:li>
    <html:li>By the way, not only do I want to switch to univalent categories, I also want to re-do everything in terms of displayed categories. Ouch. This happens enough times, and the forest dies and becomes a junkyard. The End.</html:li></html:ol>
                    <html:p>I suspect this is a somewhat common negative experience with Zettelkästen, but not many people talk about it. In one brave exception, <fr:link href="https://forum.zettelkasten.de/discussion/3254/updating-a-whole-department-of-notes-because-apple-slightly-changed-the-meaning-of-things" type="external">Christian Tietze writes about a similar experience</fr:link> recently with his Zettelkasten, in which he has written a ton of now-outdated notes about subtleties of Apple’s SwiftUI and Observation frameworks. Keeping such things “evergreen” is almost impossible because Apple frameworks are a rapidly moving target. <html:mark>The point I want to make is that mathematics and the sciences are <html:em>also</html:em> rapidly moving targets, and if your outlook on them slows its roll long enough for it to become practical to keep a sizable forest evergreen, it may indicate intellectual stagnation more than intellectual wealth.</html:mark></html:p>
                    <html:p>I must also point out that keeping a forest evergreen in this sense does not only amount to updating various trees periodically. One’s mathematical development over time tends to involve not only evolving definitions and proofs, but also an evolution of the entire ontology—which means that the very decision of what to put in one tree and what to put in another tree is difficult to commit to in the long term.</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2025</fr:year>
                      <fr:month>5</fr:month>
                      <fr:day>27</fr:day>
                    </fr:date>
                    <fr:date>
                      <fr:year>2025</fr:year>
                      <fr:month>5</fr:month>
                      <fr:day>30</fr:day>
                    </fr:date>
                    <fr:uri>https://www.forester-notes.org/QHXU/</fr:uri>
                    <fr:display-uri>QHXU</fr:display-uri>
                    <fr:route>/QHXU/</fr:route>
                    <fr:title text="Tree-rings and the dialectics of knowledge production">Tree-rings and the dialectics of knowledge production</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>My own experience with the long-term maintenance of a forest or Zettelkasten is that the level of activity therein is uneven over time—there are periods of expansion followed by periods of quiet. In the former, trees tend to cluster around not only a group of related topics but <html:em>also</html:em> a particular approach to ontologising those topics. When you encounter one of those trees later on, you can kind of remember when it was written because of the <html:em>way</html:em> it was written and the particular relationships you chose to reify in hypertext.</html:p>
                    <html:p>Seeing these distinct “rings of growth” emerging in my own forest brought me to the realisation that my viewpoint on evergreen notes might have been overly simplistic. <html:mark><html:strong>The question seems to be:</html:strong> should we resist the distinctness of intellectual growth rings by hewing to a <html:em>homogeneity of the present</html:em>, or should we embrace time and change as fundamental aspects of knowledge production?</html:mark></html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2025</fr:year>
                      <fr:month>5</fr:month>
                      <fr:day>27</fr:day>
                    </fr:date>
                    <fr:date>
                      <fr:year>2025</fr:year>
                      <fr:month>5</fr:month>
                      <fr:day>30</fr:day>
                    </fr:date>
                    <fr:uri>https://www.forester-notes.org/QHXV/</fr:uri>
                    <fr:display-uri>QHXV</fr:display-uri>
                    <fr:route>/QHXV/</fr:route>
                    <fr:title text="Resist ontology and embrace time">Resist ontology and embrace time</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>Coming back to the <fr:link href="/QHXT/" title="Intellectual junkyards › Life in the junkyard after a few years" uri="https://www.forester-notes.org/QHXT/" display-uri="QHXT" type="local">difficulty of maintaining a forest in a state of intellectual evolution</fr:link>, I have found that a good approach is to organise my notes around “tracker” trees—which pertain to a particular topic or project but have little content of their own, serving mainly as <html:em>backlink accumulators</html:em> for notes written in my private journal, my <fr:link href="https://www.jonmsterling.com/019X/" type="external">weeknotes</fr:link>, and my <fr:link href="https://www.jonmsterling.com/007W/" type="external">blog</fr:link>. For example, one thing I am working on is <fr:link href="https://www.jonmsterling.com/019E/" type="external">Project Pterosaur</fr:link>—which will be a new proof assistant that combines dependent type theory with ideas from Isabelle/HOL.</html:p>
                    <html:p>As you can see, there is very little content to the <fr:link href="https://www.jonmsterling.com/019E/" type="external">Project Pterosaur</fr:link> tree, but in the private version of my forest there are many backlinks coming from journal entries. I can reconstruct the entire project in my mind by reading through these entries via the backlinks panel, and that to me is far more useful than a (high-churn) “evergreen” note that explains my vision for the project and its status, etc. Obviously this is not a new idea—many people use tools like Obsidian, Logseq, Roam, etc. in the way I am describing.</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2025</fr:year>
                      <fr:month>5</fr:month>
                      <fr:day>27</fr:day>
                    </fr:date>
                    <fr:date>
                      <fr:year>2025</fr:year>
                      <fr:month>5</fr:month>
                      <fr:day>30</fr:day>
                    </fr:date>
                    <fr:uri>https://www.forester-notes.org/QHXX/</fr:uri>
                    <fr:display-uri>QHXX</fr:display-uri>
                    <fr:route>/QHXX/</fr:route>
                    <fr:title text="Blogging is the accretion of temporal insight">Blogging is the accretion of temporal insight</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>A few months ago, I had a very enlightening conversation with my colleague <fr:link href="https://anil.recoil.org/" type="external">Anil Madhavapeddy</fr:link> about blogging. Anil’s research group at Cambridge has a practice of internal blogging and weeknotes: pretty much everyone is writing about their work in blogs that are then syndicated into a Matrix channel. Then, discussion proceeds organically in the chat and in person. These blog posts are not the <fr:link href="https://notes.andymatuschak.org/zKGjQtsTKgscAoq271ZzKqw" type="external">transient/fleeting notes discussed by Matuschak</fr:link>, because they are not scraps—they are evergreen in the “free” sense of being permanent discourses on a moment in time.</html:p>
                    <html:p>For more than a year, I had already been maintaining a personal journal of daily notes in my private forest, but there was always some tension in my writing practices there because I was perfunctorily accumulating “records” of what I did rather than insight. What had not clicked for me at the time was that I really <html:em>ought</html:em> to have been blogging (for myself). <html:mark>Journalling in the most progressive sense is simply <html:em>blogging</html:em> with a restricted audience, facilitating the <fr:link href="https://notes.andymatuschak.org/zTn3g4wTm1hbkNFUvLLjpev" type="external">accretion of insight</fr:link> more than the mere memory of what happened when.</html:mark> Since my chat with Anil, I have shifted my practice to emphasise semi-public <fr:link href="https://www.jonmsterling.com/019X/" type="external">weeknotes</fr:link> whose goal is to provoke and continue discussions that are unfolding within the community that reads them (mainly my colleagues in the Computer Laboratory). Of course, this was only possible after I had added <fr:link href="/30FO/" title="Forester 5.0 › Atom syndication support" uri="https://www.forester-notes.org/30FO/" display-uri="30FO" type="local">support for syndication to Forester</fr:link>!</html:p>
                    <html:p>I still write private entries as well, of course, but not as many. Currently, Forester creates a lot of friction around access control and one of the goals in the coming year or two is to decrease this friction so that one does not have to think so carefully about where to put something that you want to write.</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2025</fr:year>
                      <fr:month>5</fr:month>
                      <fr:day>27</fr:day>
                    </fr:date>
                    <fr:date>
                      <fr:year>2025</fr:year>
                      <fr:month>5</fr:month>
                      <fr:day>30</fr:day>
                    </fr:date>
                    <fr:uri>https://www.forester-notes.org/QHXW/</fr:uri>
                    <fr:display-uri>QHXW</fr:display-uri>
                    <fr:route>/QHXW/</fr:route>
                    <fr:title text="Sprouting shoots, and the Hyperbook">Sprouting shoots, and the Hyperbook</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>I <fr:link href="/QHXV/" title="Intellectual junkyards › Resist ontology and embrace time" uri="https://www.forester-notes.org/QHXV/" display-uri="QHXV" type="local">have</fr:link> <fr:link href="/QHXX/" title="Intellectual junkyards › Blogging is the accretion of temporal insight" uri="https://www.forester-notes.org/QHXX/" display-uri="QHXX" type="local">written above</fr:link> about a forestry practice that embeds time and the evolution of ideas at its core; this is achieved by resisting the packrat’s urge to ontologise every aspect of their intellectual life. This does not mean that static ontologisation has no place; for example, a textbook should not present an evolution of its own ideas (except insofar as it describes history), but should rather present a single unified viewpoint on a topic. Indeed, the original goal of Forester was to simplify the creation and deployment of resources like the <fr:link href="/stacks-project/" title="The Stacks project" uri="https://www.forester-notes.org/stacks-project/" display-uri="stacks-project" type="local">Stacks Project</fr:link> and <fr:link href="/kerodon/" title="Kerodon" uri="https://www.forester-notes.org/kerodon/" display-uri="kerodon" type="local">Kerodon</fr:link>, which I will hereafter refer to as <html:em>hyperbooks</html:em>.</html:p>
                    <html:p>In the hyperbook, we can and must give full play to our instinct for ontologisation, and we are freed from the crushing obligation of permanence by treating a hyperbook in the same way that we treat a blog post: as a unified accretion of insight that pertains to a specific moment in time, making no pretensions as to the universality of the specific ontological approach. This should not surprise anyone who has written books or lecture notes before, but it does represent a retreat from what might now be viewed as an “extremist deviation” in the design of Forester.</html:p>
                    <html:p>Prior to <fr:link href="/011P/" title="Forester 5.0" uri="https://www.forester-notes.org/011P/" display-uri="011P" type="local">Forester 5.0</fr:link>, each person was expected to have just a single forest and all their writings (including lecture notes and hyperbooks!) were expected to be part of that forest. I found that this approach, however, intensifies all the kinds of <fr:link href="/QHXT/" title="Intellectual junkyards › Life in the junkyard after a few years" uri="https://www.forester-notes.org/QHXT/" display-uri="QHXT" type="local">metal stress</fr:link> that kills motivation and hastens descent into the intellectual junkyard. <html:mark>A better way forward is to liberally split off hyperbooks as independent forests—which can then be <fr:link href="/30FN/" title="Forester 5.0 › Publishing and implanting forests" uri="https://www.forester-notes.org/30FN/" display-uri="30FN" type="local"><html:em>federated</html:em> with your own forest</fr:link></html:mark> (please note that this functionality is experimental and subject to change). The ability to federate forests is important, because otherwise one would have to choose between bidirectional linking and modularity; with federation, there is no need to make this choice.</html:p>
                    <html:p>Splitting off forests in <fr:link href="/011P/" title="Forester 5.0" uri="https://www.forester-notes.org/011P/" display-uri="011P" type="local">Forester 5.0</fr:link> still involves some annoying points of friction; the biggest one is the <fr:link href="/OYOJ/" title="Towards Forester 5.0: a design for global identity" uri="https://www.forester-notes.org/OYOJ/" display-uri="OYOJ" type="local">need for global identity that spans all forests</fr:link>. A solution to this problem will not ship with 5.0, but I am preparing to work on it for a subsequent release.</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2025</fr:year>
                      <fr:month>5</fr:month>
                      <fr:day>27</fr:day>
                    </fr:date>
                    <fr:date>
                      <fr:year>2025</fr:year>
                      <fr:month>5</fr:month>
                      <fr:day>30</fr:day>
                    </fr:date>
                    <fr:uri>https://www.forester-notes.org/QHXY/</fr:uri>
                    <fr:display-uri>QHXY</fr:display-uri>
                    <fr:route>/QHXY/</fr:route>
                    <fr:title text="Renew life, have a forest fire!">Renew life, have a forest fire!</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>The goal of the Forester project has always been to reduce mental stress and release untapped stores of creativity in the struggle for outlook and insight. In some sense, every iteration of Forester has been an experiment from which we are taking both positive and negative lessons.</html:p>
                    <html:p>Some users of Forester have adopted extreme ontological practices (abetted, perhaps regrettably, by our <fr:link href="/013A/" title="Forester 5.0 › New datalog-based query engine" uri="https://www.forester-notes.org/013A/" display-uri="013A" type="local">dangerously powerful Datalog query engine</fr:link>). It is not my place to prescribe how people should use Forester, but I do care for people’s well-being and I strongly believe that these kinds of practices can destroy the mind over time. <html:mark>If you are feeling the weight of ontology in a heavy-laden forest, there is nothing wrong with a little <html:em>forest fire</html:em>.</html:mark> When the smoke clears, <fr:link href="/QHXX/" title="Intellectual junkyards › Blogging is the accretion of temporal insight" uri="https://www.forester-notes.org/QHXX/" display-uri="QHXX" type="local">start a blog</fr:link>.</html:p>
                  </fr:mainmatter>
                </fr:tree>
              </fr:mainmatter>
            </fr:tree>
            <fr:tree show-metadata="true" expanded="false" toc="false" numbered="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:date>
                  <fr:year>2025</fr:year>
                  <fr:month>3</fr:month>
                  <fr:day>25</fr:day>
                </fr:date>
                <fr:uri>https://www.forester-notes.org/JVIT/</fr:uri>
                <fr:display-uri>JVIT</fr:display-uri>
                <fr:route>/JVIT/</fr:route>
                <fr:title text="Towards Forester 5.0 II: a design for canonical URLs">Towards <fr:link href="/011P/" title="Forester 5.0" uri="https://www.forester-notes.org/011P/" display-uri="011P" type="local">Forester 5.0</fr:link> II: a design for canonical URLs</fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <html:p>One of the goals of <fr:link href="/011P/" title="Forester 5.0" uri="https://www.forester-notes.org/011P/" display-uri="011P" type="local">Forester 5.0</fr:link> is <html:em>lightweight federation</html:em>—the ability to have two forests participate in the same graph and therefore provide backlinks, etc. In a previous post (<fr:link href="/OYOJ/" title="Towards Forester 5.0: a design for global identity" uri="https://www.forester-notes.org/OYOJ/" display-uri="OYOJ" type="local">Towards <fr:link href="/011P/" title="Forester 5.0" uri="https://www.forester-notes.org/011P/" display-uri="011P" type="local">Forester 5.0</fr:link>: a design for global identity</fr:link>), I talked about some of the difficulties that arise when dealing with identities of people and references that have global scope but could nonetheless be described by trees in many forests. I proposed that such things should be addressed by canonical URIs (e.g. DIDs, DOIs, etc.) and that Forester should grow the ability to bind a canonical URI to multiple trees, which are then gathered into a disambiguation page.</html:p>
                <html:p>Today I want to broaden the discussion to cover the difficulties of addressing trees themselves (as opposed to the global entities they may describe). <html:mark>This is a proposal and I welcome feedback.</html:mark></html:p>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2025</fr:year>
                      <fr:month>3</fr:month>
                      <fr:day>25</fr:day>
                    </fr:date>
                    <fr:uri>https://www.forester-notes.org/JVIU/</fr:uri>
                    <fr:display-uri>JVIU</fr:display-uri>
                    <fr:route>/JVIU/</fr:route>
                    <fr:title text="Forester must become part of the Web">Forester must become part of the Web</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>I have been working on developing the prerequisites for Forester to emit RSS and Atom feeds for blogs, and I realised that the problem I was trying to solve <fr:link href="/OYOJ/" title="Towards Forester 5.0: a design for global identity" uri="https://www.forester-notes.org/OYOJ/" display-uri="OYOJ" type="local">earlier this month</fr:link> is a more multifaceted than I originally thought. It comes down to analysing what is needed for Forester to be a good citizen of the World Wide Web: in particular, <html:mark>if we emit an RSS feed that has hyperlinks to some trees in it, those links <html:em>must</html:em> refer to an actual page on the actual web rather than something specific to Forester’s ontology.</html:mark></html:p>
                    <html:p>This may seem downright obvious in hindsight, but you must understand that for the longest time I was not thinking of Forester as a tool for progressively enhancing the Web, but rather as a tool for building fully-local life-wikis or Zettelkästen; I no longer believe that my former viewpoint is reasonable, and I have concluded that we must integrate Forester into the Web or else we will be buried under friction. This post is the start of a design for how to do this.</html:p>
                    <html:p>Forget what you know about how either <fr:link href="/011P/" title="Forester 5.0" uri="https://www.forester-notes.org/011P/" display-uri="011P" type="local">Forester 5.0</fr:link> or previous versions currently work; in order to solve these problems in a reasonable way, we cannot be bound by the past versions of an experimental tool. What we <html:em>are</html:em> bound by is the architecture of the World Wide Web, and that will be reflected in the design.</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2025</fr:year>
                      <fr:month>3</fr:month>
                      <fr:day>25</fr:day>
                    </fr:date>
                    <fr:uri>https://www.forester-notes.org/JVIV/</fr:uri>
                    <fr:display-uri>JVIV</fr:display-uri>
                    <fr:route>/JVIV/</fr:route>
                    <fr:title text="What is the proposal?">What is the proposal?</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>Here is the essence of the proposal:</html:p>
                    <html:ol><html:li>We get rid of the <html:code>forest://host/addr</html:code> scheme. Instead, trees are globally addressed by a canonical URL.</html:li>
    <html:li>The canonical URL of a tree can in principle be arbitrary, but in practice you will want it to be a place where that tree can be viewed — e.g. the place to which it will be uploaded and served via HTTP(S). Indeed, a default scheme will be provided so as to enable files to be rendered with names and relative locations consistent with the intended global addressing scheme; it is also possible to imagine customisation of this without disturbing the overall design.</html:li>
    <html:li>The canonical URLs are now the vertices of the graph.</html:li>
    <html:li>In Forester source code, a hyperlink like <html:code><![CDATA[[foo](0001)]]></html:code> would be resolved right away to <html:code><![CDATA[[foo](https://www.jonmsterling.com/0001.xml)]]></html:code> or something, using information supplied in the user’s forest; the same goes for transclusion.</html:li>
    
    <html:li>Links to trees in foreign forests must, for now, be totally explicit (but we can imagine relaxing this in the future). Importantly, this approach does not require knowing what is in the forest at evaluation-time.</html:li></html:ol>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2025</fr:year>
                      <fr:month>3</fr:month>
                      <fr:day>25</fr:day>
                    </fr:date>
                    <fr:uri>https://www.forester-notes.org/JVIW/</fr:uri>
                    <fr:display-uri>JVIW</fr:display-uri>
                    <fr:route>/JVIW/</fr:route>
                    <fr:title text="What about replication and mirroring?">What about replication and mirroring?</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>It may seem annoying to have canonical URLs. For example, a forest that contains vital information might need to be published in multiple places. That much is true, but the fact that the physical publication of a forest is replicated should not allowed to impact the graph or fill it with redundant vertices and edges (e.g. should two mirrors become federated). So the only problem with replication is that hyperlinks might take you to the original forest instead of keeping you in the mirror, but I think this should be resolved by some kind of middleware that rewrites links, just as the <fr:link href="https://web.archive.org/" type="external">Wayback machine</fr:link> rewrites links in its snapshots. That can be handled outside of Forester.</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2025</fr:year>
                      <fr:month>3</fr:month>
                      <fr:day>25</fr:day>
                    </fr:date>
                    <fr:uri>https://www.forester-notes.org/JVIX/</fr:uri>
                    <fr:display-uri>JVIX</fr:display-uri>
                    <fr:route>/JVIX/</fr:route>
                    <fr:title text="What about viewing my forest locally?">What about viewing my forest locally?</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>Most of the time, an author is working with their forest on their own machine rather than on the web. It is important that links and transclusions point to the local content rather than whatever (if anything) is stored in the “global” canonical URL. I believe this is not actually a problem: although things like RSS feeds and perhaps even published websites would have all the hyperlinks point to the canonical URLs, there is no reason that this should be required for all renderers. It is easy to imagine making this a configurable flag for the default renderer, and for the upcoming “dynamic”/interactive HTML server we would emit links back to the local server rather than to the canonical URLs.</html:p>
                    <html:p>Similarly, there may be projects where there is no intention at all of online publication. In such cases, the scheme for assigning canonical URLs can be arbitrary.</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2025</fr:year>
                      <fr:month>3</fr:month>
                      <fr:day>25</fr:day>
                    </fr:date>
                    <fr:uri>https://www.forester-notes.org/JVIY/</fr:uri>
                    <fr:display-uri>JVIY</fr:display-uri>
                    <fr:route>/JVIY/</fr:route>
                    <fr:title text="What about access control?">What about access control?</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>Forester does not currently support any kind of access control, but this is indeed an important area that we are considering carefully in order to enable institutional use of Forester, and ease the burden of collaboration in the usual case of a forest that contains a mixture of data with varying levels of confidentiality. I believe that the current design is compatible with essentially any approach to access control that we might adopt, but I am interested in feedback to the contrary.</html:p>
                  </fr:mainmatter>
                </fr:tree>
              </fr:mainmatter>
            </fr:tree>
            <fr:tree show-metadata="true" expanded="false" toc="false" numbered="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:date>
                  <fr:year>2025</fr:year>
                  <fr:month>3</fr:month>
                  <fr:day>8</fr:day>
                </fr:date>
                <fr:uri>https://www.forester-notes.org/OYOJ/</fr:uri>
                <fr:display-uri>OYOJ</fr:display-uri>
                <fr:route>/OYOJ/</fr:route>
                <fr:title text="Towards Forester 5.0: a design for global identity">Towards <fr:link href="/011P/" title="Forester 5.0" uri="https://www.forester-notes.org/011P/" display-uri="011P" type="local">Forester 5.0</fr:link>: a design for global identity</fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <html:p>As we move closer to <fr:link href="/011P/" title="Forester 5.0" uri="https://www.forester-notes.org/011P/" display-uri="011P" type="local">Forester 5.0</fr:link>, which <fr:link href="/30FN/" title="Forester 5.0 › Publishing and implanting forests" uri="https://www.forester-notes.org/30FN/" display-uri="30FN" type="local">introduces</fr:link> rudimentary federation capabilities, we must address new problems that did not arise in the days when no two <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forests</fr:link> interacted or linked to each other. The most immediate issue is that trees describing entities with “global” identity (including actual people as well as bibliographic references) will naturally be duplicated across many forests. For example, this happens when one person authors trees in multiple forests, and it happens even more often with bibliographic entries (both for the entries themselves and their author attributions). It is very important to handle this problem properly <html:em>now</html:em> in a way that (1) minimises friction and (2) enables us to quietly evolve toward <fr:link href="/klepmann-et-al-atproto-2024/" title="Bluesky and the AT Protocol: Usable Decentralized Social Media" uri="https://www.forester-notes.org/klepmann-et-al-atproto-2024/" display-uri="klepmann-et-al-atproto-2024" type="local">more Web-centric approaches to identity as they emerge</fr:link>.</html:p>
                <html:p>Below, I survey some existing approaches to identity that we would hope to be compatible with at some level. If you want to skip to my concrete proposal, see <fr:link href="/OYOR/" title="A plan for global identity in Forester" uri="https://www.forester-notes.org/OYOR/" display-uri="OYOR" type="local">§ <fr:contextual-number uri="https://www.forester-notes.org/OYOR/" display-uri="OYOR" /></fr:link>.</html:p>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2025</fr:year>
                      <fr:month>3</fr:month>
                      <fr:day>8</fr:day>
                    </fr:date>
                    <fr:uri>https://www.forester-notes.org/OYOL/</fr:uri>
                    <fr:display-uri>OYOL</fr:display-uri>
                    <fr:route>/OYOL/</fr:route>
                    <fr:title text="Survey of global identification schemes">Survey of global identification schemes</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>There are several extant schemes for identifying individuals, organisations, and artefacts. Some are centralised, and others are decentralised. Centralisation of identity is not necessarily a bad thing, but it is most viable when nearly everyone agrees on the central authority; on the other hand, decentralisation can help in situations where a single central authority has not accumulated enough trust or prestige to be viable.</html:p>
                    <fr:tree show-metadata="false">
                      <fr:frontmatter>
                        <fr:authors>
                          <fr:author>
                            <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
                          </fr:author>
                        </fr:authors>
                        <fr:date>
                          <fr:year>2025</fr:year>
                          <fr:month>3</fr:month>
                          <fr:day>8</fr:day>
                        </fr:date>
                        <fr:uri>https://www.forester-notes.org/OYOM/</fr:uri>
                        <fr:display-uri>OYOM</fr:display-uri>
                        <fr:route>/OYOM/</fr:route>
                        <fr:title text="Centralised identification via DOIs and ORCIDs">Centralised identification via DOIs and ORCIDs</fr:title>
                      </fr:frontmatter>
                      <fr:mainmatter>
                        <html:p>Nearly every scholarly paper and book published has a <html:em>Digital Object Identifier</html:em> (DOI) assigned to it, which are managed by a single authority (<fr:link href="https://www.doi.org/" type="external">The DOI Foundation</fr:link>); this applies to both traditional publishers and eprint servers like the arXiv. Services like <fr:link href="https://zenodo.org/" type="external">Zenodo</fr:link> allow individuals to mint their own DOIs and pin resources and artefacts to them. Due to their widespread adoption, DOIs are a completely viable way to identify published papers and books—and I would argue that any attempt to replace DOIs with a decentralised identifier is likely to be counterproductive as the goal should not not be decentralisation <html:em>per se</html:em> but rather to have a reliable, universal way to refer to scholarly content and artefacts.</html:p>
                        <html:p>What DOIs do for artefacts, the <html:em>Open Researcher and Contributor ID</html:em> (ORCID) aims to do for <html:em>people</html:em> acting within the framework of open science. ORCIDs seem to do their job well, but not everyone has or should have an ORCID—nor would every person who does have one voluntarily choose to pin their entire identity to it. Therefore, although I happily use them, I think ORCIDs are likely to face more of an uphill battle than the DOI—which needed buy-in only from major publishers and eprint servers to reach hegemony.</html:p>
                      </fr:mainmatter>
                    </fr:tree>
                    <fr:tree show-metadata="false">
                      <fr:frontmatter>
                        <fr:authors>
                          <fr:author>
                            <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
                          </fr:author>
                        </fr:authors>
                        <fr:date>
                          <fr:year>2025</fr:year>
                          <fr:month>3</fr:month>
                          <fr:day>8</fr:day>
                        </fr:date>
                        <fr:uri>https://www.forester-notes.org/OYOK/</fr:uri>
                        <fr:display-uri>OYOK</fr:display-uri>
                        <fr:route>/OYOK/</fr:route>
                        <fr:title text="Informal decentralised identification via web addresses">Informal decentralised identification via web addresses</fr:title>
                      </fr:frontmatter>
                      <fr:mainmatter>
                        <html:p>A particularly simple way to identify a single person or organisation is by means of a web domain or an email address. Although not everyone has a domain name, many people have email addresses. On the other hand, people often have many domain names and their email address may change over time; and when people die, their presence on the web is often erased or lost. Therefore, although widespread, this approach may create difficulties with longevity and stability.</html:p>
                      </fr:mainmatter>
                    </fr:tree>
                    <fr:tree show-metadata="false">
                      <fr:frontmatter>
                        <fr:authors>
                          <fr:author>
                            <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
                          </fr:author>
                        </fr:authors>
                        <fr:date>
                          <fr:year>2025</fr:year>
                          <fr:month>3</fr:month>
                          <fr:day>8</fr:day>
                        </fr:date>
                        <fr:uri>https://www.forester-notes.org/OYON/</fr:uri>
                        <fr:display-uri>OYON</fr:display-uri>
                        <fr:route>/OYON/</fr:route>
                        <fr:title text="General-purpose decentralised identification via DIDs">General-purpose decentralised identification via DIDs</fr:title>
                      </fr:frontmatter>
                      <fr:mainmatter>
                        <html:p>When reading about the paper of <fr:link href="/klepmann-et-al-atproto-2024/" title="Bluesky and the AT Protocol: Usable Decentralized Social Media" uri="https://www.forester-notes.org/klepmann-et-al-atproto-2024/" display-uri="klepmann-et-al-atproto-2024" type="local">Klepmann et al.</fr:link> outlining Bluesky’s AT Protocol, I learned of <fr:link href="https://www.w3.org/TR/did-1.0/" type="external"><html:em>Decentralised Identifiers</html:em> (DIDs)</fr:link>. In essence, DIDs are URIs of the form <html:code>did:method:path</html:code> where <html:code>method</html:code> identifies <html:em>how</html:em> the DID is intended to be resolved and <html:code>path</html:code> is a colon-separated path that should be resolved by means of that method. In either case, a DID is intended to be resolved to a JSON document that contains information about the resource or entity being described, as well as various methods (like public keys) for verifying the integrity of that information. The <html:em>methods</html:em> are somewhat open-ended, but two important methods have emerged.</html:p>
                        <fr:tree show-metadata="false">
                          <fr:frontmatter>
                            <fr:authors>
                              <fr:author>
                                <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
                              </fr:author>
                            </fr:authors>
                            <fr:date>
                              <fr:year>2025</fr:year>
                              <fr:month>3</fr:month>
                              <fr:day>8</fr:day>
                            </fr:date>
                            <fr:uri>https://www.forester-notes.org/OYOO/</fr:uri>
                            <fr:display-uri>OYOO</fr:display-uri>
                            <fr:route>/OYOO/</fr:route>
                            <fr:title text="W3C’s did:web method">W3C’s <html:code>did:web</html:code> method</fr:title>
                          </fr:frontmatter>
                          <fr:mainmatter>
                            <html:p><fr:link href="https://w3c-ccg.github.io/did-method-web/" type="external">W3C have specified the <html:code>did:web</html:code> method</fr:link>, which in which the <html:code>path</html:code> is intended to be a web domain. Simplifying somewhat, a DID like <html:code>did:web:jonmsterling.com</html:code> would be substantiated by responding to the HTTPS request <html:code>https://jonmsterling.com/.well-known/did.json</html:code> with a document in the appropriate format. The upside is that the owner of a web domain is <html:em>their own</html:em> identity authority; in this sense <html:code>did:web</html:code> is a truly decentralised identification scheme. The downside is that you have to have a web domain, and you also can never change it ever—the <fr:link href="/OYOK/" title="Survey of global identification schemes › Informal decentralised identification via web addresses" uri="https://www.forester-notes.org/OYOK/" display-uri="OYOK" type="local">same disadvantage of informal decentralised identification which we have discussed</fr:link>.</html:p>
                          </fr:mainmatter>
                        </fr:tree>
                        <fr:tree show-metadata="false">
                          <fr:frontmatter>
                            <fr:authors>
                              <fr:author>
                                <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
                              </fr:author>
                            </fr:authors>
                            <fr:date>
                              <fr:year>2025</fr:year>
                              <fr:month>3</fr:month>
                              <fr:day>8</fr:day>
                            </fr:date>
                            <fr:uri>https://www.forester-notes.org/OYOP/</fr:uri>
                            <fr:display-uri>OYOP</fr:display-uri>
                            <fr:route>/OYOP/</fr:route>
                            <fr:title text="Bluesky’s did:plc method">Bluesky’s <html:code>did:plc</html:code> method</fr:title>
                          </fr:frontmatter>
                          <fr:mainmatter>
                            <html:p>For a social network like Bluesky, it is critical that users be able to migrate their identity from one domain to another. Obviously users may change or lose their domain over time, but it is important to keep in mind that the vast majority of users will <html:em>never</html:em> have their own domain and so they will over the course of their lives jump from one subsidiary domain that they don’t control to the next—just as Mastodon users are constantly migrating from instance to instance, driven to wander endlessly by either the petty tyranny of instance maintainers who think they know best, or by the natural quiescence of instances caused by lack of funds or time, or (in many cases) a combination of the two.</html:p>
                            <html:p>It seems that there is no way to address this problem without introducing some central authority—a <html:em>directory</html:em> of permanent identifiers that are then resolved to documents that establish cryptographically verified bidirectional links with more ephemeral and human-readable forms of identification (such as web domains). This is essentially the design of Bluesky’s <html:code>did:plc</html:code> method, as explained by <fr:link href="/klepmann-et-al-atproto-2024/" title="Bluesky and the AT Protocol: Usable Decentralized Social Media" uri="https://www.forester-notes.org/klepmann-et-al-atproto-2024/" display-uri="klepmann-et-al-atproto-2024" type="local">Klepmann et al.</fr:link>:</html:p>
                            <html:ol><html:li>On your own domain, which serves as your (ephemeral) handle, you place a DNS TXT record or file that contains a DID like <html:code>did:plc:asdlkfh9q8034baliufhbcailurb</html:code>.</html:li>
      <html:li>Someone resolves this DID to a document by querying a central <html:em>directory server</html:em> (such as <fr:link href="https://web.plc.directory/" type="external">Bluesky’s own</fr:link>). This document contains a link back to the domain; signatures are used to ensure that every update to the document has been authorised by whoever signed it when it was first minted.</html:li></html:ol>
                            <html:p>Although some centralisation is required here, the use of cryptographic proof ensures that the central authority does not need to be trusted (to a certain extent).</html:p>
                          </fr:mainmatter>
                        </fr:tree>
                      </fr:mainmatter>
                    </fr:tree>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2025</fr:year>
                      <fr:month>3</fr:month>
                      <fr:day>8</fr:day>
                    </fr:date>
                    <fr:uri>https://www.forester-notes.org/OYOQ/</fr:uri>
                    <fr:display-uri>OYOQ</fr:display-uri>
                    <fr:route>/OYOQ/</fr:route>
                    <fr:title text="Analysis of global identity in Forester">Analysis of global identity in Forester</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>Although Forester aims to become a better citizen of the Web and integrate with emerging protocols, it is a non-negotiable design constraint that Forester still remain usable by people who don’t control a domain  name, cannot run software on their web host, cannot set DNS records, and could not care less what a <fr:link href="/OYON/" title="Survey of global identification schemes › General-purpose decentralised identification via DIDs" uri="https://www.forester-notes.org/OYON/" display-uri="OYON" type="local">DID</fr:link> is. I also have a feeling that there will not be a single protocol that fits all use cases; what I am noticing, however, is that there are commonalities to all the protocols, and that we ought to be informed by these commonalities. For example, in every case an identity is resolved from a URI of some kind—for example, DIDs and DOIs and ORCIDs all have canonical URIs.</html:p>
                    <html:p>Therefore, it strikes me that Forester’s approach to global identity must rest on the axiom that an identity is nothing more or less than a URI; we can place no constraints whatsoever on what form this URI takes, and we should also remain flexible as to compatibility with future replacements of URIs (whether in the form of IRIs, or the <fr:link href="/011R/" title="Forester 5.0 › Canonical URLs for tree addresses › What do we mean by “URL”?" uri="https://www.forester-notes.org/011R/" display-uri="011R" type="local">URL non-“standard”</fr:link>, etc.).</html:p>
                    <html:p>If we start from that point of view, there some problems to address:</html:p>
                    <html:ol><html:li>Even if an identity is not canonically addressed by a tree in a forest, an identity still often needs to <html:em>have</html:em> a tree in the forest. One wants to store biographical and bibliographic information, and maybe even personal notes, etc., and at the very least it is very important to be able to browse backlinks on a biographical page even if the page itself has no content of its own.</html:li>
    <html:li>Not only must we be able to attach a tree to an identity: we must be able to attach <html:em>many</html:em> trees to an identity. This is a requirement of federation.</html:li></html:ol>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2025</fr:year>
                      <fr:month>3</fr:month>
                      <fr:day>8</fr:day>
                    </fr:date>
                    <fr:uri>https://www.forester-notes.org/OYOR/</fr:uri>
                    <fr:display-uri>OYOR</fr:display-uri>
                    <fr:route>/OYOR/</fr:route>
                    <fr:title text="A plan for global identity in Forester">A plan for global identity in Forester</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>Building on my <fr:link href="/OYOQ/" title="Towards Forester 5.0: a design for global identity › Analysis of global identity in Forester" uri="https://www.forester-notes.org/OYOQ/" display-uri="OYOQ" type="local">analysis</fr:link>, I propose that Forester allow any tree to declare that it “describes” a given global identity in the form of a URI. At a first cut this can be done via datalog (but we would probably hide this behind something):</html:p>
                    <html:pre><![CDATA[\execute\datalog{
  -: {\rel/describes \current-tree @{https://orcid.org/0000-0002-0585-5564}}
}]]></html:pre>
                    <html:p>Now it remains to explain how we shall surface the fact that a given entity is described by some tree.</html:p>
                    <html:ol><html:li>For any identity in this relation, we should automatically create a “disambiguation page” that transcludes all the attached trees.</html:li>
    <html:li>When a hyperlink points to a URI that lies in this relation, it should be directed to the disambiguation page.</html:li></html:ol>
                    <html:p>There are further implications for such a feature—for instance, in the future we might automatically populate bibliographic information, etc. (But we have to be careful due to the near-universal unusably low quality of bibliographic databases keyed by DOIs, etc.)</html:p>
                    <html:p>We will need to provide guidance as to how identities should be assigned to (e.g.) people who don’t control an online identity, etc. The rule of thumb should be that we always defer to the preferences of the described person, and to the version of record in the case of an artefact. When there is no canonical choice, users of Forester should do what they like, but they should be willing to update their references in the future should a canonical global entity emerge.</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2025</fr:year>
                      <fr:month>3</fr:month>
                      <fr:day>8</fr:day>
                    </fr:date>
                    <fr:uri>https://www.forester-notes.org/OYOS/</fr:uri>
                    <fr:display-uri>OYOS</fr:display-uri>
                    <fr:route>/OYOS/</fr:route>
                    <fr:title text="Request for comment">Request for comment</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>I am hoping to hear other people’s thoughts on this proposal, including any constructive criticisms or suggestions for how we might go about implementing it. You can write to me or the <fr:link href="mailto:~jonsterling/forester-discuss@lists.sr.ht" type="external">mailing list</fr:link> with your feedback.</html:p>
                  </fr:mainmatter>
                </fr:tree>
              </fr:mainmatter>
            </fr:tree>
            <fr:tree show-metadata="true" expanded="false" toc="false" numbered="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:date>
                  <fr:year>2023</fr:year>
                  <fr:month>5</fr:month>
                  <fr:day>14</fr:day>
                </fr:date>
                <fr:date>
                  <fr:year>2024</fr:year>
                  <fr:month>4</fr:month>
                  <fr:day>25</fr:day>
                </fr:date>
                <fr:date>
                  <fr:year>2025</fr:year>
                  <fr:month>5</fr:month>
                  <fr:day>26</fr:day>
                </fr:date>
                <fr:uri>https://www.forester-notes.org/0052/</fr:uri>
                <fr:display-uri>0052</fr:display-uri>
                <fr:route>/0052/</fr:route>
                <fr:title text="Build your own Stacks Project in 10 minutes">Build your own <fr:link href="/stacks-project/" title="The Stacks project" uri="https://www.forester-notes.org/stacks-project/" display-uri="stacks-project" type="local">Stacks Project</fr:link> in 10 minutes</fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <html:p><fr:link href="/stacks-project/" title="The Stacks project" uri="https://www.forester-notes.org/stacks-project/" display-uri="stacks-project" type="local">The Stacks project</fr:link> is the most successful scientific hypertext project in history. Its goal is to lay the foundations for the theory of algebraic stacks; to facilitate its scalable and sustainable development, several important innovations have been introduced, with the <html:em>tags</html:em> system being the most striking.</html:p>
                <html:blockquote>
  Each tag refers to a unique item (section, lemma, theorem, etc.) in order for this project to be referenceable. These tags don't change even if the item moves within the text. (<fr:link href="https://stacks.math.columbia.edu/tags" type="external">Tags explained</fr:link>, <fr:link href="/stacks-project/" title="The Stacks project" uri="https://www.forester-notes.org/stacks-project/" display-uri="stacks-project" type="local">The Stacks Project</fr:link>).
</html:blockquote>
                <html:p>Many working scientists, students, and hobbyists have wished to create their own tag-based hypertext knowledge base, but the combination of tools historically required to make this happen are extremely daunting. Both the <fr:link href="/stacks-project/" title="The Stacks project" uri="https://www.forester-notes.org/stacks-project/" display-uri="stacks-project" type="local">Stacks project</fr:link> and <fr:link href="/kerodon/" title="Kerodon" uri="https://www.forester-notes.org/kerodon/" display-uri="kerodon" type="local">Kerodon</fr:link> use a cluster of software called <fr:link href="/gerby/" title="Gerby" uri="https://www.forester-notes.org/gerby/" display-uri="gerby" type="local">Gerby</fr:link>, but bitrot has set in and it is <fr:link href="https://github.com/gerby-project/plastex/issues/60" type="external">no longer possible</fr:link> to build its dependencies on a modern environment without significant difficulty, raising questions of longevity.</html:p>
                <html:p>Moreover, <fr:link href="/gerby/" title="Gerby" uri="https://www.forester-notes.org/gerby/" display-uri="gerby" type="local">Gerby</fr:link>’s deployment involves running a database on a server (in spite of the fact that almost the entire functionality is static HTML), an architecture that is incompatible with the constraints of the everyday working scientist or student who knows <html:em>at most</html:em> how to upload static files to their university-provided public storage. The recent experience of the <fr:link href="https://ncatlab.org/nlab/show/HomePage" type="external">nLab</fr:link>’s pandemic-era hiatus and near death experience has demonstrated with some urgency the pracarity faced by any project relying heavily on volunteer system administrators.</html:p>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2023</fr:year>
                      <fr:month>5</fr:month>
                      <fr:day>14</fr:day>
                    </fr:date>
                    <fr:uri>https://www.forester-notes.org/0053/</fr:uri>
                    <fr:display-uri>0053</fr:display-uri>
                    <fr:route>/0053/</fr:route>
                    <fr:title text="Introducing Forester: a tool for scientific thought">Introducing <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local"><html:em>Forester</html:em></fr:link>: a <fr:link href="/tfmt-0002/" title="Tool for scientific thought" uri="https://www.forester-notes.org/tfmt-0002/" display-uri="tfmt-0002" type="local">tool for scientific thought</fr:link></fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>After spending two years exploring the <fr:link href="/tfmt-0001/" title="Designing tools for scientific thought" uri="https://www.forester-notes.org/tfmt-0001/" display-uri="tfmt-0001" type="local">design of tools for scientific thought</fr:link> that meet the unique needs of real, scalable scientific writing in hypertext, I have created a tool called <html:strong><fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link></html:strong> which has the following benefits:</html:p>
                    <html:ol><html:li><fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> is tag-based like <fr:link href="/gerby/" title="Gerby" uri="https://www.forester-notes.org/gerby/" display-uri="gerby" type="local">Gerby</fr:link>, and can therefore power large-scale generational projects like <fr:link href="/stacks-project/" title="The Stacks project" uri="https://www.forester-notes.org/stacks-project/" display-uri="stacks-project" type="local">Stacks</fr:link> and <fr:link href="/kerodon/" title="Kerodon" uri="https://www.forester-notes.org/kerodon/" display-uri="kerodon" type="local">Kerodon</fr:link>.</html:li>
  <html:li><fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> produces static content that <fr:link href="/007R/" title="Deploying your forest to a web host" uri="https://www.forester-notes.org/007R/" display-uri="007R" type="local">can be uploaded to any web hosting service</fr:link> without needing to run or install any serverside software.</html:li>
  <html:li><fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> is <fr:link href="/006W/" title="Installing the Forester software" uri="https://www.forester-notes.org/006W/" display-uri="006W" type="local">easy to install</fr:link> on your own machine.</html:li>
  <html:li>To prevent bitrot, <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> is a single tool rather than a composition of several tools.</html:li>
  <html:li><fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> satisfies <html:em>all</html:em> the <fr:link href="/tfmt-000E/" title="Requirements for typesetting mathematics" uri="https://www.forester-notes.org/tfmt-000E/" display-uri="tfmt-000E" type="local">requirements of serious scientific writing</fr:link>, including sophisticated notational macros, typesetting of diagrams, etc.</html:li></html:ol>
                    <html:p><fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> combines <fr:link href="/tfmt-0005/" title="Hierarchy in evergreen notes" uri="https://www.forester-notes.org/tfmt-0005/" display-uri="tfmt-0005" type="local">associative and hierarchical</fr:link> networks of <fr:link href="/tfmt-0003/" title="Evergreen notes" uri="https://www.forester-notes.org/tfmt-0003/" display-uri="tfmt-0003" type="local">evergreen notes</fr:link> (called “trees”) into hypertext sites called “forests”.</html:p>
                    <fr:tree show-metadata="false">
                      <fr:frontmatter>
                        <fr:authors>
                          <fr:author>
                            <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
                          </fr:author>
                        </fr:authors>
                        <fr:date>
                          <fr:year>2023</fr:year>
                          <fr:month>3</fr:month>
                          <fr:day>4</fr:day>
                        </fr:date>
                        <fr:uri>https://www.forester-notes.org/tfmt-000R/</fr:uri>
                        <fr:display-uri>tfmt-000R</fr:display-uri>
                        <fr:route>/tfmt-000R/</fr:route>
                        <fr:title text="Forests and trees of evergreen notes">Forests and trees of evergreen notes</fr:title>
                        <fr:taxon>Definition</fr:taxon>
                      </fr:frontmatter>
                      <fr:mainmatter>
                        <html:p>A <html:em>forest of <fr:link href="/tfmt-0003/" title="Evergreen notes" uri="https://www.forester-notes.org/tfmt-0003/" display-uri="tfmt-0003" type="local">evergreen notes</fr:link></html:em> (or a <html:em>forest</html:em> for short) is loosely defined to be a collection of <fr:link href="/tfmt-0003/" title="Evergreen notes" uri="https://www.forester-notes.org/tfmt-0003/" display-uri="tfmt-0003" type="local">evergreen notes</fr:link> in which multiple <fr:link href="/tfmt-0005/" title="Hierarchy in evergreen notes" uri="https://www.forester-notes.org/tfmt-0005/" display-uri="tfmt-0005" type="local">hierarchical structures</fr:link> are allowed to emerge and evolve over time. Concretely, one note may contextualize several other notes via transclusion within its textual structure; in the context of a forest, we refer to an individual note as a <html:em>tree</html:em>. Of course, a tree can be viewed as a forest that has a root node.</html:p>
                      </fr:mainmatter>
                    </fr:tree>
                    <html:p>Trees correspond roughly to what are referred to as “tags” in the <fr:link href="/stacks-project/" title="The Stacks project" uri="https://www.forester-notes.org/stacks-project/" display-uri="stacks-project" type="local">Stacks Project</fr:link>.</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <html:p>In this article, I will show you how to set up your own <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link> using the <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> software. <html:mark>These instructions pertain to the <fr:link href="/011P/" title="Forester 5.0" uri="https://www.forester-notes.org/011P/" display-uri="011P" type="local">Forester 5.0</fr:link> version.</html:mark></html:p>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2023</fr:year>
                      <fr:month>8</fr:month>
                      <fr:day>13</fr:day>
                    </fr:date>
                    <fr:uri>https://www.forester-notes.org/006R/</fr:uri>
                    <fr:display-uri>006R</fr:display-uri>
                    <fr:route>/006R/</fr:route>
                    <fr:title text="Preparing to run the Forester software">Preparing to run the <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> software</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>In this section, we will walk through the installation of the <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> software.</html:p>
                    <fr:tree show-metadata="false">
                      <fr:frontmatter>
                        <fr:authors>
                          <fr:author>
                            <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
                          </fr:author>
                        </fr:authors>
                        <fr:date>
                          <fr:year>2023</fr:year>
                          <fr:month>8</fr:month>
                          <fr:day>13</fr:day>
                        </fr:date>
                        <fr:uri>https://www.forester-notes.org/006S/</fr:uri>
                        <fr:display-uri>006S</fr:display-uri>
                        <fr:route>/006S/</fr:route>
                        <fr:title text="System requirements of Forester">System requirements of <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link></fr:title>
                      </fr:frontmatter>
                      <fr:mainmatter>
                        <fr:tree show-metadata="false">
                          <fr:frontmatter>
                            <fr:authors>
                              <fr:author>
                                <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
                              </fr:author>
                            </fr:authors>
                            <fr:date>
                              <fr:year>2023</fr:year>
                              <fr:month>8</fr:month>
                              <fr:day>13</fr:day>
                            </fr:date>
                            <fr:uri>https://www.forester-notes.org/006T/</fr:uri>
                            <fr:display-uri>006T</fr:display-uri>
                            <fr:route>/006T/</fr:route>
                            <fr:title text="A unix-based system">A unix-based system</fr:title>
                            <fr:taxon>Requirement</fr:taxon>
                          </fr:frontmatter>
                          <fr:mainmatter>
                            <html:p><fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> requires a unix-based system to run; it has been tested on both macOS and Linux. Windows support is <fr:link href="https://todo.sr.ht/~jonsterling/forester/6" type="external">desirable</fr:link>, but there are no concrete plans to implement it at this time.</html:p>
                          </fr:mainmatter>
                        </fr:tree>
                        <fr:tree show-metadata="false">
                          <fr:frontmatter>
                            <fr:authors>
                              <fr:author>
                                <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
                              </fr:author>
                            </fr:authors>
                            <fr:date>
                              <fr:year>2023</fr:year>
                              <fr:month>8</fr:month>
                              <fr:day>13</fr:day>
                            </fr:date>
                            <fr:uri>https://www.forester-notes.org/006U/</fr:uri>
                            <fr:display-uri>006U</fr:display-uri>
                            <fr:route>/006U/</fr:route>
                            <fr:title text="A working OCaml 5 installation">A working OCaml 5 installation</fr:title>
                            <fr:taxon>Requirement</fr:taxon>
                          </fr:frontmatter>
                          <fr:mainmatter>
                            <html:p><fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> is written in the <fr:link href="https://www.ocaml.org/" type="external">OCaml</fr:link> programming language, and makes use of the latest features of OCaml 5. Most users should install <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> through OCaml's <fr:link href="https://opam.ocaml.org/" type="external">opam</fr:link> package manager; instructions to install opam and OCaml simultaneously can be found <fr:link href="https://opam.ocaml.org/" type="external">here</fr:link>.</html:p>
                          </fr:mainmatter>
                        </fr:tree>
                        <fr:tree show-metadata="false">
                          <fr:frontmatter>
                            <fr:authors>
                              <fr:author>
                                <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
                              </fr:author>
                            </fr:authors>
                            <fr:date>
                              <fr:year>2023</fr:year>
                              <fr:month>8</fr:month>
                              <fr:day>13</fr:day>
                            </fr:date>
                            <fr:uri>https://www.forester-notes.org/006V/</fr:uri>
                            <fr:display-uri>006V</fr:display-uri>
                            <fr:route>/006V/</fr:route>
                            <fr:title text="A working \LaTeX  installation">A working <fr:tex display="inline"><![CDATA[\LaTeX ]]></fr:tex> installation</fr:title>
                            <fr:taxon>Requirement</fr:taxon>
                          </fr:frontmatter>
                          <fr:mainmatter>
                            <html:p>If you intend to <fr:link href="/tfmt-000L/" title="Generating images statically using LaTeX" uri="https://www.forester-notes.org/tfmt-000L/" display-uri="tfmt-000L" type="local">embed <fr:tex display="inline"><![CDATA[\LaTeX ]]></fr:tex>-rendered diagrams</fr:link> in your <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link>, you will need to have a working installation of <fr:tex display="inline"><![CDATA[\LaTeX ]]></fr:tex> installed, such as <fr:link href="https://tug.org/texlive/" type="external">TeX Live</fr:link>. If all your mathematical expressions are supported by <fr:link href="https://katex.org/" type="external"><fr:tex display="inline"><![CDATA[\KaTeX ]]></fr:tex></fr:link>, this is not necessary.</html:p>
                          </fr:mainmatter>
                        </fr:tree>
                        <fr:tree show-metadata="false">
                          <fr:frontmatter>
                            <fr:authors>
                              <fr:author>
                                <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
                              </fr:author>
                            </fr:authors>
                            <fr:date>
                              <fr:year>2023</fr:year>
                              <fr:month>8</fr:month>
                              <fr:day>14</fr:day>
                            </fr:date>
                            <fr:uri>https://www.forester-notes.org/006Y/</fr:uri>
                            <fr:display-uri>006Y</fr:display-uri>
                            <fr:route>/006Y/</fr:route>
                            <fr:title text="The git distributed version control system">The <fr:link href="https://git-scm.com/" type="external">git</fr:link> distributed version control system</fr:title>
                            <fr:taxon>Requirement</fr:taxon>
                          </fr:frontmatter>
                          <fr:mainmatter>
                            <html:p>It is best practice to maintain your <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link> inside of <fr:link href="https://en.wikipedia.org/wiki/Distributed_version_control" type="external">distributed version control</fr:link>. This serves not only as a way to prevent data loss (because you will be pushing frequently to a remote repository); it also allows you to easily roll back to an earlier version of your <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link>, or to create “branches” in which you prepare <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">trees</fr:link> that are not yet ready to be integrated into the <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link>.</html:p>
                            <html:p>The recommended <fr:link href="https://en.wikipedia.org/wiki/Distributed_version_control" type="external">distributed version control</fr:link> system is <fr:link href="https://git-scm.com/" type="external">git</fr:link>, which comes preinstalled on many unix-based systems and is easy to install otherwise. <fr:link href="https://git-scm.com/" type="external">Git</fr:link> is not the most user-friendly piece of software, unfortunately, but it is ubiquitous. It is possible (but not recommended) to use <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> without version control, but note that the simplest way to <fr:link href="/006X/" title="Setting up your forest from the template" uri="https://www.forester-notes.org/006X/" display-uri="006X" type="local">initialize your own <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link></fr:link> involves cloning a <fr:link href="https://git-scm.com/" type="external">git</fr:link> repository.</html:p>
                          </fr:mainmatter>
                        </fr:tree>
                      </fr:mainmatter>
                    </fr:tree>
                    <fr:tree show-metadata="false">
                      <fr:frontmatter>
                        <fr:authors>
                          <fr:author>
                            <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
                          </fr:author>
                        </fr:authors>
                        <fr:date>
                          <fr:year>2023</fr:year>
                          <fr:month>8</fr:month>
                          <fr:day>13</fr:day>
                        </fr:date>
                        <fr:uri>https://www.forester-notes.org/006W/</fr:uri>
                        <fr:display-uri>006W</fr:display-uri>
                        <fr:route>/006W/</fr:route>
                        <fr:title text="Installing the Forester software">Installing the <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> software</fr:title>
                      </fr:frontmatter>
                      <fr:mainmatter>
                        <html:p>Once you have met the <fr:link href="/006S/" title="System requirements of Forester" uri="https://www.forester-notes.org/006S/" display-uri="006S" type="local">system requirements</fr:link>, installing <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> requires only a single shell command:</html:p>
                        <html:pre><![CDATA[opam install forester]]></html:pre>
                        <html:p>To verify that <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> is installed, please run <html:code>forester --version</html:code> in your shell.</html:p>
                      </fr:mainmatter>
                    </fr:tree>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2023</fr:year>
                      <fr:month>8</fr:month>
                      <fr:day>14</fr:day>
                    </fr:date>
                    <fr:date>
                      <fr:year>2024</fr:year>
                      <fr:month>4</fr:month>
                      <fr:day>25</fr:day>
                    </fr:date>
                    <fr:date>
                      <fr:year>2024</fr:year>
                      <fr:month>6</fr:month>
                      <fr:day>17</fr:day>
                    </fr:date>
                    <fr:uri>https://www.forester-notes.org/006X/</fr:uri>
                    <fr:display-uri>006X</fr:display-uri>
                    <fr:route>/006X/</fr:route>
                    <fr:title text="Setting up your forest from the template">Setting up your <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link> from the template</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>Now that you have <fr:link href="/006W/" title="Installing the Forester software" uri="https://www.forester-notes.org/006W/" display-uri="006W" type="local">installed</fr:link> the <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> software, it is time to set up your <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link>. <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> provides a simple command to initialise a fresh <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link> within a folder. We’ll call our folder <html:code>forest</html:code>, but you can call it anything you want.</html:p>
                    <html:pre><![CDATA[mkdir forest
cd forest]]></html:pre>
                    <html:p>Now that we are inside our new directory, we can instruct <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> to initialise a <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link>.</html:p>
                    <html:pre>forester init</html:pre>
                    <html:p>This command initialises a <fr:link href="https://git-scm.com/" type="external">git</fr:link> repository with the skeleton of a <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link>, which contains a configuration file named <html:code>forest.toml</html:code>; this file specifies the locations of your trees, assets, etc. There is also a <fr:link href="https://git-scm.com/" type="external">git</fr:link> submodule bound to the <html:code>theme/</html:code> directory (pointing to the <fr:link href="https://git.sr.ht/~jonsterling/forester-base-theme" type="external">base theme</fr:link> repository) that contains the stylesheets that web browsers will need in order to render your <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link> as HTML.</html:p>
                    <fr:tree show-metadata="false">
                      <fr:frontmatter>
                        <fr:authors>
                          <fr:author>
                            <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
                          </fr:author>
                        </fr:authors>
                        <fr:date>
                          <fr:year>2023</fr:year>
                          <fr:month>8</fr:month>
                          <fr:day>14</fr:day>
                        </fr:date>
                        <fr:date>
                          <fr:year>2024</fr:year>
                          <fr:month>6</fr:month>
                          <fr:day>17</fr:day>
                        </fr:date>
                        <fr:uri>https://www.forester-notes.org/0073/</fr:uri>
                        <fr:display-uri>0073</fr:display-uri>
                        <fr:route>/0073/</fr:route>
                        <fr:title text="Tree addresses in a forest">Tree addresses in a <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link></fr:title>
                      </fr:frontmatter>
                      <fr:mainmatter>
                        <html:p>A <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">tree</fr:link> in <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> is usually associated to an address of the form <html:code>NNNN</html:code> is a four-digit <fr:link href="/0074/" title="Base-36 identifiers in Forester" uri="https://www.forester-notes.org/0074/" display-uri="0074" type="local">base-36 number</fr:link>. The purpose of the <fr:link href="/0074/" title="Base-36 identifiers in Forester" uri="https://www.forester-notes.org/0074/" display-uri="0074" type="local">base-36</fr:link> code is to uniquely identify a <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">tree</fr:link> within your <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link> in such a way that you are not tempted to rename it, as you might be when titles or dates are embedded into filenames. A tree with address <html:code>NNNN</html:code> is stored in a file named <html:code>NNNN.tree</html:code> (unless it is emitted from inside another tree by means of the <fr:link href="/00O4/" title="Forester 3.1 › Inline subtrees" uri="https://www.forester-notes.org/00O4/" display-uri="00O4" type="local">inline subtrees</fr:link> feature).</html:p>
                        <html:p>Note that the format of <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">tree</fr:link> addresses is purely a matter of convention, and is not forced by the <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> tool. Users are free to use their own naming convention for tree addresses, and in some cases alternative (human-readable) formats may be desirable: this includes trees representing bibliographic references, as well as biographical trees. <html:mark>If you don’t like numerical tree addresses, nobody is forcing you to use them.</html:mark> The use of numerical addresses is suitable for projects like <fr:link href="/stacks-project/" title="The Stacks project" uri="https://www.forester-notes.org/stacks-project/" display-uri="stacks-project" type="local">The Stacks Project</fr:link>, but it may not be appropriate for your own use-case.</html:p>
                        <html:p>Addresses in <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> are not hierarchical: all resources are rendered at the root of the forest, no matter where their source files are kept. This limitation is intentional, but we might revisit it in the future.</html:p>
                      </fr:mainmatter>
                    </fr:tree>
                    <fr:tree show-metadata="false">
                      <fr:frontmatter>
                        <fr:authors>
                          <fr:author>
                            <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
                          </fr:author>
                        </fr:authors>
                        <fr:date>
                          <fr:year>2023</fr:year>
                          <fr:month>8</fr:month>
                          <fr:day>15</fr:day>
                        </fr:date>
                        <fr:date>
                          <fr:year>2024</fr:year>
                          <fr:month>4</fr:month>
                          <fr:day>25</fr:day>
                        </fr:date>
                        <fr:uri>https://www.forester-notes.org/007D/</fr:uri>
                        <fr:display-uri>007D</fr:display-uri>
                        <fr:route>/007D/</fr:route>
                        <fr:title text="Building and viewing your forest for the first time">Building and viewing your <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link> for the first time</fr:title>
                      </fr:frontmatter>
                      <fr:mainmatter>
                        <html:p>To build your <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link>, you can run the following command of <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link>'s executable in your shell:</html:p>
                        <html:pre>forester build forest.toml</html:pre>
                        <html:p>The <html:code>--dev</html:code> flag is optional, and when activated supplies metadata to the generated website to support an “edit button” on each tree; this flag is meant to be used when developing your <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link> locally, and should not be used when building the <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link> to be uploaded to your public web host.</html:p>
                        <fr:tree show-metadata="false">
                          <fr:frontmatter>
                            <fr:authors>
                              <fr:author>
                                <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
                              </fr:author>
                            </fr:authors>
                            <fr:date>
                              <fr:year>2023</fr:year>
                              <fr:month>8</fr:month>
                              <fr:day>15</fr:day>
                            </fr:date>
                            <fr:uri>https://www.forester-notes.org/007G/</fr:uri>
                            <fr:display-uri>007G</fr:display-uri>
                            <fr:route>/007G/</fr:route>
                            <fr:title text="Forester renders each tree to an XML document"><fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> renders each tree to an XML document</fr:title>
                          </fr:frontmatter>
                          <fr:mainmatter>
                            <html:p><fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> renders your <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link> to some XML files in the <html:code>output/</html:code> directory; XML is, like HTML, a format for structured documents that can be displayed by web browsers. The <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link> template comes equipped with a built-in XSLT stylesheet (<html:code>theme/default.xsl</html:code>) which is used to instruct web browsers how to render your <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link> into a pleasing and readable format.</html:p>
                          </fr:mainmatter>
                        </fr:tree>
                        <fr:tree show-metadata="false">
                          <fr:frontmatter>
                            <fr:authors>
                              <fr:author>
                                <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
                              </fr:author>
                            </fr:authors>
                            <fr:date>
                              <fr:year>2023</fr:year>
                              <fr:month>8</fr:month>
                              <fr:day>15</fr:day>
                            </fr:date>
                            <fr:uri>https://www.forester-notes.org/007I/</fr:uri>
                            <fr:display-uri>007I</fr:display-uri>
                            <fr:route>/007I/</fr:route>
                            <fr:title text="Serving and viewing your forest from a local web server">Serving and viewing your <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link> from a local web server</fr:title>
                          </fr:frontmatter>
                          <fr:mainmatter>
                            <html:p>To view your <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link> while editing it, you must <html:em>serve</html:em> it from a local web server..To do this, first ensure that you have <fr:link href="https://www.python.org/downloads/" type="external">Python 3</fr:link> correctly installed. Then run the following command from the root directory of your <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link>:</html:p>
                            <html:pre>python3 -m http.server 1313 -d output</html:pre>
                            <html:p>(You could replace <html:code>1313</html:code> with whatever port you prefer.) While this command is running, you will be able to access your <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link> by navigating to <fr:link href="http://localhost:1313/" type="external"><html:code>localhost:1313</html:code></fr:link> in your preferred web browser.</html:p>
                            <html:p>In the future, <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> <fr:link href="https://todo.sr.ht/~jonsterling/forester/15" type="external">may be able to run its own local server</fr:link> to avoid the dependency on external tools like Python.</html:p>
                          </fr:mainmatter>
                        </fr:tree>
                      </fr:mainmatter>
                    </fr:tree>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2023</fr:year>
                      <fr:month>8</fr:month>
                      <fr:day>15</fr:day>
                    </fr:date>
                    <fr:uri>https://www.forester-notes.org/007K/</fr:uri>
                    <fr:display-uri>007K</fr:display-uri>
                    <fr:route>/007K/</fr:route>
                    <fr:title text="Creating your personal biographical tree">Creating your personal biographical <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">tree</fr:link></fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>The first <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">tree</fr:link> that you should create is a biographical tree to represent your own identity; ultimately you will link to this tree when you set the <fr:link href="/tfmt-000S/" title="Author of a tree" uri="https://www.forester-notes.org/tfmt-000S/" display-uri="tfmt-000S" type="local">authors</fr:link> of other <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">trees</fr:link> that you create later on. It is convenient to simply use a person’s full name to address a biographical <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">tree</fr:link>. <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">My own biographical tree</fr:link> is located at <html:code>trees/people/jonmsterling.tree</html:code> and contains the following source code:</html:p>
                    <html:pre><![CDATA[\title{Jon Sterling}
\taxon{Person}
\meta{external}{https://www.jonmsterling.com/}
\meta{institution}{[[ucam]]}
\meta{orcid}{0000-0002-0585-5564}
\meta{position}{Associate Professor}

\p{Associate Professor in Logical Foundations and Formal Methods at University of Cambridge. Formerly a [Marie Skłodowska-Curie Postdoctoral Fellow](0061) hosted at Aarhus University by [Lars Birkedal](larsbirkedal), and before this a PhD student of [Robert Harper](robertharper).}]]></html:pre>
                    <html:p>Let’s break this code down to understand what it does.</html:p>
                    <html:ol><html:li>The declaration <html:code><![CDATA[\title{Jon Sterling}]]></html:code> sets the title of the <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">tree</fr:link> to my name.</html:li>
  <html:li>The <html:code><![CDATA[\taxon{Person}]]></html:code> declaration informs <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> that the <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">tree</fr:link> is biographical. Not ever <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">tree</fr:link> needs to have a taxon; common taxa include <html:code>Person</html:code>, <html:code>Theorem</html:code>, <html:code>Definition</html:code>, <html:code>Lemma</html:code>, etc. You are free to use whatever you want, but some taxa are treated specially by <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link>.</html:li>
  <html:li>The subsequent <html:code><![CDATA[\meta]]></html:code> declarations attach additional information to the tree that can be used during rendering. These declarations are optional, and you are free to put whatever metadata you want.</html:li>
  <html:li>Like in HTML, paragraphs must be wrapped in <html:code><![CDATA[\p{...}]]></html:code>.</html:li></html:ol>
                    <html:p>Do not hard-wrap your text, as this can have visible impact on how <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">trees</fr:link> are rendered; it is recommended that you use a text editor with good support for soft-wrapping, like <fr:link href="https://code.visualstudio.com/" type="external">Visual Studio Code</fr:link>.</html:p>
                    <html:p>You can see that the <fr:link href="/007N/" title="The Forester markup language" uri="https://www.forester-notes.org/007N/" display-uri="007N" type="local">concrete syntax of <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link>'s <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">trees</fr:link></fr:link> looks superficially like a combination of <fr:tex display="inline"><![CDATA[\LaTeX ]]></fr:tex> and Markdown; Markdown-style links are used both for links to other trees <html:em>and</html:em> for links to external URLs. <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link>'s concrete syntax is not fully documented, but it is less ambiguous than both <fr:tex display="inline"><![CDATA[\LaTeX ]]></fr:tex> and Markdown.</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2023</fr:year>
                      <fr:month>8</fr:month>
                      <fr:day>15</fr:day>
                    </fr:date>
                    <fr:date>
                      <fr:year>2024</fr:year>
                      <fr:month>4</fr:month>
                      <fr:day>25</fr:day>
                    </fr:date>
                    <fr:uri>https://www.forester-notes.org/007H/</fr:uri>
                    <fr:display-uri>007H</fr:display-uri>
                    <fr:route>/007H/</fr:route>
                    <fr:title text="Creating a new tree using forester new">Creating a new <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">tree</fr:link> using <html:code>forester new</html:code></fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>Creating a new <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">tree</fr:link> in your <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link> is as simple as adding a <html:code>.tree</html:code> file to the <html:code>trees</html:code> folder. Because it is hard to manually choose the <fr:link href="/0073/" title="Tree addresses in a forest" uri="https://www.forester-notes.org/0073/" display-uri="0073" type="local">next incremental tree address</fr:link>, <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> provides a command to do this automatically:</html:p>
                    <html:pre>forester new forest.toml --dest=trees</html:pre>
                    <html:p>In return, <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> should output the location of the new tree, e.g. <html:code>trees/0002.tree</html:code>. If we look at the contents of this new file, we will see that it is empty except for metadata assigning a date to the tree:</html:p>
                    <html:pre><![CDATA[\date{2023-08-15}]]></html:pre>
                    <html:p>You may prefer to use <html:em>randomised</html:em> addresses over sequential addresses; this can be particularly useful if multiple people are contributing to a <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link>. In that case, pass the <html:code>--random</html:code> option to <html:code>forester new</html:code>.</html:p>
                    <html:p><html:strong>Most <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">trees</fr:link> should have a <html:code><![CDATA[\date]]></html:code> annotation;</html:strong> this date is meant to be the date of the <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">tree</fr:link>'s creation; you can have more than one date, if you like to keep track of when a tree has been updated. You should proceed by adding further metadata: the title and the <fr:link href="/tfmt-000S/" title="Author of a tree" uri="https://www.forester-notes.org/tfmt-000S/" display-uri="tfmt-000S" type="local">author</fr:link>; for the latter, you will use the address of your <fr:link href="/007K/" title="Creating your personal biographical tree" uri="https://www.forester-notes.org/007K/" display-uri="007K" type="local">personal biographical tree</fr:link>.</html:p>
                    <html:pre><![CDATA[\title{My first tree}
\author{jonmsterling}]]></html:pre>
                    <html:p><fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">Tree</fr:link> titles should be given in lower case (except for proper names, etc.); these titles will be <html:em>rendered</html:em> by <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> in sentence case. A <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">tree</fr:link> can have as many <html:code><![CDATA[\author]]></html:code> declarations as it has <fr:link href="/tfmt-000S/" title="Author of a tree" uri="https://www.forester-notes.org/tfmt-000S/" display-uri="tfmt-000S" type="local">authors</fr:link>; these will be rendered in their order of appearance.</html:p>
                    <html:p>Now you can begin to populate the tree with its content, written in the <fr:link href="/007N/" title="The Forester markup language" uri="https://www.forester-notes.org/007N/" display-uri="007N" type="local"><fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> markup language</fr:link>. <fr:link href="/tfmt-0007/" title="Atomicity of scientific notes" uri="https://www.forester-notes.org/tfmt-0007/" display-uri="tfmt-0007" type="local">Think carefully about keeping each tree relatively independent and atomic</fr:link>.</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2023</fr:year>
                      <fr:month>8</fr:month>
                      <fr:day>15</fr:day>
                    </fr:date>
                    <fr:uri>https://www.forester-notes.org/007L/</fr:uri>
                    <fr:display-uri>007L</fr:display-uri>
                    <fr:route>/007L/</fr:route>
                    <fr:title text="Bottom-up hierarchy via transclusion">Bottom-up hierarchy via <html:em>transclusion</html:em></fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>You may be used to writing <fr:tex display="inline"><![CDATA[\LaTeX ]]></fr:tex> documents, where you work from the top down: you create some section headings, put some text under those headings, make some deeper section headings, put more text, etc. <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">Forests</fr:link> work in the opposite way, from the bottom up: you start by writing independent, <fr:link href="/tfmt-0007/" title="Atomicity of scientific notes" uri="https://www.forester-notes.org/tfmt-0007/" display-uri="tfmt-0007" type="local">atomic</fr:link> notes/<fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">trees</fr:link> and then only later start to (sparingly) assemble these into a hierarchy in order to reify the emerging structure.</html:p>
                    <html:p><fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link>’s bottom-up approach to section hierarchy works via something called <html:em>transclusion</html:em>. The idea is that at any time, you can include (“transclude”) the full contents of another <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">tree</fr:link> into the current tree as a subsection by adding the following code:</html:p>
                    <html:pre><![CDATA[\transclude{address}]]></html:pre>
                    <html:p>This is kind of like <fr:tex display="inline"><![CDATA[\LaTeX ]]></fr:tex>’s <html:code><![CDATA[\input]]></html:code> command, but much better behaved: for instance, section levels are computed on the fly depending on the position in the hierarchy. This <fr:link href="/0052/" title="Build your own Stacks Project in 10 minutes" uri="https://www.forester-notes.org/0052/" display-uri="0052" type="local">entire tutorial</fr:link> is cobbled together by transcluding many smaller <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">trees</fr:link>, each with their own independent existence. For example, the following two sections are transcluded from an <fr:link href="/tfmt-0001/" title="Designing tools for scientific thought" uri="https://www.forester-notes.org/tfmt-0001/" display-uri="tfmt-0001" type="local">entirely different part</fr:link> of my forest:</html:p>
                    <fr:tree show-metadata="false">
                      <fr:frontmatter>
                        <fr:authors>
                          <fr:author>
                            <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
                          </fr:author>
                        </fr:authors>
                        <fr:date>
                          <fr:year>2022</fr:year>
                          <fr:month>12</fr:month>
                          <fr:day>27</fr:day>
                        </fr:date>
                        <fr:uri>https://www.forester-notes.org/tfmt-0009/</fr:uri>
                        <fr:display-uri>tfmt-0009</fr:display-uri>
                        <fr:route>/tfmt-0009/</fr:route>
                        <fr:title text="The best structure to impose is relatively flat">The best structure to impose is relatively flat</fr:title>
                      </fr:frontmatter>
                      <fr:mainmatter>
                        <html:p>It is easy to make the mistake of prematurely imposing a complex hierarchical structure on a network of notes, which leads to excessive refactoring. Hierarchy should be used sparingly, and its strength is for the large-scale organization of ideas. The best structure to impose on a network of many small related ideas is a relatively flat one. I believe that this is one of the mistakes made in the writing of the <html:em>foundations of relative category theory</html:em>, whose hierarchical nesting was too complex and quite beholden to my experience with pre-hypertext media.</html:p>
                      </fr:mainmatter>
                    </fr:tree>
                    <html:p>One of the immediate impacts and strengths of <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link>’s transclusion model is that a given <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">tree</fr:link> has no canonical “geographic” location in the <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link>. One <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">tree</fr:link> can appear as a child of many other <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">trees</fr:link>, which allows the same content to be incorporated into different textual and intellectual narratives.</html:p>
                    <fr:tree show-metadata="false">
                      <fr:frontmatter>
                        <fr:authors>
                          <fr:author>
                            <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
                          </fr:author>
                        </fr:authors>
                        <fr:date>
                          <fr:year>2022</fr:year>
                          <fr:month>12</fr:month>
                          <fr:day>26</fr:day>
                        </fr:date>
                        <fr:uri>https://www.forester-notes.org/tfmt-0006/</fr:uri>
                        <fr:display-uri>tfmt-0006</fr:display-uri>
                        <fr:route>/tfmt-0006/</fr:route>
                        <fr:title text="Hierarchical structure as non-unique narrative">Hierarchical structure as non-unique narrative</fr:title>
                      </fr:frontmatter>
                      <fr:mainmatter>
                        <html:p>Multiple hierarchical structures can be imposed on the same associative network of nodes; a hierarchical structure amounts to a “narrative” that contextualizes a given subgraph of the network. One example could be the construction of lecture notes; another example could be a homework sheet; a further example could be a book chapter or scientific article. Although these may draw from the same body of definitions, theorems, examples, and exercises, these objects are contextualized within a different narrative, often toward fundamentally different ends.</html:p>
                        <html:p>As a result, any interface for navigating the neighbor-relation in hierarchically organized notes would need to take account of the multiplicity of parent nodes. Most hypertext tools assume that the position of a node in the hierarchy is unique, and therefore have a single “next/previous” navigation interface; we must investigate the design of interfaces that surface all parent/neighbor relations.</html:p>
                      </fr:mainmatter>
                    </fr:tree>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2023</fr:year>
                      <fr:month>8</fr:month>
                      <fr:day>16</fr:day>
                    </fr:date>
                    <fr:uri>https://www.forester-notes.org/007N/</fr:uri>
                    <fr:display-uri>007N</fr:display-uri>
                    <fr:route>/007N/</fr:route>
                    <fr:title text="The Forester markup language">The <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> markup language</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>A <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">tree</fr:link> in <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> is a single file written in a markup language designed specifically for scientific writing <fr:link href="/007L/" title="Bottom-up hierarchy via transclusion" uri="https://www.forester-notes.org/007L/" display-uri="007L" type="local">with bottom-up hierarchy via transclusion</fr:link>. A <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">tree</fr:link> has two components: the <fr:link href="/007P/" title="Forester markup: frontmatter" uri="https://www.forester-notes.org/007P/" display-uri="007P" type="local">frontmatter</fr:link> and the <fr:link href="/007O/" title="Forester markup: mainmatter" uri="https://www.forester-notes.org/007O/" display-uri="007O" type="local">mainmatter</fr:link>.</html:p>
                    <fr:tree show-metadata="false">
                      <fr:frontmatter>
                        <fr:authors>
                          <fr:author>
                            <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
                          </fr:author>
                        </fr:authors>
                        <fr:date>
                          <fr:year>2023</fr:year>
                          <fr:month>8</fr:month>
                          <fr:day>16</fr:day>
                        </fr:date>
                        <fr:uri>https://www.forester-notes.org/007P/</fr:uri>
                        <fr:display-uri>007P</fr:display-uri>
                        <fr:route>/007P/</fr:route>
                        <fr:title text="Forester markup: frontmatter"><fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> markup: frontmatter</fr:title>
                      </fr:frontmatter>
                      <fr:mainmatter><html:p>The frontmatter of a <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">tree</fr:link> is a sequence of declarations that we summarize below.</html:p>
  <html:table>
  
  <html:tr>
    
  <html:th>Declaration</html:th>

    
  <html:th>Meaning</html:th>

  </html:tr>

  
 <html:tr>
  <html:td style="white-space:nowrap">
   <html:code><![CDATA[\title{...}]]></html:code>
  </html:td>
  <html:td>
    sets the title of the <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">tree</fr:link>; can contain <fr:link href="/007O/" title="Forester markup: mainmatter" uri="https://www.forester-notes.org/007O/" display-uri="007O" type="local">mainmatter</fr:link> markup
  </html:td>
 </html:tr>

  
 <html:tr>
  <html:td style="white-space:nowrap">
   <html:code><![CDATA[\author{name}]]></html:code>
  </html:td>
  <html:td>
    sets the <fr:link href="/tfmt-000S/" title="Author of a tree" uri="https://www.forester-notes.org/tfmt-000S/" display-uri="tfmt-000S" type="local">author</fr:link> of the <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">tree</fr:link> to be the biographical tree at address <html:code>name</html:code>
  </html:td>
 </html:tr>

  
 <html:tr>
  <html:td style="white-space:nowrap">
   <html:code><![CDATA[\date{YYYY-MM-DD}]]></html:code>
  </html:td>
  <html:td>sets the creation date of the <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">tree</fr:link>; full ISO 8601 date-times are supported.</html:td>
 </html:tr>

  
 <html:tr>
  <html:td style="white-space:nowrap">
   <html:code><![CDATA[\taxon{Taxon}]]></html:code>
  </html:td>
  <html:td>sets the taxon of the <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">tree</fr:link>; example taxa include <html:code>lemma</html:code>, <html:code>theorem</html:code>, <html:code>person</html:code>, <html:code>reference</html:code>; the latter two taxa are treated specially by <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> for tracking biographical and bibliographical <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">trees</fr:link> respectively</html:td>
 </html:tr>

  
 <html:tr>
  <html:td style="white-space:nowrap">
   <html:code><![CDATA[\def\ident[x][y]{body}]]></html:code>
  </html:td>
  <html:td>
    defines and exports from the current <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">tree</fr:link> a function named <html:code><![CDATA[\ident]]></html:code> with two arguments; subsequently, the expression <html:code><![CDATA[\ident{u}{v}]]></html:code> would expand to <html:code>body</html:code> with the values of <html:code>u,v</html:code> substituted for <html:code><![CDATA[\x,\y]]></html:code>
  </html:td>
 </html:tr>

  
 <html:tr>
  <html:td style="white-space:nowrap">
   <html:code><![CDATA[\import{address}]]></html:code>
  </html:td>
  <html:td>
    brings the functions exported by the tree <html:code>address</html:code> into scope
  </html:td>
 </html:tr>

  
 <html:tr>
  <html:td style="white-space:nowrap">
   <html:code><![CDATA[\export{address}]]></html:code>
  </html:td>
  <html:td>
    brings the functions exported by the tree <html:code>address</html:code> into scope, and exports them from the current tree
  </html:td>
 </html:tr>

</html:table>
</fr:mainmatter>
                    </fr:tree>
                    <fr:tree show-metadata="false">
                      <fr:frontmatter>
                        <fr:authors>
                          <fr:author>
                            <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
                          </fr:author>
                        </fr:authors>
                        <fr:date>
                          <fr:year>2023</fr:year>
                          <fr:month>8</fr:month>
                          <fr:day>16</fr:day>
                        </fr:date>
                        <fr:uri>https://www.forester-notes.org/007O/</fr:uri>
                        <fr:display-uri>007O</fr:display-uri>
                        <fr:route>/007O/</fr:route>
                        <fr:title text="Forester markup: mainmatter"><fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> markup: mainmatter</fr:title>
                      </fr:frontmatter>
                      <fr:mainmatter><html:p>Below we summarize the concrete syntax of the <html:em>mainmatter</html:em> in a <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">tree</fr:link>.</html:p>
  <html:table>
  
  <html:tr>
    
  <html:th>Function</html:th>

    
  <html:th>Meaning</html:th>

  </html:tr>

  
 <html:tr>
  <html:td style="white-space:nowrap">
   <html:code><![CDATA[\p{...}]]></html:code>
  </html:td>
  <html:td>creates a paragraph containing <html:code>...</html:code>; unlike Markdown, it is mandatory to annotate paragraphs explicitly</html:td>
 </html:tr>

  
 <html:tr>
  <html:td style="white-space:nowrap">
   <html:code><![CDATA[\em{...}]]></html:code>
  </html:td>
  <html:td>typesets the content in italics</html:td>
 </html:tr>

  
 <html:tr>
  <html:td style="white-space:nowrap">
   <html:code><![CDATA[\strong{...}]]></html:code>
  </html:td>
  <html:td>typesets the content in boldface</html:td>
 </html:tr>


  
 <html:tr>
  <html:td style="white-space:nowrap">
   <html:code><![CDATA[\ol{...}]]></html:code>
  </html:td>
  <html:td>creates an ordered list</html:td>
 </html:tr>


  
 <html:tr>
  <html:td style="white-space:nowrap">
   <html:code><![CDATA[\ul{...}]]></html:code>
  </html:td>
  <html:td>creates an unordered list</html:td>
 </html:tr>


  
 <html:tr>
  <html:td style="white-space:nowrap">
   <html:code><![CDATA[\li{...}]]></html:code>
  </html:td>
  <html:td>creates a list item</html:td>
 </html:tr>


  
 <html:tr>
  <html:td style="white-space:nowrap">
   <html:code><![CDATA[ #{...}]]></html:code>
  </html:td>
  <html:td>typesets the content in (inline) math mode using <fr:tex display="inline"><![CDATA[\KaTeX ]]></fr:tex>; note that math mode is idempotent in <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link></html:td>
 </html:tr>

  
 <html:tr>
  <html:td style="white-space:nowrap">
   <html:code><![CDATA[ ##{...}]]></html:code>
  </html:td>
  <html:td>typesets the content in (display) math mode using <fr:tex display="inline"><![CDATA[\KaTeX ]]></fr:tex></html:td>
 </html:tr>

  
 <html:tr>
  <html:td style="white-space:nowrap">
   <html:code><![CDATA[\transclude{address}]]></html:code>
  </html:td>
  <html:td><fr:link href="/007L/" title="Bottom-up hierarchy via transclusion" uri="https://www.forester-notes.org/007L/" display-uri="007L" type="local">transcludes</fr:link> the <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">tree</fr:link> at address <html:code>address</html:code> as a subsection</html:td>
 </html:tr>

  
 <html:tr>
  <html:td style="white-space:nowrap">
   <html:code><![CDATA[[title](address)]]></html:code>
  </html:td>
  <html:td>
    formats the text <html:code>title</html:code> as a hyperlink to address <html:code>address</html:code>; if <html:code>address</html:code> is the address of a <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">tree</fr:link>, the link will point to that tree, and otherwise it is treated as a URL
  </html:td>
 </html:tr>

  
 <html:tr>
  <html:td style="white-space:nowrap">
   <html:code><![CDATA[\let\ident[x][y]{body}]]></html:code>
  </html:td>
  <html:td>
    defines a local function named <html:code><![CDATA[\ident]]></html:code> with two arguments; subsequently, the expression <html:code><![CDATA[\ident{u}{v}]]></html:code> would expand to <html:code>body</html:code> with the values of <html:code>u,v</html:code> substituted for <html:code><![CDATA[\x,\y]]></html:code>.
  </html:td>
 </html:tr>

  
 <html:tr>
  <html:td style="white-space:nowrap">
   <html:code><![CDATA[\code{...}]]></html:code>
  </html:td>
  <html:td>typesets the content in monospace</html:td>
 </html:tr>

  
 <html:tr>
  <html:td style="white-space:nowrap">
   <html:code><![CDATA[\tex{preamble}{body}]]></html:code>
  </html:td>
  <html:td>typesets the <html:code>body</html:code> externally using <fr:tex display="inline"><![CDATA[\LaTeX ]]></fr:tex> using <html:code>preamble</html:code> as preamble code (e.g. to set up tikz packages, etc.). It can be useful to wrap this in your own macro in order to insert your preamble code automatically.</html:td>
 </html:tr>

</html:table>
</fr:mainmatter>
                    </fr:tree>
                    <fr:tree show-metadata="false">
                      <fr:frontmatter>
                        <fr:authors>
                          <fr:author>
                            <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
                          </fr:author>
                        </fr:authors>
                        <fr:date>
                          <fr:year>2023</fr:year>
                          <fr:month>8</fr:month>
                          <fr:day>16</fr:day>
                        </fr:date>
                        <fr:uri>https://www.forester-notes.org/007Q/</fr:uri>
                        <fr:display-uri>007Q</fr:display-uri>
                        <fr:route>/007Q/</fr:route>
                        <fr:title text="An complete worked example tree in Forester">An complete worked example <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">tree</fr:link> in <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link></fr:title>
                        <fr:taxon>Example</fr:taxon>
                      </fr:frontmatter>
                      <fr:mainmatter>
                        <html:p>An example of a complete <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">tree</fr:link> in the <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> markup language can be seen below.</html:p>
                        <html:pre><![CDATA[\title{Creation of (co)limits}
\date{2023-02-11}
\taxon{Definition}
\author{jonmsterling}

\def\CCat{#{\mathcal{C}}}
\def\DCat{#{\mathcal{D}}}
\def\ICat{#{\mathcal{I}}}
\def\Mor[arg1][arg2][arg3]{#{{\arg2}\xrightarrow{\arg1}{\arg3}}}

\p{Let \Mor{U}{\CCat}{\DCat} be a functor and let \ICat be a category. The functor #{U} is said to \em{create (co)limits of #{\ICat}-figures} when for any diagram \Mor{C_\bullet}{\ICat}{\CCat} such that #{\ICat\xrightarrow{C_\bullet}\CCat\xrightarrow{F}\DCat} has a (co)limit, then #{C_\bullet} has a (co)limit that is both preserved and reflected by #{F}.}]]></html:pre>
                        <html:p>The code above results in the following tree:</html:p>
                        <fr:tree show-metadata="true" toc="false">
                          <fr:frontmatter>
                            <fr:authors>
                              <fr:author>
                                <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
                              </fr:author>
                            </fr:authors>
                            <fr:date>
                              <fr:year>2023</fr:year>
                              <fr:month>2</fr:month>
                              <fr:day>11</fr:day>
                            </fr:date>
                            <fr:uri>https://www.forester-notes.org/001H/</fr:uri>
                            <fr:display-uri>001H</fr:display-uri>
                            <fr:route>/001H/</fr:route>
                            <fr:title text="Creation of (co)limits">Creation of (co)limits</fr:title>
                            <fr:taxon>Definition</fr:taxon>
                          </fr:frontmatter>
                          <fr:mainmatter>
                            <html:p>Let <fr:tex display="inline"><![CDATA[{\mathcal {C}}\xrightarrow {U}{\mathcal {D}}]]></fr:tex> be a functor and let <fr:tex display="inline"><![CDATA[\mathcal {I}]]></fr:tex> be a category. The functor <fr:tex display="inline"><![CDATA[U]]></fr:tex> is said to <html:em>create (co)limits of <fr:tex display="inline"><![CDATA[\mathcal {I}]]></fr:tex>-figures</html:em> when for any diagram <fr:tex display="inline"><![CDATA[{\mathcal {I}}\xrightarrow {C_\bullet }{\mathcal {C}}]]></fr:tex> such that <fr:tex display="inline"><![CDATA[\mathcal {I}\xrightarrow {C_\bullet }\mathcal {C}\xrightarrow {F}\mathcal {D}]]></fr:tex> has a (co)limit, then <fr:tex display="inline"><![CDATA[C_\bullet ]]></fr:tex> has a (co)limit that is both preserved and reflected by <fr:tex display="inline"><![CDATA[F]]></fr:tex>.</html:p>
                          </fr:mainmatter>
                        </fr:tree>
                      </fr:mainmatter>
                    </fr:tree>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2023</fr:year>
                      <fr:month>8</fr:month>
                      <fr:day>16</fr:day>
                    </fr:date>
                    <fr:uri>https://www.forester-notes.org/007R/</fr:uri>
                    <fr:display-uri>007R</fr:display-uri>
                    <fr:route>/007R/</fr:route>
                    <fr:title text="Deploying your forest to a web host">Deploying your <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link> to a web host</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>Now that you have <fr:link href="/006X/" title="Setting up your forest from the template" uri="https://www.forester-notes.org/006X/" display-uri="006X" type="local">created your <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link></fr:link> and <fr:link href="/007K/" title="Creating your personal biographical tree" uri="https://www.forester-notes.org/007K/" display-uri="007K" type="local">added a few</fr:link> <fr:link href="/007H/" title="Creating a new tree using forester new" uri="https://www.forester-notes.org/007H/" display-uri="007H" type="local"><fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">trees</fr:link> of your own</fr:link>, it is time to upload it to your web host. Many users of <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> will have university-supplied static web hosting, and others may prefer to use GitHub pages; deploying a <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link> works the same way in either case.</html:p>
                    <html:ol><html:li>First, make sure your <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link> is built using <fr:link href="/007D/" title="Building and viewing your forest for the first time" uri="https://www.forester-notes.org/007D/" display-uri="007D" type="local">the earlier instructions</fr:link>.</html:li>
  <html:li>Then take the entire contents of your <html:code>output</html:code> directory and upload them to your preferred web host.</html:li></html:ol>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2023</fr:year>
                      <fr:month>8</fr:month>
                      <fr:day>16</fr:day>
                    </fr:date>
                    <fr:uri>https://www.forester-notes.org/007S/</fr:uri>
                    <fr:display-uri>007S</fr:display-uri>
                    <fr:route>/007S/</fr:route>
                    <fr:title text="Let a hundred forests bloom!">Let a hundred <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forests</fr:link> bloom!</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>I am eager to see the new <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forests</fr:link> that people create using <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link>. I am happy to offer personal assistance via the <fr:link href="https://lists.sr.ht/~jonsterling/forester-discuss" type="external">mailing list</fr:link>.</html:p>
                    <html:p>Many aspects of <fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> are in flux and not fully documented; it will often be instructive to consult the source of existings <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forests</fr:link>, such as <fr:link href="https://git.sr.ht/~jonsterling/forester-notes.org" type="external">this one</fr:link>.</html:p>
                    <html:p>Have fun, and be sure to send me links to your <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forests</fr:link> when you have made them!</html:p>
                  </fr:mainmatter>
                </fr:tree>
              </fr:mainmatter>
            </fr:tree>
          </fr:mainmatter>
        </fr:tree>
        <fr:tree show-metadata="true" expanded="false" toc="false" numbered="false">
          <fr:frontmatter>
            <fr:authors />
            <fr:uri>https://www.forester-notes.org/jonmsterling/</fr:uri>
            <fr:display-uri>jonmsterling</fr:display-uri>
            <fr:route>/jonmsterling/</fr:route>
            <fr:title text="Jon Sterling">Jon Sterling</fr:title>
            <fr:taxon>Person</fr:taxon>
            <fr:meta name="external">https://www.jonmsterling.com/</fr:meta>
            <fr:meta name="institution">University of Cambridge</fr:meta>
            <fr:meta name="orcid">0000-0002-0585-5564</fr:meta>
            <fr:meta name="position">Associate Professor</fr:meta>
          </fr:frontmatter>
          <fr:mainmatter />
        </fr:tree>
        <fr:tree show-metadata="true" expanded="false" toc="false" numbered="false">
          <fr:frontmatter>
            <fr:authors />
            <fr:uri>https://www.forester-notes.org/kentookura/</fr:uri>
            <fr:display-uri>kentookura</fr:display-uri>
            <fr:route>/kentookura/</fr:route>
            <fr:title text="Kento Okura">Kento Okura</fr:title>
            <fr:taxon>Person</fr:taxon>
            <fr:meta name="external">https://github.com/kentookura</fr:meta>
          </fr:frontmatter>
          <fr:mainmatter />
        </fr:tree>
        <fr:tree show-metadata="true" expanded="false" toc="false" numbered="false">
          <fr:frontmatter>
            <fr:authors>
              <fr:author>
                <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
              </fr:author>
            </fr:authors>
            <fr:date>
              <fr:year>2023</fr:year>
              <fr:month>6</fr:month>
              <fr:day>20</fr:day>
            </fr:date>
            <fr:uri>https://www.forester-notes.org/0065/</fr:uri>
            <fr:display-uri>0065</fr:display-uri>
            <fr:route>/0065/</fr:route>
            <fr:title text="Forester › Project information"><fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> › Project information</fr:title>
          </fr:frontmatter>
          <fr:mainmatter>
  <html:table>
  
  
  <html:tr>
    
  <html:td><html:strong>code forge:</html:strong></html:td>

    
  <html:td>
    <fr:link href="https://sr.ht/~jonsterling/forester/" type="external">sr.ht/~jonsterling/forester</fr:link>
  </html:td>

  </html:tr>


  
  
  <html:tr>
    
  <html:td><html:strong>ticket tracker:</html:strong></html:td>

    
  <html:td>
    <fr:link href="https://todo.sr.ht/~jonsterling/forester" type="external">todo.sr.ht/~jonsterling/forester</fr:link>
  </html:td>

  </html:tr>


  
  
  <html:tr>
    
  <html:td><html:strong>mailing lists:</html:strong></html:td>

    
  <html:td>
    <fr:link href="https://sr.ht/~jonsterling/forester/lists" type="external">sr.ht/~jonsterling/forester/lists</fr:link>
  </html:td>

  </html:tr>


  
  
  <html:tr>
    
  <html:td><html:strong>opam package:</html:strong></html:td>

    
  <html:td>
    <fr:link href="https://ocaml.org/p/forester/latest" type="external">ocaml.org/p/forester</fr:link>
  </html:td>

  </html:tr>


  
  
  <html:tr>
    
  <html:td><html:strong>tutorial:</html:strong></html:td>

    
  <html:td>
    <fr:link href="/0052/" title="Build your own Stacks Project in 10 minutes" uri="https://www.forester-notes.org/0052/" display-uri="0052" type="local">How to create your own Stacks Project in 10 minutes</fr:link>
  </html:td>

  </html:tr>


</html:table>
</fr:mainmatter>
        </fr:tree>
        <fr:tree show-metadata="true" expanded="false" toc="false" numbered="false">
          <fr:frontmatter>
            <fr:authors>
              <fr:author>
                <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link>
              </fr:author>
              <fr:contributor>
                <fr:link href="/armaëlguéneau/" title="Armaël Guéneau" uri="https://www.forester-notes.org/armaëlguéneau/" display-uri="armaëlguéneau" type="local">Armaël Guéneau</fr:link>
              </fr:contributor>
              <fr:contributor>
                <fr:link href="/jinserkafka/" title="Jinser Kafka" uri="https://www.forester-notes.org/jinserkafka/" display-uri="jinserkafka" type="local">Jinser Kafka</fr:link>
              </fr:contributor>
              <fr:contributor>
                <fr:link href="/kentookura/" title="Kento Okura" uri="https://www.forester-notes.org/kentookura/" display-uri="kentookura" type="local">Kento Okura</fr:link>
              </fr:contributor>
              <fr:contributor>
                <fr:link href="/favonia/" title="Kuen-Bang Hou (Favonia)" uri="https://www.forester-notes.org/favonia/" display-uri="favonia" type="local">Kuen-Bang Hou (Favonia)</fr:link>
              </fr:contributor>
              <fr:contributor>
                <fr:link href="/dannypsnl/" title="Lîm Tsú-thuàn" uri="https://www.forester-notes.org/dannypsnl/" display-uri="dannypsnl" type="local">Lîm Tsú-thuàn</fr:link>
              </fr:contributor>
              <fr:contributor>
                <fr:link href="/nickhu/" title="Nick Hu" uri="https://www.forester-notes.org/nickhu/" display-uri="nickhu" type="local">Nick Hu</fr:link>
              </fr:contributor>
              <fr:contributor>
                <fr:link href="/owenlynch/" title="Owen Lynch" uri="https://www.forester-notes.org/owenlynch/" display-uri="owenlynch" type="local">Owen Lynch</fr:link>
              </fr:contributor>
              <fr:contributor>
                <fr:link href="/patricknicodemus/" title="Patrick Nicodemus" uri="https://www.forester-notes.org/patricknicodemus/" display-uri="patricknicodemus" type="local">Patrick Nicodemus</fr:link>
              </fr:contributor>
              <fr:contributor>
                <fr:link href="/rileyshahar/" title="Riley Shahar" uri="https://www.forester-notes.org/rileyshahar/" display-uri="rileyshahar" type="local">Riley Shahar</fr:link>
              </fr:contributor>
              <fr:contributor>
                <fr:link href="/treborhuang/" title="Trebor Huang" uri="https://www.forester-notes.org/treborhuang/" display-uri="treborhuang" type="local">Trebor Huang</fr:link>
              </fr:contributor>
            </fr:authors>
            <fr:date>
              <fr:year>2023</fr:year>
              <fr:month>6</fr:month>
              <fr:day>1</fr:day>
            </fr:date>
            <fr:uri>https://www.forester-notes.org/005P/</fr:uri>
            <fr:display-uri>005P</fr:display-uri>
            <fr:route>/005P/</fr:route>
            <fr:title text="Forester › Release notes"><fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> › Release notes</fr:title>
          </fr:frontmatter>
          <fr:mainmatter><html:p>A tool for tending <fr:link href="/tfmt-000V/" title="Forests of evergreen notes" uri="https://www.forester-notes.org/tfmt-000V/" display-uri="tfmt-000V" type="local">forests of evergreen notes</fr:link>.</html:p><fr:tree show-metadata="false" numbered="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link></fr:author></fr:authors><fr:date><fr:year>2023</fr:year><fr:month>6</fr:month><fr:day>20</fr:day></fr:date><fr:uri>https://www.forester-notes.org/0065/</fr:uri><fr:display-uri>0065</fr:display-uri><fr:route>/0065/</fr:route><fr:title text="Forester › Project information"><fr:link href="/index/" title="Forester" uri="https://www.forester-notes.org/index/" display-uri="index" type="local">Forester</fr:link> › Project information</fr:title></fr:frontmatter><fr:mainmatter>
  <html:table>
  
  
  <html:tr>
    
  <html:td><html:strong>code forge:</html:strong></html:td>

    
  <html:td>
    <fr:link href="https://sr.ht/~jonsterling/forester/" type="external">sr.ht/~jonsterling/forester</fr:link>
  </html:td>

  </html:tr>


  
  
  <html:tr>
    
  <html:td><html:strong>ticket tracker:</html:strong></html:td>

    
  <html:td>
    <fr:link href="https://todo.sr.ht/~jonsterling/forester" type="external">todo.sr.ht/~jonsterling/forester</fr:link>
  </html:td>

  </html:tr>


  
  
  <html:tr>
    
  <html:td><html:strong>mailing lists:</html:strong></html:td>

    
  <html:td>
    <fr:link href="https://sr.ht/~jonsterling/forester/lists" type="external">sr.ht/~jonsterling/forester/lists</fr:link>
  </html:td>

  </html:tr>


  
  
  <html:tr>
    
  <html:td><html:strong>opam package:</html:strong></html:td>

    
  <html:td>
    <fr:link href="https://ocaml.org/p/forester/latest" type="external">ocaml.org/p/forester</fr:link>
  </html:td>

  </html:tr>


  
  
  <html:tr>
    
  <html:td><html:strong>tutorial:</html:strong></html:td>

    
  <html:td>
    <fr:link href="/0052/" title="Build your own Stacks Project in 10 minutes" uri="https://www.forester-notes.org/0052/" display-uri="0052" type="local">How to create your own Stacks Project in 10 minutes</fr:link>
  </html:td>

  </html:tr>


</html:table>
</fr:mainmatter></fr:tree>
  <html:hr />
<fr:tree show-metadata="true" numbered="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/kentookura/" title="Kento Okura" uri="https://www.forester-notes.org/kentookura/" display-uri="kentookura" type="local">Kento Okura</fr:link></fr:author></fr:authors><fr:date><fr:year>2026</fr:year><fr:month>2</fr:month><fr:day>12</fr:day></fr:date><fr:uri>https://www.forester-notes.org/VNQB/</fr:uri><fr:display-uri>VNQB</fr:display-uri><fr:route>/VNQB/</fr:route><fr:title text="Forester 6.0">Forester 6.0</fr:title><fr:taxon>Release</fr:taxon></fr:frontmatter><fr:mainmatter><html:p>We thank <fr:link href="https://tarides.com/" type="external">Tarides</fr:link> and the <fr:link href="https://ocaml-sf.org/" type="external">OCaml Software Foundation</fr:link> for their financial support enabling this release.</html:p></fr:mainmatter></fr:tree><fr:tree show-metadata="true" expanded="false" numbered="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link></fr:author><fr:author><fr:link href="/kentookura/" title="Kento Okura" uri="https://www.forester-notes.org/kentookura/" display-uri="kentookura" type="local">Kento Okura</fr:link></fr:author></fr:authors><fr:date><fr:year>2024</fr:year><fr:month>10</fr:month><fr:day>20</fr:day></fr:date><fr:uri>https://www.forester-notes.org/011P/</fr:uri><fr:display-uri>011P</fr:display-uri><fr:route>/011P/</fr:route><fr:title text="Forester 5.0">Forester 5.0</fr:title><fr:taxon>Release</fr:taxon></fr:frontmatter><fr:mainmatter><html:p>This is a major release of Forester that includes many changes under the hood, as well as breaking changes that will require manual adjustments to existing forests. We are sorry for the frustration that these changes may cause to existing users, but we strongly believe that this is necessary for Forester to reach its potential as a tool that enhances rather than replaces the World Wide Web; we also strongly believe that these changes will make Forester more useful for existing users as well as the next thousand users.</html:p><html:p>Our thanks to <fr:link href="/owenlynch/" title="Owen Lynch" uri="https://www.forester-notes.org/owenlynch/" display-uri="owenlynch" type="local">Owen Lynch</fr:link>, <fr:link href="https://davidad.org/" type="external">davidad</fr:link>, and <fr:link href="/anilmadhavapeddy/" title="Anil Madhavapeddy" uri="https://www.forester-notes.org/anilmadhavapeddy/" display-uri="anilmadhavapeddy" type="local">Anil Madhavapeddy</fr:link> for conversations leading to the design of this release. We are grateful to <fr:link href="https://www.aria.org.uk/opportunity-spaces/mathematics-for-safe-ai/safeguarded-ai/" type="external">ARIA’s Safeguarded AI</fr:link> initiative for helping us get to 5.0.</html:p><html:p>Many of the changes included here are meant to support the future of Forester as an authoring tool for a new kind of <html:em>Internet of Science</html:em> that will enable the federation of many different forests by extending existing protocols with new hypermedia controls for content transclusion applicable to scientific authoring.</html:p><fr:tree show-metadata="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link></fr:author><fr:author><fr:link href="/kentookura/" title="Kento Okura" uri="https://www.forester-notes.org/kentookura/" display-uri="kentookura" type="local">Kento Okura</fr:link></fr:author></fr:authors><fr:date><fr:year>2024</fr:year><fr:month>10</fr:month><fr:day>20</fr:day></fr:date><fr:uri>https://www.forester-notes.org/0126/</fr:uri><fr:display-uri>0126</fr:display-uri><fr:route>/0126/</fr:route><fr:title text="Tl;dr: migration guide">Tl;dr: migration guide</fr:title></fr:frontmatter><fr:mainmatter><html:p>To migrate your forest to <fr:link href="/011P/" title="Forester 5.0" uri="https://www.forester-notes.org/011P/" display-uri="011P" type="local">Forester 5.0</fr:link>, do the following:</html:p><html:ol><html:li>Update your configuration file (<fr:link href="/0125/" title="Forester 5.0 › Changes to forest.toml format" uri="https://www.forester-notes.org/0125/" display-uri="0125" type="local">§ <fr:contextual-number uri="https://www.forester-notes.org/0125/" display-uri="0125" /></fr:link>).</html:li>
  <html:li>Take into account changes to the source language (<fr:link href="/OYOT/" title="Forester 5.0 › Simplifications to the source language" uri="https://www.forester-notes.org/OYOT/" display-uri="OYOT" type="local">§ <fr:contextual-number uri="https://www.forester-notes.org/OYOT/" display-uri="OYOT" /></fr:link>).</html:li>
  <html:li>Any <html:code><![CDATA[\author]]></html:code> or <html:code><![CDATA[\contributor]]></html:code> attributions must take a tree address as their argument; when you wish to attribute a resource to a person who is not represented by a tree, you can use <html:code><![CDATA[\author/literal{Somebody’s Name}]]></html:code> or <html:code><![CDATA[\contributor/literal{Somebody’s Name}]]></html:code> (see <fr:link href="/012N/" title="Forester 5.0 › Changes to attribution links" uri="https://www.forester-notes.org/012N/" display-uri="012N" type="local">§ <fr:contextual-number uri="https://www.forester-notes.org/012N/" display-uri="012N" /></fr:link>).</html:li>
  <html:li>Rewrite any queries to use the new datalog engine (see <fr:link href="/013A/" title="Forester 5.0 › New datalog-based query engine" uri="https://www.forester-notes.org/013A/" display-uri="013A" type="local">§ <fr:contextual-number uri="https://www.forester-notes.org/013A/" display-uri="013A" /></fr:link>), as the legacy query engine has been removed.</html:li>
  <html:li>Take into account the renaming of several built-in relations (see <fr:link href="/013C/" title="Forester 5.0 › New datalog-based query engine › Renamed built-in relations" uri="https://www.forester-notes.org/013C/" display-uri="013C" type="local">§ <fr:contextual-number uri="https://www.forester-notes.org/013C/" display-uri="013C" /></fr:link>).</html:li>
  <html:li>View your forest locally using an HTTP server rather than directly through the file system (see <fr:link href="/VNQ8/" title="Forester 5.0 › Changes to how forests are viewed locally and deployed" uri="https://www.forester-notes.org/VNQ8/" display-uri="VNQ8" type="local">§ <fr:contextual-number uri="https://www.forester-notes.org/VNQ8/" display-uri="VNQ8" /></fr:link>).</html:li>
  <html:li>Begin dialing back your use of custom XML stylesheets (see <fr:link href="/0127/" title="Forester 5.0 › The future of Forester’s XML format" uri="https://www.forester-notes.org/0127/" display-uri="0127" type="local">§ <fr:contextual-number uri="https://www.forester-notes.org/0127/" display-uri="0127" /></fr:link>). It is possible that support for customisation at this level will be removed in a future release; if you have innovative customisations that are very important for your use of Forester, consider discussing them on the <fr:link href="mailto:~jonsterling/forester-discuss@lists.sr.ht" type="external">mailing list</fr:link> so that maintainers can better understand the problems you are solving.</html:li></html:ol></fr:mainmatter></fr:tree><fr:tree show-metadata="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link></fr:author><fr:author><fr:link href="/kentookura/" title="Kento Okura" uri="https://www.forester-notes.org/kentookura/" display-uri="kentookura" type="local">Kento Okura</fr:link></fr:author></fr:authors><fr:date><fr:year>2024</fr:year><fr:month>10</fr:month><fr:day>20</fr:day></fr:date><fr:uri>https://www.forester-notes.org/0SOW/</fr:uri><fr:display-uri>0SOW</fr:display-uri><fr:route>/0SOW/</fr:route><fr:title text="An implementation of the language server protocol">An implementation of the <fr:link href="https://microsoft.github.io/language-server-protocol" type="external">language server protocol</fr:link></fr:title></fr:frontmatter><fr:mainmatter><html:p>Forester now ships with an implementation of the <fr:link href="https://microsoft.github.io/language-server-protocol" type="external">language server protocol</fr:link>. See <fr:link href="/MZSF/" title="The Forester language server" uri="https://www.forester-notes.org/MZSF/" display-uri="MZSF" type="local">our documentation</fr:link> for more information and configuration examples for various editors. Its status is still experimental. If you encounter crashes or other issues, please let the us know by <fr:link href="https://todo.sr.ht/~jonsterling/forester" type="external">opening an issue</fr:link> or by writing to the <fr:link href="mailto:~jonsterling/forester-discuss@lists.sr.ht" type="external">mailing list</fr:link></html:p></fr:mainmatter></fr:tree><fr:tree show-metadata="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link></fr:author><fr:author><fr:link href="/kentookura/" title="Kento Okura" uri="https://www.forester-notes.org/kentookura/" display-uri="kentookura" type="local">Kento Okura</fr:link></fr:author></fr:authors><fr:date><fr:year>2024</fr:year><fr:month>10</fr:month><fr:day>20</fr:day></fr:date><fr:uri>https://www.forester-notes.org/0125/</fr:uri><fr:display-uri>0125</fr:display-uri><fr:route>/0125/</fr:route><fr:title text="Changes to forest.toml format">Changes to <html:code>forest.toml</html:code> format</fr:title></fr:frontmatter><fr:mainmatter><html:p>Several changes have been made to the <html:code>forest.toml</html:code> configuration format.</html:p><html:ol><html:li><html:code>forest.root</html:code> is renamed to <html:code>forest.home</html:code>.</html:li>
  <html:li>The <html:code>forest.theme</html:code> key has been removed; from now on, your theme must be located in the <html:code>theme</html:code> directory.</html:li>
  <html:li>A new field <html:code>forest.foreign</html:code> has been added; this is the entry-point for the experimental forest syndication feature discussed in <fr:link href="/30FN/" title="Forester 5.0 › Publishing and implanting forests" uri="https://www.forester-notes.org/30FN/" display-uri="30FN" type="local">§ <fr:contextual-number uri="https://www.forester-notes.org/30FN/" display-uri="30FN" /></fr:link>.</html:li></html:ol></fr:mainmatter></fr:tree><fr:tree show-metadata="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link></fr:author><fr:author><fr:link href="/kentookura/" title="Kento Okura" uri="https://www.forester-notes.org/kentookura/" display-uri="kentookura" type="local">Kento Okura</fr:link></fr:author></fr:authors><fr:date><fr:year>2024</fr:year><fr:month>10</fr:month><fr:day>20</fr:day></fr:date><fr:uri>https://www.forester-notes.org/011Q/</fr:uri><fr:display-uri>011Q</fr:display-uri><fr:route>/011Q/</fr:route><fr:title text="Canonical URLs for tree addresses">Canonical URLs for tree addresses</fr:title></fr:frontmatter><fr:mainmatter><html:p>Up until this release, Forester’s trees were addressed by short strings — which, by convention, might be of the form <html:code>xxx-NNNN</html:code> or <html:code>NNNN</html:code> or some arbitrary string like <html:code>sterling-2021-thesis</html:code>. In order to prepare for the future in which multiple forests can be glued together, we replace Forester’s short names with fully qualified URLs that point to the location on the World Wide Web where a given tree would be published (if you choose to publish it). By default, all local trees will be resolved against <html:code>http://forest.local/</html:code>, which you should change if you choose to publish your forest on the Web. In your <html:code>forest.toml</html:code> configuration, first set a base URL for your forest like the following:</html:p><html:pre><![CDATA[[forest]
url = "https://www.forester-notes.com/"]]></html:pre><html:p>Within this forest, a tree named <html:code>foo</html:code> is then associated to the canonical URL <html:code>https://www.forester-notes.com/foo/</html:code>. Forester’s renderer will produce the correct directory structure so that if you were to upload the contents of the <html:code>output</html:code> directory to <html:code>https://www.forester-notes.com/</html:code>, a link to <html:code>https://www.forester-notes.com/foo/</html:code> would bring you to the <html:code>foo</html:code> tree.</html:p><html:p>Hyperlinks in Forester source code to trees within your own forest will automatically expand the short name <html:code>foo</html:code> to the canonical URL <html:code>https://www.forester-notes.com/foo/</html:code>. Canonical URLs are used as vertices in the <fr:link href="/013A/" title="Forester 5.0 › New datalog-based query engine" uri="https://www.forester-notes.org/013A/" display-uri="013A" type="local">graph</fr:link>.</html:p><fr:tree show-metadata="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link></fr:author><fr:author><fr:link href="/kentookura/" title="Kento Okura" uri="https://www.forester-notes.org/kentookura/" display-uri="kentookura" type="local">Kento Okura</fr:link></fr:author></fr:authors><fr:date><fr:year>2024</fr:year><fr:month>10</fr:month><fr:day>20</fr:day></fr:date><fr:uri>https://www.forester-notes.org/011R/</fr:uri><fr:display-uri>011R</fr:display-uri><fr:route>/011R/</fr:route><fr:title text="What do we mean by “URL”?">What do we mean by “URL”?</fr:title></fr:frontmatter><fr:mainmatter><html:p>Today, “URLs” are a mostly implementation-defined concept that can only be understood by looking at the source code of major web browsers; in the future, this may congeal into an actual standard but today is not that day (nor is tomorrow, if the state of the <fr:link href="https://url.spec.whatwg.org/" type="external"><html:code>whatwg/url</html:code> “living” [non-]standard</fr:link> is any indication). It is best to think of Forester’s approach to URLs as provisional and subject to evolution as the Web continues to mature.</html:p></fr:mainmatter></fr:tree></fr:mainmatter></fr:tree><fr:tree show-metadata="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link></fr:author><fr:author><fr:link href="/kentookura/" title="Kento Okura" uri="https://www.forester-notes.org/kentookura/" display-uri="kentookura" type="local">Kento Okura</fr:link></fr:author></fr:authors><fr:date><fr:year>2024</fr:year><fr:month>10</fr:month><fr:day>20</fr:day></fr:date><fr:uri>https://www.forester-notes.org/OYOT/</fr:uri><fr:display-uri>OYOT</fr:display-uri><fr:route>/OYOT/</fr:route><fr:title text="Simplifications to the source language">Simplifications to the source language</fr:title></fr:frontmatter><fr:mainmatter><fr:tree show-metadata="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link></fr:author><fr:author><fr:link href="/kentookura/" title="Kento Okura" uri="https://www.forester-notes.org/kentookura/" display-uri="kentookura" type="local">Kento Okura</fr:link></fr:author></fr:authors><fr:date><fr:year>2024</fr:year><fr:month>10</fr:month><fr:day>20</fr:day></fr:date><fr:uri>https://www.forester-notes.org/OYOU/</fr:uri><fr:display-uri>OYOU</fr:display-uri><fr:route>/OYOU/</fr:route><fr:title text="Removal of imports within subtrees">Removal of imports within subtrees</fr:title></fr:frontmatter><fr:mainmatter><html:p>It is no longer permitted to have an <html:code><![CDATA[\import]]></html:code> declaration within a subtree: these can occur only at the top level of a file and therefore have file-level scope.</html:p></fr:mainmatter></fr:tree><fr:tree show-metadata="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link></fr:author><fr:author><fr:link href="/kentookura/" title="Kento Okura" uri="https://www.forester-notes.org/kentookura/" display-uri="kentookura" type="local">Kento Okura</fr:link></fr:author></fr:authors><fr:date><fr:year>2024</fr:year><fr:month>10</fr:month><fr:day>20</fr:day></fr:date><fr:uri>https://www.forester-notes.org/011T/</fr:uri><fr:display-uri>011T</fr:display-uri><fr:route>/011T/</fr:route><fr:title text="Removing transclusion overrides">Removing transclusion overrides</fr:title></fr:frontmatter><fr:mainmatter><html:p>In prior versions of Forester, it was possible to override the title and the taxon of a transcluded tree using the fluid bindings <html:code><![CDATA[\transclude/title]]></html:code> and <html:code><![CDATA[\transclude/taxon]]></html:code> respectively. This feature is no longer supported in <fr:link href="/011P/" title="Forester 5.0" uri="https://www.forester-notes.org/011P/" display-uri="011P" type="local">Forester 5.0</fr:link>, and existing users are encouraged to purge their use of it prior to upgrading to <fr:link href="/011P/" title="Forester 5.0" uri="https://www.forester-notes.org/011P/" display-uri="011P" type="local">Forester 5.0</fr:link>.</html:p><html:p>In short, supporting this feature was greatly complicating the planned transition to a genuine hypermedia format; it could also be argued that it might have led to scenarios where an original author’s intentions are violated at the transclusion site.</html:p><html:p>Please note that transclusion options, such as <html:code><![CDATA[\transclude/expanded]]></html:code>, etc., are still supported.</html:p></fr:mainmatter></fr:tree><fr:tree show-metadata="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link></fr:author><fr:author><fr:link href="/kentookura/" title="Kento Okura" uri="https://www.forester-notes.org/kentookura/" display-uri="kentookura" type="local">Kento Okura</fr:link></fr:author></fr:authors><fr:date><fr:year>2024</fr:year><fr:month>10</fr:month><fr:day>20</fr:day></fr:date><fr:uri>https://www.forester-notes.org/OYOV/</fr:uri><fr:display-uri>OYOV</fr:display-uri><fr:route>/OYOV/</fr:route><fr:title text="Removal of autocapitalisation">Removal of autocapitalisation</fr:title></fr:frontmatter><fr:mainmatter><html:p>Titles and taxa will no longer be autocapitalised: this feature biases Forester toward specific languages and is annoyingly complex to maintain. Therefore, you must rename all your titles and taxa to be capitalised by hand.  This can be done in VS Code using the following regexp: replace <html:code><![CDATA[\\taxon\{([a-z])]]></html:code> with <html:code><![CDATA[\\taxon{\U$1]]></html:code>, etc.</html:p></fr:mainmatter></fr:tree><fr:tree show-metadata="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link></fr:author><fr:author><fr:link href="/kentookura/" title="Kento Okura" uri="https://www.forester-notes.org/kentookura/" display-uri="kentookura" type="local">Kento Okura</fr:link></fr:author></fr:authors><fr:date><fr:year>2024</fr:year><fr:month>10</fr:month><fr:day>20</fr:day></fr:date><fr:uri>https://www.forester-notes.org/OYOW/</fr:uri><fr:display-uri>OYOW</fr:display-uri><fr:route>/OYOW/</fr:route><fr:title text="Changes to fallthrough behaviour for undefined identifiers">Changes to fallthrough behaviour for undefined identifiers</fr:title></fr:frontmatter><fr:mainmatter><html:p>Previously, an undefined identifier like <html:code><![CDATA[\foo]]></html:code> would be emitted verbatim as text rather than raising a warning. The reasoning behind this was to smoothly support referring to existing commands in TeX-like environments (including KaTeX and embedded LaTeX). The trade-off was that authors would not receive warnings about what were in many cases typographical errors.</html:p><html:p>In Forester 5.0, the fallthrough behaviour of undefined identifiers is now restricted to code that is evaluated within a TeX-like environment (either KaTeX or embedded LaTeX). In all other cases, a warning will be emitted. This involves a trade-off, because the arguments to a macro like
  <html:pre><![CDATA[\def\my-macro[x]{#{\int_{\x}}}]]></html:pre>
  are evaluated first <html:em>outside</html:em> the math scope. Therefore, a call like <html:code><![CDATA[\int{\alpha}]]></html:code> written outside of a math scope would result in a warning. The recommended solution to this problem is to use a <html:em>lazy</html:em> argument, which will be evaluated in CBN. Here is an updated version of the macro that works uses a lazy argument:</html:p><html:pre><![CDATA[\def\my-macro[~x]{#{\int_{\x{}}}}]]></html:pre><html:p>The design is admittedly imperfect, but I believe this is an improvement as it allows us to catch more typos. I expect that the handling of undefined identifier fallthrough will continue to evolve.</html:p></fr:mainmatter></fr:tree></fr:mainmatter></fr:tree><fr:tree show-metadata="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link></fr:author><fr:author><fr:link href="/kentookura/" title="Kento Okura" uri="https://www.forester-notes.org/kentookura/" display-uri="kentookura" type="local">Kento Okura</fr:link></fr:author></fr:authors><fr:date><fr:year>2024</fr:year><fr:month>10</fr:month><fr:day>20</fr:day></fr:date><fr:uri>https://www.forester-notes.org/012N/</fr:uri><fr:display-uri>012N</fr:display-uri><fr:route>/012N/</fr:route><fr:title text="Changes to attribution links">Changes to attribution links</fr:title></fr:frontmatter><fr:mainmatter><html:p>In prior versions, the <html:code><![CDATA[\author]]></html:code> and <html:code><![CDATA[\contributor]]></html:code> command would detect whether its contents were the address of a tree; if so, it would create a wikilink to the tree and otherwise, the included text would appear directly. This feature was convenient for smoothly handling the case that an author of a given resource is not represented in the forest by a biographical tree; the downside is that it makes the assumption that at compiletime we shall know the entire contents of the forest (and, thus, whether a given address shall be bound to a tree).</html:p><html:p>To simplify the handling of author links and make it compatible with the open-world future of Forester, the behaviour is changed as follows:</html:p><html:ol><html:li>The argument to <html:code><![CDATA[\author]]></html:code> and <html:code><![CDATA[\author]]></html:code> <html:em>must</html:em> be a (possibly relative) <fr:link href="/011Q/" title="Forester 5.0 › Canonical URLs for tree addresses" uri="https://www.forester-notes.org/011Q/" display-uri="011Q" type="local">Forester URL</fr:link>. Thus, on my own forest, it would be OK to have either <html:code><![CDATA[\author{jeanbénabou}]]></html:code> or <html:code><![CDATA[\author{https://www.jonmsterling.com/jeanbénabou}]]></html:code> but it would not be OK to have <html:code><![CDATA[\author{Jean Bénabou}]]></html:code>.</html:li>
  <html:li>To make an unlinked attribution containing, use <html:code><![CDATA[\author/literal{Jean Bénabou}]]></html:code>.</html:li></html:ol></fr:mainmatter></fr:tree><fr:tree show-metadata="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link></fr:author><fr:author><fr:link href="/kentookura/" title="Kento Okura" uri="https://www.forester-notes.org/kentookura/" display-uri="kentookura" type="local">Kento Okura</fr:link></fr:author></fr:authors><fr:date><fr:year>2024</fr:year><fr:month>10</fr:month><fr:day>20</fr:day></fr:date><fr:uri>https://www.forester-notes.org/013A/</fr:uri><fr:display-uri>013A</fr:display-uri><fr:route>/013A/</fr:route><fr:title text="New datalog-based query engine">New datalog-based query engine</fr:title></fr:frontmatter><fr:mainmatter><html:p>As the query engine has evolved, it has become a bit unwieldy and misshapen. In order to prevent further churn and facilitate the long-term development and use of Forester, we are replacing the query engine and graph analysis with a more general tool: <html:em>datalog</html:em>. With this change comes the ability to introduce arbitrary relations of any arity; this is a powerful and dangerous tool, so use it wisely.</html:p><fr:tree show-metadata="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link></fr:author><fr:author><fr:link href="/kentookura/" title="Kento Okura" uri="https://www.forester-notes.org/kentookura/" display-uri="kentookura" type="local">Kento Okura</fr:link></fr:author></fr:authors><fr:date><fr:year>2024</fr:year><fr:month>10</fr:month><fr:day>20</fr:day></fr:date><fr:uri>https://www.forester-notes.org/013B/</fr:uri><fr:display-uri>013B</fr:display-uri><fr:route>/013B/</fr:route><fr:title text="On performance trade-offs">On performance trade-offs</fr:title></fr:frontmatter><fr:mainmatter><html:p>Switching to datalog makes forests that make heavy use of queries a bit slower to render. We considered this trade-off carefully, but believe that for the long-term health of Forester, this is acceptable. In the near future, Forester will render trees on demand rather than all at once (except when you are preparing a static archive for upload/deployment); in this mode of use, Forester will be faster than ever.</html:p></fr:mainmatter></fr:tree><fr:tree show-metadata="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link></fr:author><fr:author><fr:link href="/kentookura/" title="Kento Okura" uri="https://www.forester-notes.org/kentookura/" display-uri="kentookura" type="local">Kento Okura</fr:link></fr:author></fr:authors><fr:date><fr:year>2024</fr:year><fr:month>10</fr:month><fr:day>20</fr:day></fr:date><fr:uri>https://www.forester-notes.org/013C/</fr:uri><fr:display-uri>013C</fr:display-uri><fr:route>/013C/</fr:route><fr:title text="Renamed built-in relations">Renamed built-in relations</fr:title></fr:frontmatter><fr:mainmatter><html:p>Forester’s built-in binary relations have been accessible via macros like <html:code><![CDATA[\rel/authors]]></html:code>, etc. In this release, these relations are being renamed to make them more pleasant and consistent to use with datalog.</html:p><html:table>
   <html:tr>
    <html:th>Old name</html:th>
    <html:th>New name</html:th>
   </html:tr>
   
   <html:tr>
    <html:td><html:code><![CDATA[\]]>rel/tags</html:code></html:td>
    <html:td><html:code><![CDATA[\]]>rel/has-tag</html:code></html:td>
   </html:tr>
  
   
   <html:tr>
    <html:td><html:code><![CDATA[\]]>rel/taxa</html:code></html:td>
    <html:td><html:code><![CDATA[\]]>rel/has-taxon</html:code></html:td>
   </html:tr>
  
   
   <html:tr>
    <html:td><html:code><![CDATA[\]]>rel/authors</html:code></html:td>
    <html:td><html:code><![CDATA[\]]>rel/has-author</html:code></html:td>
   </html:tr>
  
   
   <html:tr>
    <html:td><html:code><![CDATA[\]]>rel/contributors</html:code></html:td>
    <html:td><html:code><![CDATA[\]]>rel/has-direct-contributor</html:code></html:td>
   </html:tr>
  
   
   <html:tr>
    <html:td><html:code><![CDATA[\]]>rel/transclusion</html:code></html:td>
    <html:td><html:code><![CDATA[\]]>rel/transcludes</html:code></html:td>
   </html:tr>
  
   
   <html:tr>
    <html:td><html:code><![CDATA[\]]>rel/links</html:code></html:td>
    <html:td><html:code><![CDATA[\]]>rel/links-to</html:code></html:td>
   </html:tr>
  
  </html:table></fr:mainmatter></fr:tree><fr:tree show-metadata="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link></fr:author><fr:author><fr:link href="/kentookura/" title="Kento Okura" uri="https://www.forester-notes.org/kentookura/" display-uri="kentookura" type="local">Kento Okura</fr:link></fr:author></fr:authors><fr:date><fr:year>2024</fr:year><fr:month>10</fr:month><fr:day>20</fr:day></fr:date><fr:uri>https://www.forester-notes.org/013D/</fr:uri><fr:display-uri>013D</fr:display-uri><fr:route>/013D/</fr:route><fr:title text="New built-in relations">New built-in relations</fr:title></fr:frontmatter><fr:mainmatter><html:p>A few new built-in relations have been added.</html:p><html:ul><html:li><html:code><![CDATA[\]]>rel/is-node ?X</html:code> is a unary relation that holds for <html:em>any</html:em> tree address <html:code>?X</html:code>. This is needed when specifying reflexive binary relations: the clause <html:code>R ?X ?X -:</html:code> is not allowed by datalog, so one must use <html:code><![CDATA[R ?X ?X -: {\rel/is-node X}]]></html:code>.</html:li>
   <html:li><html:code><![CDATA[\]]>rel/transcludes/transitive-closure</html:code> is the transitive closure of <html:code><![CDATA[\]]>rel/transcludes</html:code>.</html:li>
   <html:li><html:code><![CDATA[\]]>rel/transcludes/reflexive-transitive-closure</html:code> is the <html:em>reflexive</html:em> transitive closure of <html:code><![CDATA[\]]>rel/transcludes</html:code>.</html:li>
   <html:li><html:code><![CDATA[\]]>rel/is-reference ?X</html:code> holds when <html:code>?X</html:code> is designated as a reference/bibliographical tree. Currently, the built-in rules of the database deduce <html:code><![CDATA[\]]>rel/is-reference ?X</html:code> for any tree <html:code>?X</html:code> with taxon <html:code>Reference</html:code>. The purpose of abstracting from the taxon is to enable non-English users of Forester to benefit from the computation of bibliographies.</html:li>
   <html:li>Similarly, <html:code><![CDATA[\]]>rel/is-person ?X</html:code> holds when <html:code>?X</html:code> is designated as a personal/biographical tree. Currently, the built-in rules of the database deduce <html:code><![CDATA[\]]>rel/is-reference ?X</html:code> for any tree <html:code>?X</html:code> with taxon <html:code>Person</html:code>.</html:li>
   <html:li><html:code><![CDATA[\]]>rel/in-bundle-closure ?X ?Y</html:code> is the reflexive transitive closure of the union of the transclusion relation with the relation of <html:code>?X</html:code> requiring the asset <html:code>?Y</html:code>. The purpose of this relation is to easily bundle up fragments of a forest (see <fr:link href="/30FN/" title="Forester 5.0 › Publishing and implanting forests" uri="https://www.forester-notes.org/30FN/" display-uri="30FN" type="local">§ <fr:contextual-number uri="https://www.forester-notes.org/30FN/" display-uri="30FN" /></fr:link>).</html:li></html:ul><html:p>All of these built-in relations can be defined in Forester’s dialect of datalog; they are predefined for convenience, and because they are used in the computation of backmatter.</html:p></fr:mainmatter></fr:tree><fr:tree show-metadata="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link></fr:author><fr:author><fr:link href="/kentookura/" title="Kento Okura" uri="https://www.forester-notes.org/kentookura/" display-uri="kentookura" type="local">Kento Okura</fr:link></fr:author></fr:authors><fr:date><fr:year>2024</fr:year><fr:month>10</fr:month><fr:day>20</fr:day></fr:date><fr:uri>https://www.forester-notes.org/013E/</fr:uri><fr:display-uri>013E</fr:display-uri><fr:route>/013E/</fr:route><fr:title text="An example datalog query">An example datalog query</fr:title><fr:taxon>Example</fr:taxon></fr:frontmatter><fr:mainmatter><html:p>In order to illustrate the use of the datalog engine, I will show how to construct a query that will find all the reference trees written by <html:code>jonmsterling</html:code> that are tagged either <html:code>accepted</html:code> or <html:code>refereed</html:code>. The first thing we must do is define the smallest relation containing all trees tagged <html:code>accepted</html:code> or <html:code>refereed</html:code>; this is done by adding clauses to the database as follows.</html:p><html:p>First we define the name of a relation. In the current release, relations are global strings and there is no facility to generate a “fresh” one; that may change in the future.</html:p><html:pre><![CDATA[\let\rel/accepted-or-refereed{jonmsterling.query.bibliography.accepted-or-refereed}]]></html:pre><html:p>Next, we add two defining clauses for our relation. In what follows, <html:code><![CDATA[\datalog]]></html:code> simply delimits content that should be parsed as a datalog expression, and <html:code><![CDATA[\execute]]></html:code> instructs Forester to execute the datalog expression.</html:p><html:pre><![CDATA[\execute\datalog{
 \rel/accepted-or-refereed ?X -: {\rel/has-tag ?X '{refereed}}
}

\execute\datalog{
 \rel/accepted-or-refereed ?X -: {\rel/has-tag ?X '{accepted}}
}]]></html:pre><html:p>The left-hand side of the reversed turnstile <html:code>-:</html:code> is a proposition representing the <html:em>goal</html:em>; the right hand side is given by propositions representing the premises, each surrounded in braces and separated by whitespace. Metavariables are written with a question mark sigil. Literal content is embedded into a datalog proposition by surrounding it in <html:code>'{...}</html:code>; we will see that literal content is one kind of vertex in the graph database.</html:p><html:p>Now that we have actually defined the relation that we will use, we can run a query:</html:p><html:pre><![CDATA[\query\datalog{
 ?X -:
   {\rel/has-author ?X @{jonmsterling}}
   {\rel/is-reference ?X}
   {\rel/accepted-or-refereed ?X}
 }]]></html:pre><html:p>The structure of a query identifies the metavariable being solved behind the turnstile, and then lists the clauses that must hold. Whereas a content vertex is addressed via <html:code>'{...}</html:code>, a <fr:link href="/011Q/" title="Forester 5.0 › Canonical URLs for tree addresses" uri="https://www.forester-notes.org/011Q/" display-uri="011Q" type="local">URL vertex</fr:link> is addressed using <html:code>@{...}</html:code>.</html:p></fr:mainmatter></fr:tree></fr:mainmatter></fr:tree><fr:tree show-metadata="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link></fr:author><fr:author><fr:link href="/kentookura/" title="Kento Okura" uri="https://www.forester-notes.org/kentookura/" display-uri="kentookura" type="local">Kento Okura</fr:link></fr:author></fr:authors><fr:date><fr:year>2024</fr:year><fr:month>10</fr:month><fr:day>20</fr:day></fr:date><fr:uri>https://www.forester-notes.org/30FO/</fr:uri><fr:display-uri>30FO</fr:display-uri><fr:route>/30FO/</fr:route><fr:title text="Atom syndication support">Atom syndication support</fr:title></fr:frontmatter><fr:mainmatter><html:p>It is now possible to syndicate a given tree as an Atom feed; for example, if you have a tree for your blog and its subtrees/transclusions are your blog posts, you can include the following code to generate an Atom feed for this blog:</html:p><html:pre><![CDATA[\syndicate-current-tree-as-atom-feed]]></html:pre><html:p>If your blog is located at <html:code>https://www.my-great-forest.net/my-blog/</html:code>, then there will be an atom feed placed at <html:code>https://www.my-great-forest.net/my-blog/atom.xml</html:code>.</html:p><html:p>This feature is experimental and has some limitations.</html:p></fr:mainmatter></fr:tree><fr:tree show-metadata="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link></fr:author><fr:author><fr:link href="/kentookura/" title="Kento Okura" uri="https://www.forester-notes.org/kentookura/" display-uri="kentookura" type="local">Kento Okura</fr:link></fr:author></fr:authors><fr:date><fr:year>2024</fr:year><fr:month>10</fr:month><fr:day>20</fr:day></fr:date><fr:uri>https://www.forester-notes.org/30FN/</fr:uri><fr:display-uri>30FN</fr:display-uri><fr:route>/30FN/</fr:route><fr:title text="Publishing and implanting forests">Publishing and implanting forests</fr:title></fr:frontmatter><fr:mainmatter><html:p>Forester now includes an experimental feature to “publish” a portion of your forest to a JSON blob that can be read by Forester and implanted into another forest. For example, if you include the following code in a tree within your forest, then a file will be emitted at <html:code>output/my-forest.json</html:code> containing the compiled content of your entire forest, together with all the assets:</html:p><html:pre><![CDATA[\syndicate-query-as-json-blob{my-forest}{
 \datalog{
  ?X -: {\rel/in-host ?X '{www.my-great-forest.net}}
 }
}]]></html:pre><html:p>Of course, more sophisticated queries can be used. For example, you can emit all the items tagged <html:code>public</html:code> together as follows:</html:p><html:pre><![CDATA[\syndicate-query-as-json-blob{my-public-forest}{
 \datalog{
   ?X -: {\rel/has-tag ?Z '{public}}
 }
}]]></html:pre><html:p>To implant the resulting JSON file into another forest, simply copy over the file and add the following line to your configuration file:</html:p><html:pre><![CDATA[[forest]
foreign = [{ path = "my-public-forest.json" }]]]></html:pre><html:p>By default, implanted trees will be rendered to your output folder underneath a <html:code>foreign/</html:code> directory; if you wish to instead that links to implanted trees be routed directly to their canonical URLs (which will likely be the case if you implant a public forest), then you may configure that as follows:</html:p><html:pre><![CDATA[[forest]
foreign = [{ path = "my-public-forest.json", route_locally = false }]]]></html:pre><html:p><html:mark>This feature is highly experimental and has many limitations; it <html:em>will</html:em> change in breaking ways in the near future.</html:mark> Although we are very interested to learn about the limitations of this feature, we will be taking a hands-off approach to support until the feature has taken a more stable form.</html:p></fr:mainmatter></fr:tree><fr:tree show-metadata="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link></fr:author><fr:author><fr:link href="/kentookura/" title="Kento Okura" uri="https://www.forester-notes.org/kentookura/" display-uri="kentookura" type="local">Kento Okura</fr:link></fr:author></fr:authors><fr:date><fr:year>2024</fr:year><fr:month>10</fr:month><fr:day>20</fr:day></fr:date><fr:uri>https://www.forester-notes.org/VNQ8/</fr:uri><fr:display-uri>VNQ8</fr:display-uri><fr:route>/VNQ8/</fr:route><fr:title text="Changes to how forests are viewed locally and deployed">Changes to how forests are viewed locally and deployed</fr:title></fr:frontmatter><fr:mainmatter><html:p>In the past, Forester’s XML output used relative URLs for all links. This was tractable because the output had no directory structure, but this is increasingly becoming problematic—for example, <fr:link href="/30FN/" title="Forester 5.0 › Publishing and implanting forests" uri="https://www.forester-notes.org/30FN/" display-uri="30FN" type="local">foreign trees</fr:link> are going to be rendered to a subdirectory, but this breaks all the relative URLs. I have come to the conclusion that the only way forward is to use absolute URLs for everything, but this assumes that the output is being served from the root directory of some host. As a result, users <html:em>must</html:em> fire up an HTTP server in order to view their forest locally. With this release we will (TODO) include a built-in HTTP server, but early adopters can simply run <html:code>python3 -m http.server 8000</html:code> from the <html:code>output</html:code> directory and open <html:code>localhost:8000</html:code> in their browser.</html:p><html:p>Some users may wish to deploy their forest somewhere other than the root directory of a given (sub)domain. To achieve this and have all your links work correctly, enter the following configuration:</html:p><html:pre><![CDATA[[forest]
url = "https://www.my-great-website.net/my-subfolder/"]]></html:pre></fr:mainmatter></fr:tree><fr:tree show-metadata="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link></fr:author><fr:author><fr:link href="/kentookura/" title="Kento Okura" uri="https://www.forester-notes.org/kentookura/" display-uri="kentookura" type="local">Kento Okura</fr:link></fr:author></fr:authors><fr:date><fr:year>2024</fr:year><fr:month>10</fr:month><fr:day>20</fr:day></fr:date><fr:uri>https://www.forester-notes.org/P9BN/</fr:uri><fr:display-uri>P9BN</fr:display-uri><fr:route>/P9BN/</fr:route><fr:title text="Changes to handling of assets">Changes to handling of assets</fr:title></fr:frontmatter><fr:mainmatter><html:p>Assets in compiled forests are content-addressed by their hash; a new primitive <html:code><![CDATA[\route-asset]]></html:code> is provided for generating the correct URL of an asset that is stored in a designated <html:code>assets</html:code> directory. For example, to embed an image that is stored in <html:code>assets/images/my-great-illustration.jpg</html:code>, you would write the following code:</html:p><html:pre><![CDATA[\xmlns:html{http://www.w3.org/1999/xhtml}
\<html:img>[src]{\route-asset{assets/images/my-great-illustration.jpg}}{}]]></html:pre></fr:mainmatter></fr:tree><fr:tree show-metadata="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link></fr:author><fr:author><fr:link href="/kentookura/" title="Kento Okura" uri="https://www.forester-notes.org/kentookura/" display-uri="kentookura" type="local">Kento Okura</fr:link></fr:author></fr:authors><fr:date><fr:year>2024</fr:year><fr:month>10</fr:month><fr:day>20</fr:day></fr:date><fr:uri>https://www.forester-notes.org/0127/</fr:uri><fr:display-uri>0127</fr:display-uri><fr:route>/0127/</fr:route><fr:title text="The future of Forester’s XML format">The future of Forester’s XML format</fr:title></fr:frontmatter><fr:mainmatter><html:p>Forester currently emits archival-quality output in a custom XML format that is then interpreted using an XSLT stylesheet (as part of the <fr:link href="https://git.sr.ht/~jonsterling/forester-base-theme" type="external">“theme”</fr:link>). This format has served us well, enabling users to customise the presentation of their forests to a great degree. An added benefit of the XML format is to be able to easily convert a tree to LaTeX using another stylesheet.</html:p><html:p>However, the constantly changing XML format has been an equally frustrating source of churn for users of Forester, and I have for some time now been warning users who customise their theme that these customisations are technically possible but <html:em>not</html:em> supported (i.e. we make no promise not to break them).</html:p><html:p>The time is coming when Forester’s interaction model and output format will be changed <html:em>drastically</html:em>; rest assured that the core principles behind Forester (including the ability to generate static archival output that can be hosted anywhere) will be retained. We aim to become a better citizen of the World Wide Web by moving toward a more standard hypermedia format.</html:p><html:p>One possiblity is to extend HTML with just the hypermedia controls and embedded microformats needed for Forester’s operation. This re-coupling of presentation and data would, paradoxically, facilitate Forester to evolve more rapidly over time while simultaneously increasing the longevity of forests that have been compiled using older versions of the tool.</html:p></fr:mainmatter></fr:tree></fr:mainmatter></fr:tree><fr:tree show-metadata="true" expanded="false" numbered="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link></fr:author><fr:contributor><fr:link href="/patricknicodemus/" title="Patrick Nicodemus" uri="https://www.forester-notes.org/patricknicodemus/" display-uri="patricknicodemus" type="local">Patrick Nicodemus</fr:link></fr:contributor><fr:contributor><fr:link href="/kentookura/" title="Kento Okura" uri="https://www.forester-notes.org/kentookura/" display-uri="kentookura" type="local">Kento Okura</fr:link></fr:contributor><fr:contributor><fr:link href="/nickhu/" title="Nick Hu" uri="https://www.forester-notes.org/nickhu/" display-uri="nickhu" type="local">Nick Hu</fr:link></fr:contributor><fr:contributor><fr:link href="/owenlynch/" title="Owen Lynch" uri="https://www.forester-notes.org/owenlynch/" display-uri="owenlynch" type="local">Owen Lynch</fr:link></fr:contributor></fr:authors><fr:date><fr:year>2024</fr:year><fr:month>8</fr:month><fr:day>10</fr:day></fr:date><fr:uri>https://www.forester-notes.org/0109/</fr:uri><fr:display-uri>0109</fr:display-uri><fr:route>/0109/</fr:route><fr:title text="Forester 4.3">Forester 4.3</fr:title><fr:taxon>Release</fr:taxon></fr:frontmatter><fr:mainmatter><html:p>This is a smaller release that contains a few changes to how Forester works under the hood. As usual, you must upgrade your theme submodule to the <html:code>4.3.0</html:code> tag.</html:p><fr:tree show-metadata="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link></fr:author><fr:contributor><fr:link href="/nickhu/" title="Nick Hu" uri="https://www.forester-notes.org/nickhu/" display-uri="nickhu" type="local">Nick Hu</fr:link></fr:contributor></fr:authors><fr:date><fr:year>2024</fr:year><fr:month>8</fr:month><fr:day>10</fr:day></fr:date><fr:uri>https://www.forester-notes.org/010A/</fr:uri><fr:display-uri>010A</fr:display-uri><fr:route>/010A/</fr:route><fr:title text="Changes to external LaTeX rendering">Changes to external LaTeX rendering</fr:title></fr:frontmatter><fr:mainmatter><html:p>Previously, the <html:code><![CDATA[\tex]]></html:code> construct would generate a <html:code>.tex</html:code> file, convert it to an SVG file, and then copy it into <html:code>output/resources/</html:code>; this file would then be referenced in the resulting XML using the <html:code>&lt;forester:embeddex-tex&gt;</html:code> element, which was rendered by the theme to <html:code>&lt;html:img&gt;</html:code>.</html:p><html:p>Now, the contents of the SVG file are embedded directly into the resulting document as an <html:code>&lt;html:img&gt;</html:code> element with a base64-encoded data-url. The <html:code>&lt;forester:embedded-tex&gt;</html:code> element is no longer used.</html:p><html:p>The goal of this change is to make the output files more self-contained and less reliant on surrounding files. A downside of the present change is that it makes the output files a bit larger, as base64-encoded SVGs are not exactly small. In the future, we might instead embed the SVG code into the DOM (which could have some benefits for accessibility), but if we do this, we will have to massage the SVG output to remove duplicate <html:code>@id</html:code> attributes.</html:p></fr:mainmatter></fr:tree><fr:tree show-metadata="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link></fr:author><fr:contributor><fr:link href="/owenlynch/" title="Owen Lynch" uri="https://www.forester-notes.org/owenlynch/" display-uri="owenlynch" type="local">Owen Lynch</fr:link></fr:contributor></fr:authors><fr:date><fr:year>2024</fr:year><fr:month>8</fr:month><fr:day>10</fr:day></fr:date><fr:uri>https://www.forester-notes.org/010B/</fr:uri><fr:display-uri>010B</fr:display-uri><fr:route>/010B/</fr:route><fr:title text="Static builds for linux">Static builds for linux</fr:title></fr:frontmatter><fr:mainmatter><html:p>A <html:code>build-static-linux.sh</html:code> script has been added which can be used, in connection with Docker, to build a static binary that can be run on Linux.</html:p></fr:mainmatter></fr:tree></fr:mainmatter></fr:tree><fr:tree show-metadata="true" expanded="false" numbered="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link></fr:author><fr:contributor><fr:link href="/kentookura/" title="Kento Okura" uri="https://www.forester-notes.org/kentookura/" display-uri="kentookura" type="local">Kento Okura</fr:link></fr:contributor><fr:contributor><fr:link href="/jinserkafka/" title="Jinser Kafka" uri="https://www.forester-notes.org/jinserkafka/" display-uri="jinserkafka" type="local">Jinser Kafka</fr:link></fr:contributor></fr:authors><fr:date><fr:year>2024</fr:year><fr:month>6</fr:month><fr:day>20</fr:day></fr:date><fr:uri>https://www.forester-notes.org/00WK/</fr:uri><fr:display-uri>00WK</fr:display-uri><fr:route>/00WK/</fr:route><fr:title text="Forester 4.2">Forester 4.2</fr:title><fr:taxon>Release</fr:taxon></fr:frontmatter><fr:mainmatter><html:p>This release brings several internal changes that are meant to facilitate the further improvement of Forester, as well as some user-facing changes (most notably a <fr:link href="/00WS/" title="New query language" uri="https://www.forester-notes.org/00WS/" display-uri="00WS" type="local">new query language</fr:link>). These are breaking changes: existing queries will need to be translated, and you will need to upgrade your theme.</html:p><fr:tree show-metadata="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link></fr:author></fr:authors><fr:date><fr:year>2024</fr:year><fr:month>6</fr:month><fr:day>20</fr:day></fr:date><fr:uri>https://www.forester-notes.org/00YF/</fr:uri><fr:display-uri>00YF</fr:display-uri><fr:route>/00YF/</fr:route><fr:title text="First-class functions and lazy arguments">First-class functions and lazy arguments</fr:title></fr:frontmatter><fr:mainmatter><html:p>This release adds λ-abstraction, which can be written like so:</html:p><html:pre><![CDATA[\fun[x][y]{Hello, \x and \y}]]></html:pre><html:p>In addition, <html:em>lazy</html:em> arguments are now supported. In any place that a function argument can be bound (e.g. in <html:code><![CDATA[\def]]></html:code>, <html:code><![CDATA[\let]]></html:code>, or <html:code><![CDATA[\fun]]></html:code>), an argument marked with a tilde is automatically wrapped in a thunk when it is passed. For example, consider the following code:</html:p><html:pre><![CDATA[\def\my-fun[x][~y]{Hello, \x and \y{}!}

\p{\my-fun{foo}{bar}}]]></html:pre><html:p>In the above, the argument <html:code>x</html:code> is strict and <html:code>y</html:code> is a thunk that must be forced before being used—hence the application to <html:code>{}</html:code>; note that the results are not memoised. The code above is functionally equivalent to the following:</html:p><html:pre><![CDATA[\def\my-fun[x][y]{Hello, \x and \y{}!}

\p{\my-fun{foo}{\fun[z]{bar}}}]]></html:pre><html:p>Of course, when your code is pure, passing by name <html:em>vs.</html:em> by value does not make a difference. The purpose of this feature is, however, to enable more expressive macros that make use of fluid bindings.</html:p><fr:tree show-metadata="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link></fr:author></fr:authors><fr:date><fr:year>2024</fr:year><fr:month>6</fr:month><fr:day>20</fr:day></fr:date><fr:uri>https://www.forester-notes.org/00YG/</fr:uri><fr:display-uri>00YG</fr:display-uri><fr:route>/00YG/</fr:route><fr:title text="Combining fluid bindings and lazy arguments">Combining fluid bindings and lazy arguments</fr:title><fr:taxon>Example</fr:taxon></fr:frontmatter><fr:mainmatter><html:p><fr:link href="/00RH/" title="Forester 4.0 › Enhanced XML support" uri="https://www.forester-notes.org/00RH/" display-uri="00RH" type="local">Forester 4.0’s enhanced XML support</fr:link> makes it possible (see <fr:link href="/00RL/" title="Forester 4.0 › Enhanced XML support › Emitting XML and resolving namespaces › A worked example" uri="https://www.forester-notes.org/00RL/" display-uri="00RL" type="local">Example <fr:contextual-number uri="https://www.forester-notes.org/00RL/" display-uri="00RL" /></fr:link>) to write MathML directly as an alternative to using Forester’s TeX-like math mode via KaTeX. For example, we can write the following wrappers for some basic MathML elements:</html:p><html:pre><![CDATA[\xmlns:mml{http://www.w3.org/1998/Math/MathML}
\def\math[body]{\<mml:math>{\body}}
\def\mrow[body]{\<mml:mrow>{\body}}
\def\mi[x]{\<mml:mi>{\x}}
\def\mo[o]{\<mml:mo>{\o}}
\def\mn[n]{\<mml:mn>{\n}}]]></html:pre><html:p>With this in hand, we can write prose involving MathML content, like so:</html:p><html:pre><![CDATA[\p{Let \math{\mi{x}} and \math{\mi{y}} be integers such that \math{\mrow{\mrow{\mi{x}\mo{-}\mi{y}}\mo{=}\mn{0}}}.}]]></html:pre><html:p>The above is a bit messy. We can clean it up with some function definitions:</html:p><html:pre><![CDATA[\def\plus[x][y]{\mrow{\x \mo{+} \y}}
\def\equals[x][y]{\mrow{\x \mo{=} \y}}
\let\x{\mi{x}}
\let\y{\mi{y}}

\p{Let \math{\x} and \math{\y} be integers such that \math{\equals{\plus{\x}{\y}}{\mn{0}}}.}]]></html:pre><html:p>It is annoying that we have to always wrap things in <html:code><![CDATA[\math]]></html:code>. By combining first-class functions, lazy arguments, and fluid bindings, we can lift this requirement:</html:p><html:pre><![CDATA[% Allocate a fluid binding to hold the function that enters math mode.
\alloc\math-wrapper

% Ensure that a given (lazy) argument is evaluated inside a
% <mml:math> element.
\def\ensure-math[~body]{%
 \scope{%
  % Set a default value for \math-wrapper (no-op if already set).
  \put?\math-wrapper{\fun[x]{\<mml:math>{\x}}}%
  %
  % Apply the current function bound to \math-wrapper.
  \get\math-wrapper{%
   % Bind \math-wrapper to the identity function in the current scope so that
   % we do not get redundant <mml:math> nodes.
   \put\math-wrapper{\fun[x]{\x}}%
   %
   % Force the \body thunk to evaluate the body within the wrapper.
   \body{}%
  }%
 }%
}]]></html:pre><html:p>We now re-define our macro library to use the <html:code><![CDATA[\ensure-math]]></html:code>:</html:p><html:pre><![CDATA[\def\mrow[~x]{\ensure-math{\<mml:mrow>{\x{}}}}
\def\mi[~x]{\ensure-math{\<mml:mi>{\x{}}}}
\def\mo[~x]{\ensure-math{\<mml:mo>{\x{}}}}
\def\mn[~x]{\ensure-math{\<mml:mn>{\x{}}}}
\def\plus[~x][~y]{\mrow{\x{} \mo{+} \y{}}}
\def\equals[~x][~y]{\mrow{\x{} \mo{=} \y{}}}]]></html:pre><html:p>Now, we can put MathML content freely into prose without needing to wrap it each time.</html:p><html:pre><![CDATA[\let\x{\mi{x}}
\let\y{\mi{y}}

\p{Let \x and \y be integers such that \equals{\plus{\x}{\y}}{\mn{0}}.}]]></html:pre></fr:mainmatter></fr:tree><fr:tree show-metadata="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link></fr:author></fr:authors><fr:date><fr:year>2024</fr:year><fr:month>6</fr:month><fr:day>20</fr:day></fr:date><fr:uri>https://www.forester-notes.org/00YH/</fr:uri><fr:display-uri>00YH</fr:display-uri><fr:route>/00YH/</fr:route><fr:title text="Lazy arguments are experimental">Lazy arguments are experimental</fr:title><fr:taxon>Warning</fr:taxon></fr:frontmatter><fr:mainmatter><html:p>Please note that these features are experimental and subject to change—only build large macro libraries relying on them at your own risk.</html:p></fr:mainmatter></fr:tree></fr:mainmatter></fr:tree><fr:tree show-metadata="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link></fr:author></fr:authors><fr:date><fr:year>2024</fr:year><fr:month>6</fr:month><fr:day>20</fr:day></fr:date><fr:uri>https://www.forester-notes.org/00WS/</fr:uri><fr:display-uri>00WS</fr:display-uri><fr:route>/00WS/</fr:route><fr:title text="New query language">New query language</fr:title></fr:frontmatter><fr:mainmatter><html:p>The existing querying feature, <fr:link href="/0066/" title="Forester 2.2 › Queries" uri="https://www.forester-notes.org/0066/" display-uri="0066" type="local">introduced in Forester 2.2</fr:link>, has been replaced by something much better — at the cost of a breaking change that will require existing queries to be rewritten.</html:p><fr:tree show-metadata="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link></fr:author></fr:authors><fr:date><fr:year>2024</fr:year><fr:month>6</fr:month><fr:day>20</fr:day></fr:date><fr:uri>https://www.forester-notes.org/00WU/</fr:uri><fr:display-uri>00WU</fr:display-uri><fr:route>/00WU/</fr:route><fr:title text="New syntax for set operations">New syntax for set operations</fr:title></fr:frontmatter><fr:mainmatter><html:p>Intersections of queries are formed using a <html:em>variadic</html:em> constructor <html:code><![CDATA[\query/isect]]></html:code>. For example, the following computes the intersection of the queries <html:code>q1</html:code>, <html:code>q2</html:code>, and <html:code>q3</html:code>:</html:p><html:pre><![CDATA[\query/isect{q1}{q2}{q3}]]></html:pre><html:p>Unions of queries are formed similarly using the variadic <html:code><![CDATA[\query/union]]></html:code> constructor. The complement of a query <html:code>q</html:code> is written <html:code><![CDATA[\query/compl{q}]]></html:code>.</html:p><html:p><html:strong>Note:</html:strong> as before, to render the results of a query you must use the <html:code><![CDATA[\query]]></html:code> command; for example:</html:p><html:pre><![CDATA[\query{
 \query/isect{q1}{q2}{q3}
}]]></html:pre></fr:mainmatter></fr:tree><fr:tree show-metadata="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link></fr:author></fr:authors><fr:date><fr:year>2024</fr:year><fr:month>6</fr:month><fr:day>20</fr:day></fr:date><fr:uri>https://www.forester-notes.org/00WV/</fr:uri><fr:display-uri>00WV</fr:display-uri><fr:route>/00WV/</fr:route><fr:title text="Query operations are first-class values">Query operations are first-class values</fr:title></fr:frontmatter><fr:mainmatter><html:p>Previously, the built-in query operations were written like <html:code><![CDATA[\query/and]]></html:code>, etc.; these names, however, were hard-coded into the lexer which meant that they did not work in the expected way with Forester’s hierarchical namespacing. This hardcoding has been removed, and query operations are treated as first-class values that are resolved from primitive names in the <html:code><![CDATA[\query/]]></html:code> namespace. As such, the following code is equivalent to <html:code><![CDATA[\query/compl{\query/taxon{theorem}}]]></html:code>:</html:p><html:pre><![CDATA[\scope{
 \open\query
 \compl{\taxon{Theorem}}
}]]></html:pre><html:p>A further consequence of this change is that queries can be defined compositionally by macros.</html:p></fr:mainmatter></fr:tree><fr:tree show-metadata="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link></fr:author></fr:authors><fr:date><fr:year>2024</fr:year><fr:month>6</fr:month><fr:day>20</fr:day></fr:date><fr:uri>https://www.forester-notes.org/00WW/</fr:uri><fr:display-uri>00WW</fr:display-uri><fr:route>/00WW/</fr:route><fr:title text="Relational queries">Relational queries</fr:title></fr:frontmatter><fr:mainmatter><html:p>The most significant user-facing change to the query language is the ability to form basic <html:em>relational</html:em> queries along several <fr:link href="/00WX/" title="Built-in relation symbols" uri="https://www.forester-notes.org/00WX/" display-uri="00WX" type="local">built-in relation-symbols</fr:link>; in fact, the built-in query constructors <html:code><![CDATA[\query/taxon]]></html:code>, <html:code><![CDATA[\query/tag]]></html:code>, and <html:code><![CDATA[\query/author]]></html:code> are all expressible in these terms.</html:p><fr:tree show-metadata="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link></fr:author></fr:authors><fr:date><fr:year>2024</fr:year><fr:month>6</fr:month><fr:day>20</fr:day></fr:date><fr:uri>https://www.forester-notes.org/00WX/</fr:uri><fr:display-uri>00WX</fr:display-uri><fr:route>/00WX/</fr:route><fr:title text="Built-in relation symbols">Built-in relation symbols</fr:title></fr:frontmatter><fr:mainmatter><html:p>Forester includes several built-in relation symbols, maintained as graphs that are accumulated during evaluation:</html:p><html:ul><html:li><html:code><![CDATA[\rel/transclusion]]></html:code> contains an edge from <html:code>x</html:code> to <html:code>y</html:code> when <html:code>x</html:code> directly transcludes <html:code>y</html:code>, i.e. contains <html:code><![CDATA[\transclude{y}]]></html:code>.</html:li>
    <html:li><html:code><![CDATA[\rel/links]]></html:code> contains an edge from <html:code>x</html:code> to <html:code>y</html:code> when <html:code>x</html:code> links to <html:code>y</html:code>, i.e. contains something like <html:code><![CDATA[[...](y)]]></html:code> or <html:code><![CDATA[[[y]]]]></html:code>.</html:li>
    <html:li><html:code><![CDATA[\rel/taxa]]></html:code> contains an edge from <html:code>x</html:code> to <html:code>y</html:code> when <html:code>x</html:code> has taxon <html:code>y</html:code>, i.e. contains <html:code><![CDATA[\taxon{Y}]]></html:code>.</html:li>
    <html:li><html:code><![CDATA[\rel/tags]]></html:code> contains an edge from <html:code>x</html:code> to <html:code>y</html:code> when <html:code>x</html:code> has tag <html:code>y</html:code>, i.e. contains <html:code><![CDATA[\tag{y}]]></html:code>.</html:li>
    <html:li><html:code><![CDATA[\rel/authors]]></html:code> contains an edge from <html:code>x</html:code> to <html:code>y</html:code> when <html:code>x</html:code> has author <html:code>y</html:code>, i.e. contains <html:code><![CDATA[\author{y}]]></html:code>.</html:li>
    <html:li><html:code><![CDATA[\rel/contributors]]></html:code> contains an edge from <html:code>x</html:code> to <html:code>y</html:code> when <html:code>x</html:code> is a tree with contributor <html:code>y</html:code>, i.e. contains <html:code><![CDATA[\contributor{y}]]></html:code>.</html:li></html:ul><html:p>The implementation supports arbitrarily many relation symbols; this is not yet exposed to the user, but could in the future be employed by advanced users of Forester to support the development of sophisticated ontologies.</html:p></fr:mainmatter></fr:tree><fr:tree show-metadata="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link></fr:author></fr:authors><fr:date><fr:year>2024</fr:year><fr:month>6</fr:month><fr:day>20</fr:day></fr:date><fr:uri>https://www.forester-notes.org/00WZ/</fr:uri><fr:display-uri>00WZ</fr:display-uri><fr:route>/00WZ/</fr:route><fr:title text="Query modes and polarities">Query modes and polarities</fr:title></fr:frontmatter><fr:mainmatter><html:p>Given an address <html:code>x</html:code> and a relation symbol <html:code>r</html:code>, there are several useful queries that we might wish to make:</html:p><html:ol><html:li>We might wish to find all <html:em>incoming</html:em> edges to <html:code>x</html:code> in <html:code>r</html:code>, or we may wish to find all <html:em>outgoing</html:em> edges from <html:code>x</html:code> in <html:code>r</html:code>. We shall refer to the differenec between incoming and outgoing edges is referred to as a <html:em>polarity</html:em>.</html:li>
    <html:li>Rather than searching for edges, we may wish to search for <html:em>paths</html:em> — which corresponds to passing from a relation to its preorder reflection. We will refer to this distinction as a <html:em>mode</html:em>.</html:li></html:ol><html:p>Forester supports both polarities and modes for relational queries via the following built-in constants:</html:p><html:ol><html:li><html:code><![CDATA[\query/incoming]]></html:code> and <html:code><![CDATA[\query/outgoing]]></html:code> denote the two polarities.</html:li>
    <html:li><html:code><![CDATA[\query/edges]]></html:code> and <html:code><![CDATA[\query/paths]]></html:code> represent the two modes.</html:li></html:ol></fr:mainmatter></fr:tree><fr:tree show-metadata="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link></fr:author></fr:authors><fr:date><fr:year>2024</fr:year><fr:month>6</fr:month><fr:day>20</fr:day></fr:date><fr:uri>https://www.forester-notes.org/00WY/</fr:uri><fr:display-uri>00WY</fr:display-uri><fr:route>/00WY/</fr:route><fr:title text="The syntax of a relational query">The syntax of a relational query</fr:title></fr:frontmatter><fr:mainmatter><html:p>A relational query takes the following form:</html:p><html:pre><![CDATA[\query/rel{mode}{polarity}{relation}{addr}]]></html:pre><html:p>In the above, <html:code>mode</html:code> and <html:code>polarity</html:code> must evaluate to mode and polarity constants as in <fr:link href="/00WZ/" title="Forester 4.2 › New query language › Relational queries › Query modes and polarities" uri="https://www.forester-notes.org/00WZ/" display-uri="00WZ" type="local">§ <fr:contextual-number uri="https://www.forester-notes.org/00WZ/" display-uri="00WZ" /></fr:link>; <html:code>relation</html:code> must evaluate to a relation symbol as in <fr:link href="/00WX/" title="Forester 4.2 › New query language › Relational queries › Built-in relation symbols" uri="https://www.forester-notes.org/00WX/" display-uri="00WX" type="local">§ <fr:contextual-number uri="https://www.forester-notes.org/00WX/" display-uri="00WX" /></fr:link>.</html:p></fr:mainmatter></fr:tree><fr:tree show-metadata="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link></fr:author></fr:authors><fr:date><fr:year>2024</fr:year><fr:month>6</fr:month><fr:day>20</fr:day></fr:date><fr:uri>https://www.forester-notes.org/00X0/</fr:uri><fr:display-uri>00X0</fr:display-uri><fr:route>/00X0/</fr:route><fr:title text="Expressing built-in queries">Expressing built-in queries</fr:title><fr:taxon>Example</fr:taxon></fr:frontmatter><fr:mainmatter><html:p>The built-in basic queries can be expressed in terms of <fr:link href="/00WY/" title="Forester 4.2 › New query language › Relational queries › The syntax of a relational query" uri="https://www.forester-notes.org/00WY/" display-uri="00WY" type="local"><html:code><![CDATA[\query/rel]]></html:code></fr:link> in the following way:</html:p><html:pre><![CDATA[\def\my-query/author[x]{
 \open\query
 \rel{\edges}{\incoming}{\rel/authors}{\x}
}

\def\my-query/taxon[x]{
 \open\query
 \rel{\edges}{\incoming}{\rel/taxa}{\x}
}

\def\my-query/tag[x]{
 \open\query
 \rel{\edges}{\incoming}{\rel/tags}{\x}
}]]></html:pre></fr:mainmatter></fr:tree><fr:tree show-metadata="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link></fr:author></fr:authors><fr:date><fr:year>2024</fr:year><fr:month>6</fr:month><fr:day>20</fr:day></fr:date><fr:uri>https://www.forester-notes.org/00X2/</fr:uri><fr:display-uri>00X2</fr:display-uri><fr:route>/00X2/</fr:route><fr:title text="Querying the (back)links and context a given tree">Querying the (back)links and context a given tree</fr:title><fr:taxon>Example</fr:taxon></fr:frontmatter><fr:mainmatter><html:p>Both the backlinks and (forward) links of a given tree can be computed using a query to the <html:code><![CDATA[\rel/links]]></html:code> relation, and the context (immediate parents) of a given tree can be obatined from the <html:code><![CDATA[\query/transclusion]]></html:code> relation:</html:p><html:pre><![CDATA[\def\query/backlinks[x]{
 \open\query
 \rel{\edges}{\incoming}{\rel/links}{\x}
}

\def\query/links[x]{
 \open\query
 \rel{\edges}{\outgoing}{\rel/links}{\x}
}

\def\query/context[x]{
 \open\query
 \rel{\edges}{\incoming}{\rel/transclusion}{\x}
}]]></html:pre></fr:mainmatter></fr:tree><fr:tree show-metadata="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link></fr:author></fr:authors><fr:date><fr:year>2024</fr:year><fr:month>6</fr:month><fr:day>20</fr:day></fr:date><fr:uri>https://www.forester-notes.org/00X4/</fr:uri><fr:display-uri>00X4</fr:display-uri><fr:route>/00X4/</fr:route><fr:title text="Querying a coslice of the transclusion preorder">Querying a coslice of the transclusion preorder</fr:title><fr:taxon>Example</fr:taxon></fr:frontmatter><fr:mainmatter><html:p>We can also write a query to compute the set of trees <html:em>underneath</html:em> a given tree in the transclusion preorder (including the original tree) — in other words, the coslice.</html:p><html:pre><![CDATA[\def\query/transclusion-coslice[x]{
 \open\query
 \rel{\paths}{\outgoing}{\rel/transclusion}{\x}
}]]></html:pre></fr:mainmatter></fr:tree></fr:mainmatter></fr:tree><fr:tree show-metadata="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link></fr:author></fr:authors><fr:date><fr:year>2024</fr:year><fr:month>6</fr:month><fr:day>20</fr:day></fr:date><fr:uri>https://www.forester-notes.org/00X1/</fr:uri><fr:display-uri>00X1</fr:display-uri><fr:route>/00X1/</fr:route><fr:title text="Unions and intersections of families of queries">Unions and intersections of families of queries</fr:title></fr:frontmatter><fr:mainmatter><html:p>A further primitive query-former is the union or intersection of a certain <html:em>family</html:em> of queries indexed in the <html:em>results</html:em> of a fixed query. These are written as follows:</html:p><html:pre><![CDATA[\query/union-fam{q}{qfam}
\query/isect-fam{q}{qfam}]]></html:pre><html:p>In the above, <html:code>q</html:code> is a query expression and <html:code>qfam</html:code> is a <fr:link href="/00YF/" title="Forester 4.2 › First-class functions and lazy arguments" uri="https://www.forester-notes.org/00YF/" display-uri="00YF" type="local"><html:em>first-class function</html:em></fr:link> that takes an address and returns a query expression. There are a couple built-in instantiations of <html:code><![CDATA[\query/union-fam]]></html:code> and <html:code><![CDATA[\query/isect-fam]]></html:code> for the specific case where <html:code>qfam</html:code> is a family of <html:em>relational</html:em> queries; for example:</html:p><html:pre><![CDATA[\query/union-fam-rel{q}{mode}{polarity}{rel}]]></html:pre><html:p>is equivalent to the following more verbose code:</html:p><html:pre><![CDATA[\query/union-fam{q}{
 \fun[x]{
  \query/rel{mode}{pol}{\x}
 }
}]]></html:pre><fr:tree show-metadata="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link></fr:author></fr:authors><fr:date><fr:year>2024</fr:year><fr:month>6</fr:month><fr:day>20</fr:day></fr:date><fr:uri>https://www.forester-notes.org/00X3/</fr:uri><fr:display-uri>00X3</fr:display-uri><fr:route>/00X3/</fr:route><fr:title text="Querying the bibliography of a given tree">Querying the bibliography of a given tree</fr:title><fr:taxon>Example</fr:taxon></fr:frontmatter><fr:mainmatter><html:p>We can define a macro to compute the bibliography of a given tree, making use of <html:code><![CDATA[\query/transclusion-coslice]]></html:code> from <fr:link href="/00X4/" title="Forester 4.2 › New query language › Relational queries › Querying a coslice of the transclusion preorder" uri="https://www.forester-notes.org/00X4/" display-uri="00X4" type="local">Example <fr:contextual-number uri="https://www.forester-notes.org/00X4/" display-uri="00X4" /></fr:link>.</html:p><html:pre><![CDATA[\def\query/bibliography[x]{
 \open\query
 \isect{
  \union-fam-rel{\transclusion-coslice{\x}}{\edges}{\outgoing}{\rel/links}
 }{
  \taxon{Reference}
 }
}]]></html:pre><html:p>The above code first accumulates all the outgoing links from the given tree and any of its children, and then restricts (by intersection) to those with taxon <html:code>reference</html:code>.</html:p></fr:mainmatter></fr:tree><fr:tree show-metadata="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link></fr:author></fr:authors><fr:date><fr:year>2024</fr:year><fr:month>6</fr:month><fr:day>20</fr:day></fr:date><fr:uri>https://www.forester-notes.org/00X5/</fr:uri><fr:display-uri>00X5</fr:display-uri><fr:route>/00X5/</fr:route><fr:title text="Querying all hereditary contributors to a tree">Querying all hereditary contributors to a tree</fr:title><fr:taxon>Example</fr:taxon></fr:frontmatter><fr:mainmatter><html:p>We can use the union of families of relational queries to compute the set of (proper) <fr:link href="/tfmt-000T/" title="Contributor to a tree" uri="https://www.forester-notes.org/tfmt-000T/" display-uri="tfmt-000T" type="local"><html:em>contributors</html:em></fr:link> to a given tree. This is slightly subtle, because if a bibliographic tree is transcluded, we do not want its contributors to be included.</html:p><html:pre><![CDATA[\def\query/contributors[x]{
 \open\query
 \union-fam-rel{
  \isect{
   \transclusion-coslice{\x}
  }{
   \compl{
    \taxon{Reference}
   }
  }
 }{\edges}{\outgoing}{\rel/contributors}
}]]></html:pre></fr:mainmatter></fr:tree><html:p>In the future, the support for query-indexed families of queries might be generalised to allow arbitrary queries in the components rather than only relational ones. The current version of the feature should be viewed as somewhat provisional.</html:p></fr:mainmatter></fr:tree><fr:tree show-metadata="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link></fr:author></fr:authors><fr:date><fr:year>2024</fr:year><fr:month>6</fr:month><fr:day>20</fr:day></fr:date><fr:uri>https://www.forester-notes.org/00WT/</fr:uri><fr:display-uri>00WT</fr:display-uri><fr:route>/00WT/</fr:route><fr:title text="Queries are experimental">Queries are experimental</fr:title><fr:taxon>Warning</fr:taxon></fr:frontmatter><fr:mainmatter><html:p>It is strongly recommended that inexperienced users of Forester continue to limit their usage of queries until the feature has reached a stable interface.</html:p></fr:mainmatter></fr:tree></fr:mainmatter></fr:tree><fr:tree show-metadata="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link></fr:author></fr:authors><fr:date><fr:year>2024</fr:year><fr:month>6</fr:month><fr:day>20</fr:day></fr:date><fr:uri>https://www.forester-notes.org/00WL/</fr:uri><fr:display-uri>00WL</fr:display-uri><fr:route>/00WL/</fr:route><fr:title text="Intermediate representation of the XML format">Intermediate representation of the XML format</fr:title></fr:frontmatter><fr:mainmatter><html:p>Forester’s primary output format is XML, rendered live in the browser to HTML using an XSLT stylesheet. Although this will continue to be the main output format, together with <fr:link href="/kentookura/" title="Kento Okura" uri="https://www.forester-notes.org/kentookura/" display-uri="kentookura" type="local">Kento Okura</fr:link> as well as our friends from the Topos Institute I am hoping to explore richer <fr:link href="https://hypermedia.systems/" type="external"><html:em>hypermedia</html:em></fr:link> interfaces for <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forests</fr:link> that could transcend the limitations of static HTML output.</html:p><html:p>In order to support multiple backends without creating a log of code churn, I have created an OCaml abstraction of the XML format that will serve as a “source of truth” for Forester’s output — which can be serialised directly to XML, or rendered in a different way (e.g. as HTML or <fr:link href="https://htmx.org/" type="external">htmx</fr:link> emitted by a hypermedia server).</html:p><html:p>With this change, I would expect Forester’s XML format to begin to change less and less over time, perhaps culminating in a versioned schema. I do not, however, guarantee that I will not make breaking changes to the format going forward.</html:p></fr:mainmatter></fr:tree><fr:tree show-metadata="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link></fr:author></fr:authors><fr:date><fr:year>2024</fr:year><fr:month>6</fr:month><fr:day>20</fr:day></fr:date><fr:uri>https://www.forester-notes.org/00WM/</fr:uri><fr:display-uri>00WM</fr:display-uri><fr:route>/00WM/</fr:route><fr:title text="Generalised backmatter">Generalised backmatter</fr:title></fr:frontmatter><fr:mainmatter><html:p>Currently, the <html:em>backmatter</html:em> of a tree is not customisable; although the default backmatter sections are useful for most trees, it is likely that some of the sections are less relevant at times, and that other kinds of queries would be useful to be able to include on a tree-by-tree basis.</html:p><html:p>In order to facilitate such a feature in the future, this release changes the representation of backmatter to support arbitrary content and queries. <html:mark>This is a breaking change to the XML format:</html:mark> the <html:code>&lt;backmatter&gt;</html:code> element now contains arbitrary <html:code>&lt;tree&gt;</html:code> elements that encode the backmatter sections. By virtue of the <fr:link href="/00WS/" title="Forester 4.2 › New query language" uri="https://www.forester-notes.org/00WS/" display-uri="00WS" type="local">improved query engine</fr:link>, all default backmatter sections are computed from queries.</html:p></fr:mainmatter></fr:tree><fr:tree show-metadata="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link></fr:author></fr:authors><fr:date><fr:year>2024</fr:year><fr:month>6</fr:month><fr:day>20</fr:day></fr:date><fr:uri>https://www.forester-notes.org/00WN/</fr:uri><fr:display-uri>00WN</fr:display-uri><fr:route>/00WN/</fr:route><fr:title text="HTML figures and captions; embedded TeX">HTML figures and captions; embedded TeX</fr:title></fr:frontmatter><fr:mainmatter><html:p>This release adds <html:code><![CDATA[\]]>figure</html:code> and <html:code><![CDATA[\]]>figcaption</html:code> primitives that are interpreted by the XSLT stylesheet as HTML’s <html:code>&lt;figure&gt;</html:code> and <html:code>&lt;figcaption&gt;</html:code> elements.</html:p><html:p>The stylesheet no longer emits the images corresponding to embedded <fr:tex display="inline"><![CDATA[\LaTeX ]]></fr:tex> inside a <html:code>&lt;center&gt;</html:code> tag, as this is deprecated in HTML. Users are encouraged to wrap Forester’s <html:code><![CDATA[\]]>tex</html:code> primitive in a macro that embeds a diagram in a figure. For example, the following code comes from my own macro preamble:</html:p><html:pre><![CDATA[% Allocate a fluid binding to hold the default LaTeX preamble,
% e.g. for loading tikz packages.
\alloc\base/tex-preamble

\def\texfig[~body]{
 \scope{
  % Install a LaTeX preamble to be used by default if none is set.
  \put?\base/tex-preamble{
   % Some useful things from my own library.
   \latex-preamble/string-diagrams
   \latex-preamble/diagrams
  }

  % Wrap the diagram in a figure
  \figure{
   % Render the LaTeX code with the current preamble
   \tex{\get\base/tex-preamble}{\body{}}
  }
 }
}]]></html:pre></fr:mainmatter></fr:tree><fr:tree show-metadata="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link></fr:author></fr:authors><fr:date><fr:year>2024</fr:year><fr:month>6</fr:month><fr:day>20</fr:day></fr:date><fr:uri>https://www.forester-notes.org/00ZF/</fr:uri><fr:display-uri>00ZF</fr:display-uri><fr:route>/00ZF/</fr:route><fr:title text="Performance improvements in graph analysis">Performance improvements in graph analysis</fr:title></fr:frontmatter><fr:mainmatter><html:p>The <fr:link href="http://backtracking.github.io/ocamlgraph/ocamlgraph/Graph/Imperative/Digraph/Concrete/index.html" type="external">previous graph implementation</fr:link> has been replaced with <fr:link href="http://backtracking.github.io/ocamlgraph/ocamlgraph/Graph/Imperative/Digraph/ConcreteBidirectional/index.html" type="external">one that is more time-efficient</fr:link> (at the cost of space). Computing the transclusion preorder (or, more generally, the reflexive-transitive closure of relations) is orders of magnitude faster; <fr:link href="http://www.jonmsterling.com/" type="external">my own forest</fr:link> ultimately compiles in twice the speed.</html:p></fr:mainmatter></fr:tree></fr:mainmatter></fr:tree><fr:tree show-metadata="true" expanded="false" numbered="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link></fr:author><fr:contributor><fr:link href="/kentookura/" title="Kento Okura" uri="https://www.forester-notes.org/kentookura/" display-uri="kentookura" type="local">Kento Okura</fr:link></fr:contributor><fr:contributor><fr:link href="/treborhuang/" title="Trebor Huang" uri="https://www.forester-notes.org/treborhuang/" display-uri="treborhuang" type="local">Trebor Huang</fr:link></fr:contributor><fr:contributor><fr:link href="/nickhu/" title="Nick Hu" uri="https://www.forester-notes.org/nickhu/" display-uri="nickhu" type="local">Nick Hu</fr:link></fr:contributor></fr:authors><fr:date><fr:year>2024</fr:year><fr:month>6</fr:month><fr:day>15</fr:day></fr:date><fr:uri>https://www.forester-notes.org/00S9/</fr:uri><fr:display-uri>00S9</fr:display-uri><fr:route>/00S9/</fr:route><fr:title text="Forester 4.1">Forester 4.1</fr:title><fr:taxon>Release</fr:taxon></fr:frontmatter><fr:mainmatter><html:p>Special thanks to <fr:link href="/kentookura/" title="Kento Okura" uri="https://www.forester-notes.org/kentookura/" display-uri="kentookura" type="local">Kento Okura</fr:link>, <fr:link href="/nickhu/" title="Nick Hu" uri="https://www.forester-notes.org/nickhu/" display-uri="nickhu" type="local">Nick Hu</fr:link>, and <fr:link href="/treborhuang/" title="Trebor Huang" uri="https://www.forester-notes.org/treborhuang/" display-uri="treborhuang" type="local">Trebor Huang</fr:link> for their contributions to this release.</html:p><fr:tree show-metadata="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link></fr:author><fr:contributor><fr:link href="/kentookura/" title="Kento Okura" uri="https://www.forester-notes.org/kentookura/" display-uri="kentookura" type="local">Kento Okura</fr:link></fr:contributor></fr:authors><fr:date><fr:year>2024</fr:year><fr:month>6</fr:month><fr:day>15</fr:day></fr:date><fr:uri>https://www.forester-notes.org/00U0/</fr:uri><fr:display-uri>00U0</fr:display-uri><fr:route>/00U0/</fr:route><fr:title text="New forester init command">New <html:code>forester init</html:code> command</fr:title></fr:frontmatter><fr:mainmatter><html:p>To make it easier to set up a new forest, we have added a <html:code>forester init</html:code> command; when you run this command in an empty directory, it will initialise a git repository with a submodule for the <fr:link href="https://git.sr.ht/~jonsterling/forester-base-theme" type="external">default theme</fr:link> pinned to the correct release, and a <fr:link href="/00RG/" title="Forester 4.0 › Forest configuration via TOML" uri="https://www.forester-notes.org/00RG/" display-uri="00RG" type="local">configuration file</fr:link>.</html:p></fr:mainmatter></fr:tree><fr:tree show-metadata="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link></fr:author></fr:authors><fr:date><fr:year>2024</fr:year><fr:month>6</fr:month><fr:day>15</fr:day></fr:date><fr:uri>https://www.forester-notes.org/00WA/</fr:uri><fr:display-uri>00WA</fr:display-uri><fr:route>/00WA/</fr:route><fr:title text="Rendering only a subset of the forest">Rendering only a subset of the forest</fr:title></fr:frontmatter><fr:mainmatter><html:p>A new option has been added to the <html:code>forester build</html:code> command to render only certain trees. For example, the following command will render only the trees at addresses <html:code>xxx-MMMM</html:code> and <html:code>yyy-NNNN</html:code>:</html:p><html:pre>forester build forest.toml --render-only=xxx-MMMM,yyy-NNNN</html:pre><html:p>Note that in order to maintain a correct graph analysis, the entire forest will nonetheless be <html:em>evaluated</html:em>. As rendering is the slowest part of the process, however, this option can still save a lot of time. In the future it could be useful to have a more sophisticated option that renders (e.g.) all children of a given tree, etc.</html:p></fr:mainmatter></fr:tree><fr:tree show-metadata="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link></fr:author></fr:authors><fr:date><fr:year>2024</fr:year><fr:month>6</fr:month><fr:day>15</fr:day></fr:date><fr:uri>https://www.forester-notes.org/00SP/</fr:uri><fr:display-uri>00SP</fr:display-uri><fr:route>/00SP/</fr:route><fr:title text="Changed behaviour of queries">Changed behaviour of queries</fr:title></fr:frontmatter><fr:mainmatter><html:p>Forester’s <fr:link href="/0066/" title="Forester 2.2 › Queries" uri="https://www.forester-notes.org/0066/" display-uri="0066" type="local">rudimentary support for queries</fr:link> has been simplified somewhat. Previously, the results of a query would be gathered and, if non-empty, placed underneath an anonymous subtree (whose title could be modified using <fr:link href="/0067/" title="Forester 2.2 › Flexible transclusion options" uri="https://www.forester-notes.org/0067/" display-uri="0067" type="local">transclusion options</fr:link>).</html:p><html:p>In light of the <fr:link href="/00O4/" title="Forester 3.1 › Inline subtrees" uri="https://www.forester-notes.org/00O4/" display-uri="00O4" type="local">user-level support for anonymous subtrees</fr:link> introduced in <fr:link href="/00HY/" title="Forester 3.1" uri="https://www.forester-notes.org/00HY/" display-uri="00HY" type="local">Forester 3.1</fr:link>, the behaviour of queries has been simplified: the results of a query are simply transcluded directly without being enclosed in a subtree.</html:p><html:p>Although the new behaviour is simpler, it is no longer possible to have a query subtree that is hidden when it returns no results. Users should treat the querying feature as highly provisional, and subject to change and even potential removal.</html:p></fr:mainmatter></fr:tree><fr:tree show-metadata="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link></fr:author></fr:authors><fr:date><fr:year>2024</fr:year><fr:month>6</fr:month><fr:day>15</fr:day></fr:date><fr:uri>https://www.forester-notes.org/00SQ/</fr:uri><fr:display-uri>00SQ</fr:display-uri><fr:route>/00SQ/</fr:route><fr:title text="Addresses for anonymous trees">Addresses for anonymous trees</fr:title></fr:frontmatter><fr:mainmatter><html:p>Previously, a subtree could be emitted without any address; this greatly complicated the logic of the graph analysis, <fr:link href="/00O3/" title="Forester 3.1 › Designated parents" uri="https://www.forester-notes.org/00O3/" display-uri="00O3" type="local">designated parents</fr:link>, and other things. Now, emitting an anonymous subtree generates a fresh address in a separate namespace; as a result, these trees get rendered to their own XML file. Naturally, an anonymous subtree cannot be linked to or transcluded, but it can now participate properly in the graph analysis.</html:p></fr:mainmatter></fr:tree><fr:tree show-metadata="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link></fr:author><fr:contributor><fr:link href="/nickhu/" title="Nick Hu" uri="https://www.forester-notes.org/nickhu/" display-uri="nickhu" type="local">Nick Hu</fr:link></fr:contributor></fr:authors><fr:date><fr:year>2024</fr:year><fr:month>6</fr:month><fr:day>15</fr:day></fr:date><fr:uri>https://www.forester-notes.org/00SA/</fr:uri><fr:display-uri>00SA</fr:display-uri><fr:route>/00SA/</fr:route><fr:title text="Incremental parsing">Incremental parsing</fr:title></fr:frontmatter><fr:mainmatter><html:p>Menhir’s incremental parsing API is adopted in order to make the parser more resiliant to syntax errors. The goal is to support language server protocol diagnostics in a future release.</html:p></fr:mainmatter></fr:tree><fr:tree show-metadata="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link></fr:author></fr:authors><fr:date><fr:year>2024</fr:year><fr:month>6</fr:month><fr:day>15</fr:day></fr:date><fr:uri>https://www.forester-notes.org/00WG/</fr:uri><fr:display-uri>00WG</fr:display-uri><fr:route>/00WG/</fr:route><fr:title text="Dependency audit">Dependency audit</fr:title></fr:frontmatter><fr:mainmatter><html:p>In recent releases, Forester has become increasingly dependent on various system packages (including openssl) via transitive dependencies. This has caused a great deal of build breakage for both our developers and users, so we decided to remove all but the most critical dependencies to avoid losing control of things. Experimental tools that rely on more system dependencies that are likely to cause build breakage can be created, but only outside the main <html:code>forester</html:code> package.</html:p></fr:mainmatter></fr:tree></fr:mainmatter></fr:tree><fr:tree show-metadata="true" expanded="false" numbered="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link></fr:author><fr:contributor><fr:link href="/kentookura/" title="Kento Okura" uri="https://www.forester-notes.org/kentookura/" display-uri="kentookura" type="local">Kento Okura</fr:link></fr:contributor></fr:authors><fr:date><fr:year>2024</fr:year><fr:month>4</fr:month><fr:day>5</fr:day></fr:date><fr:uri>https://www.forester-notes.org/00RF/</fr:uri><fr:display-uri>00RF</fr:display-uri><fr:route>/00RF/</fr:route><fr:title text="Forester 4.0">Forester 4.0</fr:title><fr:taxon>Release</fr:taxon></fr:frontmatter><fr:mainmatter><html:p>This is a major release of Forester that changes both the command line interface <html:em>and</html:em> the XML format, introducing many new features under the hood as well as quality-of-life improvements (including a 2X rendering speedup).</html:p><fr:tree show-metadata="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link></fr:author><fr:contributor><fr:link href="/kentookura/" title="Kento Okura" uri="https://www.forester-notes.org/kentookura/" display-uri="kentookura" type="local">Kento Okura</fr:link></fr:contributor></fr:authors><fr:date><fr:year>2024</fr:year><fr:month>4</fr:month><fr:day>5</fr:day></fr:date><fr:uri>https://www.forester-notes.org/00RG/</fr:uri><fr:display-uri>00RG</fr:display-uri><fr:route>/00RG/</fr:route><fr:title text="Forest configuration via TOML">Forest configuration via TOML</fr:title></fr:frontmatter><fr:mainmatter><html:p>Previously, the locations of trees as well as assets and theme directories were configured by means of command line arguments. As this has become a bit unwieldy, especially as many users have multiple projections of their forest, we have consolidated these options under a simple <fr:link href="https://toml.io/en/" type="external">TOML</fr:link> configuration file whose location is the first argument to most <html:code>forester</html:code> commands. Here is an example configuration file:</html:p><html:pre><![CDATA[# forest.toml
[forest]
trees = ["trees"]
assets = ["assets"]
theme = "theme"
root = "0001"
base_url = "https://www.jonmsterling.com"]]></html:pre><html:p>It is common to have multiple configurations. For example, if you have “public” trees located in a specific directory, you can have an additional configuration:</html:p><html:pre><![CDATA[# public.toml
[forest]
trees = ["trees/public"]
assets = ["assets"]
theme = "theme"
root = "0001"
base_url = "https://www.jonmsterling.com"]]></html:pre><html:p>Both the <html:code>assets</html:code> and <html:code>theme</html:code> keys are displayed above with their default values, so they could be omitted. There is an additional <html:code>stylesheet</html:code> key that can be used to set the name of the XSL stylesheet used (the default is <html:code>forest.xsl</html:code>).</html:p><html:p>To build the forest, simply run: <html:code>forester build forest.toml</html:code>; other options can be used (see <html:code>forester build --help</html:code>), such as <html:code>forester build forest.toml --dev</html:code>.</html:p></fr:mainmatter></fr:tree><fr:tree show-metadata="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link></fr:author></fr:authors><fr:date><fr:year>2024</fr:year><fr:month>4</fr:month><fr:day>5</fr:day></fr:date><fr:uri>https://www.forester-notes.org/00RH/</fr:uri><fr:display-uri>00RH</fr:display-uri><fr:route>/00RH/</fr:route><fr:title text="Enhanced XML support">Enhanced XML support</fr:title></fr:frontmatter><fr:mainmatter><fr:tree show-metadata="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link></fr:author></fr:authors><fr:date><fr:year>2024</fr:year><fr:month>4</fr:month><fr:day>5</fr:day></fr:date><fr:uri>https://www.forester-notes.org/00RI/</fr:uri><fr:display-uri>00RI</fr:display-uri><fr:route>/00RI/</fr:route><fr:title text="An XML namespace for Forester">An XML namespace for Forester</fr:title></fr:frontmatter><fr:mainmatter><html:p>The XML format is now governed by the <fr:link href="https://www.w3.org/TR/xml-names/" type="external">XML namespace</fr:link> with URI <fr:link href="http://www.jonmsterling.com/005P.xml" type="external">http://www.jonmsterling.com/005P.xml</fr:link>; as is typical of XML grammars, element names are namespaced whereas attribute names lie in no namespace. Forester emits XML with element names qualified by a prefix bound to this namespace. <html:mark>This change breaks existing XSL stylesheets, so you must upgrade your theme.</html:mark></html:p><html:p>The new version of the <fr:link href="https://git.sr.ht/~jonsterling/forester-base-theme" type="external">default theme</fr:link> contains rules to allow anything in either the <html:code>http://www.w3.org/1999/xhtml</html:code> or <html:code>http://www.w3.org/1998/Math/MathML</html:code> namespaces to be copied through to the output HTML (with namespace prefixes stripped). In combination with <fr:link href="/00RJ/" title="Forester 4.0 › Enhanced XML support › Emitting XML and resolving namespaces" uri="https://www.forester-notes.org/00RJ/" display-uri="00RJ" type="local">§ <fr:contextual-number uri="https://www.forester-notes.org/00RJ/" display-uri="00RJ" /></fr:link>, this allows you to write HTML and MathML in Forester directly.</html:p><html:p>Please note that although Forester now has a namespace, it does <html:em>not</html:em> has a schema. Any direct integration with the XML format (e.g. by custom themes) is not supported and should be done at your own risk — several recent releases have illustrated the continued rapid evolution of the XML format with many breaking changes. I expect this evolution will continue for some time.</html:p></fr:mainmatter></fr:tree><fr:tree show-metadata="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link></fr:author></fr:authors><fr:date><fr:year>2024</fr:year><fr:month>4</fr:month><fr:day>5</fr:day></fr:date><fr:uri>https://www.forester-notes.org/00RJ/</fr:uri><fr:display-uri>00RJ</fr:display-uri><fr:route>/00RJ/</fr:route><fr:title text="Emitting XML and resolving namespaces">Emitting XML and resolving namespaces</fr:title></fr:frontmatter><fr:mainmatter><html:p>Since <fr:link href="/00CW/" title="Forester 3.0" uri="https://www.forester-notes.org/00CW/" display-uri="00CW" type="local">version 3.0</fr:link>, <fr:link href="/00CZ/" title="Forester 3.0 › Breaking changes › Fall-through of undefined identifiers" uri="https://www.forester-notes.org/00CZ/" display-uri="00CZ" type="local">Forester’s source language has supported</fr:link> a limited form of custom XML output by means of the <html:code><![CDATA[\xml]]></html:code> command. This support was, however, somewhat unwieldy: no built-in accounting for XML namespaces was included, so correct  usage of <html:code><![CDATA[\xml]]></html:code> was prohibitively difficult because of the need for <html:code>xmlns</html:code> attributes on essentially every node.</html:p><fr:tree show-metadata="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link></fr:author></fr:authors><fr:date><fr:year>2024</fr:year><fr:month>4</fr:month><fr:day>5</fr:day></fr:date><fr:uri>https://www.forester-notes.org/00RK/</fr:uri><fr:display-uri>00RK</fr:display-uri><fr:route>/00RK/</fr:route><fr:title text="XML namespace declaration">XML namespace declaration</fr:title><fr:taxon>Feature</fr:taxon></fr:frontmatter><fr:mainmatter><html:p>Forester treats XML namespace prefixes in a way that respects <fr:tex display="inline"><![CDATA[\alpha ]]></fr:tex>-equivalence: in other words, any prefix mentioned must be <html:em>bound</html:em>, and it is possible for two different textually identical namespace prefixes to denote different namespaces depending on their scope. This makes it possible to compose code that emits XML without coordinating namespace prefixes, which I have found to be a major impediment to the correct use of XML for non-trivial work.</html:p><html:p>An XML namespace prefix is bound by a declaration like the following:</html:p><html:pre><![CDATA[\xmlns:html{http://www.w3.org/1999/xhtml}]]></html:pre><html:p>This declaration has the same scoping rules as <html:code><![CDATA[\def]]></html:code>.</html:p></fr:mainmatter></fr:tree><fr:tree show-metadata="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link></fr:author></fr:authors><fr:date><fr:year>2024</fr:year><fr:month>4</fr:month><fr:day>5</fr:day></fr:date><fr:uri>https://www.forester-notes.org/00RM/</fr:uri><fr:display-uri>00RM</fr:display-uri><fr:route>/00RM/</fr:route><fr:title text="XML literals">XML literals</fr:title><fr:taxon>Feature</fr:taxon></fr:frontmatter><fr:mainmatter><html:p>The old <html:code><![CDATA[\xml]]></html:code> syntax has been replaced with a new convenient notation for XML literals that supports <fr:link href="/00RK/" title="Forester 4.0 › Enhanced XML support › Emitting XML and resolving namespaces › XML namespace declaration" uri="https://www.forester-notes.org/00RK/" display-uri="00RK" type="local">declared XML namespace prefixes</fr:link>. The grammar of XML literals is summarised below:</html:p><html:pre><![CDATA[qname ::= prefix:name | name
expr ::= ... | \<qname>[qname]{expr}...{expr}]]></html:pre><html:p>For example, if the prefix <html:code>html:</html:code> is bound to <fr:link href="http://www.w3.org/1999/xhtml" type="external">http://www.w3.org/1999/xhtml</fr:link> as in <fr:link href="/00RK/" title="Forester 4.0 › Enhanced XML support › Emitting XML and resolving namespaces › XML namespace declaration" uri="https://www.forester-notes.org/00RK/" display-uri="00RK" type="local">Feature <fr:contextual-number uri="https://www.forester-notes.org/00RK/" display-uri="00RK" /></fr:link>, the expression <html:code><![CDATA[\<html:mark>[class]{highlight}{some highlighted text}]]></html:code> will emit the following XML:</html:p><html:pre><![CDATA[<html:mark
  xmlns:html="http://www.w3.org/1999/xhtml"
  class="highlight">
 some highlighted text
</html:mark>]]></html:pre><html:p>In reality, the appropriate <html:code>@xmlns:html</html:code> attribute will be attached only where it is needed in keeping with the hierarchical structure of the XML tree. Note that when the same textual prefix is bound to two different namespaces, one of them will be automatically <fr:tex display="inline"><![CDATA[\alpha ]]></fr:tex>-renamed so as to result in correct XML with the intended semantics.</html:p></fr:mainmatter></fr:tree><fr:tree show-metadata="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link></fr:author></fr:authors><fr:date><fr:year>2024</fr:year><fr:month>4</fr:month><fr:day>5</fr:day></fr:date><fr:uri>https://www.forester-notes.org/00RL/</fr:uri><fr:display-uri>00RL</fr:display-uri><fr:route>/00RL/</fr:route><fr:title text="A worked example">A worked example</fr:title><fr:taxon>Example</fr:taxon></fr:frontmatter><fr:mainmatter><html:p>The following code causes MathML to be emitted (in the correct namespace), combining <fr:link href="/00RK/" title="Forester 4.0 › Enhanced XML support › Emitting XML and resolving namespaces › XML namespace declaration" uri="https://www.forester-notes.org/00RK/" display-uri="00RK" type="local">Feature <fr:contextual-number uri="https://www.forester-notes.org/00RK/" display-uri="00RK" /></fr:link> and <fr:link href="/00RM/" title="Forester 4.0 › Enhanced XML support › Emitting XML and resolving namespaces › XML literals" uri="https://www.forester-notes.org/00RM/" display-uri="00RM" type="local">Feature <fr:contextual-number uri="https://www.forester-notes.org/00RM/" display-uri="00RM" /></fr:link>:</html:p><html:pre><![CDATA[\xmlns:mml{http://www.w3.org/1998/Math/MathML}
\<mml:math>[display]{block}{
 \<mml:mrow>{
  \<mml:msup>{
   \<mml:mi>{x}
   \<mml:mn>{2}
  }
  \<mml:mo>{+}
  \<mml:mi>{x}
 }
}]]></html:pre><html:p>The above displays as follows:</html:p><mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" display="block">
    <mml:mrow>
     <mml:msup>
      <mml:mi>x</mml:mi>
      <mml:mn>2</mml:mn>
     </mml:msup>
     <mml:mo>+</mml:mo>
     <mml:mi>x</mml:mi>
    </mml:mrow>
   </mml:math></fr:mainmatter></fr:tree></fr:mainmatter></fr:tree></fr:mainmatter></fr:tree></fr:mainmatter></fr:tree><fr:tree show-metadata="true" expanded="false" numbered="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link></fr:author><fr:contributor><fr:link href="/kentookura/" title="Kento Okura" uri="https://www.forester-notes.org/kentookura/" display-uri="kentookura" type="local">Kento Okura</fr:link></fr:contributor><fr:contributor><fr:link href="/owenlynch/" title="Owen Lynch" uri="https://www.forester-notes.org/owenlynch/" display-uri="owenlynch" type="local">Owen Lynch</fr:link></fr:contributor></fr:authors><fr:date><fr:year>2024</fr:year><fr:month>3</fr:month><fr:day>9</fr:day></fr:date><fr:uri>https://www.forester-notes.org/00HY/</fr:uri><fr:display-uri>00HY</fr:display-uri><fr:route>/00HY/</fr:route><fr:title text="Forester 3.1">Forester 3.1</fr:title><fr:taxon>Release</fr:taxon></fr:frontmatter><fr:mainmatter><html:p>To use this release, you will need to <fr:link href="https://git.sr.ht/~jonsterling/forester-base-theme" type="external">upgrade your theme</fr:link> and you may also need to edit your forest itself (please write to the <fr:link href="https://lists.sr.ht/~jonsterling/forester-discuss" type="external">mailing list</fr:link> if you encounter difficulties). Remember that this includes not only the XSLT stylesheet, but also the CSS stylesheet and the JavaScripts.</html:p><html:p>The <fr:link href="https://git.sr.ht/~jonsterling/forester-base-theme" type="external">base theme</fr:link> is now <fr:link href="https://git.sr.ht/~jonsterling/forester-base-theme/refs" type="external">versioned</fr:link>: if you are using <fr:link href="/00HY/" title="Forester 3.1" uri="https://www.forester-notes.org/00HY/" display-uri="00HY" type="local">Forester 3.1</fr:link>, you can confidently use the <html:code>3.1.0</html:code> tag. The head of the <html:code>main</html:code> branch of the theme may at times include changes that are compatible with only the <html:code>main</html:code> branch of Forester itself.</html:p><fr:tree show-metadata="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link></fr:author></fr:authors><fr:date><fr:year>2024</fr:year><fr:month>3</fr:month><fr:day>9</fr:day></fr:date><fr:date><fr:year>2024</fr:year><fr:month>2</fr:month><fr:day>8</fr:day></fr:date><fr:uri>https://www.forester-notes.org/00O3/</fr:uri><fr:display-uri>00O3</fr:display-uri><fr:route>/00O3/</fr:route><fr:title text="Designated parents">Designated parents</fr:title><fr:taxon>Feature</fr:taxon></fr:frontmatter><fr:mainmatter><html:p>In keeping with the <fr:link href="/tfmt-0007/" title="Atomicity of scientific notes" uri="https://www.forester-notes.org/tfmt-0007/" display-uri="tfmt-0007" type="local">philosophy of evergreen notes</fr:link>, hierarchical structure in Forester has always been introduced by transclusion of independent trees; in this model, a <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">tree</fr:link> has no canonical parent because <fr:link href="/tfmt-0006/" title="Hierarchical structure as non-unique narrative" uri="https://www.forester-notes.org/tfmt-0006/" display-uri="tfmt-0006" type="local">it may be contextualised in many distinct hierarchical narratives</fr:link>. Experience using Forester suggests that this is the right idea the vast majority of the time, but use-cases have emerged that challenge these assumptions: there do indeed arise natural subtrees that are exceedingly awkward to “decontextualise”.</html:p><html:p>For example, the features described in a changelog (such as the present one) are awkward to decontextualise because they refer to knowledge that is temporary in its applicability. Likewise, the subtrees of one’s daily notes or journal are likely to be fleeting in nature and may have little insight that can be decontextualised — and in spite of this, these notes remain important for restoring mental context on long-running projects, etc.</html:p><html:p><html:mark>For these reasons, I have (reluctantly) added a new frontmatter directive <html:code><![CDATA[\parent{xxx-NNNN}]]></html:code></html:mark>, which <html:em>designates</html:em> the tree at address <html:code>xxx-NNNN</html:code> as “the” context-providing parent of the current tree. <html:strong>This feature is experimental and under-theorised; it should be used sparingly.</html:strong></html:p><html:p>When a given tree appears transcluded within its “designated” parent, it will be shown with the title that has been specified; however, when the tree appears outside of this context, its title will appear with the parent’s title prepended to it: “parent › child”.</html:p></fr:mainmatter></fr:tree><fr:tree show-metadata="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link></fr:author></fr:authors><fr:date><fr:year>2024</fr:year><fr:month>3</fr:month><fr:day>9</fr:day></fr:date><fr:date><fr:year>2024</fr:year><fr:month>2</fr:month><fr:day>8</fr:day></fr:date><fr:uri>https://www.forester-notes.org/00O4/</fr:uri><fr:display-uri>00O4</fr:display-uri><fr:route>/00O4/</fr:route><fr:title text="Inline subtrees">Inline subtrees</fr:title><fr:taxon>Feature</fr:taxon></fr:frontmatter><fr:mainmatter><html:p>Previously, there was a one-to-one mapping between trees and files. After discussion on the mailing list with <fr:link href="/kristopherbrown/" title="Kristopher Brown" uri="https://www.forester-notes.org/kristopherbrown/" display-uri="kristopherbrown" type="local">Kristopher Brown</fr:link>, I have added support for defining new subtrees <html:em>inline</html:em> to an existing tree. The current behavior is that an inline subtree has its <fr:link href="/00O3/" title="Forester 3.1 › Designated parents" uri="https://www.forester-notes.org/00O3/" display-uri="00O3" type="local">designated parent</fr:link> automatically assigned; author and date metadata is inherited (this may change in the future).</html:p><html:p>To emit (and transclude) a subtree at address <html:code>xxx-NNNN</html:code>, you can write the following:</html:p><html:pre><![CDATA[\subtree[xxx-NNNN]{
  \title{My title}
  \p{my body}
}]]></html:pre><html:p>It is also possible to have an <html:em>anonymous</html:em> inline subtree, one that has no address of its own. In this case, write:</html:p><html:pre><![CDATA[\subtree{
  \title{My title}
  \p{my body}
}]]></html:pre><html:p>An anonymous inline subtree will, naturally, not have its own page emitted and cannot be linked to. In the graph analysis (for computing backlinks, etc.), an anonymous inline subtree will be identified with its parent.</html:p><html:p>Inline subtrees should not be overrused; but they may make the process of daily journalling and other activities more lightweight.</html:p><html:p>One consequence of breaking the one-to-one relationship between trees and files is that commands like <html:code>forester new</html:code> need to actually fully evaluate the forest, whereas in the past it was possible to merely scan the file system. This is a trade-off: if your forest contains fatal errors, you cannot use <html:code>forester new</html:code> or related querying commands. You should never leave your forest with fatal errors long enough to notice this.</html:p><html:p><html:mark>This feature is experimental and its behaviour may change. Use it at your own risk.</html:mark></html:p></fr:mainmatter></fr:tree><fr:tree show-metadata="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link></fr:author></fr:authors><fr:date><fr:year>2024</fr:year><fr:month>1</fr:month><fr:day>12</fr:day></fr:date><fr:uri>https://www.forester-notes.org/00HZ/</fr:uri><fr:display-uri>00HZ</fr:display-uri><fr:route>/00HZ/</fr:route><fr:title text="cleveref-style referencing"><html:code>cleveref</html:code>-style referencing</fr:title><fr:taxon>Feature</fr:taxon></fr:frontmatter><fr:mainmatter><html:p>You can now write <html:code><![CDATA[\ref{xxx-NNNN}]]></html:code> to produce a link to the tree at address <html:code>xxx-NNNN</html:code> labeled by its taxon. After the taxon, the textual format and destination of the link depends on whether <html:code>xxx-NNNN</html:code> lies in the present context. If the linked tree is present, then link will refer to the first transclusion of the tree into the present context; otherwise, the link will refer to the tree’s stable address. For example:</html:p><html:ol><html:li>A reference to this very tree: <fr:link href="/00HZ/" title="Forester 3.1 › cleveref-style referencing" uri="https://www.forester-notes.org/00HZ/" display-uri="00HZ" type="local">Feature <fr:contextual-number uri="https://www.forester-notes.org/00HZ/" display-uri="00HZ" /></fr:link>.</html:li>
 <html:li>A reference to a parent of this tree: <fr:link href="/00HY/" title="Forester 3.1" uri="https://www.forester-notes.org/00HY/" display-uri="00HY" type="local">Release <fr:contextual-number uri="https://www.forester-notes.org/00HY/" display-uri="00HY" /></fr:link>.</html:li>
 <html:li>A reference to a cousin of this tree: <fr:link href="/00EY/" title="Forester 3.0 › Experimental support for objects" uri="https://www.forester-notes.org/00EY/" display-uri="00EY" type="local">Feature <fr:contextual-number uri="https://www.forester-notes.org/00EY/" display-uri="00EY" /></fr:link>.</html:li></html:ol><html:p>The behavior of references within one tree naturally depends on the transclusion context in which you are viewing that tree. It is instructive to examine the examples above by viewing this tree from its <fr:link href="/00HY/" title="Forester 3.1" uri="https://www.forester-notes.org/00HY/" display-uri="00HY" type="local">parent</fr:link> or on its <fr:link href="/00HZ/" title="Forester 3.1 › cleveref-style referencing" uri="https://www.forester-notes.org/00HZ/" display-uri="00HZ" type="local">own page</fr:link>.</html:p></fr:mainmatter></fr:tree><fr:tree show-metadata="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link></fr:author><fr:contributor><fr:link href="/kentookura/" title="Kento Okura" uri="https://www.forester-notes.org/kentookura/" display-uri="kentookura" type="local">Kento Okura</fr:link></fr:contributor></fr:authors><fr:date><fr:year>2024</fr:year><fr:month>3</fr:month><fr:day>9</fr:day></fr:date><fr:uri>https://www.forester-notes.org/00O5/</fr:uri><fr:display-uri>00O5</fr:display-uri><fr:route>/00O5/</fr:route><fr:title text="New forester query command">New <html:code>forester query</html:code> command</fr:title><fr:taxon>Feature</fr:taxon></fr:frontmatter><fr:mainmatter><html:p><fr:link href="/kentookura/" title="Kento Okura" uri="https://www.forester-notes.org/kentookura/" display-uri="kentookura" type="local">Kento Okura</fr:link> has implemented a new <html:code>forester query</html:code> command that may be useful for creating external editor tooling; currently it is possible to query for lists of all prefixes (the <html:code>xxx</html:code> in <html:code>xxx-NNNN</html:code>), tags, and taxa. Please run <html:code>forester query --help</html:code> for more information.</html:p></fr:mainmatter></fr:tree><fr:tree show-metadata="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link></fr:author><fr:contributor><fr:link href="/owenlynch/" title="Owen Lynch" uri="https://www.forester-notes.org/owenlynch/" display-uri="owenlynch" type="local">Owen Lynch</fr:link></fr:contributor></fr:authors><fr:date><fr:year>2024</fr:year><fr:month>3</fr:month><fr:day>9</fr:day></fr:date><fr:uri>https://www.forester-notes.org/00O6/</fr:uri><fr:display-uri>00O6</fr:display-uri><fr:route>/00O6/</fr:route><fr:title text="Random vs. sequential generation of addresses">Random vs. sequential generation of addresses</fr:title><fr:taxon>Feature</fr:taxon></fr:frontmatter><fr:mainmatter><html:p>By default, Forester generates tree addresses sequentially within a given prefix; <fr:link href="/owenlynch/" title="Owen Lynch" uri="https://www.forester-notes.org/owenlynch/" display-uri="owenlynch" type="local">Owen Lynch</fr:link> has implemented <html:code>forester new --random</html:code>, which instead generates random tree identifiers. Although this option is not recommended for most users, it can be used to mitigate the problem of multiple collaborators creating trees within the same prefix. Please run <html:code>forester new --help</html:code> for more information.</html:p></fr:mainmatter></fr:tree><fr:tree show-metadata="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link></fr:author></fr:authors><fr:date><fr:year>2024</fr:year><fr:month>3</fr:month><fr:day>9</fr:day></fr:date><fr:uri>https://www.forester-notes.org/00Q6/</fr:uri><fr:display-uri>00Q6</fr:display-uri><fr:route>/00Q6/</fr:route><fr:title text="Manual numbering for digital editions">Manual numbering for digital editions</fr:title><fr:taxon>Feature</fr:taxon></fr:frontmatter><fr:mainmatter><html:p>Numbering of trees in Forester is by default relative and determined by position in the current view. When creating translations or digital editions, the numbering from the source material is what is important. For this reason, I have added a new frontmatter directive to impose a manual numbering on a given tree.</html:p><html:pre><![CDATA[\taxon{Chapter}
\number{foo}]]></html:pre><html:p>This numbering will be used in the table of contents, headings, and by <fr:link href="/00HZ/" title="Forester 3.1 › cleveref-style referencing" uri="https://www.forester-notes.org/00HZ/" display-uri="00HZ" type="local">Feature <fr:contextual-number uri="https://www.forester-notes.org/00HZ/" display-uri="00HZ" /></fr:link>.</html:p></fr:mainmatter></fr:tree><fr:tree show-metadata="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link></fr:author></fr:authors><fr:date><fr:year>2024</fr:year><fr:month>3</fr:month><fr:day>9</fr:day></fr:date><fr:uri>https://www.forester-notes.org/00OH/</fr:uri><fr:display-uri>00OH</fr:display-uri><fr:route>/00OH/</fr:route><fr:title text="Improvements to verbatim lexer">Improvements to verbatim lexer</fr:title><fr:taxon>Change</fr:taxon></fr:frontmatter><fr:mainmatter><html:p>Forester includes a special lexing mode for quoting source code, delimited by <html:code><![CDATA[\]]>startverb</html:code> and <html:code><![CDATA[\]]>stopverb</html:code>. This mode was never implemented properly and so it did not work well in practice; for example, previously the line comment lexer could be activated via <html:code><![CDATA[%]]></html:code> from within vebatim mode, which made it very difficult to quote code that has comments. The lexer has been revamped and the behavior of verbatim mode is a bit different from before.</html:p><html:p>Between the delimiters (<html:code><![CDATA[\]]>startverb</html:code>,<html:code><![CDATA[\]]>stopverb</html:code>), text now is taken <html:em>precisely</html:em> as-written, except that newlines are stripped from the beginning and the end of the quoted text. Previously, the strange behavior of comments noted above could be used to manually avoid an initial line break from appearing in the quoted text. So in a prior version of Forester, you may have written something like this:</html:p><html:pre><![CDATA[\startverb%
my verbatim text
\stopverb]]></html:pre><html:p>Now, you should instead write:</html:p><html:pre><![CDATA[\startverb
my verbatim text
\stopverb]]></html:pre></fr:mainmatter></fr:tree><fr:tree show-metadata="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link></fr:author></fr:authors><fr:date><fr:year>2024</fr:year><fr:month>1</fr:month><fr:day>25</fr:day></fr:date><fr:uri>https://www.forester-notes.org/00LR/</fr:uri><fr:display-uri>00LR</fr:display-uri><fr:route>/00LR/</fr:route><fr:title text="Removal of \texpackage and changes to \tex">Removal of <html:code><![CDATA[\texpackage]]></html:code> and changes to <html:code><![CDATA[\tex]]></html:code></fr:title><fr:taxon>Change</fr:taxon></fr:frontmatter><fr:mainmatter><html:p>In <fr:link href="/005O/" title="Forester 2.1" uri="https://www.forester-notes.org/005O/" display-uri="005O" type="local">Forester 2.1</fr:link>, the <html:code><![CDATA[\texpackage]]></html:code> frontmatter command was added in order to accumulate a list of packages that are then used automatically when rendering <html:code><![CDATA[\tex{code...}]]></html:code>. From <fr:link href="/00HY/" title="Forester 3.1" uri="https://www.forester-notes.org/00HY/" display-uri="00HY" type="local">Forester 3.1</fr:link>, this feature is removed and to embed <fr:tex display="inline"><![CDATA[\LaTeX ]]></fr:tex> code, you must explicitly specify the preamble as follows:</html:p><html:pre><![CDATA[\tex{
 \usepackage{mypackage1}
 \usepackage{mypackage2}
}{
 my code goes here
}]]></html:pre><html:p>Of course, within a single project (or even <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forest</fr:link>), you may have a relatively stable set of <fr:tex display="inline"><![CDATA[\LaTeX ]]></fr:tex> packages that you need. In this case, it is recommended to wrap <html:code><![CDATA[\tex]]></html:code> in your own macro:</html:p><html:pre><![CDATA[\def\my-tex[body]{
 \tex{
  \usepackage{mypackage1}
  \usepackage{mypackage2}
 }{\body}
}]]></html:pre><html:p>An even more sophisticated approach might use fluid bindings to allow local customisation of packages in use:</html:p><html:pre><![CDATA[ \alloc\my-tex-preamble
 \def\my-tex[body]{
  \scope{
   \put?\my-tex-preamble{}
   \tex{\get\my-tex-preamble}{\body}
  }
 }]]></html:pre></fr:mainmatter></fr:tree><fr:tree show-metadata="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link></fr:author></fr:authors><fr:date><fr:year>2024</fr:year><fr:month>3</fr:month><fr:day>9</fr:day></fr:date><fr:date><fr:year>2024</fr:year><fr:month>2</fr:month><fr:day>8</fr:day></fr:date><fr:uri>https://www.forester-notes.org/00O2/</fr:uri><fr:display-uri>00O2</fr:display-uri><fr:route>/00O2/</fr:route><fr:title text="Removal of undocumented \LaTeX  output">Removal of undocumented <fr:tex display="inline"><![CDATA[\LaTeX ]]></fr:tex> output</fr:title><fr:taxon>Change</fr:taxon></fr:frontmatter><fr:mainmatter><html:p>Previously, Forester would emit <html:code>.tex</html:code> files for each of your trees in the <html:code>latex</html:code> directory. This feature has been removed, as <fr:tex display="inline"><![CDATA[\LaTeX ]]></fr:tex> can be generated more reliably using XSLT. Please see the <fr:link href="https://git.sr.ht/~jonsterling/forester-to-latex" type="external">forester-to-latex</fr:link> repository for an example stylesheet.</html:p></fr:mainmatter></fr:tree><fr:tree show-metadata="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link></fr:author></fr:authors><fr:date><fr:year>2024</fr:year><fr:month>1</fr:month><fr:day>25</fr:day></fr:date><fr:uri>https://www.forester-notes.org/00LS/</fr:uri><fr:display-uri>00LS</fr:display-uri><fr:route>/00LS/</fr:route><fr:title text="Breaking changes to the XML format">Breaking changes to the XML format</fr:title><fr:taxon>Change</fr:taxon></fr:frontmatter><fr:mainmatter><html:p><fr:link href="/00HY/" title="Forester 3.1" uri="https://www.forester-notes.org/00HY/" display-uri="00HY" type="local">Forester 3.1</fr:link> makes some breaking changes to the XML format; if you are using the <fr:link href="https://git.sr.ht/~jonsterling/forester-base-theme" type="external">default theme</fr:link>, just update it to the latest version to migrate your forest. The main change is that “trails” for subtrees (like “1.4.2”) are no longer computed ahead of time and stored in XML, but are instead computed on the fly in the XSLT stylesheet using <html:code>&lt;xsl:number&gt;</html:code>.</html:p><html:p>A further change is that embedded <fr:tex display="inline"><![CDATA[\LaTeX ]]></fr:tex> is no longer emitted using the <html:code>&lt;img&gt;</html:code> element: instead, there is a new <html:code>&lt;embedded-tex&gt;</html:code> element with an attribute <html:code>@hash</html:code> containing the name (without extension) of the appropriate SVG file, and with children elements <html:code>&lt;embedded-tex-preamble&gt;</html:code> and <html:code>&lt;embedded-tex-body&gt;</html:code>. These are meant to facilitate generation of <fr:tex display="inline"><![CDATA[\LaTeX ]]></fr:tex> documents from Forester’s XML output in combination with the <html:code>filecontents</html:code> environment.</html:p></fr:mainmatter></fr:tree></fr:mainmatter></fr:tree><fr:tree show-metadata="true" expanded="false" numbered="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link></fr:author><fr:contributor><fr:link href="/kentookura/" title="Kento Okura" uri="https://www.forester-notes.org/kentookura/" display-uri="kentookura" type="local">Kento Okura</fr:link></fr:contributor><fr:contributor><fr:link href="/dannypsnl/" title="Lîm Tsú-thuàn" uri="https://www.forester-notes.org/dannypsnl/" display-uri="dannypsnl" type="local">Lîm Tsú-thuàn</fr:link></fr:contributor><fr:contributor><fr:link href="/owenlynch/" title="Owen Lynch" uri="https://www.forester-notes.org/owenlynch/" display-uri="owenlynch" type="local">Owen Lynch</fr:link></fr:contributor><fr:contributor><fr:link href="/favonia/" title="Kuen-Bang Hou (Favonia)" uri="https://www.forester-notes.org/favonia/" display-uri="favonia" type="local">Kuen-Bang Hou (Favonia)</fr:link></fr:contributor></fr:authors><fr:date><fr:year>2023</fr:year><fr:month>11</fr:month><fr:day>3</fr:day></fr:date><fr:uri>https://www.forester-notes.org/00CW/</fr:uri><fr:display-uri>00CW</fr:display-uri><fr:route>/00CW/</fr:route><fr:title text="Forester 3.0">Forester 3.0</fr:title><fr:taxon>Release</fr:taxon></fr:frontmatter><fr:mainmatter><html:p>This is a major breaking release; some surgery may be required on existing <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forests</fr:link>. Thanks to Favonia, <fr:link href="/kentookura/" title="Kento Okura" uri="https://www.forester-notes.org/kentookura/" display-uri="kentookura" type="local">Kento Okura</fr:link>, <fr:link href="/dannypsnl/" title="Lîm Tsú-thuàn" uri="https://www.forester-notes.org/dannypsnl/" display-uri="dannypsnl" type="local">Lîm Tsú-thuàn</fr:link>, and <fr:link href="/owenlynch/" title="Owen Lynch" uri="https://www.forester-notes.org/owenlynch/" display-uri="owenlynch" type="local">Owen Lynch</fr:link> for their contributions to this release. Thanks also to Adrien Guatto for bug reports.</html:p><fr:tree show-metadata="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link></fr:author></fr:authors><fr:date><fr:year>2023</fr:year><fr:month>11</fr:month><fr:day>3</fr:day></fr:date><fr:uri>https://www.forester-notes.org/00CX/</fr:uri><fr:display-uri>00CX</fr:display-uri><fr:route>/00CX/</fr:route><fr:title text="Proper diagnostics with source locations">Proper diagnostics with source locations</fr:title><fr:taxon>Feature</fr:taxon></fr:frontmatter><fr:mainmatter><html:p><fr:link href="/00CW/" title="Forester 3.0" uri="https://www.forester-notes.org/00CW/" display-uri="00CW" type="local">Forester 3.0</fr:link> adds proper diagnostics and error messages, via the excellent <fr:link href="https://ocaml.org/p/asai/latest" type="external">asai</fr:link> library maintained by <fr:link href="/favonia/" title="Kuen-Bang Hou (Favonia)" uri="https://www.forester-notes.org/favonia/" display-uri="favonia" type="local">Favonia</fr:link>. When something goes wrong in your forest, the terminal output should expain what happened while displaying the precise location in your source file.</html:p></fr:mainmatter></fr:tree><fr:tree show-metadata="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link></fr:author></fr:authors><fr:date><fr:year>2023</fr:year><fr:month>11</fr:month><fr:day>19</fr:day></fr:date><fr:uri>https://www.forester-notes.org/00EY/</fr:uri><fr:display-uri>00EY</fr:display-uri><fr:route>/00EY/</fr:route><fr:title text="Experimental support for objects">Experimental support for objects</fr:title><fr:taxon>Feature</fr:taxon></fr:frontmatter><fr:mainmatter><html:p>To facilitate the development of extensible macro libraries for diagramming and other tasks, <fr:link href="/00CW/" title="Forester 3.0" uri="https://www.forester-notes.org/00CW/" display-uri="00CW" type="local">Forester 3.0</fr:link> introduces experimental support for <html:em>objects</html:em> — which should be thought of as combination of records/structs, closures, and general recursion. An object is created like so:</html:p><html:pre><![CDATA[\def\my-object{
  \object[self]{
    [method1]{
      the implementation of this method
    }
    [method2]{
      the implementation of another method
      \self#method1
    }
  }
}]]></html:pre><html:p>The variable <html:code>self</html:code> is explicitly bound, and can be bound to any name you like. Methods currently are not allowed to take any arguments, but this may change in the future. A primitive form of inheritance is supported, using <html:code><![CDATA[\patch]]></html:code>:</html:p><html:pre><![CDATA[\patch{\my-object}[self]{
  [method1]{
    \self/super#method1
    some further code
  }
}]]></html:pre><html:p>The support for objects in <fr:link href="/00CW/" title="Forester 3.0" uri="https://www.forester-notes.org/00CW/" display-uri="00CW" type="local">Forester 3.0</fr:link> is extremely experimental and preliminary: users are discouraged from relying on it.</html:p></fr:mainmatter></fr:tree><fr:tree show-metadata="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link></fr:author></fr:authors><fr:date><fr:year>2023</fr:year><fr:month>11</fr:month><fr:day>20</fr:day></fr:date><fr:uri>https://www.forester-notes.org/00F0/</fr:uri><fr:display-uri>00F0</fr:display-uri><fr:route>/00F0/</fr:route><fr:title text="Improvements to date handling">Improvements to date handling</fr:title><fr:taxon>Feature</fr:taxon></fr:frontmatter><fr:mainmatter><html:p><fr:link href="/00CW/" title="Forester 3.0" uri="https://www.forester-notes.org/00CW/" display-uri="00CW" type="local">Forester 3.0</fr:link> improves support for journaling with date-specific trees. When a tree is dated <html:code>YYYY-MM-DD</html:code> and there exists a tree at address <html:code>YYYY-MM-DD</html:code>, the date field will be hyperlinked to the latter. This involves changes to both the executable and the XSL stylesheet of the <fr:link href="https://git.sr.ht/~jonsterling/forester-base-theme" type="external">base theme</fr:link>. The purpose of this change is to better facilitate daily notes / journaling.</html:p><html:p>Additionally, Forester’s data model now allows <html:em>multiple</html:em> dates to be assigned to a single tree simultaneously.</html:p></fr:mainmatter></fr:tree><fr:tree show-metadata="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/kentookura/" title="Kento Okura" uri="https://www.forester-notes.org/kentookura/" display-uri="kentookura" type="local">Kento Okura</fr:link></fr:author></fr:authors><fr:date><fr:year>2023</fr:year><fr:month>11</fr:month><fr:day>22</fr:day></fr:date><fr:uri>https://www.forester-notes.org/00FI/</fr:uri><fr:display-uri>00FI</fr:display-uri><fr:route>/00FI/</fr:route><fr:title text="Nix support">Nix support</fr:title><fr:taxon>Feature</fr:taxon></fr:frontmatter><fr:mainmatter><html:p><fr:link href="/00CW/" title="Forester 3.0" uri="https://www.forester-notes.org/00CW/" display-uri="00CW" type="local">Forester 3.0</fr:link> comes with a <fr:link href="https://nixos.wiki/wiki/Flakes" type="external">nix flake</fr:link>
for easy integration with nix-based systems. Users of nix can try
forester without installing the ocaml toolchain by running
<html:code>nix run sourcehut:~jonsterling/ocaml-forester</html:code>.</html:p><html:p>To create a development shell with <html:code>forester</html:code> and LaTeX dependencies,
create a file named <html:code>flake.nix</html:code> with the following content:</html:p><html:pre><![CDATA[{
 inputs = {
   forester = {
     url = "sourcehut:~jonsterling/ocaml-forester";
   };
   flake-utils.url = "github:numtide/flake-utils";
 };
 outputs =
   { self
   , flake-utils
   , nixpkgs
   , forester
   }:
   flake-utils.lib.eachDefaultSystem
     (system:
     let
       pkgs = import nixpkgs { inherit system; };
       legacyPackages = import forester.legacyPackages.${system};
     in
     {
       devShell =
         pkgs.mkShell {
           buildInputs = with pkgs; [
             forester.packages.${system}.default
             texlive.combined.scheme-full
             fswatch
           ];
         };
     });
}]]></html:pre><html:p>and run <html:code>nix develop</html:code>.</html:p><html:p>The <fr:link href="https://git.sr.ht/~jonsterling/forest-template" type="external">default template</fr:link> now ships with a flake and an <fr:link href="https://direnv.net/" type="external">envrc</fr:link>. If you created your forest using this template and would like to use direnv, simply copy <html:code>flake.nix</html:code> and <html:code>.envrc</html:code> to your forest base directory.</html:p></fr:mainmatter></fr:tree><fr:tree show-metadata="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link></fr:author><fr:author><fr:link href="/dannypsnl/" title="Lîm Tsú-thuàn" uri="https://www.forester-notes.org/dannypsnl/" display-uri="dannypsnl" type="local">Lîm Tsú-thuàn</fr:link></fr:author></fr:authors><fr:date><fr:year>2023</fr:year><fr:month>12</fr:month><fr:day>2</fr:day></fr:date><fr:uri>https://www.forester-notes.org/00G7/</fr:uri><fr:display-uri>00G7</fr:display-uri><fr:route>/00G7/</fr:route><fr:title text="Lightweight templating in forester new">Lightweight templating in <html:code>forester new</html:code></fr:title><fr:taxon>Feature</fr:taxon></fr:frontmatter><fr:mainmatter><html:p><fr:link href="/00CW/" title="Forester 3.0" uri="https://www.forester-notes.org/00CW/" display-uri="00CW" type="local">Forester 3.0</fr:link> adds a new <html:code>--template</html:code> option to the <html:code>forester new</html:code> command. Running <html:code>forester new --template xxx-0001</html:code> will create a new tree with the contents of the existing tree <html:code>xxx-0001</html:code>.</html:p></fr:mainmatter></fr:tree><fr:tree show-metadata="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link></fr:author><fr:author><fr:link href="/owenlynch/" title="Owen Lynch" uri="https://www.forester-notes.org/owenlynch/" display-uri="owenlynch" type="local">Owen Lynch</fr:link></fr:author></fr:authors><fr:date><fr:year>2023</fr:year><fr:month>12</fr:month><fr:day>13</fr:day></fr:date><fr:uri>https://www.forester-notes.org/00GG/</fr:uri><fr:display-uri>00GG</fr:display-uri><fr:route>/00GG/</fr:route><fr:title text="Support for randomised tree identifiers in forester new">Support for randomised tree identifiers in <html:code>forester new</html:code></fr:title><fr:taxon>Feature</fr:taxon></fr:frontmatter><fr:mainmatter><html:p>The <html:code>forester new</html:code> has a new <html:code>--random</html:code> flag; when activated, the new tree will be allocated with a <html:em>randomised</html:em> unused tree identifier rather than the usual sequential tree identifier. This can be useful for projects that have multiple collaborators, although in this case, users are generally advised to claim their own namespaces.</html:p></fr:mainmatter></fr:tree><fr:tree show-metadata="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link></fr:author></fr:authors><fr:date><fr:year>2023</fr:year><fr:month>12</fr:month><fr:day>15</fr:day></fr:date><fr:uri>https://www.forester-notes.org/00GL/</fr:uri><fr:display-uri>00GL</fr:display-uri><fr:route>/00GL/</fr:route><fr:title text="Custom static assets directories">Custom static assets directories</fr:title><fr:taxon>Feature</fr:taxon></fr:frontmatter><fr:mainmatter><html:p>A new <html:code>--assets-dirs</html:code> option has been added to the <html:code>forester build</html:code> command, which can be used to supply multiple directories containing static assets that should be copied into the forest. By default, the option is set to <html:code>assets</html:code>.</html:p></fr:mainmatter></fr:tree><fr:tree show-metadata="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link></fr:author></fr:authors><fr:date><fr:year>2023</fr:year><fr:month>11</fr:month><fr:day>3</fr:day></fr:date><fr:uri>https://www.forester-notes.org/00CY/</fr:uri><fr:display-uri>00CY</fr:display-uri><fr:route>/00CY/</fr:route><fr:title text="Breaking changes">Breaking changes</fr:title></fr:frontmatter><fr:mainmatter><html:p><fr:link href="/00CW/" title="Forester 3.0" uri="https://www.forester-notes.org/00CW/" display-uri="00CW" type="local">Forester 3.0</fr:link> introduces a number of breaking changes to the source language in order to facilitate maintainability, diagnostic support, and extensibility of both the Forester tool and your individual <fr:link href="/tfmt-000R/" title="Forests and trees of evergreen notes" uri="https://www.forester-notes.org/tfmt-000R/" display-uri="tfmt-000R" type="local">forests</fr:link>.</html:p><fr:tree show-metadata="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link></fr:author></fr:authors><fr:date><fr:year>2023</fr:year><fr:month>11</fr:month><fr:day>3</fr:day></fr:date><fr:uri>https://www.forester-notes.org/00CZ/</fr:uri><fr:display-uri>00CZ</fr:display-uri><fr:route>/00CZ/</fr:route><fr:title text="Fall-through of undefined identifiers">Fall-through of undefined identifiers</fr:title><fr:taxon>Change</fr:taxon></fr:frontmatter><fr:mainmatter><html:p>The fall-through for undefined identifiers in XML mode is removed in <fr:link href="/00CW/" title="Forester 3.0" uri="https://www.forester-notes.org/00CW/" display-uri="00CW" type="local">Forester 3.0</fr:link>: previously when an identifier <html:code><![CDATA[\foo]]></html:code> was undefined, it was possible to write <html:code><![CDATA[\foo[attr]{value}{body}]]></html:code> and have this be rendered in XML to <html:code><![CDATA[<foo attr="value">body</foo>]]></html:code>.</html:p><html:p>This behavior has been removed, but you can nonetheless write <html:code><![CDATA[\xml{foo}[attr]{value}{body}]]></html:code> to achieve the same. For content that is being rendered by either LaTeX or KaTeX, simple fallthrough (naturally without attributes or arguments) is supported; therefore <html:code><![CDATA[#{\alpha}]]></html:code> will render to <fr:tex display="inline"><![CDATA[\alpha ]]></fr:tex>.</html:p></fr:mainmatter></fr:tree><fr:tree show-metadata="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link></fr:author></fr:authors><fr:date><fr:year>2023</fr:year><fr:month>11</fr:month><fr:day>3</fr:day></fr:date><fr:uri>https://www.forester-notes.org/00D0/</fr:uri><fr:display-uri>00D0</fr:display-uri><fr:route>/00D0/</fr:route><fr:title text="Primitive formatting commands">Primitive formatting commands</fr:title><fr:taxon>Change</fr:taxon></fr:frontmatter><fr:mainmatter><html:p>As a consequence of the <fr:link href="/00CZ/" title="Forester 3.0 › Breaking changes › Fall-through of undefined identifiers" uri="https://www.forester-notes.org/00CZ/" display-uri="00CZ" type="local">changed fallthrough behavior</fr:link>, several new primitives have been added to the source language, including <html:code><![CDATA[\p]]></html:code>, <html:code><![CDATA[\em]]></html:code>, <html:code><![CDATA[\strong]]></html:code>, <html:code><![CDATA[\ol]]></html:code>, <html:code><![CDATA[\ul]]></html:code>, <html:code><![CDATA[\li]]></html:code>, <html:code><![CDATA[\blockquote]]></html:code>, and <html:code><![CDATA[\pre]]></html:code>.</html:p><html:p>You can add further commands to your primitives using a combination of <html:code><![CDATA[\def]]></html:code>, <html:code><![CDATA[\iftex]]></html:code>, and <html:code><![CDATA[\xml]]></html:code>.</html:p></fr:mainmatter></fr:tree></fr:mainmatter></fr:tree></fr:mainmatter></fr:tree><fr:tree show-metadata="true" expanded="false" numbered="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link></fr:author></fr:authors><fr:date><fr:year>2023</fr:year><fr:month>9</fr:month><fr:day>27</fr:day></fr:date><fr:uri>https://www.forester-notes.org/009Q/</fr:uri><fr:display-uri>009Q</fr:display-uri><fr:route>/009Q/</fr:route><fr:title text="Forester 2.5">Forester 2.5</fr:title><fr:taxon>Release</fr:taxon></fr:frontmatter><fr:mainmatter><html:p>Thanks to <fr:link href="/dannypsnl/" title="Lîm Tsú-thuàn" uri="https://www.forester-notes.org/dannypsnl/" display-uri="dannypsnl" type="local">Lîm Tsú-thuàn</fr:link> and Vikraman Choudhury for their suggestions and bug reports on the <fr:link href="https://lists.sr.ht/~jonsterling/forester-discuss" type="external">mailing list</fr:link>.</html:p><fr:tree show-metadata="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link></fr:author></fr:authors><fr:date><fr:year>2023</fr:year><fr:month>9</fr:month><fr:day>27</fr:day></fr:date><fr:uri>https://www.forester-notes.org/UM95/</fr:uri><fr:display-uri>UM95</fr:display-uri><fr:route>/UM95/</fr:route><fr:title text="New \iftex command">New <html:code><![CDATA[\iftex]]></html:code> command</fr:title></fr:frontmatter><fr:mainmatter><html:p>A new <html:code><![CDATA[\iftex]]></html:code> command has been added, following a suggestion of Vikraman Choudhury; this can be used to control the behavior of macros, depending on whether they are being rendered by <fr:tex display="inline"><![CDATA[\LaTeX ]]></fr:tex> or by the browser. For example, <html:code><![CDATA[\iftex{foo}{bar}]]></html:code> will become <html:code>foo</html:code> when passed to the <fr:tex display="inline"><![CDATA[\LaTeX ]]></fr:tex> tool, but will be reated as <html:code>bar</html:code> when rendering for the browser.</html:p></fr:mainmatter></fr:tree><fr:tree show-metadata="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link></fr:author></fr:authors><fr:date><fr:year>2023</fr:year><fr:month>9</fr:month><fr:day>27</fr:day></fr:date><fr:uri>https://www.forester-notes.org/UMS4/</fr:uri><fr:display-uri>UMS4</fr:display-uri><fr:route>/UMS4/</fr:route><fr:title text="Overriding taxa">Overriding taxa</fr:title></fr:frontmatter><fr:mainmatter><html:p>A new <fr:link href="/005O/" title="Forester 2.1" uri="https://www.forester-notes.org/005O/" display-uri="005O" type="local">fluid binding</fr:link> <html:code><![CDATA[\transclude/taxon]]></html:code> has been added to the <fr:link href="/0067/" title="Forester 2.2 › Flexible transclusion options" uri="https://www.forester-notes.org/0067/" display-uri="0067" type="local">transclusion overrides</fr:link>, which can be used to locally change the taxon of a transcluded tree. Thanks to <fr:link href="/dannypsnl/" title="Lîm Tsú-thuàn" uri="https://www.forester-notes.org/dannypsnl/" display-uri="dannypsnl" type="local">Lîm Tsú-thuàn</fr:link> for implementing this.</html:p></fr:mainmatter></fr:tree><fr:tree show-metadata="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link></fr:author></fr:authors><fr:date><fr:year>2023</fr:year><fr:month>9</fr:month><fr:day>27</fr:day></fr:date><fr:uri>https://www.forester-notes.org/NRTU/</fr:uri><fr:display-uri>NRTU</fr:display-uri><fr:route>/NRTU/</fr:route><fr:title text="Theme and asset directories">Theme and asset directories</fr:title></fr:frontmatter><fr:mainmatter><html:p>In order to support more modular development of <fr:link href="/tfmt-000V/" title="Forests of evergreen notes" uri="https://www.forester-notes.org/tfmt-000V/" display-uri="tfmt-000V" type="local">forests</fr:link>, a new <html:code>theme</html:code> directory is expected to contain all the XSL, CSS, font, etc. assets that pertain to the <html:em>presentation</html:em> of your <fr:link href="/tfmt-000V/" title="Forests of evergreen notes" uri="https://www.forester-notes.org/tfmt-000V/" display-uri="tfmt-000V" type="local">forest</fr:link>; the <html:code>assets</html:code> directory is meant to store things like images, PDFs, etc. that pertain to the <html:em>content</html:em> of your <fr:link href="/tfmt-000V/" title="Forests of evergreen notes" uri="https://www.forester-notes.org/tfmt-000V/" display-uri="tfmt-000V" type="local">forest</fr:link>. The simplest way to take advantage of this new feature is to bind your <html:code>theme</html:code> directory to a <fr:link href="https://git-scm.com/book/en/v2/Git-Tools-Submodules" type="external">git submodule</fr:link> pointing to the <fr:link href="https://git.sr.ht/~jonsterling/forester-base-theme" type="external">forester-base-theme</fr:link> repository. Your existing <fr:link href="/tfmt-000V/" title="Forests of evergreen notes" uri="https://www.forester-notes.org/tfmt-000V/" display-uri="tfmt-000V" type="local">forest</fr:link> will still work fine for now even if you do not migrate to the new directory structure. I’m grateful to <fr:link href="/armaëlguéneau/" title="Armaël Guéneau" uri="https://www.forester-notes.org/armaëlguéneau/" display-uri="armaëlguéneau" type="local">Armaël Guéneau</fr:link> for conversations that motivated me to make this change.</html:p></fr:mainmatter></fr:tree></fr:mainmatter></fr:tree><fr:tree show-metadata="true" expanded="false" numbered="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link></fr:author></fr:authors><fr:date><fr:year>2023</fr:year><fr:month>9</fr:month><fr:day>22</fr:day></fr:date><fr:uri>https://www.forester-notes.org/007M/</fr:uri><fr:display-uri>007M</fr:display-uri><fr:route>/007M/</fr:route><fr:title text="Forester 2.4">Forester 2.4</fr:title><fr:taxon>Release</fr:taxon></fr:frontmatter><fr:mainmatter><html:p>Thanks to <fr:link href="/masanoriogino/" title="Masanori Ogino" uri="https://www.forester-notes.org/masanoriogino/" display-uri="masanoriogino" type="local">Masanori Ogino</fr:link> and <fr:link href="/haroldcarr/" title="Harold Carr" uri="https://www.forester-notes.org/haroldcarr/" display-uri="haroldcarr" type="local">Harold Carr</fr:link> for their suggestions which have influenced this release. In addition to the major changes detailed below, there are a few minor improvements:</html:p><html:ul><html:li>The evaluator for Markdown-style links <html:code><![CDATA[[title](destination)]]></html:code> now allows <html:code>destination</html:code> to contain expressions other than text, so long as they <html:em>evaluate</html:em> to text.</html:li>
  <html:li>The <fr:link href="/0072/" title="Forester 2.3 › Rudimentary support for XML attributes" uri="https://www.forester-notes.org/0072/" display-uri="0072" type="local">XML attribute support</fr:link> introduced in <fr:link href="/006Z/" title="Forester 2.3" uri="https://www.forester-notes.org/006Z/" display-uri="006Z" type="local">Forester 2.3</fr:link> has been amended so that attributes appear in square brackets, e.g. <html:code><![CDATA[\p[class]{myclass}{body}]]></html:code></html:li>
  <html:li>The <html:code>forester new</html:code> command now has a <html:code>--dest</html:code> option, which is used to specify the directory in which to deposit the new tree (independently of the <html:code>--dir</html:code> option, which specifies the directory to scan for existing trees). Please run  <html:code>forester new --help</html:code> for details.</html:li></html:ul><fr:tree show-metadata="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link></fr:author></fr:authors><fr:date><fr:year>2023</fr:year><fr:month>8</fr:month><fr:day>19</fr:day></fr:date><fr:uri>https://www.forester-notes.org/007Y/</fr:uri><fr:display-uri>007Y</fr:display-uri><fr:route>/007Y/</fr:route><fr:title text="Rudimentary support for RSS feeds">Rudimentary support for RSS feeds</fr:title><fr:taxon>Feature</fr:taxon></fr:frontmatter><fr:mainmatter><html:p>Each tree generates an RSS feed containing its immediate children; if a tree is located at <html:code>xxx-NNNN.xml</html:code>, then the corresponding RSS file will be located at <html:code>xxx-NNNN.rss.xml</html:code>. Currently no content is placed in the RSS feed items, but in the future we may add some best-effort plain text linearization of the first paragraph of the tree or something. <fr:link href="https://lists.sr.ht/~jonsterling/forester-discuss" type="external">Feedback on this feature is welcome</fr:link>.</html:p></fr:mainmatter></fr:tree><fr:tree show-metadata="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link></fr:author></fr:authors><fr:date><fr:year>2023</fr:year><fr:month>9</fr:month><fr:day>13</fr:day></fr:date><fr:uri>https://www.forester-notes.org/008Z/</fr:uri><fr:display-uri>008Z</fr:display-uri><fr:route>/008Z/</fr:route><fr:title text="Wikilinks support">Wikilinks support</fr:title><fr:taxon>Feature</fr:taxon></fr:frontmatter><fr:mainmatter><html:p>This release adds support for “wikilinks” in the form <html:code><![CDATA[[[destination]]]]></html:code>; this will be rendered as a link whose title is given by the title of the tree at address <html:code>destination</html:code>. Users are discouraged from using wikilinks heavily, as it is better for your mind to “work a link into a sentence” naturally; but this can be very useful for linking to <fr:link href="/007K/" title="Creating your personal biographical tree" uri="https://www.forester-notes.org/007K/" display-uri="007K" type="local">biographical trees</fr:link> or daily notes.</html:p></fr:mainmatter></fr:tree><fr:tree show-metadata="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link></fr:author></fr:authors><fr:date><fr:year>2023</fr:year><fr:month>8</fr:month><fr:day>19</fr:day></fr:date><fr:uri>https://www.forester-notes.org/007X/</fr:uri><fr:display-uri>007X</fr:display-uri><fr:route>/007X/</fr:route><fr:title text="Breaking changes to XML format">Breaking changes to XML format</fr:title><fr:taxon>Change</fr:taxon></fr:frontmatter><fr:mainmatter><html:p>This release contains several breaking changes to the XML format that can break custom XSLT stylesheets.</html:p><html:ol><html:li>Taxa used to be attributes of <html:code>tree</html:code>, but they are now child elements of <html:code>tree/frontmatter</html:code>. Therefore, what previously was written as
    <html:pre>&lt;tree taxon="lemma"&gt;
  &lt;frontmatter&gt;
    &lt;!-- ... --&gt;
  &lt;/frontmatter&gt;
  &lt;!-- ... --&gt;
&lt;/tree&gt;</html:pre>
    is now written as follows:
    <html:pre>&lt;tree&gt;
  &lt;frontmatter&gt;
    &lt;taxon&gt;lemma&lt;/taxon&gt;
    &lt;!-- ... --&gt;
  &lt;/frontmatter&gt;
  &lt;!-- ... --&gt;
&lt;/tree&gt;</html:pre></html:li>
  <html:li><html:p>Dates are now stored in machine-readable format. For example, what used to be written <html:code>&lt;date&gt;August 16, 2023&lt;/date&gt;</html:code> is now written as follows:</html:p>
    <html:pre>&lt;date&gt;
  &lt;year&gt;2023&lt;/year&gt;
  &lt;month&gt;8&lt;/month&gt;
  &lt;day&gt;16&lt;/day&gt;
&lt;/date&gt;</html:pre>
    <html:p>It is the responsibility of the XSLT stylesheet to format dates appropriately. Thanks to <fr:link href="/masanoriogino/" title="Masanori Ogino" uri="https://www.forester-notes.org/masanoriogino/" display-uri="masanoriogino" type="local">Masanori Ogino</fr:link> for suggesting this change.</html:p></html:li>
  <html:li>All identifiers in the XML format have been regularized to use snake-case; for instance, <html:code>sourcePath</html:code> is now <html:code>source-path</html:code> and <html:code>show_heading</html:code> is now <html:code>show-heading</html:code>.</html:li></html:ol></fr:mainmatter></fr:tree></fr:mainmatter></fr:tree><fr:tree show-metadata="true" expanded="false" numbered="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link></fr:author><fr:contributor><fr:link href="/armaëlguéneau/" title="Armaël Guéneau" uri="https://www.forester-notes.org/armaëlguéneau/" display-uri="armaëlguéneau" type="local">Armaël Guéneau</fr:link></fr:contributor><fr:contributor><fr:link href="/rileyshahar/" title="Riley Shahar" uri="https://www.forester-notes.org/rileyshahar/" display-uri="rileyshahar" type="local">Riley Shahar</fr:link></fr:contributor></fr:authors><fr:date><fr:year>2023</fr:year><fr:month>8</fr:month><fr:day>14</fr:day></fr:date><fr:uri>https://www.forester-notes.org/006Z/</fr:uri><fr:display-uri>006Z</fr:display-uri><fr:route>/006Z/</fr:route><fr:title text="Forester 2.3">Forester 2.3</fr:title><fr:taxon>Release</fr:taxon></fr:frontmatter><fr:mainmatter><html:p><fr:link href="/armaëlguéneau/" title="Armaël Guéneau" uri="https://www.forester-notes.org/armaëlguéneau/" display-uri="armaëlguéneau" type="local">Armaël Guéneau</fr:link>, <fr:link href="/rileyshahar/" title="Riley Shahar" uri="https://www.forester-notes.org/rileyshahar/" display-uri="rileyshahar" type="local">Riley Shahar</fr:link>, and <fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link> contributed code to this major release. Thanks also to <fr:link href="/masanoriogino/" title="Masanori Ogino" uri="https://www.forester-notes.org/masanoriogino/" display-uri="masanoriogino" type="local">Masanori Ogino</fr:link> for <fr:link href="/0072/" title="Rudimentary support for XML attributes" uri="https://www.forester-notes.org/0072/" display-uri="0072" type="local">feature requests</fr:link> that made it into this release.</html:p><html:p>This release adds some new features to the command line interface. The original behavior of the <html:code>forester</html:code> command is now obtained by calling <html:code>forester build</html:code>. Please browse <html:code>forester --help</html:code> for more information.</html:p><fr:tree show-metadata="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link></fr:author></fr:authors><fr:date><fr:year>2023</fr:year><fr:month>8</fr:month><fr:day>14</fr:day></fr:date><fr:uri>https://www.forester-notes.org/0070/</fr:uri><fr:display-uri>0070</fr:display-uri><fr:route>/0070/</fr:route><fr:title text="Create new trees from the command line">Create new trees from the command line</fr:title><fr:taxon>Feature</fr:taxon></fr:frontmatter><fr:mainmatter><html:p>A new command has been added in <fr:link href="/006Z/" title="Forester 2.3" uri="https://www.forester-notes.org/006Z/" display-uri="006Z" type="local">Forester 2.3</fr:link> to simplify the creation of new trees with the correct base-36 identifier. If your personal namespace prefix is <html:code>xxx</html:code>, you may run the following command to create a new tree in the <html:code>trees</html:code> directory:</html:p><html:pre><![CDATA[forester new --dir=trees --prefix=xxx]]></html:pre><html:p>If the last tree in this directory was <html:code>xxx-0039</html:code>, a new tree will be generated at <html:code>xxx-003A</html:code>. The new tree will be populated with a correct <html:code><![CDATA[\date]]></html:code> declaration.</html:p></fr:mainmatter></fr:tree><fr:tree show-metadata="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link></fr:author></fr:authors><fr:date><fr:year>2023</fr:year><fr:month>8</fr:month><fr:day>14</fr:day></fr:date><fr:uri>https://www.forester-notes.org/0071/</fr:uri><fr:display-uri>0071</fr:display-uri><fr:route>/0071/</fr:route><fr:title text="Tree title completion for tool support">Tree title completion for tool support</fr:title><fr:taxon>Feature</fr:taxon></fr:frontmatter><fr:mainmatter><html:p>A new <html:code>forester complete</html:code> command has been added to search for trees by their title; the purpose of this command is to facilitate external tool support, such as this <fr:link href="https://github.com/rileyshahar/cmp-Forester" type="external">proof-of-concept completion engine for neovim</fr:link>. Please browse <html:code>forester complete --help</html:code> for more information about this command.</html:p><html:p>Current limitations: the command is currently case sensitive and only searches prefixes; in the future, it would be desirable to support more flexible <fr:link href="https://en.wikipedia.org/wiki/Approximate_string_matching" type="external">fuzzy-search</fr:link>.</html:p><html:p>Thanks to <fr:link href="/rileyshahar/" title="Riley Shahar" uri="https://www.forester-notes.org/rileyshahar/" display-uri="rileyshahar" type="local">Riley Shahar</fr:link> for implementing this feature.</html:p></fr:mainmatter></fr:tree><fr:tree show-metadata="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link></fr:author></fr:authors><fr:date><fr:year>2023</fr:year><fr:month>8</fr:month><fr:day>14</fr:day></fr:date><fr:uri>https://www.forester-notes.org/0072/</fr:uri><fr:display-uri>0072</fr:display-uri><fr:route>/0072/</fr:route><fr:title text="Rudimentary support for XML attributes">Rudimentary support for XML attributes</fr:title><fr:taxon>Feature</fr:taxon></fr:frontmatter><fr:mainmatter><html:p>When Forester encounters an undefined function, it automatically passes through to the XML output. For instance, if the function <html:code><![CDATA[\myfun]]></html:code> is not defined, then the Forester code <html:code><![CDATA[\myfun{hello}]]></html:code> will render to the XML code <html:code><![CDATA[<myfun>hello</myfun>]]></html:code>. <html:strong>The <fr:link href="/006Z/" title="Forester 2.3" uri="https://www.forester-notes.org/006Z/" display-uri="006Z" type="local">Forester 2.3</fr:link> extends this fall-through behavior to support XML attributes.</html:strong></html:p><html:p>In particular, if you write <html:code><![CDATA[\myfun{key1}{value1}{key2}{value2}{hello}]]></html:code>, Forester will render the following XML code:</html:p><html:pre><![CDATA[<myfun key1="value1" key2="value2">
  hello
</myfun>]]></html:pre><html:p>Thanks to <fr:link href="/masanoriogino/" title="Masanori Ogino" uri="https://www.forester-notes.org/masanoriogino/" display-uri="masanoriogino" type="local">Masanori Ogino</fr:link> for suggesting this feature, and welcome to the <fr:link href="https://lists.sr.ht/~jonsterling/forester-discuss" type="external">Forester community</fr:link>!.</html:p></fr:mainmatter></fr:tree><html:p>In addition to the major changes above, the following minor changes are included in this release:</html:p><html:ol><html:li>A <html:code>title</html:code> attribute attribute has been added to the XML output of internal links, in order to facilitate tooltips and other affordances in rendered forests. Thanks to <fr:link href="/armaëlguéneau/" title="Armaël Guéneau" uri="https://www.forester-notes.org/armaëlguéneau/" display-uri="armaëlguéneau" type="local">Armaël Guéneau</fr:link> for implementing this feature.</html:li>
  <html:li>Subdirectories of input directories will now be traversed automatically; note that the tree address model remains flat, and subdirectories are present only for convenience.</html:li>
  <html:li>Added a nicer command line interface with <html:code>--help</html:code> documentation.</html:li>
  <html:li>I have migrated much of the system code to use the experimental <fr:link href="https://github.com/ocaml-multicore/eio" type="external">Eio library</fr:link> for improved portability.</html:li>
  <html:li>The example forest has been removed from the main repository, and moved into a separate <fr:link href="https://git.sr.ht/~jonsterling/forest-template" type="external">template repository</fr:link>.</html:li></html:ol></fr:mainmatter></fr:tree><fr:tree show-metadata="true" expanded="false" numbered="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link></fr:author></fr:authors><fr:date><fr:year>2023</fr:year><fr:month>7</fr:month><fr:day>17</fr:day></fr:date><fr:uri>https://www.forester-notes.org/005V/</fr:uri><fr:display-uri>005V</fr:display-uri><fr:route>/005V/</fr:route><fr:title text="Forester 2.2">Forester 2.2</fr:title><fr:taxon>Release</fr:taxon></fr:frontmatter><fr:mainmatter><fr:tree show-metadata="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link></fr:author></fr:authors><fr:date><fr:year>2023</fr:year><fr:month>7</fr:month><fr:day>20</fr:day></fr:date><fr:uri>https://www.forester-notes.org/0067/</fr:uri><fr:display-uri>0067</fr:display-uri><fr:route>/0067/</fr:route><fr:title text="Flexible transclusion options">Flexible transclusion options</fr:title><fr:taxon>Feature</fr:taxon></fr:frontmatter><fr:mainmatter><html:p>This release replaces the old <html:code><![CDATA[\transclude*]]></html:code>, <html:code><![CDATA[\transclude@]]></html:code> commands with a more flexible transclusion configuration mechanism using the support for fluid binding introduced in <fr:link href="/005O/" title="Forester 2.1" uri="https://www.forester-notes.org/005O/" display-uri="005O" type="local">Forester 2.1</fr:link>. A basic transclusion with the default options is done in the same way as before:</html:p><html:pre><![CDATA[\transclude{0005}]]></html:pre><html:p>The behavior of transclusion is, however, configurable by several globally allocated fluid bindings as depicted in the <fr:link href="/0069/" title="Transclusion options" uri="https://www.forester-notes.org/0069/" display-uri="0069" type="local">table below</fr:link>.</html:p><fr:tree show-metadata="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link></fr:author></fr:authors><fr:uri>https://www.forester-notes.org/0069/</fr:uri><fr:display-uri>0069</fr:display-uri><fr:route>/0069/</fr:route><fr:title text="Transclusion options">Transclusion options</fr:title><fr:taxon>Table</fr:taxon></fr:frontmatter><fr:mainmatter>
  <html:table>
  
  
  <html:tr>
    
  <html:th>Fluid Binding</html:th>

    
  <html:th>Default</html:th>

    
  <html:th>Meaning</html:th>

  </html:tr>

  
  <html:tr>
    
  <html:td><html:code><![CDATA[\transclude/]]>title</html:code></html:td>

    
  <html:td><html:em>(none)</html:em></html:td>

    
  <html:td>To override the tree's title during transclusion.</html:td>

  </html:tr>

  
  <html:tr>
    
  <html:td><html:code><![CDATA[\transclude/]]>toc</html:code></html:td>

    
  <html:td><html:code>true</html:code></html:td>

    
  <html:td>Show the tree in the table of contents.</html:td>

  </html:tr>

  
  <html:tr>
    
  <html:td><html:code><![CDATA[\transclude/]]>expanded</html:code></html:td>

    
  <html:td><html:code>true</html:code></html:td>

    
  <html:td>Whether the tree is expanded or not.</html:td>

  </html:tr>

  
  <html:tr>
    
  <html:td><html:code><![CDATA[\transclude/]]>heading</html:code></html:td>

    
  <html:td><html:code>true</html:code></html:td>

    
  <html:td>If set to <html:code>false</html:code>, the tree's contents will be inlined.</html:td>

  </html:tr>

  
  <html:tr>
    
  <html:td><html:code><![CDATA[\transclude/]]>metadata</html:code></html:td>

    
  <html:td><html:code>false</html:code></html:td>

    
  <html:td>Show in a tree's heading.</html:td>

  </html:tr>

  
  <html:tr>
    
  <html:td><html:code><![CDATA[\transclude/]]>numbered</html:code></html:td>

    
  <html:td><html:code>true</html:code></html:td>

    
  <html:td>Whether the tree is displayed with a number or not, transitively on subtrees.</html:td>

  </html:tr>

</html:table>
<html:p>It is possible to achieve undesirable results by combining these options in undesirable ways; it is up to you to use them correctly.</html:p></fr:mainmatter></fr:tree><fr:tree show-metadata="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link></fr:author></fr:authors><fr:date><fr:year>2023</fr:year><fr:month>7</fr:month><fr:day>20</fr:day></fr:date><fr:uri>https://www.forester-notes.org/0068/</fr:uri><fr:display-uri>0068</fr:display-uri><fr:route>/0068/</fr:route><fr:title text="A configured transclusion">A configured transclusion</fr:title><fr:taxon>Example</fr:taxon></fr:frontmatter><fr:mainmatter><html:p>The following code produces an unnumbered transclusion that nonetheless appears in the table of context, with an overridden title.</html:p><html:pre><![CDATA[\scope{
  \put\transclude/title{A short title in context}
  \put\transclude/numbered{false}
  \transclude{0068}
}]]></html:pre></fr:mainmatter></fr:tree></fr:mainmatter></fr:tree><fr:tree show-metadata="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link></fr:author></fr:authors><fr:date><fr:year>2023</fr:year><fr:month>7</fr:month><fr:day>20</fr:day></fr:date><fr:uri>https://www.forester-notes.org/0066/</fr:uri><fr:display-uri>0066</fr:display-uri><fr:route>/0066/</fr:route><fr:title text="Queries">Queries</fr:title><fr:taxon>Feature</fr:taxon></fr:frontmatter><fr:mainmatter><html:p>This release adds support for generating subsections from transclusions obtained by a query the forest; this can be used to produce topical bibliographies.</html:p><fr:tree show-metadata="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link></fr:author></fr:authors><fr:date><fr:year>2023</fr:year><fr:month>7</fr:month><fr:day>20</fr:day></fr:date><fr:uri>https://www.forester-notes.org/006A/</fr:uri><fr:display-uri>006A</fr:display-uri><fr:route>/006A/</fr:route><fr:title text="A conjunctive query node">A conjunctive query node</fr:title><fr:taxon>Example</fr:taxon></fr:frontmatter><fr:mainmatter><html:p>The following code will generate a subsection containing my “featured talks” as collapsed subtrees:</html:p><html:pre><![CDATA[\scope{
  \query{
    \query/and{
      \query/author{jonmsterling}
      \query/taxon{reference}
      \query/tag{featured}
    }
  }
}]]></html:pre><html:p>Under the hood, a query node is an “anonymous transclusion” and can therefore be <fr:link href="/0067/" title="Forester 2.2 › Flexible transclusion options" uri="https://www.forester-notes.org/0067/" display-uri="0067" type="local">configured using the same options as other transclusions</fr:link>.</html:p></fr:mainmatter></fr:tree></fr:mainmatter></fr:tree><html:p>A minor change is that the <html:code>assets</html:code> directly does not need to be flat anymore.</html:p><html:p>As always, existing forests can be upgraded by copying <html:code>forest.xsl</html:code> and <html:code>style.css</html:code> into their <html:code>assets</html:code> directory. </html:p></fr:mainmatter></fr:tree><fr:tree show-metadata="true" expanded="false" numbered="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/jonmsterling/" title="Jon Sterling" uri="https://www.forester-notes.org/jonmsterling/" display-uri="jonmsterling" type="local">Jon Sterling</fr:link></fr:author></fr:authors><fr:date><fr:year>2023</fr:year><fr:month>6</fr:month><fr:day>1</fr:day></fr:date><fr:uri>https://www.forester-notes.org/005O/</fr:uri><fr:display-uri>005O</fr:display-uri><fr:route>/005O/</fr:route><fr:title text="Forester 2.1">Forester 2.1</fr:title><fr:taxon>Release</fr:taxon></fr:frontmatter><fr:mainmatter><html:p>This is a major release that breaks compatibility of the XML format for trees; existing forests can be upgraded by copying <html:code>forest.xsl</html:code> and <html:code>style.css</html:code> into their <html:code>assets</html:code> directory.</html:p><html:ul><html:li><html:strong>Development mode and edit button.</html:strong> A <html:code>--dev</html:code> option has been added to the <html:code>forester</html:code> executable; when this option is enabled, absolute paths will be embedded into tree metadata and an <html:strong>edit button</html:strong> is added to the top of the command palette.</html:li>

  <html:li><html:strong>Your own TeX preamble.</html:strong> There is no longer a hardcoded LaTeX preamble used for compiling graphics; instead, you can store your own <html:code>.sty</html:code> files in the <html:code>assets</html:code> directory and import them locally in a specific tree using the new <html:code><![CDATA[\texpackage{...}]]></html:code> frontmatter command.</html:li>

  <html:li><html:strong>Fluid binding constructs.</html:strong> Macros in the Forester language have functional semantics, which means that they capture their environment at the time of definition; this differs from the stacks of dynamic scopes that are familiar from the TeX model. This release adds support for  <html:strong>fluid bindings</html:strong> via <html:code><![CDATA[\alloc, \put, \get]]></html:code> in order to simulate this behavior of TeX where desired; a scope can be delimited using <html:code><![CDATA[\scope{...}]]></html:code>. This can be useful for providing flexible configurations to macros.</html:li>

  <html:li><html:strong>Tables of contents.</html:strong> Tables of contents are now rendered by the default <html:code>forest.xsl</html:code> stylesheet.</html:li>

  <html:li><html:strong>LaTeX output.</html:strong> LaTeX output with full bibliography support is now available; this feature is still experimental, and may not work properly with some constructs (e.g. code blocks, etc.).</html:li>

  <html:li><html:strong>Name resolution.</html:strong> The behavior of name resolution was highly erratic in the prior release, and this has been corrected by adopting the <fr:link href="https://redprl.org/yuujinchou/yuujinchou/index.html" type="external">yuujinchou</fr:link> library. This change may break trees that depended on the prior behavior.</html:li>

  <html:li><html:strong>Namespaces and hierarchical identifiers.</html:strong> Identifiers in the Forester language are now hierarchical, with components delimited by <html:code>/</html:code>. Namespaces can be created using <html:code><![CDATA[\namespace\foo{...}]]></html:code>, outside which all exported identifiers are prefixed by <html:code>foo/</html:code>. Namespaces can be opened into the current scope using <html:code><![CDATA[\open\foo]]></html:code>.</html:li></html:ul></fr:mainmatter></fr:tree></fr:mainmatter>
        </fr:tree>
      </fr:mainmatter>
    </fr:tree>
    <fr:tree show-metadata="false" hidden-when-empty="true">
      <fr:frontmatter>
        <fr:authors />
        <fr:title text="Contributions">Contributions</fr:title>
      </fr:frontmatter>
      <fr:mainmatter />
    </fr:tree>
  </fr:backmatter>
</fr:tree>
