inweb-bootstrap/docs/inweb/3-tw.html
2020-04-07 23:04:32 +01:00

1348 lines
183 KiB
HTML

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>3/ti</title>
<meta name="viewport" content="width=device-width initial-scale=1">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="Content-Language" content="en-gb">
<link href="../inweb.css" rel="stylesheet" rev="stylesheet" type="text/css">
</head>
<body>
<nav role="navigation">
<h1><a href="../webs.html">Sources</a></h1>
<ul>
<li><a href="../inweb/index.html">inweb</a></li>
</ul>
<h2>Foundation</h2>
<ul>
<li><a href="../foundation-module/index.html">foundation-module</a></li>
<li><a href="../foundation-test/index.html">foundation-test</a></li>
</ul>
</nav>
<main role="main">
<!--Weave of '3/tw' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="index.html">inweb</a></li><li><a href="index.html#3">Chapter 3: Outputs</a></li><li><b>The Weaver</b></li></ul><p class="purpose">To weave a portion of the code into instructions for TeX.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. The Master Weaver</a></li><li><a href="#SP1_3_1">&#167;1.3.1. The state</a></li><li><a href="#SP1_3_3">&#167;1.3.3. Weaving a section</a></li><li><a href="#SP1_3_3_1_1">&#167;1.3.3.1.1. Reasons to skip things</a></li><li><a href="#SP1_3_3_1_3">&#167;1.3.3.1.3. Headings</a></li><li><a href="#SP1_3_3_1_8">&#167;1.3.3.1.8. Commentary matter</a></li><li><a href="#SP1_3_3_1_9">&#167;1.3.3.1.9. Code-like matter</a></li><li><a href="#SP1_3_3_1_10">&#167;1.3.3.1.10. How paragraphs begin</a></li><li><a href="#SP1_3_3_2">&#167;1.3.3.2. How paragraphs end</a></li><li><a href="#SP2">&#167;2. Endnotes</a></li><li><a href="#SP3">&#167;3. Section tables of contents</a></li></ul><hr class="tocbar">
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. The Master Weaver. </b>Here's what has happened so far, on a weave run of Inweb: on any other
sort of run, of course, we would never be in this section of code. The web was
read completely into memory and fully parsed. A request was then made either
to swarm a mass of individual weaves, or to make just a single weave, with the
target in each case being identified by its range. A further decoding layer
then translated each range into rather more basic details of what to weave and
where to put the result: and so we arrive at the front door of the routine
<code class="display"><span class="extract">Weaver::weave_source</span></code> below.
</p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Weaver::weave_source</span><span class="plain">(</span><span class="reserved">web</span><span class="plain"> *</span><span class="identifier">W</span><span class="plain">, </span><span class="reserved">weave_target</span><span class="plain"> *</span><span class="identifier">wv</span><span class="plain">) {</span>
<span class="reserved">text_stream</span><span class="plain"> </span><span class="identifier">TO_struct</span><span class="plain">;</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">OUT</span><span class="plain"> = &amp;</span><span class="identifier">TO_struct</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">STREAM_OPEN_TO_FILE</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">-&gt;</span><span class="identifier">weave_to</span><span class="plain">, </span><span class="constant">UTF8_ENC</span><span class="plain">) == </span><span class="constant">FALSE</span><span class="plain">)</span>
<span class="functiontext">Errors::fatal_with_file</span><span class="plain">(</span><span class="string">"unable to write woven file"</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">-&gt;</span><span class="element">weave_to</span><span class="plain">);</span>
&lt;<span class="cwebmacro">Weave the banner</span> <span class="cwebmacronumber">1.1</span>&gt;<span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">wv</span><span class="plain">-&gt;</span><span class="element">cover_sheet_to_use</span><span class="plain">) &gt; </span><span class="constant">0</span><span class="plain">) &amp;&amp; (</span><span class="functiontext">Reader::web_has_one_section</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">) == </span><span class="constant">FALSE</span><span class="plain">))</span>
&lt;<span class="cwebmacro">Weave head of the cover sheet, if any</span> <span class="cwebmacronumber">1.2</span>&gt;<span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">lines_woven</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
<span class="reserved">section</span><span class="plain"> *</span><span class="identifier">latest_section</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
&lt;<span class="cwebmacro">Weave the body of the material</span> <span class="cwebmacronumber">1.3</span>&gt;<span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">wv</span><span class="plain">-&gt;</span><span class="element">cover_sheet_to_use</span><span class="plain">) &gt; </span><span class="constant">0</span><span class="plain">) &amp;&amp; (</span><span class="functiontext">Reader::web_has_one_section</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">) == </span><span class="constant">FALSE</span><span class="plain">))</span>
&lt;<span class="cwebmacro">Weave tail of the cover sheet, if any</span> <span class="cwebmacronumber">1.4</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Weave the rennab</span> <span class="cwebmacronumber">1.5</span>&gt;<span class="plain">;</span>
<span class="identifier">STREAM_CLOSE</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">lines_woven</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Weaver::weave_source is used in 3/ts (<a href="3-ts.html#SP2">&#167;2</a>).</p>
<p class="inwebparagraph"><a id="SP1_1"></a><b>&#167;1.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Weave the banner</span> <span class="cwebmacronumber">1.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">banner</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">banner</span><span class="plain">, </span><span class="string">"Weave of '%S' generated by %s"</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">-&gt;</span><span class="element">booklet_title</span><span class="plain">, </span><span class="constant">INWEB_BUILD</span><span class="plain">);</span>
<span class="functiontext">Formats::top</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">banner</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">banner</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1">&#167;1</a>.</p>
<p class="inwebparagraph"><a id="SP1_2"></a><b>&#167;1.2. </b><code class="display">
&lt;<span class="cwebmacrodefn">Weave head of the cover sheet, if any</span> <span class="cwebmacronumber">1.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (!(</span><span class="functiontext">Bibliographic::data_exists</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Booklet Title"</span><span class="plain">)))</span>
<span class="functiontext">Bibliographic::set_datum</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Booklet Title"</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">-&gt;</span><span class="element">booklet_title</span><span class="plain">);</span>
<span class="functiontext">Indexer::cover_sheet_maker</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">-&gt;</span><span class="element">cover_sheet_to_use</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="constant">WEAVE_FIRST_HALF</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1">&#167;1</a>.</p>
<p class="inwebparagraph"><a id="SP1_3"></a><b>&#167;1.3. </b><code class="display">
&lt;<span class="cwebmacrodefn">Weave the body of the material</span> <span class="cwebmacronumber">1.3</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">weaver_state</span><span class="plain"> </span><span class="identifier">state_at</span><span class="plain">; </span><span class="reserved">weaver_state</span><span class="plain"> *</span><span class="identifier">state</span><span class="plain"> = &amp;</span><span class="identifier">state_at</span><span class="plain">;</span>
&lt;<span class="cwebmacro">Start the weaver with a clean slate</span> <span class="cwebmacronumber">1.3.2</span>&gt;<span class="plain">;</span>
<span class="reserved">chapter</span><span class="plain"> *</span><span class="identifier">C</span><span class="plain">;</span>
<span class="reserved">section</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">, </span><span class="reserved">chapter</span><span class="plain">, </span><span class="identifier">W</span><span class="plain">-&gt;</span><span class="element">chapters</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">C</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">-&gt;</span><span class="identifier">imported</span><span class="plain"> == </span><span class="constant">FALSE</span><span class="plain">) {</span>
<span class="functiontext">Str::clear</span><span class="plain">(</span><span class="identifier">state</span><span class="plain">-&gt;</span><span class="element">chaptermark</span><span class="plain">);</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">, </span><span class="reserved">section</span><span class="plain">, </span><span class="identifier">C</span><span class="plain">-&gt;</span><span class="element">sections</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Reader::range_within</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">sect_range</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">-&gt;</span><span class="element">weave_range</span><span class="plain">)) {</span>
<span class="identifier">latest_section</span><span class="plain"> = </span><span class="identifier">S</span><span class="plain">;</span>
<span class="functiontext">LanguageMethods::begin_weave</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">);</span>
<span class="functiontext">Str::clear</span><span class="plain">(</span><span class="identifier">state</span><span class="plain">-&gt;</span><span class="element">sectionmark</span><span class="plain">);</span>
&lt;<span class="cwebmacro">Weave this section</span> <span class="cwebmacronumber">1.3.3</span>&gt;<span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1">&#167;1</a>.</p>
<p class="inwebparagraph"><a id="SP1_4"></a><b>&#167;1.4. </b><code class="display">
&lt;<span class="cwebmacrodefn">Weave tail of the cover sheet, if any</span> <span class="cwebmacronumber">1.4</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (!(</span><span class="functiontext">Bibliographic::data_exists</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Booklet Title"</span><span class="plain">)))</span>
<span class="functiontext">Bibliographic::set_datum</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Booklet Title"</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">-&gt;</span><span class="element">booklet_title</span><span class="plain">);</span>
<span class="functiontext">Indexer::cover_sheet_maker</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">-&gt;</span><span class="element">cover_sheet_to_use</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="constant">WEAVE_SECOND_HALF</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1">&#167;1</a>.</p>
<p class="inwebparagraph"><a id="SP1_5"></a><b>&#167;1.5. </b><code class="display">
&lt;<span class="cwebmacrodefn">Weave the rennab</span> <span class="cwebmacronumber">1.5</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">rennab</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">rennab</span><span class="plain">, </span><span class="string">"End of weave"</span><span class="plain">);</span>
<span class="functiontext">Formats::tail</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">rennab</span><span class="plain">, </span><span class="identifier">latest_section</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">rennab</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1">&#167;1</a>.</p>
<p class="inwebparagraph"><a id="SP1_3_1"></a><b>&#167;1.3.1. The state. </b>We can now begin on a clean page, by initialising the state of the weaver:
</p>
<pre class="definitions">
<span class="definitionkeyword">enum</span> <span class="constant">REGULAR_MATERIAL</span><span class="definitionkeyword"> from </span><span class="constant">1</span>
<span class="definitionkeyword">enum</span> <span class="constant">MACRO_MATERIAL</span><span class="plain"> </span><span class="comment">when a macro is being defined...</span>
<span class="definitionkeyword">enum</span> <span class="constant">DEFINITION_MATERIAL</span><span class="plain"> </span><span class="comment">...versus when an <code class="display"><span class="extract">@d</span></code> definition is being made</span>
<span class="definitionkeyword">enum</span> <span class="constant">CODE_MATERIAL</span><span class="plain"> </span><span class="comment">verbatim code</span>
</pre>
<pre class="display">
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">weaver_state</span><span class="plain"> {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">kind_of_material</span><span class="plain">; </span><span class="comment">one of the enumerated <code class="display"><span class="extract">*_MATERIAL</span></code> constants above</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">line_break_pending</span><span class="plain">; </span><span class="comment">insert a line break before the next woven line?</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">next_heading_without_vertical_skip</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">show_section_toc_soon</span><span class="plain">; </span><span class="comment">is a table of contents for the section imminent?</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">horizontal_rule_just_drawn</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">in_run_of_definitions</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">section</span><span class="plain"> *</span><span class="identifier">last_extract_from</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">paragraph</span><span class="plain"> *</span><span class="identifier">last_endnoted_para</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">substantive_comment</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">chaptermark</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">sectionmark</span><span class="plain">;</span>
<span class="plain">} </span><span class="reserved">weaver_state</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The structure weaver_state is private to this section.</p>
<p class="inwebparagraph"><a id="SP1_3_2"></a><b>&#167;1.3.2. </b><code class="display">
&lt;<span class="cwebmacrodefn">Start the weaver with a clean slate</span> <span class="cwebmacronumber">1.3.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">state</span><span class="plain">-&gt;</span><span class="element">kind_of_material</span><span class="plain"> = </span><span class="constant">REGULAR_MATERIAL</span><span class="plain">;</span>
<span class="identifier">state</span><span class="plain">-&gt;</span><span class="element">line_break_pending</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="identifier">state</span><span class="plain">-&gt;</span><span class="element">next_heading_without_vertical_skip</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="identifier">state</span><span class="plain">-&gt;</span><span class="element">show_section_toc_soon</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="identifier">state</span><span class="plain">-&gt;</span><span class="element">horizontal_rule_just_drawn</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="identifier">state</span><span class="plain">-&gt;</span><span class="element">in_run_of_definitions</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="identifier">state</span><span class="plain">-&gt;</span><span class="element">last_extract_from</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">state</span><span class="plain">-&gt;</span><span class="element">last_endnoted_para</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">state</span><span class="plain">-&gt;</span><span class="element">substantive_comment</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="identifier">state</span><span class="plain">-&gt;</span><span class="element">chaptermark</span><span class="plain"> = </span><span class="functiontext">Str::new</span><span class="plain">();</span>
<span class="identifier">state</span><span class="plain">-&gt;</span><span class="element">sectionmark</span><span class="plain"> = </span><span class="functiontext">Str::new</span><span class="plain">();</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1_3">&#167;1.3</a>.</p>
<p class="inwebparagraph"><a id="SP1_3_3"></a><b>&#167;1.3.3. Weaving a section. </b></p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Weave this section</span> <span class="cwebmacronumber">1.3.3</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">paragraph</span><span class="plain"> *</span><span class="identifier">current_paragraph</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">source_line</span><span class="plain"> *</span><span class="identifier">L</span><span class="plain"> = </span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">first_line</span><span class="plain">; </span><span class="identifier">L</span><span class="plain">; </span><span class="identifier">L</span><span class="plain"> = </span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">next_line</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="functiontext">Tags::tagged_with</span><span class="plain">(</span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">owning_paragraph</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">-&gt;</span><span class="element">theme_match</span><span class="plain">)) &amp;&amp;</span>
<span class="plain">(</span><span class="functiontext">LanguageMethods::skip_in_weaving</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">sect_language</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">) == </span><span class="constant">FALSE</span><span class="plain">)) {</span>
<span class="identifier">lines_woven</span><span class="plain">++;</span>
&lt;<span class="cwebmacro">Weave this line</span> <span class="cwebmacronumber">1.3.3.1</span>&gt;<span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="reserved">source_line</span><span class="plain"> *</span><span class="identifier">L</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
&lt;<span class="cwebmacro">Complete any started but not-fully-woven paragraph</span> <span class="cwebmacronumber">1.3.3.2</span>&gt;<span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1_3">&#167;1.3</a>.</p>
<p class="inwebparagraph"><a id="SP1_3_3_1"></a><b>&#167;1.3.3.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Weave this line</span> <span class="cwebmacronumber">1.3.3.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="comment">In principle, all of these source lines should be woven, but...</span>
&lt;<span class="cwebmacro">Certain categories of line are excluded from the weave</span> <span class="cwebmacronumber">1.3.3.1.1</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Respond to any commands aimed at the weaver, and otherwise skip commands</span> <span class="cwebmacronumber">1.3.3.1.2</span>&gt;<span class="plain">;</span>
<span class="comment">Some of the more baroque front matter of a section...</span>
&lt;<span class="cwebmacro">Weave the Purpose marker as a little heading</span> <span class="cwebmacronumber">1.3.3.1.3</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">If we need to work in a section table of contents and this is a blank line, do it now</span> <span class="cwebmacronumber">1.3.3.1.4</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Deal with the Interface passage</span> <span class="cwebmacronumber">1.3.3.1.5</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Weave the Definitions marker as a little heading</span> <span class="cwebmacronumber">1.3.3.1.6</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Weave the section bar as a horizontal rule</span> <span class="cwebmacronumber">1.3.3.1.7</span>&gt;<span class="plain">;</span>
<span class="comment">The crucial junction point between modes...</span>
&lt;<span class="cwebmacro">Deal with the marker for the start of a new paragraph, section or chapter</span> <span class="cwebmacronumber">1.3.3.1.10</span>&gt;<span class="plain">;</span>
<span class="comment">With all exotica dealt with, we now just have material to weave verbatim...</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">matter</span><span class="plain">); </span><span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">matter</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">text</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">is_commentary</span><span class="plain">) </span>&lt;<span class="cwebmacro">Weave verbatim matter in commentary style</span> <span class="cwebmacronumber">1.3.3.1.8</span>&gt;
<span class="reserved">else</span><span class="plain"> </span>&lt;<span class="cwebmacro">Weave verbatim matter in code style</span> <span class="cwebmacronumber">1.3.3.1.9</span>&gt;<span class="plain">;</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">matter</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1_3_3">&#167;1.3.3</a>.</p>
<p class="inwebparagraph"><a id="SP1_3_3_1_1"></a><b>&#167;1.3.3.1.1. Reasons to skip things. </b>We skip these because we weave their contents in some other way:
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Certain categories of line are excluded from the weave</span> <span class="cwebmacronumber">1.3.3.1.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">category</span><span class="plain"> == </span><span class="constant">INTERFACE_BODY_LCAT</span><span class="plain">) </span><span class="reserved">continue</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">category</span><span class="plain"> == </span><span class="constant">PURPOSE_BODY_LCAT</span><span class="plain">) </span><span class="reserved">continue</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">category</span><span class="plain"> == </span><span class="constant">END_EXTRACT_LCAT</span><span class="plain">) </span><span class="reserved">continue</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">category</span><span class="plain"> == </span><span class="constant">BEGIN_CODE_LCAT</span><span class="plain">) {</span>
<span class="identifier">state</span><span class="plain">-&gt;</span><span class="element">line_break_pending</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="functiontext">LanguageMethods::reset_syntax_colouring</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">sect_language</span><span class="plain">);</span>
<span class="reserved">continue</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1_3_3_1">&#167;1.3.3.1</a>.</p>
<p class="inwebparagraph"><a id="SP1_3_3_1_2"></a><b>&#167;1.3.3.1.2. </b>And lastly we ignore commands, or act on them if they happen to be aimed
at us; but we don't weave them into the output, that's for sure.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Respond to any commands aimed at the weaver, and otherwise skip commands</span> <span class="cwebmacronumber">1.3.3.1.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">category</span><span class="plain"> == </span><span class="constant">COMMAND_LCAT</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">command_code</span><span class="plain"> == </span><span class="constant">PAGEBREAK_CMD</span><span class="plain">) </span><span class="functiontext">Formats::pagebreak</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">command_code</span><span class="plain"> == </span><span class="constant">GRAMMAR_INDEX_CMD</span><span class="plain">) </span><span class="functiontext">InCSupport::weave_grammar_index</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">command_code</span><span class="plain"> == </span><span class="constant">FIGURE_CMD</span><span class="plain">) </span>&lt;<span class="cwebmacro">Weave a figure</span> <span class="cwebmacronumber">1.3.3.1.2.1</span>&gt;<span class="plain">;</span>
<span class="comment">Otherwise assume it was a tangler command, and ignore it here</span>
<span class="reserved">continue</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1_3_3_1">&#167;1.3.3.1</a>.</p>
<p class="inwebparagraph"><a id="SP1_3_3_1_2_1"></a><b>&#167;1.3.3.1.2.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Weave a figure</span> <span class="cwebmacronumber">1.3.3.1.2.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">figname</span><span class="plain"> = </span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">text_operand</span><span class="plain">;</span>
<span class="reserved">match_results</span><span class="plain"> </span><span class="identifier">mr</span><span class="plain"> = </span><span class="functiontext">Regexp::create_mr</span><span class="plain">();</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">figname</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"(%d+)cm: (%c+)"</span><span class="plain">)) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">-&gt;</span><span class="identifier">using_syntax</span><span class="plain"> &gt; </span><span class="constant">V1_SYNTAX</span><span class="plain">)</span>
<span class="functiontext">Parser::wrong_version</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">-&gt;</span><span class="element">using_syntax</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">, </span><span class="string">"[[Figure: Xcm:...]]"</span><span class="plain">, </span><span class="constant">V1_SYNTAX</span><span class="plain">);</span>
<span class="functiontext">Formats::figure</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[1], </span><span class="functiontext">Str::atoi</span><span class="plain">(</span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0], </span><span class="constant">0</span><span class="plain">), -1, </span><span class="identifier">NULL</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">figname</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"(%c+) width (%d+)cm"</span><span class="plain">)) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">-&gt;</span><span class="identifier">using_syntax</span><span class="plain"> &lt; </span><span class="constant">V2_SYNTAX</span><span class="plain">)</span>
<span class="functiontext">Parser::wrong_version</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">-&gt;</span><span class="element">using_syntax</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">, </span><span class="string">"[[F width Xcm]]"</span><span class="plain">, </span><span class="constant">V2_SYNTAX</span><span class="plain">);</span>
<span class="functiontext">Formats::figure</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0], </span><span class="functiontext">Str::atoi</span><span class="plain">(</span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[1], </span><span class="constant">0</span><span class="plain">), -1, </span><span class="identifier">NULL</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">figname</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"(%c+) height (%d+)cm"</span><span class="plain">)) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">-&gt;</span><span class="identifier">using_syntax</span><span class="plain"> &lt; </span><span class="constant">V2_SYNTAX</span><span class="plain">)</span>
<span class="functiontext">Parser::wrong_version</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">-&gt;</span><span class="element">using_syntax</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">, </span><span class="string">"[[F height Xcm]]"</span><span class="plain">, </span><span class="constant">V2_SYNTAX</span><span class="plain">);</span>
<span class="functiontext">Formats::figure</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0], -1, </span><span class="functiontext">Str::atoi</span><span class="plain">(</span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[1], </span><span class="constant">0</span><span class="plain">), </span><span class="identifier">NULL</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">figname</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"(%c+) as (%c+)"</span><span class="plain">)) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">-&gt;</span><span class="identifier">using_syntax</span><span class="plain"> &lt; </span><span class="constant">V2_SYNTAX</span><span class="plain">)</span>
<span class="functiontext">Parser::wrong_version</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">-&gt;</span><span class="element">using_syntax</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">, </span><span class="string">"[[F as L]]"</span><span class="plain">, </span><span class="constant">V2_SYNTAX</span><span class="plain">);</span>
<span class="reserved">programming_language</span><span class="plain"> *</span><span class="identifier">pl</span><span class="plain"> = </span><span class="functiontext">Languages::find_by_name</span><span class="plain">(</span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[1], </span><span class="identifier">W</span><span class="plain">);</span>
<span class="functiontext">Formats::figure</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0], -1, -1, </span><span class="identifier">pl</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="functiontext">Formats::figure</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">figname</span><span class="plain">, -1, -1, </span><span class="identifier">NULL</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="functiontext">Regexp::dispose_of</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1_3_3_1_2">&#167;1.3.3.1.2</a>.</p>
<p class="inwebparagraph"><a id="SP1_3_3_1_3"></a><b>&#167;1.3.3.1.3. Headings. </b>The purpose is set with a little heading. Its operand is that part of
the purpose-text which is on the opening line; the rest follows on
subsequent lines until the next blank.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Weave the Purpose marker as a little heading</span> <span class="cwebmacronumber">1.3.3.1.3</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">category</span><span class="plain"> == </span><span class="constant">PURPOSE_LCAT</span><span class="plain">) {</span>
<span class="functiontext">Formats::subheading</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="constant">2</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">sect_purpose</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
<span class="functiontext">Weaver::weave_table_of_contents</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">);</span>
<span class="reserved">continue</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1_3_3_1">&#167;1.3.3.1</a>.</p>
<p class="inwebparagraph"><a id="SP1_3_3_1_4"></a><b>&#167;1.3.3.1.4. </b>This normally appears just after the Purpose subheading:
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">If we need to work in a section table of contents and this is a blank line, do it now</span> <span class="cwebmacronumber">1.3.3.1.4</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">state</span><span class="plain">-&gt;</span><span class="element">show_section_toc_soon</span><span class="plain"> == </span><span class="constant">1</span><span class="plain">) &amp;&amp; (</span><span class="functiontext">Regexp::string_is_white_space</span><span class="plain">(</span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">text</span><span class="plain">))) {</span>
<span class="identifier">state</span><span class="plain">-&gt;</span><span class="element">show_section_toc_soon</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Weaver::weave_table_of_contents</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">))</span>
<span class="identifier">state</span><span class="plain">-&gt;</span><span class="element">horizontal_rule_just_drawn</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="reserved">else</span>
<span class="identifier">state</span><span class="plain">-&gt;</span><span class="element">horizontal_rule_just_drawn</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1_3_3_1">&#167;1.3.3.1</a>.</p>
<p class="inwebparagraph"><a id="SP1_3_3_1_5"></a><b>&#167;1.3.3.1.5. </b>After which we have the Interface &mdash; if we're in Inweb syntax version 1 &mdash;
but it weaves nothing:
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Deal with the Interface passage</span> <span class="cwebmacronumber">1.3.3.1.5</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">category</span><span class="plain"> == </span><span class="constant">INTERFACE_LCAT</span><span class="plain">) {</span>
<span class="identifier">state</span><span class="plain">-&gt;</span><span class="element">horizontal_rule_just_drawn</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="reserved">continue</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1_3_3_1">&#167;1.3.3.1</a>.</p>
<p class="inwebparagraph"><a id="SP1_3_3_1_6"></a><b>&#167;1.3.3.1.6. </b>And another little heading, again visible only in syntax version 1...
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Weave the Definitions marker as a little heading</span> <span class="cwebmacronumber">1.3.3.1.6</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">category</span><span class="plain"> == </span><span class="constant">DEFINITIONS_LCAT</span><span class="plain">) {</span>
<span class="functiontext">Formats::subheading</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="constant">2</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Definitions"</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
<span class="identifier">state</span><span class="plain">-&gt;</span><span class="element">next_heading_without_vertical_skip</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="identifier">state</span><span class="plain">-&gt;</span><span class="element">horizontal_rule_just_drawn</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="reserved">continue</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1_3_3_1">&#167;1.3.3.1</a>.</p>
<p class="inwebparagraph"><a id="SP1_3_3_1_7"></a><b>&#167;1.3.3.1.7. </b>...with the section bar to follow. The bar line completes any half-finished
paragraph and is set as a horizontal rule (and, once again, can exist only
in a version 1 web).
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Weave the section bar as a horizontal rule</span> <span class="cwebmacronumber">1.3.3.1.7</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">category</span><span class="plain"> == </span><span class="constant">BAR_LCAT</span><span class="plain">) {</span>
&lt;<span class="cwebmacro">Complete any started but not-fully-woven paragraph</span> <span class="cwebmacronumber">1.3.3.2</span>&gt;<span class="plain">;</span>
<span class="identifier">state</span><span class="plain">-&gt;</span><span class="element">kind_of_material</span><span class="plain"> = </span><span class="constant">REGULAR_MATERIAL</span><span class="plain">;</span>
<span class="identifier">state</span><span class="plain">-&gt;</span><span class="element">next_heading_without_vertical_skip</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">state</span><span class="plain">-&gt;</span><span class="identifier">horizontal_rule_just_drawn</span><span class="plain"> == </span><span class="constant">FALSE</span><span class="plain">) </span><span class="functiontext">Formats::bar</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">);</span>
<span class="reserved">continue</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1_3_3_1">&#167;1.3.3.1</a>.</p>
<p class="inwebparagraph"><a id="SP1_3_3_1_8"></a><b>&#167;1.3.3.1.8. Commentary matter. </b>Typographically this is a fairly simple business: it's almost the case that
we only have to transcribe it. But not quite!
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Weave verbatim matter in commentary style</span> <span class="cwebmacronumber">1.3.3.1.8</span>&gt; =
</code></p>
<pre class="displaydefn">
&lt;<span class="cwebmacro">Weave displayed source in its own special style</span> <span class="cwebmacronumber">1.3.3.1.8.1</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Weave a blank line as a thin vertical skip and paragraph break</span> <span class="cwebmacronumber">1.3.3.1.8.2</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Weave bracketed list indications at start of line into indentation</span> <span class="cwebmacronumber">1.3.3.1.8.3</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Weave tabbed code material as a new indented paragraph</span> <span class="cwebmacronumber">1.3.3.1.8.4</span>&gt;<span class="plain">;</span>
<span class="identifier">state</span><span class="plain">-&gt;</span><span class="element">substantive_comment</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">matter</span><span class="plain">, </span><span class="string">"\n"</span><span class="plain">);</span>
<span class="functiontext">Formats::text</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">matter</span><span class="plain">);</span>
<span class="reserved">continue</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1_3_3_1">&#167;1.3.3.1</a>.</p>
<p class="inwebparagraph"><a id="SP1_3_3_1_8_1"></a><b>&#167;1.3.3.1.8.1. </b>Displayed source is the material marked with <code class="display"><span class="extract">&gt;&gt;</span></code> arrows in column 1.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Weave displayed source in its own special style</span> <span class="cwebmacronumber">1.3.3.1.8.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">category</span><span class="plain"> == </span><span class="constant">SOURCE_DISPLAY_LCAT</span><span class="plain">) {</span>
<span class="functiontext">Formats::display_line</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">text_operand</span><span class="plain">);</span>
<span class="reserved">continue</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1_3_3_1_8">&#167;1.3.3.1.8</a>.</p>
<p class="inwebparagraph"><a id="SP1_3_3_1_8_2"></a><b>&#167;1.3.3.1.8.2. </b>Our style is to use paragraphs without initial-line indentation, so we
add a vertical skip between them to show the division more clearly.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Weave a blank line as a thin vertical skip and paragraph break</span> <span class="cwebmacronumber">1.3.3.1.8.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Regexp::string_is_white_space</span><span class="plain">(</span><span class="identifier">matter</span><span class="plain">)) {</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">next_line</span><span class="plain">) &amp;&amp; (</span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">next_line</span><span class="plain">-&gt;</span><span class="element">category</span><span class="plain"> == </span><span class="constant">COMMENT_BODY_LCAT</span><span class="plain">) &amp;&amp;</span>
<span class="plain">(</span><span class="identifier">state</span><span class="plain">-&gt;</span><span class="element">substantive_comment</span><span class="plain">)) {</span>
<span class="reserved">match_results</span><span class="plain"> </span><span class="identifier">mr</span><span class="plain"> = </span><span class="functiontext">Regexp::create_mr</span><span class="plain">();</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">state</span><span class="plain">-&gt;</span><span class="element">kind_of_material</span><span class="plain"> != </span><span class="constant">CODE_MATERIAL</span><span class="plain">) ||</span>
<span class="plain">(</span><span class="functiontext">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">matter</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"\t|(%c*)|(%c*?)"</span><span class="plain">)))</span>
<span class="functiontext">Formats::blank_line</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="constant">TRUE</span><span class="plain">);</span>
<span class="functiontext">Regexp::dispose_of</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">continue</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1_3_3_1_8">&#167;1.3.3.1.8</a>.</p>
<p class="inwebparagraph"><a id="SP1_3_3_1_8_3"></a><b>&#167;1.3.3.1.8.3. </b>Here our extension is simply to provide a tidier way to use TeX's standard
<code class="display"><span class="extract">\item</span></code> and <code class="display"><span class="extract">\itemitem</span></code> macros for indented list items.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Weave bracketed list indications at start of line into indentation</span> <span class="cwebmacronumber">1.3.3.1.8.3</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">match_results</span><span class="plain"> </span><span class="identifier">mr</span><span class="plain"> = </span><span class="functiontext">Regexp::create_mr</span><span class="plain">();</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">matter</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"%(...%) (%c*)"</span><span class="plain">)) { </span><span class="comment">continue single</span>
<span class="functiontext">Formats::change_material</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">state</span><span class="plain">-&gt;</span><span class="element">kind_of_material</span><span class="plain">, </span><span class="constant">REGULAR_MATERIAL</span><span class="plain">,</span>
<span class="identifier">state</span><span class="plain">-&gt;</span><span class="element">substantive_comment</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain">);</span>
<span class="identifier">state</span><span class="plain">-&gt;</span><span class="element">kind_of_material</span><span class="plain"> = </span><span class="constant">REGULAR_MATERIAL</span><span class="plain">;</span>
<span class="functiontext">Formats::item</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="constant">1</span><span class="plain">, </span><span class="identifier">I</span><span class="string">""</span><span class="plain">);</span>
<span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">matter</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0]);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">matter</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"%(-...%) (%c*)"</span><span class="plain">)) { </span><span class="comment">continue double</span>
<span class="functiontext">Formats::change_material</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">state</span><span class="plain">-&gt;</span><span class="element">kind_of_material</span><span class="plain">, </span><span class="constant">REGULAR_MATERIAL</span><span class="plain">,</span>
<span class="identifier">state</span><span class="plain">-&gt;</span><span class="element">substantive_comment</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain">);</span>
<span class="identifier">state</span><span class="plain">-&gt;</span><span class="element">kind_of_material</span><span class="plain"> = </span><span class="constant">REGULAR_MATERIAL</span><span class="plain">;</span>
<span class="functiontext">Formats::item</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="constant">2</span><span class="plain">, </span><span class="identifier">I</span><span class="string">""</span><span class="plain">);</span>
<span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">matter</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0]);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">matter</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"%((%i+)%) (%c*)"</span><span class="plain">)) { </span><span class="comment">begin single</span>
<span class="functiontext">Formats::change_material</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">state</span><span class="plain">-&gt;</span><span class="element">kind_of_material</span><span class="plain">, </span><span class="constant">REGULAR_MATERIAL</span><span class="plain">,</span>
<span class="identifier">state</span><span class="plain">-&gt;</span><span class="element">substantive_comment</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain">);</span>
<span class="identifier">state</span><span class="plain">-&gt;</span><span class="element">kind_of_material</span><span class="plain"> = </span><span class="constant">REGULAR_MATERIAL</span><span class="plain">;</span>
<span class="functiontext">Formats::item</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="constant">1</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0]);</span>
<span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">matter</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[1]);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">matter</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"%(-(%i+)%) (%c*)"</span><span class="plain">)) { </span><span class="comment">begin double</span>
<span class="functiontext">Formats::change_material</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">state</span><span class="plain">-&gt;</span><span class="element">kind_of_material</span><span class="plain">, </span><span class="constant">REGULAR_MATERIAL</span><span class="plain">,</span>
<span class="identifier">state</span><span class="plain">-&gt;</span><span class="element">substantive_comment</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain">);</span>
<span class="identifier">state</span><span class="plain">-&gt;</span><span class="element">kind_of_material</span><span class="plain"> = </span><span class="constant">REGULAR_MATERIAL</span><span class="plain">;</span>
<span class="functiontext">Formats::item</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="constant">2</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0]);</span>
<span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">matter</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[1]);</span>
<span class="plain">}</span>
<span class="functiontext">Regexp::dispose_of</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1_3_3_1_8">&#167;1.3.3.1.8</a>.</p>
<p class="inwebparagraph"><a id="SP1_3_3_1_8_4"></a><b>&#167;1.3.3.1.8.4. </b>Finally, matter encased in vertical strokes one tab stop in from column 1
in the source is set indented in code style.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Weave tabbed code material as a new indented paragraph</span> <span class="cwebmacronumber">1.3.3.1.8.4</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">match_results</span><span class="plain"> </span><span class="identifier">mr</span><span class="plain"> = </span><span class="functiontext">Regexp::create_mr</span><span class="plain">();</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">matter</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"\t|(%c*)|(%c*?)"</span><span class="plain">)) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">state</span><span class="plain">-&gt;</span><span class="identifier">kind_of_material</span><span class="plain"> != </span><span class="constant">CODE_MATERIAL</span><span class="plain">) {</span>
<span class="functiontext">Formats::change_material</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">state</span><span class="plain">-&gt;</span><span class="element">kind_of_material</span><span class="plain">, </span><span class="constant">CODE_MATERIAL</span><span class="plain">,</span>
<span class="constant">TRUE</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">plainer</span><span class="plain">);</span>
<span class="identifier">state</span><span class="plain">-&gt;</span><span class="element">kind_of_material</span><span class="plain"> = </span><span class="constant">CODE_MATERIAL</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">original</span><span class="plain">);</span>
<span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">original</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0]);</span>
<span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">matter</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[1]);</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">colouring</span><span class="plain">);</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">=0; </span><span class="identifier">i</span><span class="plain">&lt;</span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">original</span><span class="plain">); </span><span class="identifier">i</span><span class="plain">++) </span><span class="identifier">PUT_TO</span><span class="plain">(</span><span class="identifier">colouring</span><span class="plain">, </span><span class="constant">PLAIN_COLOUR</span><span class="plain">);</span>
<span class="functiontext">Formats::source_code</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="constant">1</span><span class="plain">, </span><span class="identifier">I</span><span class="string">""</span><span class="plain">, </span><span class="identifier">original</span><span class="plain">, </span><span class="identifier">colouring</span><span class="plain">, </span><span class="identifier">I</span><span class="string">""</span><span class="plain">, </span><span class="constant">TRUE</span><span class="plain">, </span><span class="constant">TRUE</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain">);</span>
<span class="functiontext">Formats::text</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">matter</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">colouring</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">original</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">no_inweb_errors</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">) {</span>
<span class="functiontext">Main::error_in_web</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"Old-style pipes here"</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">);</span>
<span class="identifier">no_inweb_errors</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">continue</span><span class="plain">;</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">state</span><span class="plain">-&gt;</span><span class="element">kind_of_material</span><span class="plain"> != </span><span class="constant">REGULAR_MATERIAL</span><span class="plain">) {</span>
<span class="functiontext">Formats::change_material</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">state</span><span class="plain">-&gt;</span><span class="element">kind_of_material</span><span class="plain">, </span><span class="constant">REGULAR_MATERIAL</span><span class="plain">,</span>
<span class="constant">TRUE</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain">);</span>
<span class="identifier">state</span><span class="plain">-&gt;</span><span class="element">kind_of_material</span><span class="plain"> = </span><span class="constant">REGULAR_MATERIAL</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="functiontext">Regexp::dispose_of</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1_3_3_1_8">&#167;1.3.3.1.8</a>.</p>
<p class="inwebparagraph"><a id="SP1_3_3_1_9"></a><b>&#167;1.3.3.1.9. Code-like matter. </b>Even though Inweb's approach, unlike <code class="display"><span class="extract">CWEB</span></code>'s, is to respect the layout
of the original, this is still quite typographically complex: commentary
and macro usage is rendered differently.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Weave verbatim matter in code style</span> <span class="cwebmacronumber">1.3.3.1.9</span>&gt; =
</code></p>
<pre class="displaydefn">
&lt;<span class="cwebmacro">Enter beginlines/endlines mode if necessary</span> <span class="cwebmacronumber">1.3.3.1.9.1</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Weave a blank line as a thin vertical skip</span> <span class="cwebmacronumber">1.3.3.1.9.2</span>&gt;<span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">tab_stops_of_indentation</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
&lt;<span class="cwebmacro">Convert leading space in line matter to a number of tab stops</span> <span class="cwebmacronumber">1.3.3.1.9.3</span>&gt;<span class="plain">;</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">prefatory</span><span class="plain">);</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">concluding_comment</span><span class="plain">);</span>
&lt;<span class="cwebmacro">Extract any comment matter ending the line to be set in italic</span> <span class="cwebmacronumber">1.3.3.1.9.4</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Give constant definition lines slightly fancier openings</span> <span class="cwebmacronumber">1.3.3.1.9.5</span>&gt;<span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">LanguageMethods::weave_code_line</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">sect_language</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">,</span>
<span class="identifier">W</span><span class="plain">, </span><span class="identifier">C</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">, </span><span class="identifier">matter</span><span class="plain">, </span><span class="identifier">concluding_comment</span><span class="plain">)) </span><span class="reserved">continue</span><span class="plain">;</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">colouring</span><span class="plain">);</span>
<span class="functiontext">LanguageMethods::syntax_colour</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">sect_language</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">C</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">,</span>
<span class="plain"> </span><span class="identifier">matter</span><span class="plain">, </span><span class="identifier">colouring</span><span class="plain">);</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">found</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
&lt;<span class="cwebmacro">Find macro usages and adjust syntax colouring accordingly</span> <span class="cwebmacronumber">1.3.3.1.9.6</span>&gt;<span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">prefatory</span><span class="plain">) &gt; </span><span class="constant">0</span><span class="plain">) {</span>
<span class="identifier">state</span><span class="plain">-&gt;</span><span class="element">in_run_of_definitions</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">state</span><span class="plain">-&gt;</span><span class="identifier">in_run_of_definitions</span><span class="plain">) </span><span class="functiontext">Formats::after_definitions</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">);</span>
<span class="identifier">state</span><span class="plain">-&gt;</span><span class="element">in_run_of_definitions</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="functiontext">Formats::source_code</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">tab_stops_of_indentation</span><span class="plain">, </span><span class="identifier">prefatory</span><span class="plain">,</span>
<span class="identifier">matter</span><span class="plain">, </span><span class="identifier">colouring</span><span class="plain">, </span><span class="identifier">concluding_comment</span><span class="plain">, (</span><span class="identifier">found</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">)?</span><span class="identifier">TRUE:FALSE</span><span class="plain">, </span><span class="constant">TRUE</span><span class="plain">, </span><span class="constant">TRUE</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">colouring</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">concluding_comment</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">prefatory</span><span class="plain">);</span>
<span class="reserved">continue</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1_3_3_1">&#167;1.3.3.1</a>.</p>
<p class="inwebparagraph"><a id="SP1_3_3_1_9_1"></a><b>&#167;1.3.3.1.9.1. </b>Code is typeset between the <code class="display"><span class="extract">\beginlines</span></code> and <code class="display"><span class="extract">\endlines</span></code> macros in TeX,
hence the name of the following paragraph:
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Enter beginlines/endlines mode if necessary</span> <span class="cwebmacronumber">1.3.3.1.9.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">mode_now</span><span class="plain"> = </span><span class="identifier">state</span><span class="plain">-&gt;</span><span class="element">kind_of_material</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">state</span><span class="plain">-&gt;</span><span class="identifier">kind_of_material</span><span class="plain"> != </span><span class="constant">CODE_MATERIAL</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">category</span><span class="plain"> == </span><span class="constant">MACRO_DEFINITION_LCAT</span><span class="plain">)</span>
<span class="identifier">state</span><span class="plain">-&gt;</span><span class="element">kind_of_material</span><span class="plain"> = </span><span class="constant">MACRO_MATERIAL</span><span class="plain">;</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">category</span><span class="plain"> == </span><span class="constant">BEGIN_DEFINITION_LCAT</span><span class="plain">) ||</span>
<span class="plain">(</span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">category</span><span class="plain"> == </span><span class="constant">CONT_DEFINITION_LCAT</span><span class="plain">))</span>
<span class="identifier">state</span><span class="plain">-&gt;</span><span class="element">kind_of_material</span><span class="plain"> = </span><span class="constant">DEFINITION_MATERIAL</span><span class="plain">;</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">state</span><span class="plain">-&gt;</span><span class="element">kind_of_material</span><span class="plain"> == </span><span class="constant">DEFINITION_MATERIAL</span><span class="plain">) &amp;&amp;</span>
<span class="plain">((</span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">category</span><span class="plain"> == </span><span class="constant">CODE_BODY_LCAT</span><span class="plain">) || (</span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">category</span><span class="plain"> == </span><span class="constant">COMMENT_BODY_LCAT</span><span class="plain">)) &amp;&amp;</span>
<span class="plain">(</span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">text</span><span class="plain">) == </span><span class="constant">0</span><span class="plain">))</span>
<span class="identifier">state</span><span class="plain">-&gt;</span><span class="element">kind_of_material</span><span class="plain"> = </span><span class="constant">DEFINITION_MATERIAL</span><span class="plain">;</span>
<span class="reserved">else</span>
<span class="identifier">state</span><span class="plain">-&gt;</span><span class="element">kind_of_material</span><span class="plain"> = </span><span class="constant">CODE_MATERIAL</span><span class="plain">;</span>
<span class="functiontext">Formats::change_material</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">mode_now</span><span class="plain">, </span><span class="identifier">state</span><span class="plain">-&gt;</span><span class="element">kind_of_material</span><span class="plain">,</span>
<span class="identifier">state</span><span class="plain">-&gt;</span><span class="element">substantive_comment</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">plainer</span><span class="plain">);</span>
<span class="identifier">state</span><span class="plain">-&gt;</span><span class="element">line_break_pending</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1_3_3_1_9">&#167;1.3.3.1.9</a>.</p>
<p class="inwebparagraph"><a id="SP1_3_3_1_9_2"></a><b>&#167;1.3.3.1.9.2. </b>A blank line is typeset as a thin vertical skip (no TeX paragraph break
is needed):
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Weave a blank line as a thin vertical skip</span> <span class="cwebmacronumber">1.3.3.1.9.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">state</span><span class="plain">-&gt;</span><span class="identifier">line_break_pending</span><span class="plain">) {</span>
<span class="functiontext">Formats::blank_line</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain">);</span>
<span class="identifier">state</span><span class="plain">-&gt;</span><span class="element">line_break_pending</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Regexp::string_is_white_space</span><span class="plain">(</span><span class="identifier">matter</span><span class="plain">)) {</span>
<span class="identifier">state</span><span class="plain">-&gt;</span><span class="element">line_break_pending</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="reserved">continue</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1_3_3_1_9">&#167;1.3.3.1.9</a>.</p>
<p class="inwebparagraph"><a id="SP1_3_3_1_9_3"></a><b>&#167;1.3.3.1.9.3. </b>Examine the white space at the start of the code line, and count the
number of tab steps of indentation, rating 1 tab = 4 spaces:
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Convert leading space in line matter to a number of tab stops</span> <span class="cwebmacronumber">1.3.3.1.9.3</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">spaces_in</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
<span class="reserved">while</span><span class="plain"> (</span><span class="functiontext">Characters::is_space_or_tab</span><span class="plain">(</span><span class="functiontext">Str::get_first_char</span><span class="plain">(</span><span class="identifier">matter</span><span class="plain">))) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::get_first_char</span><span class="plain">(</span><span class="identifier">matter</span><span class="plain">) == </span><span class="character">'\t'</span><span class="plain">) {</span>
<span class="identifier">spaces_in</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
<span class="identifier">tab_stops_of_indentation</span><span class="plain">++;</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="identifier">spaces_in</span><span class="plain">++;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">spaces_in</span><span class="plain"> == </span><span class="constant">4</span><span class="plain">) {</span>
<span class="identifier">tab_stops_of_indentation</span><span class="plain">++;</span>
<span class="identifier">spaces_in</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="functiontext">Str::delete_first_character</span><span class="plain">(</span><span class="identifier">matter</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">spaces_in</span><span class="plain"> &gt; </span><span class="constant">0</span><span class="plain">) {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">respaced</span><span class="plain">);</span>
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">spaces_in</span><span class="plain"> &gt; </span><span class="constant">0</span><span class="plain">) { </span><span class="identifier">PUT_TO</span><span class="plain">(</span><span class="identifier">respaced</span><span class="plain">, </span><span class="character">' '</span><span class="plain">); </span><span class="identifier">spaces_in</span><span class="plain">--; }</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">respaced</span><span class="plain">, </span><span class="string">"%S"</span><span class="plain">, </span><span class="identifier">matter</span><span class="plain">);</span>
<span class="functiontext">Str::clear</span><span class="plain">(</span><span class="identifier">matter</span><span class="plain">);</span>
<span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">matter</span><span class="plain">, </span><span class="identifier">respaced</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">respaced</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1_3_3_1_9">&#167;1.3.3.1.9</a>.</p>
<p class="inwebparagraph"><a id="SP1_3_3_1_9_4"></a><b>&#167;1.3.3.1.9.4. </b>Comments which run to the end of a line are set in italic type. If the
only item on their lines, they are presented at the code tab stop;
otherwise, they are set flush right.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Extract any comment matter ending the line to be set in italic</span> <span class="cwebmacronumber">1.3.3.1.9.4</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">part_before_comment</span><span class="plain">);</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">part_within_comment</span><span class="plain">);</span>
<span class="reserved">programming_language</span><span class="plain"> *</span><span class="identifier">pl</span><span class="plain"> = </span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">sect_language</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">category</span><span class="plain"> == </span><span class="constant">TEXT_EXTRACT_LCAT</span><span class="plain">) </span><span class="identifier">pl</span><span class="plain"> = </span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">colour_as</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">pl</span><span class="plain">) &amp;&amp; (</span><span class="functiontext">LanguageMethods::parse_comment</span><span class="plain">(</span><span class="identifier">pl</span><span class="plain">,</span>
<span class="identifier">matter</span><span class="plain">, </span><span class="identifier">part_before_comment</span><span class="plain">, </span><span class="identifier">part_within_comment</span><span class="plain">))) {</span>
<span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">matter</span><span class="plain">, </span><span class="identifier">part_before_comment</span><span class="plain">);</span>
<span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">concluding_comment</span><span class="plain">, </span><span class="identifier">part_within_comment</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">part_before_comment</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">part_within_comment</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1_3_3_1_9">&#167;1.3.3.1.9</a>.</p>
<p class="inwebparagraph"><a id="SP1_3_3_1_9_5"></a><b>&#167;1.3.3.1.9.5. </b>Set the <code class="display"><span class="extract">@d</span></code> definition escape very slightly more fancily:
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Give constant definition lines slightly fancier openings</span> <span class="cwebmacronumber">1.3.3.1.9.5</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">category</span><span class="plain"> == </span><span class="constant">BEGIN_DEFINITION_LCAT</span><span class="plain">) {</span>
<span class="reserved">match_results</span><span class="plain"> </span><span class="identifier">mr</span><span class="plain"> = </span><span class="functiontext">Regexp::create_mr</span><span class="plain">();</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="functiontext">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">matter</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"@d (%c*)"</span><span class="plain">)) ||</span>
<span class="plain">(</span><span class="functiontext">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">matter</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"@define (%c*)"</span><span class="plain">))) {</span>
<span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">prefatory</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"define"</span><span class="plain">);</span>
<span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">matter</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0]);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> ((</span><span class="functiontext">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">matter</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"@e (%c*)"</span><span class="plain">)) ||</span>
<span class="plain">(</span><span class="functiontext">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">matter</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"@enum (%c*)"</span><span class="plain">))) {</span>
<span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">prefatory</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"enum"</span><span class="plain">);</span>
<span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">matter</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0]);</span>
<span class="plain">}</span>
<span class="functiontext">Regexp::dispose_of</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1_3_3_1_9">&#167;1.3.3.1.9</a>.</p>
<p class="inwebparagraph"><a id="SP1_3_3_1_9_6"></a><b>&#167;1.3.3.1.9.6. </b><code class="display">
&lt;<span class="cwebmacrodefn">Find macro usages and adjust syntax colouring accordingly</span> <span class="cwebmacronumber">1.3.3.1.9.6</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">match_results</span><span class="plain"> </span><span class="identifier">mr</span><span class="plain"> = </span><span class="functiontext">Regexp::create_mr</span><span class="plain">();</span>
<span class="reserved">while</span><span class="plain"> (</span><span class="functiontext">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">matter</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"(%c*?)%@%&lt;(%c*?)%@%&gt;(%c*)"</span><span class="plain">)) {</span>
<span class="reserved">para_macro</span><span class="plain"> *</span><span class="identifier">pmac</span><span class="plain"> = </span><span class="functiontext">Macros::find_by_name</span><span class="plain">(</span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[1], </span><span class="identifier">S</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">pmac</span><span class="plain">) {</span>
<span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">matter</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[2]);</span>
<span class="functiontext">Formats::source_code</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">tab_stops_of_indentation</span><span class="plain">, </span><span class="identifier">prefatory</span><span class="plain">,</span>
<span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0], </span><span class="identifier">colouring</span><span class="plain">, </span><span class="identifier">concluding_comment</span><span class="plain">, (</span><span class="identifier">found</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">)?</span><span class="identifier">TRUE:FALSE</span><span class="plain">,</span>
<span class="constant">FALSE</span><span class="plain">, </span><span class="constant">TRUE</span><span class="plain">);</span>
<span class="functiontext">LanguageMethods::reset_syntax_colouring</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">sect_language</span><span class="plain">);</span>
<span class="identifier">found</span><span class="plain">++;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">defn</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">pmac</span><span class="plain">) </span><span class="identifier">defn</span><span class="plain"> = (</span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">owning_paragraph</span><span class="plain"> == </span><span class="identifier">pmac</span><span class="plain">-&gt;</span><span class="element">defining_paragraph</span><span class="plain">)?</span><span class="identifier">TRUE:FALSE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">defn</span><span class="plain">) </span><span class="identifier">state</span><span class="plain">-&gt;</span><span class="element">in_run_of_definitions</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">pmac</span><span class="plain">) </span><span class="functiontext">Formats::para_macro</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">pmac</span><span class="plain">, </span><span class="identifier">defn</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">defn</span><span class="plain">) </span><span class="functiontext">Str::clear</span><span class="plain">(</span><span class="identifier">matter</span><span class="plain">);</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">temp</span><span class="plain">);</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">L</span><span class="plain"> = </span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">colouring</span><span class="plain">);</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain"> = </span><span class="identifier">L</span><span class="plain"> - </span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">matter</span><span class="plain">); </span><span class="identifier">i</span><span class="plain"> &lt; </span><span class="identifier">L</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">++)</span>
<span class="identifier">PUT_TO</span><span class="plain">(</span><span class="identifier">temp</span><span class="plain">, </span><span class="functiontext">Str::get_at</span><span class="plain">(</span><span class="identifier">colouring</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">));</span>
<span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">colouring</span><span class="plain">, </span><span class="identifier">temp</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">temp</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">break</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="functiontext">Regexp::dispose_of</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1_3_3_1_9">&#167;1.3.3.1.9</a>.</p>
<p class="inwebparagraph"><a id="SP1_3_3_1_10"></a><b>&#167;1.3.3.1.10. How paragraphs begin. </b></p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Deal with the marker for the start of a new paragraph, section or chapter</span> <span class="cwebmacronumber">1.3.3.1.10</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">category</span><span class="plain"> == </span><span class="constant">HEADING_START_LCAT</span><span class="plain">) ||</span>
<span class="plain">(</span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">category</span><span class="plain"> == </span><span class="constant">PARAGRAPH_START_LCAT</span><span class="plain">) ||</span>
<span class="plain">(</span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">category</span><span class="plain"> == </span><span class="constant">CHAPTER_HEADING_LCAT</span><span class="plain">) ||</span>
<span class="plain">(</span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">category</span><span class="plain"> == </span><span class="constant">SECTION_HEADING_LCAT</span><span class="plain">)) {</span>
<span class="identifier">state</span><span class="plain">-&gt;</span><span class="element">in_run_of_definitions</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
&lt;<span class="cwebmacro">Complete any started but not-fully-woven paragraph</span> <span class="cwebmacronumber">1.3.3.2</span>&gt;<span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">wv</span><span class="plain">-&gt;</span><span class="element">theme_match</span><span class="plain">)</span>
&lt;<span class="cwebmacro">If this is a paragraph break forced onto a new page, then throw a page</span> <span class="cwebmacronumber">1.3.3.1.10.1</span>&gt;<span class="plain">;</span>
<span class="functiontext">LanguageMethods::reset_syntax_colouring</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">sect_language</span><span class="plain">);</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">weight</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">category</span><span class="plain"> == </span><span class="constant">HEADING_START_LCAT</span><span class="plain">) </span><span class="identifier">weight</span><span class="plain"> = </span><span class="constant">1</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">category</span><span class="plain"> == </span><span class="constant">SECTION_HEADING_LCAT</span><span class="plain">) </span><span class="identifier">weight</span><span class="plain"> = </span><span class="constant">2</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">category</span><span class="plain"> == </span><span class="constant">CHAPTER_HEADING_LCAT</span><span class="plain">) </span><span class="identifier">weight</span><span class="plain"> = </span><span class="constant">3</span><span class="plain">;</span>
&lt;<span class="cwebmacro">Work out the next mark to place into the TeX vertical list</span> <span class="cwebmacronumber">1.3.3.1.10.2</span>&gt;<span class="plain">;</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">TeX_macro</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
&lt;<span class="cwebmacro">Choose which TeX macro to use in order to typeset the new paragraph heading</span> <span class="cwebmacronumber">1.3.3.1.10.3</span>&gt;<span class="plain">;</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">heading_text</span><span class="plain">);</span>
&lt;<span class="cwebmacro">Compose the heading text</span> <span class="cwebmacronumber">1.3.3.1.10.4</span>&gt;<span class="plain">;</span>
<span class="functiontext">Formats::paragraph_heading</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">TeX_macro</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">owning_paragraph</span><span class="plain">,</span>
<span class="identifier">heading_text</span><span class="plain">, </span><span class="identifier">state</span><span class="plain">-&gt;</span><span class="element">chaptermark</span><span class="plain">, </span><span class="identifier">state</span><span class="plain">-&gt;</span><span class="element">sectionmark</span><span class="plain">, </span><span class="identifier">weight</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">heading_text</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">weight</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">) </span><span class="identifier">state</span><span class="plain">-&gt;</span><span class="element">substantive_comment</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">state</span><span class="plain">-&gt;</span><span class="element">substantive_comment</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
&lt;<span class="cwebmacro">Weave any regular commentary text after the heading on the same line</span> <span class="cwebmacronumber">1.3.3.1.10.5</span>&gt;<span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">weight</span><span class="plain"> == </span><span class="constant">3</span><span class="plain">) </span><span class="functiontext">Formats::chapter_title_page</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">C</span><span class="plain">);</span>
<span class="reserved">continue</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1_3_3_1">&#167;1.3.3.1</a>.</p>
<p class="inwebparagraph"><a id="SP1_3_3_1_10_1"></a><b>&#167;1.3.3.1.10.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">If this is a paragraph break forced onto a new page, then throw a page</span> <span class="cwebmacronumber">1.3.3.1.10.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">owning_paragraph</span><span class="plain">) &amp;&amp;</span>
<span class="plain">(</span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">owning_paragraph</span><span class="plain">-&gt;</span><span class="element">starts_on_new_page</span><span class="plain">)) </span><span class="functiontext">Formats::pagebreak</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1_3_3_1_10">&#167;1.3.3.1.10</a>.</p>
<p class="inwebparagraph"><a id="SP1_3_3_1_10_2"></a><b>&#167;1.3.3.1.10.2. </b>"Marks" are the contrivance by which TeX produces running heads on pages
which follow the material on those pages: so that the running head for a page
can show the paragraph range for the material which tops it, for instance.
</p>
<p class="inwebparagraph">The ornament has to be set in math mode, even in the mark. <code class="display"><span class="extract">\S</span></code> and <code class="display"><span class="extract">\P</span></code>,
making a section sign and a pilcrow respectively, only work in math mode
because they abbreviate characters found in math fonts but not regular ones,
in TeX's deeply peculiar font encoding system.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Work out the next mark to place into the TeX vertical list</span> <span class="cwebmacronumber">1.3.3.1.10.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">weight</span><span class="plain"> == </span><span class="constant">3</span><span class="plain">) {</span>
<span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">state</span><span class="plain">-&gt;</span><span class="element">chaptermark</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="identifier">text_operand</span><span class="plain">);</span>
<span class="functiontext">Str::clear</span><span class="plain">(</span><span class="identifier">state</span><span class="plain">-&gt;</span><span class="element">sectionmark</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">weight</span><span class="plain"> == </span><span class="constant">2</span><span class="plain">) {</span>
<span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">state</span><span class="plain">-&gt;</span><span class="element">sectionmark</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="identifier">text_operand</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">wv</span><span class="plain">-&gt;</span><span class="element">pattern</span><span class="plain">-&gt;</span><span class="element">show_abbrevs</span><span class="plain"> == </span><span class="constant">FALSE</span><span class="plain">) </span><span class="functiontext">Str::clear</span><span class="plain">(</span><span class="identifier">state</span><span class="plain">-&gt;</span><span class="element">chaptermark</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">sect_range</span><span class="plain">) &gt; </span><span class="constant">0</span><span class="plain">) </span><span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">state</span><span class="plain">-&gt;</span><span class="element">chaptermark</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">sect_range</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">state</span><span class="plain">-&gt;</span><span class="element">chaptermark</span><span class="plain">) &gt; </span><span class="constant">0</span><span class="plain">) {</span>
<span class="functiontext">Str::clear</span><span class="plain">(</span><span class="identifier">state</span><span class="plain">-&gt;</span><span class="element">sectionmark</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">state</span><span class="plain">-&gt;</span><span class="element">sectionmark</span><span class="plain">, </span><span class="string">" - %S"</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">text_operand</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1_3_3_1_10">&#167;1.3.3.1.10</a>.</p>
<p class="inwebparagraph"><a id="SP1_3_3_1_10_3"></a><b>&#167;1.3.3.1.10.3. </b>We want to have different heading styles for different weights, and TeX is
horrible at using macro parameters as function arguments, so we don't want
to pass the weight that way. Instead we use
</p>
<pre class="display">
<span class="plain">\weavesection</span>
<span class="plain">\weavesections</span>
<span class="plain">\weavesectionss</span>
<span class="plain">\weavesectionsss</span>
</pre>
<p class="inwebparagraph">where the weight is the number of terminal <code class="display"><span class="extract">s</span></code>s, 0 to 3. (TeX macros,
lamentably, are not allowed digits in their name.) In the cases 0 and 1, we
also have variants <code class="display"><span class="extract">\nsweavesection</span></code> and <code class="display"><span class="extract">\nsweavesections</span></code> which are
the same, but with the initial vertical spacing removed; these allow us to
prevent unsightly excess white space in certain configurations of a section.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Choose which TeX macro to use in order to typeset the new paragraph heading</span> <span class="cwebmacronumber">1.3.3.1.10.3</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">switch</span><span class="plain"> (</span><span class="identifier">weight</span><span class="plain">) {</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">0</span><span class="plain">: </span><span class="identifier">TeX_macro</span><span class="plain"> = </span><span class="identifier">I</span><span class="string">"weavesection"</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">1</span><span class="plain">: </span><span class="identifier">TeX_macro</span><span class="plain"> = </span><span class="identifier">I</span><span class="string">"weavesections"</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">2</span><span class="plain">: </span><span class="identifier">TeX_macro</span><span class="plain"> = </span><span class="identifier">I</span><span class="string">"weavesectionss"</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="identifier">default:</span><span class="plain"> </span><span class="identifier">TeX_macro</span><span class="plain"> = </span><span class="identifier">I</span><span class="string">"weavesectionsss"</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">wv</span><span class="plain">-&gt;</span><span class="element">theme_match</span><span class="plain">) </span>&lt;<span class="cwebmacro">Apply special rules for thematic extracts</span> <span class="cwebmacronumber">1.3.3.1.10.3.1</span>&gt;<span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">state</span><span class="plain">-&gt;</span><span class="element">next_heading_without_vertical_skip</span><span class="plain">) &amp;&amp; (</span><span class="identifier">weight</span><span class="plain"> &lt; </span><span class="constant">2</span><span class="plain">)) {</span>
<span class="identifier">state</span><span class="plain">-&gt;</span><span class="element">next_heading_without_vertical_skip</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="reserved">switch</span><span class="plain"> (</span><span class="identifier">weight</span><span class="plain">) {</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">0</span><span class="plain">: </span><span class="identifier">TeX_macro</span><span class="plain"> = </span><span class="identifier">I</span><span class="string">"nsweavesection"</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">1</span><span class="plain">: </span><span class="identifier">TeX_macro</span><span class="plain"> = </span><span class="identifier">I</span><span class="string">"nsweavesections"</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1_3_3_1_10">&#167;1.3.3.1.10</a>.</p>
<p class="inwebparagraph"><a id="SP1_3_3_1_10_3_1"></a><b>&#167;1.3.3.1.10.3.1. </b>If we are weaving a selection of extracted paragraphs, normal conventions
about breaking pages at chapters and sections fail to work. So:
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Apply special rules for thematic extracts</span> <span class="cwebmacronumber">1.3.3.1.10.3.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">switch</span><span class="plain"> (</span><span class="identifier">weight</span><span class="plain">) {</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">0</span><span class="plain">: </span><span class="identifier">TeX_macro</span><span class="plain"> = </span><span class="identifier">I</span><span class="string">"tweavesection"</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">1</span><span class="plain">: </span><span class="identifier">TeX_macro</span><span class="plain"> = </span><span class="identifier">I</span><span class="string">"tweavesections"</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">2</span><span class="plain">: </span><span class="identifier">TeX_macro</span><span class="plain"> = </span><span class="identifier">I</span><span class="string">"tweavesectionss"</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="identifier">default:</span><span class="plain"> </span><span class="identifier">TeX_macro</span><span class="plain"> = </span><span class="identifier">I</span><span class="string">"tweavesectionsss"</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">weight</span><span class="plain"> &gt;= </span><span class="constant">0</span><span class="plain">) { </span><span class="identifier">weight</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">; }</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">cap</span><span class="plain"> = </span><span class="functiontext">Tags::retrieve_caption</span><span class="plain">(</span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">owning_paragraph</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">-&gt;</span><span class="element">theme_match</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">cap</span><span class="plain">) &gt; </span><span class="constant">0</span><span class="plain">) {</span>
<span class="functiontext">Formats::subheading</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="constant">1</span><span class="plain">, </span><span class="identifier">cap</span><span class="plain">, </span><span class="identifier">C</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">-&gt;</span><span class="element">ch_title</span><span class="plain">);</span>
<span class="identifier">state</span><span class="plain">-&gt;</span><span class="element">last_extract_from</span><span class="plain"> = </span><span class="identifier">S</span><span class="plain">;</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">state</span><span class="plain">-&gt;</span><span class="element">last_extract_from</span><span class="plain"> != </span><span class="identifier">S</span><span class="plain">) {</span>
<span class="identifier">state</span><span class="plain">-&gt;</span><span class="element">last_extract_from</span><span class="plain"> = </span><span class="identifier">S</span><span class="plain">;</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">extr</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">extr</span><span class="plain">, </span><span class="string">"From %S: %S"</span><span class="plain">, </span><span class="identifier">C</span><span class="plain">-&gt;</span><span class="identifier">md</span><span class="plain">-&gt;</span><span class="element">ch_title</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">-&gt;</span><span class="element">sect_title</span><span class="plain">);</span>
<span class="functiontext">Formats::subheading</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="constant">1</span><span class="plain">, </span><span class="identifier">extr</span><span class="plain">, </span><span class="identifier">C</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">-&gt;</span><span class="element">ch_title</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">extr</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1_3_3_1_10_3">&#167;1.3.3.1.10.3</a>.</p>
<p class="inwebparagraph"><a id="SP1_3_3_1_10_4"></a><b>&#167;1.3.3.1.10.4. </b><code class="display">
&lt;<span class="cwebmacrodefn">Compose the heading text</span> <span class="cwebmacronumber">1.3.3.1.10.4</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">weight</span><span class="plain"> == </span><span class="constant">3</span><span class="plain">) {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">brief_title</span><span class="plain">);</span>
<span class="reserved">match_results</span><span class="plain"> </span><span class="identifier">mr</span><span class="plain"> = </span><span class="functiontext">Regexp::create_mr</span><span class="plain">();</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">C</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">-&gt;</span><span class="element">ch_title</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"%c*?: (%c*)"</span><span class="plain">))</span>
<span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">brief_title</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[0]);</span>
<span class="reserved">else</span>
<span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">brief_title</span><span class="plain">, </span><span class="identifier">C</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">-&gt;</span><span class="element">ch_title</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">heading_text</span><span class="plain">, </span><span class="string">"%S: %S"</span><span class="plain">, </span><span class="identifier">C</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">-&gt;</span><span class="element">ch_range</span><span class="plain">, </span><span class="identifier">brief_title</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">brief_title</span><span class="plain">);</span>
<span class="functiontext">Regexp::dispose_of</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">weight</span><span class="plain"> == </span><span class="constant">2</span><span class="plain">) &amp;&amp; (</span><span class="functiontext">Reader::web_has_one_section</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">))) {</span>
<span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">heading_text</span><span class="plain">, </span><span class="functiontext">Bibliographic::get_datum</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Title"</span><span class="plain">));</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">weight</span><span class="plain"> == </span><span class="constant">2</span><span class="plain">) &amp;&amp; (</span><span class="identifier">wv</span><span class="plain">-&gt;</span><span class="element">pattern</span><span class="plain">-&gt;</span><span class="element">number_sections</span><span class="plain">) &amp;&amp; (</span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">printed_number</span><span class="plain"> &gt;= </span><span class="constant">0</span><span class="plain">))</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">heading_text</span><span class="plain">, </span><span class="string">"%d. "</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">printed_number</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">heading_text</span><span class="plain">, </span><span class="string">"%S"</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">text_operand</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1_3_3_1_10">&#167;1.3.3.1.10</a>.</p>
<p class="inwebparagraph"><a id="SP1_3_3_1_10_5"></a><b>&#167;1.3.3.1.10.5. </b>There's quite likely ordinary text on the line following the paragraph
start indication, too, so we need to weave this out:
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Weave any regular commentary text after the heading on the same line</span> <span class="cwebmacronumber">1.3.3.1.10.5</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">text_operand2</span><span class="plain">) &gt; </span><span class="constant">0</span><span class="plain">) {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">matter</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">matter</span><span class="plain">, </span><span class="string">"%S\n"</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">text_operand2</span><span class="plain">);</span>
<span class="functiontext">Formats::text</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">matter</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">matter</span><span class="plain">);</span>
<span class="identifier">state</span><span class="plain">-&gt;</span><span class="element">substantive_comment</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1_3_3_1_10">&#167;1.3.3.1.10</a>.</p>
<p class="inwebparagraph"><a id="SP1_3_3_2"></a><b>&#167;1.3.3.2. How paragraphs end. </b>At the end of a paragraph, on the other hand, we do this:
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Complete any started but not-fully-woven paragraph</span> <span class="cwebmacronumber">1.3.3.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">mode_now</span><span class="plain"> = </span><span class="identifier">state</span><span class="plain">-&gt;</span><span class="element">kind_of_material</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">state</span><span class="plain">-&gt;</span><span class="identifier">kind_of_material</span><span class="plain"> != </span><span class="constant">REGULAR_MATERIAL</span><span class="plain">) {</span>
<span class="identifier">state</span><span class="plain">-&gt;</span><span class="element">kind_of_material</span><span class="plain"> = </span><span class="constant">REGULAR_MATERIAL</span><span class="plain">;</span>
<span class="functiontext">Formats::change_material</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">mode_now</span><span class="plain">, </span><span class="identifier">state</span><span class="plain">-&gt;</span><span class="element">kind_of_material</span><span class="plain">,</span>
<span class="constant">TRUE</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">?(</span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">plainer</span><span class="plain">):</span><span class="constant">FALSE</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">current_paragraph</span><span class="plain">) &amp;&amp; (</span><span class="identifier">current_paragraph</span><span class="plain"> != </span><span class="identifier">state</span><span class="plain">-&gt;</span><span class="element">last_endnoted_para</span><span class="plain">)) {</span>
<span class="identifier">state</span><span class="plain">-&gt;</span><span class="element">last_endnoted_para</span><span class="plain"> = </span><span class="identifier">current_paragraph</span><span class="plain">;</span>
<span class="functiontext">Weaver::show_endnotes_on_previous_paragraph</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">current_paragraph</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">L</span><span class="plain">) </span><span class="identifier">current_paragraph</span><span class="plain"> = </span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">owning_paragraph</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1_3_3">&#167;1.3.3</a>, <a href="#SP1_3_3_1_7">&#167;1.3.3.1.7</a>, <a href="#SP1_3_3_1_10">&#167;1.3.3.1.10</a>.</p>
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. Endnotes. </b>The endnotes describe function calls from far away, or unexpected
structure usage, or how <code class="display"><span class="extract">CWEB</span></code>-style code substitutions were made.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Weaver::show_endnotes_on_previous_paragraph</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">,</span>
<span class="reserved">weave_target</span><span class="plain"> *</span><span class="identifier">wv</span><span class="plain">, </span><span class="reserved">paragraph</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain">) {</span>
<span class="functiontext">Tags::show_endnote_on_ifdefs</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">P</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">P</span><span class="plain">-&gt;</span><span class="element">defines_macro</span><span class="plain">)</span>
&lt;<span class="cwebmacro">Show endnote on where paragraph macro is used</span> <span class="cwebmacronumber">2.1</span>&gt;<span class="plain">;</span>
<span class="reserved">function</span><span class="plain"> *</span><span class="identifier">fn</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">fn</span><span class="plain">, </span><span class="reserved">function</span><span class="plain">, </span><span class="identifier">P</span><span class="plain">-&gt;</span><span class="element">functions</span><span class="plain">)</span>
&lt;<span class="cwebmacro">Show endnote on where this function is used</span> <span class="cwebmacronumber">2.2</span>&gt;<span class="plain">;</span>
<span class="reserved">c_structure</span><span class="plain"> *</span><span class="identifier">st</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">st</span><span class="plain">, </span><span class="reserved">c_structure</span><span class="plain">, </span><span class="identifier">P</span><span class="plain">-&gt;</span><span class="element">structures</span><span class="plain">)</span>
&lt;<span class="cwebmacro">Show endnote on where this C structure is accessed</span> <span class="cwebmacronumber">2.3</span>&gt;<span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Weaver::show_endnotes_on_previous_paragraph is used in <a href="#SP1_3_3_2">&#167;1.3.3.2</a>.</p>
<p class="inwebparagraph"><a id="SP2_1"></a><b>&#167;2.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Show endnote on where paragraph macro is used</span> <span class="cwebmacronumber">2.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="functiontext">Formats::endnote</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="constant">1</span><span class="plain">);</span>
<span class="functiontext">Formats::text</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"This code is "</span><span class="plain">);</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">ct</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
<span class="reserved">macro_usage</span><span class="plain"> *</span><span class="identifier">mu</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">mu</span><span class="plain">, </span><span class="reserved">macro_usage</span><span class="plain">, </span><span class="identifier">P</span><span class="plain">-&gt;</span><span class="element">defines_macro</span><span class="plain">-&gt;</span><span class="element">macro_usages</span><span class="plain">)</span>
<span class="identifier">ct</span><span class="plain">++;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ct</span><span class="plain"> == </span><span class="constant">1</span><span class="plain">) </span><span class="functiontext">Formats::text</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"never used"</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">k</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">, </span><span class="identifier">used_flag</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">mu</span><span class="plain">, </span><span class="reserved">macro_usage</span><span class="plain">, </span><span class="identifier">P</span><span class="plain">-&gt;</span><span class="element">defines_macro</span><span class="plain">-&gt;</span><span class="element">macro_usages</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">P</span><span class="plain"> != </span><span class="identifier">mu</span><span class="plain">-&gt;</span><span class="element">used_in_paragraph</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">used_flag</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">k</span><span class="plain"> &lt; </span><span class="identifier">ct</span><span class="plain">-1) </span><span class="functiontext">Formats::text</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">I</span><span class="string">", "</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="functiontext">Formats::text</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">I</span><span class="string">" and "</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="functiontext">Formats::text</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"used in "</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="functiontext">Formats::locale</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">mu</span><span class="plain">-&gt;</span><span class="element">used_in_paragraph</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
<span class="identifier">used_flag</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">; </span><span class="identifier">k</span><span class="plain">++;</span>
<span class="reserved">switch</span><span class="plain"> (</span><span class="identifier">mu</span><span class="plain">-&gt;</span><span class="element">multiplicity</span><span class="plain">) {</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">1</span><span class="plain">: </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">2</span><span class="plain">: </span><span class="functiontext">Formats::text</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">I</span><span class="string">" (twice)"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">3</span><span class="plain">: </span><span class="functiontext">Formats::text</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">I</span><span class="string">" (three times)"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">4</span><span class="plain">: </span><span class="functiontext">Formats::text</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">I</span><span class="string">" (four times)"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">5</span><span class="plain">: </span><span class="functiontext">Formats::text</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">I</span><span class="string">" (five times)"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="identifier">default:</span><span class="plain"> {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">mt</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">mt</span><span class="plain">, </span><span class="string">" (%d times)"</span><span class="plain">, </span><span class="identifier">mu</span><span class="plain">-&gt;</span><span class="element">multiplicity</span><span class="plain">);</span>
<span class="functiontext">Formats::text</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">mt</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">mt</span><span class="plain">);</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="functiontext">Formats::text</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"."</span><span class="plain">);</span>
<span class="functiontext">Formats::endnote</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="constant">2</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP2">&#167;2</a>.</p>
<p class="inwebparagraph"><a id="SP2_2"></a><b>&#167;2.2. </b><code class="display">
&lt;<span class="cwebmacrodefn">Show endnote on where this function is used</span> <span class="cwebmacronumber">2.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="functiontext">Formats::endnote</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="constant">1</span><span class="plain">);</span>
<span class="reserved">hash_table_entry</span><span class="plain"> *</span><span class="identifier">hte</span><span class="plain"> =</span>
<span class="functiontext">Analyser::find_hash_entry_for_section</span><span class="plain">(</span><span class="identifier">fn</span><span class="plain">-&gt;</span><span class="element">function_header_at</span><span class="plain">-&gt;</span><span class="element">owning_section</span><span class="plain">,</span>
<span class="identifier">fn</span><span class="plain">-&gt;</span><span class="element">function_name</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain">);</span>
<span class="functiontext">Formats::text</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"The function "</span><span class="plain">);</span>
<span class="functiontext">Formats::text</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">fn</span><span class="plain">-&gt;</span><span class="element">function_name</span><span class="plain">);</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">used_flag</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="reserved">hash_table_entry_usage</span><span class="plain"> *</span><span class="identifier">hteu</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">section</span><span class="plain"> *</span><span class="identifier">last_cited_in</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">count_under</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">hteu</span><span class="plain">, </span><span class="reserved">hash_table_entry_usage</span><span class="plain">, </span><span class="identifier">hte</span><span class="plain">-&gt;</span><span class="element">usages</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">P</span><span class="plain"> != </span><span class="identifier">hteu</span><span class="plain">-&gt;</span><span class="element">usage_recorded_at</span><span class="plain">) &amp;&amp;</span>
<span class="plain">(</span><span class="identifier">P</span><span class="plain">-&gt;</span><span class="element">under_section</span><span class="plain"> == </span><span class="identifier">hteu</span><span class="plain">-&gt;</span><span class="element">usage_recorded_at</span><span class="plain">-&gt;</span><span class="element">under_section</span><span class="plain">))</span>
&lt;<span class="cwebmacro">Cite usage of function here</span> <span class="cwebmacronumber">2.2.1</span>&gt;<span class="plain">;</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">hteu</span><span class="plain">, </span><span class="reserved">hash_table_entry_usage</span><span class="plain">, </span><span class="identifier">hte</span><span class="plain">-&gt;</span><span class="element">usages</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">P</span><span class="plain">-&gt;</span><span class="element">under_section</span><span class="plain"> != </span><span class="identifier">hteu</span><span class="plain">-&gt;</span><span class="element">usage_recorded_at</span><span class="plain">-&gt;</span><span class="element">under_section</span><span class="plain">)</span>
&lt;<span class="cwebmacro">Cite usage of function here</span> <span class="cwebmacronumber">2.2.1</span>&gt;<span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">used_flag</span><span class="plain"> == </span><span class="constant">FALSE</span><span class="plain">) </span><span class="functiontext">Formats::text</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">I</span><span class="string">" appears nowhere else"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">last_cited_in</span><span class="plain"> != </span><span class="identifier">P</span><span class="plain">-&gt;</span><span class="element">under_section</span><span class="plain">) &amp;&amp; (</span><span class="identifier">last_cited_in</span><span class="plain">))</span>
<span class="functiontext">Formats::text</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">I</span><span class="string">")"</span><span class="plain">);</span>
<span class="functiontext">Formats::text</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"."</span><span class="plain">);</span>
<span class="functiontext">Formats::endnote</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="constant">2</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP2">&#167;2</a>.</p>
<p class="inwebparagraph"><a id="SP2_2_1"></a><b>&#167;2.2.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Cite usage of function here</span> <span class="cwebmacronumber">2.2.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">used_flag</span><span class="plain"> == </span><span class="constant">FALSE</span><span class="plain">) </span><span class="functiontext">Formats::text</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">I</span><span class="string">" is used in "</span><span class="plain">);</span>
<span class="identifier">used_flag</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="reserved">section</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain"> = </span><span class="identifier">hteu</span><span class="plain">-&gt;</span><span class="element">usage_recorded_at</span><span class="plain">-&gt;</span><span class="element">under_section</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">S</span><span class="plain"> != </span><span class="identifier">last_cited_in</span><span class="plain">) &amp;&amp; (</span><span class="identifier">S</span><span class="plain"> != </span><span class="identifier">P</span><span class="plain">-&gt;</span><span class="element">under_section</span><span class="plain">)) {</span>
<span class="identifier">count_under</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">last_cited_in</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">last_cited_in</span><span class="plain"> != </span><span class="identifier">P</span><span class="plain">-&gt;</span><span class="element">under_section</span><span class="plain">) </span><span class="functiontext">Formats::text</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"), "</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="functiontext">Formats::text</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">I</span><span class="string">", "</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="functiontext">Formats::text</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">hteu</span><span class="plain">-&gt;</span><span class="element">usage_recorded_at</span><span class="plain">-&gt;</span><span class="element">under_section</span><span class="plain">-&gt;</span><span class="element">sect_range</span><span class="plain">);</span>
<span class="functiontext">Formats::text</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">I</span><span class="string">" ("</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">count_under</span><span class="plain">++ &gt; </span><span class="constant">0</span><span class="plain">) </span><span class="functiontext">Formats::text</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">I</span><span class="string">", "</span><span class="plain">);</span>
<span class="functiontext">Formats::locale</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">hteu</span><span class="plain">-&gt;</span><span class="element">usage_recorded_at</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
<span class="identifier">last_cited_in</span><span class="plain"> = </span><span class="identifier">hteu</span><span class="plain">-&gt;</span><span class="element">usage_recorded_at</span><span class="plain">-&gt;</span><span class="element">under_section</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP2_2">&#167;2.2</a> (twice).</p>
<p class="inwebparagraph"><a id="SP2_3"></a><b>&#167;2.3. </b><code class="display">
&lt;<span class="cwebmacrodefn">Show endnote on where this C structure is accessed</span> <span class="cwebmacronumber">2.3</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="functiontext">Formats::endnote</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="constant">1</span><span class="plain">);</span>
<span class="functiontext">Formats::text</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"The structure "</span><span class="plain">);</span>
<span class="functiontext">Formats::text</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">st</span><span class="plain">-&gt;</span><span class="element">structure_name</span><span class="plain">);</span>
<span class="reserved">section</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">, </span><span class="reserved">section</span><span class="plain">) </span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">scratch_flag</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="reserved">structure_element</span><span class="plain"> *</span><span class="identifier">elt</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">elt</span><span class="plain">, </span><span class="reserved">structure_element</span><span class="plain">, </span><span class="identifier">st</span><span class="plain">-&gt;</span><span class="element">elements</span><span class="plain">) {</span>
<span class="reserved">hash_table_entry</span><span class="plain"> *</span><span class="identifier">hte</span><span class="plain"> =</span>
<span class="functiontext">Analyser::find_hash_entry_for_section</span><span class="plain">(</span><span class="identifier">elt</span><span class="plain">-&gt;</span><span class="element">element_created_at</span><span class="plain">-&gt;</span><span class="element">owning_section</span><span class="plain">,</span>
<span class="identifier">elt</span><span class="plain">-&gt;</span><span class="element">element_name</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">hte</span><span class="plain">) {</span>
<span class="reserved">hash_table_entry_usage</span><span class="plain"> *</span><span class="identifier">hteu</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">hteu</span><span class="plain">, </span><span class="reserved">hash_table_entry_usage</span><span class="plain">, </span><span class="identifier">hte</span><span class="plain">-&gt;</span><span class="element">usages</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">hteu</span><span class="plain">-&gt;</span><span class="identifier">form_of_usage</span><span class="plain"> &amp; </span><span class="constant">ELEMENT_ACCESS_USAGE</span><span class="plain">)</span>
<span class="identifier">hteu</span><span class="plain">-&gt;</span><span class="element">usage_recorded_at</span><span class="plain">-&gt;</span><span class="element">under_section</span><span class="plain">-&gt;</span><span class="element">scratch_flag</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">usage_count</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">, </span><span class="identifier">external</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">, </span><span class="reserved">section</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">scratch_flag</span><span class="plain">) {</span>
<span class="identifier">usage_count</span><span class="plain">++;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">S</span><span class="plain"> != </span><span class="identifier">P</span><span class="plain">-&gt;</span><span class="element">under_section</span><span class="plain">) </span><span class="identifier">external</span><span class="plain">++;</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">external</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">) </span><span class="functiontext">Formats::text</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">I</span><span class="string">" is private to this section"</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> {</span>
<span class="functiontext">Formats::text</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">I</span><span class="string">" is accessed in "</span><span class="plain">);</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">c</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">, </span><span class="reserved">section</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">scratch_flag</span><span class="plain">) &amp;&amp; (</span><span class="identifier">S</span><span class="plain"> != </span><span class="identifier">P</span><span class="plain">-&gt;</span><span class="element">under_section</span><span class="plain">)) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain">++ &gt; </span><span class="constant">0</span><span class="plain">) </span><span class="functiontext">Formats::text</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">I</span><span class="string">", "</span><span class="plain">);</span>
<span class="functiontext">Formats::text</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">sect_range</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">P</span><span class="plain">-&gt;</span><span class="element">under_section</span><span class="plain">-&gt;</span><span class="element">scratch_flag</span><span class="plain">) </span><span class="functiontext">Formats::text</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">I</span><span class="string">" and here"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="functiontext">Formats::text</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"."</span><span class="plain">);</span>
<span class="functiontext">Formats::endnote</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="constant">2</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP2">&#167;2</a>.</p>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. Section tables of contents. </b>These appear at the top of each woven section, and give links to the paragraphs
marked as <code class="display"><span class="extract">@h</span></code> headings.
</p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Weaver::weave_table_of_contents</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">weave_target</span><span class="plain"> *</span><span class="identifier">wv</span><span class="plain">, </span><span class="reserved">section</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">noteworthy</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
<span class="reserved">paragraph</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">, </span><span class="reserved">paragraph</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">paragraphs</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">P</span><span class="plain">-&gt;</span><span class="element">weight</span><span class="plain"> &gt; </span><span class="constant">0</span><span class="plain">) &amp;&amp; ((</span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">barred</span><span class="plain"> == </span><span class="constant">FALSE</span><span class="plain">) || (</span><span class="identifier">P</span><span class="plain">-&gt;</span><span class="element">above_bar</span><span class="plain"> == </span><span class="constant">FALSE</span><span class="plain">)))</span>
<span class="identifier">noteworthy</span><span class="plain">++;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">noteworthy</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="functiontext">Formats::toc</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="constant">1</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">sect_range</span><span class="plain">, </span><span class="identifier">I</span><span class="string">""</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
<span class="identifier">noteworthy</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">, </span><span class="reserved">paragraph</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">paragraphs</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">P</span><span class="plain">-&gt;</span><span class="element">weight</span><span class="plain"> &gt; </span><span class="constant">0</span><span class="plain">) &amp;&amp; ((</span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">barred</span><span class="plain"> == </span><span class="constant">FALSE</span><span class="plain">) || (</span><span class="identifier">P</span><span class="plain">-&gt;</span><span class="element">above_bar</span><span class="plain"> == </span><span class="constant">FALSE</span><span class="plain">))) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">noteworthy</span><span class="plain"> &gt; </span><span class="constant">0</span><span class="plain">) </span><span class="functiontext">Formats::toc</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="constant">2</span><span class="plain">, </span><span class="identifier">I</span><span class="string">""</span><span class="plain">, </span><span class="identifier">I</span><span class="string">""</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">loc</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">loc</span><span class="plain">, </span><span class="string">"%S%S"</span><span class="plain">, </span><span class="identifier">P</span><span class="plain">-&gt;</span><span class="element">ornament</span><span class="plain">, </span><span class="identifier">P</span><span class="plain">-&gt;</span><span class="element">paragraph_number</span><span class="plain">);</span>
<span class="functiontext">Formats::toc</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="constant">3</span><span class="plain">, </span><span class="identifier">loc</span><span class="plain">, </span><span class="identifier">P</span><span class="plain">-&gt;</span><span class="identifier">first_line_in_paragraph</span><span class="plain">-&gt;</span><span class="element">text_operand</span><span class="plain">, </span><span class="identifier">P</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">loc</span><span class="plain">);</span>
<span class="identifier">noteworthy</span><span class="plain">++;</span>
<span class="plain">}</span>
<span class="functiontext">Formats::toc</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">wv</span><span class="plain">, </span><span class="constant">4</span><span class="plain">, </span><span class="identifier">I</span><span class="string">""</span><span class="plain">, </span><span class="identifier">I</span><span class="string">""</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Weaver::weave_table_of_contents is used in <a href="#SP1_3_3_1_3">&#167;1.3.3.1.3</a>, <a href="#SP1_3_3_1_4">&#167;1.3.3.1.4</a>.</p>
<hr class="tocbar">
<ul class="toc"><li><a href="3-ti.html">Back to 'The Indexer'</a></li><li><a href="3-tt.html">Continue with 'The Tangler'</a></li></ul><hr class="tocbar">
<!--End of weave-->
</main>
</body>
</html>