inweb-bootstrap/docs/inweb/5-tf.html

1178 lines
201 KiB
HTML

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>5/ptf</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 '5/tf' 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#5">Chapter 5: Formats</a></li><li><b>TeX Format</b></li></ul><p class="purpose">To provide for weaving in the standard maths and science typesetting software, TeX.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Creation</a></li><li><a href="#SP2">&#167;2. Methods</a></li><li><a href="#SP25">&#167;25. Post-processing</a></li><li><a href="#SP28">&#167;28. Removing math mode</a></li></ul><hr class="tocbar">
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. Creation. </b></p>
<pre class="display">
<span class="identifier">void</span><span class="plain"> </span><span class="functiontext">TeX::create</span><span class="plain">(</span><span class="identifier">void</span><span class="plain">) {</span>
&lt;<span class="cwebmacro">Create TeX format</span> <span class="cwebmacronumber">1.1</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Create DVI format</span> <span class="cwebmacronumber">1.2</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Create PDF format</span> <span class="cwebmacronumber">1.3</span>&gt;<span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function TeX::create is used in 5/wf (<a href="5-wf.html#SP3">&#167;3</a>).</p>
<p class="inwebparagraph"><a id="SP1_1"></a><b>&#167;1.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Create TeX format</span> <span class="cwebmacronumber">1.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">weave_format</span><span class="plain"> *</span><span class="identifier">wf</span><span class="plain"> = </span><span class="functiontext">Formats::create_weave_format</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"TeX"</span><span class="plain">, </span><span class="identifier">I</span><span class="string">".tex"</span><span class="plain">);</span>
&lt;<span class="cwebmacro">Make this format basically TeX</span> <span class="cwebmacronumber">1.1.1</span>&gt;<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">Create DVI format</span> <span class="cwebmacronumber">1.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">weave_format</span><span class="plain"> *</span><span class="identifier">wf</span><span class="plain"> = </span><span class="functiontext">Formats::create_weave_format</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"DVI"</span><span class="plain">, </span><span class="identifier">I</span><span class="string">".tex"</span><span class="plain">);</span>
&lt;<span class="cwebmacro">Make this format basically TeX</span> <span class="cwebmacronumber">1.1.1</span>&gt;<span class="plain">;</span>
<span class="identifier">METHOD_ADD</span><span class="plain">(</span><span class="identifier">wf</span><span class="plain">, </span><span class="constant">POST_PROCESS_POS_MTID</span><span class="plain">, </span><span class="functiontext">TeX::post_process_DVI</span><span class="plain">);</span>
<span class="identifier">METHOD_ADD</span><span class="plain">(</span><span class="identifier">wf</span><span class="plain">, </span><span class="constant">POST_PROCESS_POS_MTID</span><span class="plain">, </span><span class="functiontext">TeX::post_process_report</span><span class="plain">);</span>
<span class="identifier">METHOD_ADD</span><span class="plain">(</span><span class="identifier">wf</span><span class="plain">, </span><span class="constant">POST_PROCESS_SUBSTITUTE_POS_MTID</span><span class="plain">, </span><span class="functiontext">TeX::post_process_substitute</span><span class="plain">);</span>
<span class="identifier">METHOD_ADD</span><span class="plain">(</span><span class="identifier">wf</span><span class="plain">, </span><span class="constant">PRESERVE_MATH_MODE_FOR_MTID</span><span class="plain">, </span><span class="functiontext">TeX::yes</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">Create PDF format</span> <span class="cwebmacronumber">1.3</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">weave_format</span><span class="plain"> *</span><span class="identifier">wf</span><span class="plain"> = </span><span class="functiontext">Formats::create_weave_format</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"PDF"</span><span class="plain">, </span><span class="identifier">I</span><span class="string">".tex"</span><span class="plain">);</span>
<span class="identifier">METHOD_ADD</span><span class="plain">(</span><span class="identifier">wf</span><span class="plain">, </span><span class="constant">PARA_MACRO_FOR_MTID</span><span class="plain">, </span><span class="functiontext">TeX::para_macro_PDF_1</span><span class="plain">);</span>
&lt;<span class="cwebmacro">Make this format basically TeX</span> <span class="cwebmacronumber">1.1.1</span>&gt;<span class="plain">;</span>
<span class="identifier">METHOD_ADD</span><span class="plain">(</span><span class="identifier">wf</span><span class="plain">, </span><span class="constant">PARA_MACRO_FOR_MTID</span><span class="plain">, </span><span class="functiontext">TeX::para_macro_PDF_2</span><span class="plain">);</span>
<span class="identifier">METHOD_ADD</span><span class="plain">(</span><span class="identifier">wf</span><span class="plain">, </span><span class="constant">CHANGE_COLOUR_FOR_MTID</span><span class="plain">, </span><span class="functiontext">TeX::change_colour_PDF</span><span class="plain">);</span>
<span class="identifier">METHOD_ADD</span><span class="plain">(</span><span class="identifier">wf</span><span class="plain">, </span><span class="constant">FIGURE_FOR_MTID</span><span class="plain">, </span><span class="functiontext">TeX::figure_PDF</span><span class="plain">);</span>
<span class="identifier">METHOD_ADD</span><span class="plain">(</span><span class="identifier">wf</span><span class="plain">, </span><span class="constant">POST_PROCESS_POS_MTID</span><span class="plain">, </span><span class="functiontext">TeX::post_process_PDF</span><span class="plain">);</span>
<span class="identifier">METHOD_ADD</span><span class="plain">(</span><span class="identifier">wf</span><span class="plain">, </span><span class="constant">POST_PROCESS_SUBSTITUTE_POS_MTID</span><span class="plain">, </span><span class="functiontext">TeX::post_process_substitute</span><span class="plain">);</span>
<span class="identifier">METHOD_ADD</span><span class="plain">(</span><span class="identifier">wf</span><span class="plain">, </span><span class="constant">INDEX_PDFS_POS_MTID</span><span class="plain">, </span><span class="functiontext">TeX::yes</span><span class="plain">);</span>
<span class="identifier">METHOD_ADD</span><span class="plain">(</span><span class="identifier">wf</span><span class="plain">, </span><span class="constant">PRESERVE_MATH_MODE_FOR_MTID</span><span class="plain">, </span><span class="functiontext">TeX::yes</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_1_1"></a><b>&#167;1.1.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Make this format basically TeX</span> <span class="cwebmacronumber">1.1.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">METHOD_ADD</span><span class="plain">(</span><span class="identifier">wf</span><span class="plain">, </span><span class="constant">TOP_FOR_MTID</span><span class="plain">, </span><span class="functiontext">TeX::top</span><span class="plain">);</span>
<span class="identifier">METHOD_ADD</span><span class="plain">(</span><span class="identifier">wf</span><span class="plain">, </span><span class="constant">SUBHEADING_FOR_MTID</span><span class="plain">, </span><span class="functiontext">TeX::subheading</span><span class="plain">);</span>
<span class="identifier">METHOD_ADD</span><span class="plain">(</span><span class="identifier">wf</span><span class="plain">, </span><span class="constant">TOC_FOR_MTID</span><span class="plain">, </span><span class="functiontext">TeX::toc</span><span class="plain">);</span>
<span class="identifier">METHOD_ADD</span><span class="plain">(</span><span class="identifier">wf</span><span class="plain">, </span><span class="constant">CHAPTER_TP_FOR_MTID</span><span class="plain">, </span><span class="functiontext">TeX::chapter_title_page</span><span class="plain">);</span>
<span class="identifier">METHOD_ADD</span><span class="plain">(</span><span class="identifier">wf</span><span class="plain">, </span><span class="constant">PARAGRAPH_HEADING_FOR_MTID</span><span class="plain">, </span><span class="functiontext">TeX::paragraph_heading</span><span class="plain">);</span>
<span class="identifier">METHOD_ADD</span><span class="plain">(</span><span class="identifier">wf</span><span class="plain">, </span><span class="constant">SOURCE_CODE_FOR_MTID</span><span class="plain">, </span><span class="functiontext">TeX::source_code</span><span class="plain">);</span>
<span class="identifier">METHOD_ADD</span><span class="plain">(</span><span class="identifier">wf</span><span class="plain">, </span><span class="constant">INLINE_CODE_FOR_MTID</span><span class="plain">, </span><span class="functiontext">TeX::inline_code</span><span class="plain">);</span>
<span class="identifier">METHOD_ADD</span><span class="plain">(</span><span class="identifier">wf</span><span class="plain">, </span><span class="constant">DISPLAY_LINE_FOR_MTID</span><span class="plain">, </span><span class="functiontext">TeX::display_line</span><span class="plain">);</span>
<span class="identifier">METHOD_ADD</span><span class="plain">(</span><span class="identifier">wf</span><span class="plain">, </span><span class="constant">ITEM_FOR_MTID</span><span class="plain">, </span><span class="functiontext">TeX::item</span><span class="plain">);</span>
<span class="identifier">METHOD_ADD</span><span class="plain">(</span><span class="identifier">wf</span><span class="plain">, </span><span class="constant">BAR_FOR_MTID</span><span class="plain">, </span><span class="functiontext">TeX::bar</span><span class="plain">);</span>
<span class="identifier">METHOD_ADD</span><span class="plain">(</span><span class="identifier">wf</span><span class="plain">, </span><span class="constant">PARA_MACRO_FOR_MTID</span><span class="plain">, </span><span class="functiontext">TeX::para_macro</span><span class="plain">);</span>
<span class="identifier">METHOD_ADD</span><span class="plain">(</span><span class="identifier">wf</span><span class="plain">, </span><span class="constant">PAGEBREAK_FOR_MTID</span><span class="plain">, </span><span class="functiontext">TeX::pagebreak</span><span class="plain">);</span>
<span class="identifier">METHOD_ADD</span><span class="plain">(</span><span class="identifier">wf</span><span class="plain">, </span><span class="constant">BLANK_LINE_FOR_MTID</span><span class="plain">, </span><span class="functiontext">TeX::blank_line</span><span class="plain">);</span>
<span class="identifier">METHOD_ADD</span><span class="plain">(</span><span class="identifier">wf</span><span class="plain">, </span><span class="constant">AFTER_DEFINITIONS_FOR_MTID</span><span class="plain">, </span><span class="functiontext">TeX::after_definitions</span><span class="plain">);</span>
<span class="identifier">METHOD_ADD</span><span class="plain">(</span><span class="identifier">wf</span><span class="plain">, </span><span class="constant">CHANGE_MATERIAL_FOR_MTID</span><span class="plain">, </span><span class="functiontext">TeX::change_material</span><span class="plain">);</span>
<span class="identifier">METHOD_ADD</span><span class="plain">(</span><span class="identifier">wf</span><span class="plain">, </span><span class="constant">ENDNOTE_FOR_MTID</span><span class="plain">, </span><span class="functiontext">TeX::endnote</span><span class="plain">);</span>
<span class="identifier">METHOD_ADD</span><span class="plain">(</span><span class="identifier">wf</span><span class="plain">, </span><span class="constant">COMMENTARY_TEXT_FOR_MTID</span><span class="plain">, </span><span class="functiontext">TeX::commentary_text</span><span class="plain">);</span>
<span class="identifier">METHOD_ADD</span><span class="plain">(</span><span class="identifier">wf</span><span class="plain">, </span><span class="constant">LOCALE_FOR_MTID</span><span class="plain">, </span><span class="functiontext">TeX::locale</span><span class="plain">);</span>
<span class="identifier">METHOD_ADD</span><span class="plain">(</span><span class="identifier">wf</span><span class="plain">, </span><span class="constant">TAIL_FOR_MTID</span><span class="plain">, </span><span class="functiontext">TeX::tail</span><span class="plain">);</span>
<span class="identifier">METHOD_ADD</span><span class="plain">(</span><span class="identifier">wf</span><span class="plain">, </span><span class="constant">PREFORM_DOCUMENT_FOR_MTID</span><span class="plain">, </span><span class="functiontext">TeX::preform_document</span><span class="plain">);</span>
<span class="identifier">METHOD_ADD</span><span class="plain">(</span><span class="identifier">wf</span><span class="plain">, </span><span class="constant">POST_PROCESS_SUBSTITUTE_POS_MTID</span><span class="plain">, </span><span class="functiontext">TeX::post_process_substitute</span><span class="plain">);</span>
<span class="identifier">METHOD_ADD</span><span class="plain">(</span><span class="identifier">wf</span><span class="plain">, </span><span class="constant">PRESERVE_MATH_MODE_FOR_MTID</span><span class="plain">, </span><span class="functiontext">TeX::yes</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1_1">&#167;1.1</a>, <a href="#SP1_2">&#167;1.2</a>, <a href="#SP1_3">&#167;1.3</a>.</p>
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. Methods. </b>For documentation, see "Weave Fornats".
</p>
<pre class="display">
<span class="identifier">int</span><span class="plain"> </span><span class="functiontext">TeX::yes</span><span class="plain">(</span><span class="reserved">weave_format</span><span class="plain"> *</span><span class="identifier">self</span><span class="plain">) {</span>
<span class="identifier">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 TeX::yes is used in <a href="#SP1_2">&#167;1.2</a>, <a href="#SP1_3">&#167;1.3</a>, <a href="#SP1_1_1">&#167;1.1.1</a>.</p>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b></p>
<pre class="display">
<span class="identifier">void</span><span class="plain"> </span><span class="functiontext">TeX::top</span><span class="plain">(</span><span class="reserved">weave_format</span><span class="plain"> *</span><span class="identifier">self</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">OUT</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">comment</span><span class="plain">) {</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%% %S\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">comment</span><span class="plain">);</span>
&lt;<span class="cwebmacro">Incorporate suitable TeX macro definitions into the woven output</span> <span class="cwebmacronumber">3.1</span>&gt;<span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function TeX::top is used in <a href="#SP1_1_1">&#167;1.1.1</a>.</p>
<p class="inwebparagraph"><a id="SP3_1"></a><b>&#167;3.1. </b>We don't use TeX's <code class="display"><span class="extract">\input</span></code> mechanism for macros because it is so prone to
failures when searching directories (especially those with spaces in the
names) and then locking TeX into a repeated prompt for help from <code class="display"><span class="extract">stdin</span></code>
which is rather hard to escape from.
</p>
<p class="inwebparagraph">Instead we paste the entire text of our macros file into the woven TeX:
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Incorporate suitable TeX macro definitions into the woven output</span> <span class="cwebmacronumber">3.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">Macros</span><span class="plain"> = </span><span class="functiontext">Patterns::obtain_filename</span><span class="plain">(</span><span class="identifier">wv</span><span class="plain">-&gt;</span><span class="element">pattern</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"inweb-macros.tex"</span><span class="plain">);</span>
<span class="identifier">FILE</span><span class="plain"> *</span><span class="identifier">MACROS</span><span class="plain"> = </span><span class="functiontext">Filenames::fopen</span><span class="plain">(</span><span class="identifier">Macros</span><span class="plain">, </span><span class="string">"r"</span><span class="plain">);</span>
<span class="identifier">if</span><span class="plain"> (</span><span class="identifier">MACROS</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="functiontext">Errors::fatal_with_file</span><span class="plain">(</span><span class="string">"can't open file of TeX macros"</span><span class="plain">, </span><span class="identifier">Macros</span><span class="plain">);</span>
<span class="identifier">while</span><span class="plain"> (</span><span class="constant">TRUE</span><span class="plain">) {</span>
<span class="identifier">int</span><span class="plain"> </span><span class="identifier">c</span><span class="plain"> = </span><span class="identifier">fgetc</span><span class="plain">(</span><span class="identifier">MACROS</span><span class="plain">);</span>
<span class="identifier">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain"> == </span><span class="identifier">EOF</span><span class="plain">) </span><span class="identifier">break</span><span class="plain">;</span>
<span class="identifier">PUT</span><span class="plain">(</span><span class="identifier">c</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">fclose</span><span class="plain">(</span><span class="identifier">MACROS</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP3">&#167;3</a>.</p>
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. </b></p>
<pre class="display">
<span class="identifier">void</span><span class="plain"> </span><span class="functiontext">TeX::subheading</span><span class="plain">(</span><span class="reserved">weave_format</span><span class="plain"> *</span><span class="identifier">self</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">OUT</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="identifier">int</span><span class="plain"> </span><span class="identifier">level</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">comment</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">head</span><span class="plain">) {</span>
<span class="identifier">switch</span><span class="plain"> (</span><span class="identifier">level</span><span class="plain">) {</span>
<span class="identifier">case</span><span class="plain"> </span><span class="constant">1</span><span class="plain">:</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"\</span><span class="plain">\</span><span class="string">par\</span><span class="plain">\</span><span class="string">noindent{\</span><span class="plain">\</span><span class="string">bf %S}\</span><span class="plain">\</span><span class="string">mark{%S}\</span><span class="plain">\</span><span class="string">medskip\</span><span class="plain">n</span><span class="string">"</span><span class="plain">,</span>
<span class="identifier">comment</span><span class="plain">, </span><span class="identifier">head</span><span class="plain">);</span>
<span class="identifier">break</span><span class="plain">;</span>
<span class="identifier">case</span><span class="plain"> </span><span class="constant">2</span><span class="plain">:</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"\</span><span class="plain">\</span><span class="string">smallskip\</span><span class="plain">\</span><span class="string">par\</span><span class="plain">\</span><span class="string">noindent{\</span><span class="plain">\</span><span class="string">it %S}\</span><span class="plain">\</span><span class="string">smallskip\</span><span class="plain">\</span><span class="string">noindent\</span><span class="plain">n</span><span class="string">"</span><span class="plain">,</span>
<span class="identifier">comment</span><span class="plain">);</span>
<span class="identifier">if</span><span class="plain"> (</span><span class="identifier">head</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">head</span><span class="plain">);</span>
<span class="identifier">break</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function TeX::subheading is used in <a href="#SP1_1_1">&#167;1.1.1</a>.</p>
<p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. </b></p>
<pre class="display">
<span class="identifier">void</span><span class="plain"> </span><span class="functiontext">TeX::toc</span><span class="plain">(</span><span class="reserved">weave_format</span><span class="plain"> *</span><span class="identifier">self</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">OUT</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="identifier">int</span><span class="plain"> </span><span class="identifier">stage</span><span class="plain">,</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">text1</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">text2</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">switch</span><span class="plain"> (</span><span class="identifier">stage</span><span class="plain">) {</span>
<span class="identifier">case</span><span class="plain"> </span><span class="constant">1</span><span class="plain">:</span>
<span class="identifier">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="identifier">WRITE</span><span class="plain">(</span><span class="string">"\</span><span class="plain">\</span><span class="string">medskip\</span><span class="plain">\</span><span class="string">hrule\</span><span class="plain">\</span><span class="string">smallskip\</span><span class="plain">\</span><span class="string">par\</span><span class="plain">\</span><span class="string">noindent{\</span><span class="plain">\</span><span class="string">usagefont %S."</span><span class="plain">, </span><span class="identifier">text1</span><span class="plain">);</span>
<span class="identifier">else</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"\</span><span class="plain">\</span><span class="string">medskip\</span><span class="plain">\</span><span class="string">hrule\</span><span class="plain">\</span><span class="string">smallskip\</span><span class="plain">\</span><span class="string">par\</span><span class="plain">\</span><span class="string">noindent{\</span><span class="plain">\</span><span class="string">usagefont "</span><span class="plain">);</span>
<span class="identifier">break</span><span class="plain">;</span>
<span class="identifier">case</span><span class="plain"> </span><span class="constant">2</span><span class="plain">:</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"; "</span><span class="plain">);</span>
<span class="identifier">break</span><span class="plain">;</span>
<span class="identifier">case</span><span class="plain"> </span><span class="constant">3</span><span class="plain">:</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%S~%S"</span><span class="plain">, </span><span class="identifier">text1</span><span class="plain">, </span><span class="identifier">text2</span><span class="plain">);</span>
<span class="identifier">break</span><span class="plain">;</span>
<span class="identifier">case</span><span class="plain"> </span><span class="constant">4</span><span class="plain">:</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"}\</span><span class="plain">\</span><span class="string">par\</span><span class="plain">\</span><span class="string">medskip\</span><span class="plain">\</span><span class="string">hrule\</span><span class="plain">\</span><span class="string">bigskip\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="identifier">break</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function TeX::toc is used in <a href="#SP1_1_1">&#167;1.1.1</a>.</p>
<p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. </b></p>
<pre class="display">
<span class="identifier">void</span><span class="plain"> </span><span class="functiontext">TeX::chapter_title_page</span><span class="plain">(</span><span class="reserved">weave_format</span><span class="plain"> *</span><span class="identifier">self</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">OUT</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">chapter</span><span class="plain"> *</span><span class="identifier">C</span><span class="plain">) {</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%S\</span><span class="plain">\</span><span class="string">medskip\</span><span class="plain">n</span><span class="string">"</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">rubric</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">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="identifier">WRITE</span><span class="plain">(</span><span class="string">"\</span><span class="plain">\</span><span class="string">smallskip\</span><span class="plain">\</span><span class="string">noindent "</span><span class="plain">);</span>
<span class="identifier">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">number_sections</span><span class="plain">) </span><span class="identifier">WRITE</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">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="identifier">WRITE</span><span class="plain">(</span><span class="string">"|%S|: "</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">WRITE</span><span class="plain">(</span><span class="string">"{\</span><span class="plain">\</span><span class="string">it %S}\</span><span class="plain">\</span><span class="string">qquad\</span><span class="plain">n</span><span class="string">%S"</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="identifier">md</span><span class="plain">-&gt;</span><span class="element">sect_title</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="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function TeX::chapter_title_page is used in <a href="#SP1_1_1">&#167;1.1.1</a>.</p>
<p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. </b></p>
<pre class="display">
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">P_literal</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">void</span><span class="plain"> </span><span class="functiontext">TeX::paragraph_heading</span><span class="plain">(</span><span class="reserved">weave_format</span><span class="plain"> *</span><span class="identifier">self</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">OUT</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">TeX_macro</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">paragraph</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">heading_text</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">text_stream</span><span class="plain"> *</span><span class="identifier">sectionmark</span><span class="plain">, </span><span class="identifier">int</span><span class="plain"> </span><span class="identifier">weight</span><span class="plain">) {</span>
<span class="identifier">if</span><span class="plain"> (</span><span class="identifier">P_literal</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">P_literal</span><span class="plain"> = </span><span class="functiontext">Str::new_from_wide_string</span><span class="plain">(</span><span class="identifier">L</span><span class="string">"P"</span><span class="plain">);</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">orn</span><span class="plain"> = (</span><span class="identifier">P</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_literal</span><span class="plain">;</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">N</span><span class="plain"> = (</span><span class="identifier">P</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="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">mark</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">mark</span><span class="plain">, </span><span class="string">"%S%S\</span><span class="plain">\</span><span class="string">quad$\</span><span class="plain">\</span><span class="string">%S$%S"</span><span class="plain">, </span><span class="identifier">chaptermark</span><span class="plain">, </span><span class="identifier">sectionmark</span><span class="plain">, </span><span class="identifier">orn</span><span class="plain">, </span><span class="identifier">N</span><span class="plain">);</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">modified</span><span class="plain">);</span>
<span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">modified</span><span class="plain">, </span><span class="identifier">heading_text</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="identifier">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">modified</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"(%c*?): (%c*)"</span><span class="plain">)) {</span>
<span class="functiontext">Str::clear</span><span class="plain">(</span><span class="identifier">modified</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">modified</span><span class="plain">, </span><span class="string">"{\</span><span class="plain">\</span><span class="string">sinchhigh %S}\</span><span class="plain">\</span><span class="string">quad %S"</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">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[1]);</span>
<span class="plain">}</span>
<span class="identifier">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">S</span><span class="plain">-&gt;</span><span class="element">md</span><span class="plain">-&gt;</span><span class="element">is_a_singleton</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="identifier">WRITE</span><span class="plain">(</span><span class="string">"\</span><span class="plain">\</span><span class="string">%S{%S}{%S}{%S}{\</span><span class="plain">\</span><span class="string">%S}{%S}%%\</span><span class="plain">n</span><span class="string">"</span><span class="plain">,</span>
<span class="identifier">TeX_macro</span><span class="plain">, </span><span class="identifier">N</span><span class="plain">, </span><span class="identifier">modified</span><span class="plain">, </span><span class="identifier">mark</span><span class="plain">, </span><span class="identifier">orn</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
<span class="identifier">else</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"\</span><span class="plain">\</span><span class="string">%S{%S}{%S}{%S}{\</span><span class="plain">\</span><span class="string">%S}{%S}%%\</span><span class="plain">n</span><span class="string">"</span><span class="plain">,</span>
<span class="identifier">TeX_macro</span><span class="plain">, </span><span class="identifier">N</span><span class="plain">, </span><span class="identifier">modified</span><span class="plain">, </span><span class="identifier">mark</span><span class="plain">, </span><span class="identifier">orn</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">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">mark</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">modified</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">The function TeX::paragraph_heading is used in <a href="#SP1_1_1">&#167;1.1.1</a>.</p>
<p class="inwebparagraph"><a id="SP8"></a><b>&#167;8. </b>Code is typeset by TeX within vertical strokes; these switch a sort of
typewriter-type verbatim mode on and off. To get an actual stroke, we must
escape from code mode, escape it using a backslash, then re-enter code
mode once again:
</p>
<pre class="display">
<span class="identifier">void</span><span class="plain"> </span><span class="functiontext">TeX::source_code</span><span class="plain">(</span><span class="reserved">weave_format</span><span class="plain"> *</span><span class="identifier">self</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">OUT</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="identifier">int</span><span class="plain"> </span><span class="identifier">tab_stops_of_indentation</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">prefatory</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">matter</span><span class="plain">,</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">colouring</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">concluding_comment</span><span class="plain">,</span>
<span class="identifier">int</span><span class="plain"> </span><span class="identifier">starts</span><span class="plain">, </span><span class="identifier">int</span><span class="plain"> </span><span class="identifier">finishes</span><span class="plain">, </span><span class="identifier">int</span><span class="plain"> </span><span class="identifier">code_mode</span><span class="plain">) {</span>
<span class="identifier">if</span><span class="plain"> (</span><span class="identifier">code_mode</span><span class="plain"> == </span><span class="constant">FALSE</span><span class="plain">) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"\</span><span class="plain">\</span><span class="string">smallskip\</span><span class="plain">\</span><span class="string">par\</span><span class="plain">\</span><span class="string">noindent"</span><span class="plain">);</span>
<span class="identifier">if</span><span class="plain"> (</span><span class="identifier">starts</span><span class="plain">) {</span>
&lt;<span class="cwebmacro">Weave a suitable horizontal advance for that many tab stops</span> <span class="cwebmacronumber">8.1</span>&gt;<span class="plain">;</span>
<span class="identifier">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">WRITE</span><span class="plain">(</span><span class="string">"{\</span><span class="plain">\</span><span class="string">ninebf %S} "</span><span class="plain">, </span><span class="identifier">prefatory</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"|"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">int</span><span class="plain"> </span><span class="identifier">current_colour</span><span class="plain"> = </span><span class="constant">PLAIN_COLOUR</span><span class="plain">, </span><span class="identifier">colour_wanted</span><span class="plain"> = </span><span class="constant">PLAIN_COLOUR</span><span class="plain">;</span>
<span class="identifier">for</span><span class="plain"> (</span><span class="identifier">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">matter</span><span class="plain">); </span><span class="identifier">i</span><span class="plain">++) {</span>
<span class="identifier">colour_wanted</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>&lt;<span class="cwebmacro">Adjust code colour as necessary</span> <span class="cwebmacronumber">8.2</span>&gt;<span class="plain">;</span>
<span class="identifier">if</span><span class="plain"> (</span><span class="functiontext">Str::get_at</span><span class="plain">(</span><span class="identifier">matter</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">) == </span><span class="character">'|'</span><span class="plain">) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"|\</span><span class="plain">\</span><span class="string">||"</span><span class="plain">);</span>
<span class="identifier">else</span><span class="plain"> </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%c"</span><span class="plain">, </span><span class="functiontext">Str::get_at</span><span class="plain">(</span><span class="identifier">matter</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">));</span>
<span class="plain">}</span>
<span class="identifier">colour_wanted</span><span class="plain"> = </span><span class="constant">PLAIN_COLOUR</span><span class="plain">; </span>&lt;<span class="cwebmacro">Adjust code colour as necessary</span> <span class="cwebmacronumber">8.2</span>&gt;<span class="plain">;</span>
<span class="identifier">if</span><span class="plain"> (</span><span class="identifier">finishes</span><span class="plain">) {</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"|"</span><span class="plain">);</span>
<span class="identifier">if</span><span class="plain"> (</span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">concluding_comment</span><span class="plain">) &gt; </span><span class="constant">0</span><span class="plain">) {</span>
<span class="identifier">if</span><span class="plain"> ((</span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">matter</span><span class="plain">) &gt; </span><span class="constant">0</span><span class="plain">) || (!</span><span class="identifier">starts</span><span class="plain">))</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"\</span><span class="plain">\</span><span class="string">hfill\</span><span class="plain">\</span><span class="string">quad "</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"{\</span><span class="plain">\</span><span class="string">ttninepoint\</span><span class="plain">\</span><span class="string">it %S}"</span><span class="plain">, </span><span class="identifier">concluding_comment</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function TeX::source_code is used in <a href="#SP1_1_1">&#167;1.1.1</a>.</p>
<p class="inwebparagraph"><a id="SP8_1"></a><b>&#167;8.1. </b>We actually use <code class="display"><span class="extract">\qquad</span></code> horizontal spaces rather than risk using TeX's
messy alignment system:
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Weave a suitable horizontal advance for that many tab stops</span> <span class="cwebmacronumber">8.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">for</span><span class="plain"> (</span><span class="identifier">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="identifier">tab_stops_of_indentation</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">++)</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"\</span><span class="plain">\</span><span class="string">qquad"</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP8">&#167;8</a>.</p>
<p class="inwebparagraph"><a id="SP8_2"></a><b>&#167;8.2. </b><code class="display">
&lt;<span class="cwebmacrodefn">Adjust code colour as necessary</span> <span class="cwebmacronumber">8.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">if</span><span class="plain"> (</span><span class="identifier">colour_wanted</span><span class="plain"> != </span><span class="identifier">current_colour</span><span class="plain">) {</span>
<span class="functiontext">Formats::change_colour</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">colour_wanted</span><span class="plain">, </span><span class="constant">TRUE</span><span class="plain">);</span>
<span class="identifier">current_colour</span><span class="plain"> = </span><span class="identifier">colour_wanted</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP8">&#167;8</a> (twice).</p>
<p class="inwebparagraph"><a id="SP9"></a><b>&#167;9. </b></p>
<pre class="display">
<span class="identifier">void</span><span class="plain"> </span><span class="functiontext">TeX::inline_code</span><span class="plain">(</span><span class="reserved">weave_format</span><span class="plain"> *</span><span class="identifier">self</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">OUT</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="identifier">int</span><span class="plain"> </span><span class="identifier">enter</span><span class="plain">) {</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"|"</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function TeX::inline_code is used in <a href="#SP1_1_1">&#167;1.1.1</a>.</p>
<p class="inwebparagraph"><a id="SP10"></a><b>&#167;10. </b></p>
<pre class="display">
<span class="identifier">void</span><span class="plain"> </span><span class="functiontext">TeX::change_colour_PDF</span><span class="plain">(</span><span class="reserved">weave_format</span><span class="plain"> *</span><span class="identifier">self</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">OUT</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="identifier">int</span><span class="plain"> </span><span class="identifier">col</span><span class="plain">, </span><span class="identifier">int</span><span class="plain"> </span><span class="identifier">in_code</span><span class="plain">) {</span>
<span class="identifier">char</span><span class="plain"> *</span><span class="identifier">inout</span><span class="plain"> = </span><span class="string">""</span><span class="plain">;</span>
<span class="identifier">if</span><span class="plain"> (</span><span class="identifier">in_code</span><span class="plain">) </span><span class="identifier">inout</span><span class="plain"> = </span><span class="string">"|"</span><span class="plain">;</span>
<span class="identifier">switch</span><span class="plain"> (</span><span class="identifier">col</span><span class="plain">) {</span>
<span class="identifier">case</span><span class="plain"> </span><span class="identifier">MACRO_COLOUR:</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%s\</span><span class="plain">\</span><span class="string">pdfliteral direct{1 1 0 0 k}%s"</span><span class="plain">, </span><span class="identifier">inout</span><span class="plain">, </span><span class="identifier">inout</span><span class="plain">); </span><span class="identifier">break</span><span class="plain">;</span>
<span class="identifier">case</span><span class="plain"> </span><span class="identifier">FUNCTION_COLOUR:</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%s\</span><span class="plain">\</span><span class="string">pdfliteral direct{0 1 1 0 k}%s"</span><span class="plain">, </span><span class="identifier">inout</span><span class="plain">, </span><span class="identifier">inout</span><span class="plain">); </span><span class="identifier">break</span><span class="plain">;</span>
<span class="identifier">case</span><span class="plain"> </span><span class="identifier">PLAIN_COLOUR:</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%s\</span><span class="plain">\</span><span class="string">special{PDF:0 g}%s"</span><span class="plain">, </span><span class="identifier">inout</span><span class="plain">, </span><span class="identifier">inout</span><span class="plain">); </span><span class="identifier">break</span><span class="plain">;</span>
<span class="identifier">case</span><span class="plain"> </span><span class="identifier">EXTRACT_COLOUR:</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%s\</span><span class="plain">\</span><span class="string">special{PDF:0 g}%s"</span><span class="plain">, </span><span class="identifier">inout</span><span class="plain">, </span><span class="identifier">inout</span><span class="plain">); </span><span class="identifier">break</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function TeX::change_colour_PDF is used in <a href="#SP1_3">&#167;1.3</a>.</p>
<p class="inwebparagraph"><a id="SP11"></a><b>&#167;11. </b></p>
<pre class="display">
<span class="identifier">void</span><span class="plain"> </span><span class="functiontext">TeX::display_line</span><span class="plain">(</span><span class="reserved">weave_format</span><span class="plain"> *</span><span class="identifier">self</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">OUT</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">text</span><span class="plain">) {</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"\</span><span class="plain">\</span><span class="string">quotesource{%S}\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">text</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function TeX::display_line is used in <a href="#SP1_1_1">&#167;1.1.1</a>.</p>
<p class="inwebparagraph"><a id="SP12"></a><b>&#167;12. </b></p>
<pre class="display">
<span class="identifier">void</span><span class="plain"> </span><span class="functiontext">TeX::item</span><span class="plain">(</span><span class="reserved">weave_format</span><span class="plain"> *</span><span class="identifier">self</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">OUT</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="identifier">int</span><span class="plain"> </span><span class="identifier">depth</span><span class="plain">,</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">label</span><span class="plain">) {</span>
<span class="identifier">if</span><span class="plain"> (</span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">label</span><span class="plain">) &gt; </span><span class="constant">0</span><span class="plain">) {</span>
<span class="identifier">if</span><span class="plain"> (</span><span class="identifier">depth</span><span class="plain"> == </span><span class="constant">1</span><span class="plain">) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"\</span><span class="plain">\</span><span class="string">item{(%S)}"</span><span class="plain">, </span><span class="identifier">label</span><span class="plain">);</span>
<span class="identifier">else</span><span class="plain"> </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"\</span><span class="plain">\</span><span class="string">itemitem{(%S)}"</span><span class="plain">, </span><span class="identifier">label</span><span class="plain">);</span>
<span class="plain">} </span><span class="identifier">else</span><span class="plain"> {</span>
<span class="identifier">if</span><span class="plain"> (</span><span class="identifier">depth</span><span class="plain"> == </span><span class="constant">1</span><span class="plain">) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"\</span><span class="plain">\</span><span class="string">item{}"</span><span class="plain">);</span>
<span class="identifier">else</span><span class="plain"> </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"\</span><span class="plain">\</span><span class="string">itemitem{}"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function TeX::item is used in <a href="#SP1_1_1">&#167;1.1.1</a>.</p>
<p class="inwebparagraph"><a id="SP13"></a><b>&#167;13. </b></p>
<pre class="display">
<span class="identifier">void</span><span class="plain"> </span><span class="functiontext">TeX::bar</span><span class="plain">(</span><span class="reserved">weave_format</span><span class="plain"> *</span><span class="identifier">self</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">OUT</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="identifier">WRITE</span><span class="plain">(</span><span class="string">"\</span><span class="plain">\</span><span class="string">par\</span><span class="plain">\</span><span class="string">medskip\</span><span class="plain">\</span><span class="string">noindent\</span><span class="plain">\</span><span class="string">hrule\</span><span class="plain">\</span><span class="string">medskip\</span><span class="plain">\</span><span class="string">noindent\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function TeX::bar is used in <a href="#SP1_1_1">&#167;1.1.1</a>.</p>
<p class="inwebparagraph"><a id="SP14"></a><b>&#167;14. </b>TeX itself has an almost defiant lack of support for anything pictorial,
which is one reason it didn't live up to its hope of being the definitive basis
for typography; even today the loose confederation of TeX-like programs and
extensions lack standard approaches. Here we're going to use <code class="display"><span class="extract">pdftex</span></code> features,
having nothing better. All we're trying for is to insert a picture, scaled
to a given width, into the text at the current position.
</p>
<pre class="display">
<span class="identifier">void</span><span class="plain"> </span><span class="functiontext">TeX::figure_PDF</span><span class="plain">(</span><span class="reserved">weave_format</span><span class="plain"> *</span><span class="identifier">self</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">OUT</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">figname</span><span class="plain">, </span><span class="identifier">int</span><span class="plain"> </span><span class="identifier">w</span><span class="plain">, </span><span class="identifier">int</span><span class="plain"> </span><span class="identifier">h</span><span class="plain">) {</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"\</span><span class="plain">\</span><span class="string">pdfximage"</span><span class="plain">);</span>
<span class="identifier">if</span><span class="plain"> (</span><span class="identifier">w</span><span class="plain"> &gt;= </span><span class="constant">0</span><span class="plain">)</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" width %d cm{../Figures/%S}\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">w</span><span class="plain">, </span><span class="identifier">figname</span><span class="plain">);</span>
<span class="identifier">else</span><span class="plain"> </span><span class="identifier">if</span><span class="plain"> (</span><span class="identifier">h</span><span class="plain"> &gt;= </span><span class="constant">0</span><span class="plain">)</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" height %d cm{../Figures/%S}\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">h</span><span class="plain">, </span><span class="identifier">figname</span><span class="plain">);</span>
<span class="identifier">else</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"{../Figures/%S}\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">figname</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"\</span><span class="plain">\</span><span class="string">smallskip\</span><span class="plain">\</span><span class="string">noindent"</span>
<span class="string">"\</span><span class="plain">\</span><span class="string">hbox to\</span><span class="plain">\</span><span class="string">hsize{\</span><span class="plain">\</span><span class="string">hfill\</span><span class="plain">\</span><span class="string">pdfrefximage \</span><span class="plain">\</span><span class="string">pdflastximage\</span><span class="plain">\</span><span class="string">hfill}"</span>
<span class="string">"\</span><span class="plain">\</span><span class="string">smallskip\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function TeX::figure_PDF is used in <a href="#SP1_3">&#167;1.3</a>.</p>
<p class="inwebparagraph"><a id="SP15"></a><b>&#167;15. </b>Any usage of angle-macros is highlighted in several cute ways: first,
we make use of colour and we drop in the paragraph number of the definition
of the macro in small type; and second, we use cross-reference links.
</p>
<p class="inwebparagraph">In the PDF format, these three are all called, in sequence below; in TeX
or DVI, only the middle one is.
</p>
<pre class="display">
<span class="identifier">void</span><span class="plain"> </span><span class="functiontext">TeX::para_macro_PDF_1</span><span class="plain">(</span><span class="reserved">weave_format</span><span class="plain"> *</span><span class="identifier">self</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">OUT</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">para_macro</span><span class="plain"> *</span><span class="identifier">pmac</span><span class="plain">, </span><span class="identifier">int</span><span class="plain"> </span><span class="identifier">defn</span><span class="plain">) {</span>
<span class="identifier">if</span><span class="plain"> (</span><span class="identifier">defn</span><span class="plain">)</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"|\</span><span class="plain">\</span><span class="string">pdfdest num %d fit "</span><span class="plain">,</span>
<span class="identifier">pmac</span><span class="plain">-&gt;</span><span class="element">allocation_id</span><span class="plain"> + </span><span class="constant">100</span><span class="plain">);</span>
<span class="identifier">else</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"|\</span><span class="plain">\</span><span class="string">pdfstartlink attr{/C [0.9 0 0] /Border [0 0 0]} goto num %d "</span><span class="plain">,</span>
<span class="identifier">pmac</span><span class="plain">-&gt;</span><span class="element">allocation_id</span><span class="plain"> + </span><span class="constant">100</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">void</span><span class="plain"> </span><span class="functiontext">TeX::para_macro</span><span class="plain">(</span><span class="reserved">weave_format</span><span class="plain"> *</span><span class="identifier">self</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">OUT</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">para_macro</span><span class="plain"> *</span><span class="identifier">pmac</span><span class="plain">, </span><span class="identifier">int</span><span class="plain"> </span><span class="identifier">defn</span><span class="plain">) {</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"$\</span><span class="plain">\</span><span class="string">langle${\</span><span class="plain">\</span><span class="string">xreffont"</span><span class="plain">);</span>
<span class="functiontext">Formats::change_colour</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">MACRO_COLOUR</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%S "</span><span class="plain">, </span><span class="identifier">pmac</span><span class="plain">-&gt;</span><span class="element">macro_name</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"{\</span><span class="plain">\</span><span class="string">sevenss %S}}"</span><span class="plain">, </span><span class="identifier">pmac</span><span class="plain">-&gt;</span><span class="element">defining_paragraph</span><span class="plain">-&gt;</span><span class="element">paragraph_number</span><span class="plain">);</span>
<span class="functiontext">Formats::change_colour</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">PLAIN_COLOUR</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"$\</span><span class="plain">\</span><span class="string">rangle$ "</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">void</span><span class="plain"> </span><span class="functiontext">TeX::para_macro_PDF_2</span><span class="plain">(</span><span class="reserved">weave_format</span><span class="plain"> *</span><span class="identifier">self</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">OUT</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">para_macro</span><span class="plain"> *</span><span class="identifier">pmac</span><span class="plain">, </span><span class="identifier">int</span><span class="plain"> </span><span class="identifier">defn</span><span class="plain">) {</span>
<span class="identifier">if</span><span class="plain"> (</span><span class="identifier">defn</span><span class="plain">)</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"$\</span><span class="plain">\</span><span class="string">equiv$|"</span><span class="plain">);</span>
<span class="identifier">else</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"\</span><span class="plain">\</span><span class="string">pdfendlink|"</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function TeX::para_macro_PDF_1 is used in <a href="#SP1_3">&#167;1.3</a>.</p>
<p class="endnote">The function TeX::para_macro is used in <a href="#SP1_1_1">&#167;1.1.1</a>.</p>
<p class="endnote">The function TeX::para_macro_PDF_2 is used in <a href="#SP1_3">&#167;1.3</a>.</p>
<p class="inwebparagraph"><a id="SP16"></a><b>&#167;16. </b></p>
<pre class="display">
<span class="identifier">void</span><span class="plain"> </span><span class="functiontext">TeX::pagebreak</span><span class="plain">(</span><span class="reserved">weave_format</span><span class="plain"> *</span><span class="identifier">self</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">OUT</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="identifier">WRITE</span><span class="plain">(</span><span class="string">"\</span><span class="plain">\</span><span class="string">vfill\</span><span class="plain">\</span><span class="string">eject\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function TeX::pagebreak is used in <a href="#SP1_1_1">&#167;1.1.1</a>.</p>
<p class="inwebparagraph"><a id="SP17"></a><b>&#167;17. </b></p>
<pre class="display">
<span class="identifier">void</span><span class="plain"> </span><span class="functiontext">TeX::blank_line</span><span class="plain">(</span><span class="reserved">weave_format</span><span class="plain"> *</span><span class="identifier">self</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">OUT</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="identifier">int</span><span class="plain"> </span><span class="identifier">in_comment</span><span class="plain">) {</span>
<span class="identifier">if</span><span class="plain"> (</span><span class="identifier">in_comment</span><span class="plain">) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"\</span><span class="plain">\</span><span class="string">smallskip\</span><span class="plain">\</span><span class="string">par\</span><span class="plain">\</span><span class="string">noindent%%\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="identifier">else</span><span class="plain"> </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"\</span><span class="plain">\</span><span class="string">smallskip\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function TeX::blank_line is used in <a href="#SP1_1_1">&#167;1.1.1</a>.</p>
<p class="inwebparagraph"><a id="SP18"></a><b>&#167;18. </b></p>
<pre class="display">
<span class="identifier">void</span><span class="plain"> </span><span class="functiontext">TeX::after_definitions</span><span class="plain">(</span><span class="reserved">weave_format</span><span class="plain"> *</span><span class="identifier">self</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">OUT</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="identifier">WRITE</span><span class="plain">(</span><span class="string">"\</span><span class="plain">\</span><span class="string">smallskip\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function TeX::after_definitions is used in <a href="#SP1_1_1">&#167;1.1.1</a>.</p>
<p class="inwebparagraph"><a id="SP19"></a><b>&#167;19. </b></p>
<pre class="display">
<span class="identifier">void</span><span class="plain"> </span><span class="functiontext">TeX::endnote</span><span class="plain">(</span><span class="reserved">weave_format</span><span class="plain"> *</span><span class="identifier">self</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">OUT</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="identifier">int</span><span class="plain"> </span><span class="identifier">end</span><span class="plain">) {</span>
<span class="identifier">if</span><span class="plain"> (</span><span class="identifier">end</span><span class="plain"> == </span><span class="constant">1</span><span class="plain">) {</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"\</span><span class="plain">\</span><span class="string">par\</span><span class="plain">\</span><span class="string">noindent\</span><span class="plain">\</span><span class="string">penalty10000\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"{\</span><span class="plain">\</span><span class="string">usagefont "</span><span class="plain">);</span>
<span class="plain">} </span><span class="identifier">else</span><span class="plain"> {</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"}\</span><span class="plain">\</span><span class="string">smallskip\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function TeX::endnote is used in <a href="#SP1_1_1">&#167;1.1.1</a>.</p>
<p class="inwebparagraph"><a id="SP20"></a><b>&#167;20. </b></p>
<pre class="display">
<span class="identifier">void</span><span class="plain"> </span><span class="functiontext">TeX::commentary_text</span><span class="plain">(</span><span class="reserved">weave_format</span><span class="plain"> *</span><span class="identifier">self</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">OUT</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">id</span><span class="plain">) {</span>
<span class="identifier">int</span><span class="plain"> </span><span class="identifier">math_mode</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="identifier">for</span><span class="plain"> (</span><span class="identifier">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">id</span><span class="plain">); </span><span class="identifier">i</span><span class="plain">++) {</span>
<span class="identifier">switch</span><span class="plain"> (</span><span class="functiontext">Str::get_at</span><span class="plain">(</span><span class="identifier">id</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">)) {</span>
<span class="identifier">case</span><span class="plain"> </span><span class="character">'$'</span><span class="plain">: </span><span class="identifier">math_mode</span><span class="plain"> = (</span><span class="identifier">math_mode</span><span class="plain">)?</span><span class="identifier">FALSE:TRUE</span><span class="plain">;</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%c"</span><span class="plain">, </span><span class="functiontext">Str::get_at</span><span class="plain">(</span><span class="identifier">id</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">)); </span><span class="identifier">break</span><span class="plain">;</span>
<span class="identifier">case</span><span class="plain"> </span><span class="character">'_'</span><span class="plain">: </span><span class="identifier">if</span><span class="plain"> (</span><span class="identifier">math_mode</span><span class="plain">) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"_"</span><span class="plain">); </span><span class="identifier">else</span><span class="plain"> </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"\</span><span class="plain">\</span><span class="string">_"</span><span class="plain">); </span><span class="identifier">break</span><span class="plain">;</span>
<span class="identifier">case</span><span class="plain"> </span><span class="character">'"'</span><span class="plain">:</span>
<span class="identifier">if</span><span class="plain"> ((</span><span class="functiontext">Str::get_at</span><span class="plain">(</span><span class="identifier">id</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">) == </span><span class="character">'"'</span><span class="plain">) &amp;&amp;</span>
<span class="plain">((</span><span class="identifier">i</span><span class="plain">==0) || (</span><span class="functiontext">Str::get_at</span><span class="plain">(</span><span class="identifier">id</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">-1) == </span><span class="character">' '</span><span class="plain">) ||</span>
<span class="plain">(</span><span class="functiontext">Str::get_at</span><span class="plain">(</span><span class="identifier">id</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">-1) == </span><span class="character">'('</span><span class="plain">)))</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"``"</span><span class="plain">);</span>
<span class="identifier">else</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"''"</span><span class="plain">);</span>
<span class="identifier">break</span><span class="plain">;</span>
<span class="identifier">default:</span><span class="plain"> </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%c"</span><span class="plain">, </span><span class="functiontext">Str::get_at</span><span class="plain">(</span><span class="identifier">id</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">));</span>
<span class="identifier">break</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function TeX::commentary_text is used in <a href="#SP1_1_1">&#167;1.1.1</a>.</p>
<p class="inwebparagraph"><a id="SP21"></a><b>&#167;21. </b></p>
<pre class="display">
<span class="identifier">void</span><span class="plain"> </span><span class="functiontext">TeX::locale</span><span class="plain">(</span><span class="reserved">weave_format</span><span class="plain"> *</span><span class="identifier">self</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">OUT</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">par1</span><span class="plain">, </span><span class="reserved">paragraph</span><span class="plain"> *</span><span class="identifier">par2</span><span class="plain">) {</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"$\</span><span class="plain">\</span><span class="string">%S$%S"</span><span class="plain">, </span><span class="identifier">par1</span><span class="plain">-&gt;</span><span class="element">ornament</span><span class="plain">, </span><span class="identifier">par1</span><span class="plain">-&gt;</span><span class="element">paragraph_number</span><span class="plain">);</span>
<span class="identifier">if</span><span class="plain"> (</span><span class="identifier">par2</span><span class="plain">) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"-%S"</span><span class="plain">, </span><span class="identifier">par2</span><span class="plain">-&gt;</span><span class="element">paragraph_number</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function TeX::locale is used in <a href="#SP1_1_1">&#167;1.1.1</a>.</p>
<p class="inwebparagraph"><a id="SP22"></a><b>&#167;22. </b></p>
<pre class="display">
<span class="identifier">void</span><span class="plain"> </span><span class="functiontext">TeX::change_material</span><span class="plain">(</span><span class="reserved">weave_format</span><span class="plain"> *</span><span class="identifier">self</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">OUT</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="identifier">int</span><span class="plain"> </span><span class="identifier">old_material</span><span class="plain">, </span><span class="identifier">int</span><span class="plain"> </span><span class="identifier">new_material</span><span class="plain">, </span><span class="identifier">int</span><span class="plain"> </span><span class="identifier">content</span><span class="plain">) {</span>
<span class="identifier">if</span><span class="plain"> (</span><span class="identifier">old_material</span><span class="plain"> != </span><span class="identifier">new_material</span><span class="plain">) {</span>
<span class="identifier">switch</span><span class="plain"> (</span><span class="identifier">old_material</span><span class="plain">) {</span>
<span class="identifier">case</span><span class="plain"> </span><span class="identifier">REGULAR_MATERIAL:</span>
<span class="identifier">switch</span><span class="plain"> (</span><span class="identifier">new_material</span><span class="plain">) {</span>
<span class="identifier">case</span><span class="plain"> </span><span class="identifier">CODE_MATERIAL:</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"\</span><span class="plain">\</span><span class="string">beginlines\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="identifier">break</span><span class="plain">;</span>
<span class="identifier">case</span><span class="plain"> </span><span class="identifier">DEFINITION_MATERIAL:</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"\</span><span class="plain">\</span><span class="string">beginlines\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="identifier">break</span><span class="plain">;</span>
<span class="identifier">case</span><span class="plain"> </span><span class="identifier">MACRO_MATERIAL:</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"\</span><span class="plain">\</span><span class="string">beginlines\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="identifier">break</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">break</span><span class="plain">;</span>
<span class="identifier">default:</span>
<span class="identifier">if</span><span class="plain"> (</span><span class="identifier">new_material</span><span class="plain"> == </span><span class="constant">REGULAR_MATERIAL</span><span class="plain">)</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"\</span><span class="plain">\</span><span class="string">endlines\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="identifier">break</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function TeX::change_material is used in <a href="#SP1_1_1">&#167;1.1.1</a>.</p>
<p class="inwebparagraph"><a id="SP23"></a><b>&#167;23. </b></p>
<pre class="display">
<span class="identifier">void</span><span class="plain"> </span><span class="functiontext">TeX::tail</span><span class="plain">(</span><span class="reserved">weave_format</span><span class="plain"> *</span><span class="identifier">self</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">OUT</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">comment</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">WRITE</span><span class="plain">(</span><span class="string">"%% %S\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">comment</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"\</span><span class="plain">\</span><span class="string">end\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function TeX::tail is used in <a href="#SP1_1_1">&#167;1.1.1</a>.</p>
<p class="inwebparagraph"><a id="SP24"></a><b>&#167;24. </b>The following is called only when the language is InC, and the weave is of
the special Preform grammar document.
</p>
<pre class="display">
<span class="identifier">int</span><span class="plain"> </span><span class="functiontext">TeX::preform_document</span><span class="plain">(</span><span class="reserved">weave_format</span><span class="plain"> *</span><span class="identifier">self</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">OUT</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">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="reserved">source_line</span><span class="plain"> *</span><span class="identifier">L</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">matter</span><span class="plain">,</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">concluding_comment</span><span class="plain">) {</span>
<span class="identifier">if</span><span class="plain"> (</span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">preform_nonterminal_defined</span><span class="plain">) {</span>
<span class="identifier">preform_production_count</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
&lt;<span class="cwebmacro">Weave the opening line of the nonterminal definition</span> <span class="cwebmacronumber">24.1</span>&gt;<span class="plain">;</span>
<span class="identifier">return</span><span class="plain"> </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="plain">} </span><span class="identifier">else</span><span class="plain"> {</span>
<span class="identifier">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">PREFORM_GRAMMAR_LCAT</span><span class="plain">) {</span>
&lt;<span class="cwebmacro">Weave a line from the body of the nonterminal definition</span> <span class="cwebmacronumber">24.2</span>&gt;<span class="plain">;</span>
<span class="identifier">return</span><span class="plain"> </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="identifier">return</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">The function TeX::preform_document is used in <a href="#SP1_1_1">&#167;1.1.1</a>.</p>
<p class="inwebparagraph"><a id="SP24_1"></a><b>&#167;24.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Weave the opening line of the nonterminal definition</span> <span class="cwebmacronumber">24.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"\</span><span class="plain">\</span><span class="string">nonterminal{%S} |::=|"</span><span class="plain">,</span>
<span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">preform_nonterminal_defined</span><span class="plain">-&gt;</span><span class="element">unangled_name</span><span class="plain">);</span>
<span class="identifier">if</span><span class="plain"> (</span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">preform_nonterminal_defined</span><span class="plain">-&gt;</span><span class="element">as_function</span><span class="plain">) {</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"\</span><span class="plain">\</span><span class="string">quad{\</span><span class="plain">\</span><span class="string">it internal definition"</span><span class="plain">);</span>
<span class="identifier">if</span><span class="plain"> (</span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">preform_nonterminal_defined</span><span class="plain">-&gt;</span><span class="element">voracious</span><span class="plain">)</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" (voracious)"</span><span class="plain">);</span>
<span class="identifier">else</span><span class="plain"> </span><span class="identifier">if</span><span class="plain"> (</span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">preform_nonterminal_defined</span><span class="plain">-&gt;</span><span class="element">min_word_count</span><span class="plain"> ==</span>
<span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">preform_nonterminal_defined</span><span class="plain">-&gt;</span><span class="element">min_word_count</span><span class="plain">)</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" (%d word%s)"</span><span class="plain">,</span>
<span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">preform_nonterminal_defined</span><span class="plain">-&gt;</span><span class="element">min_word_count</span><span class="plain">,</span>
<span class="plain">(</span><span class="identifier">L</span><span class="plain">-&gt;</span><span class="element">preform_nonterminal_defined</span><span class="plain">-&gt;</span><span class="identifier">min_word_count</span><span class="plain"> != </span><span class="constant">1</span><span class="plain">)?</span><span class="string">"s"</span><span class="plain">:</span><span class="string">""</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"}"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP24">&#167;24</a>.</p>
<p class="inwebparagraph"><a id="SP24_2"></a><b>&#167;24.2. </b><code class="display">
&lt;<span class="cwebmacrodefn">Weave a line from the body of the nonterminal definition</span> <span class="cwebmacronumber">24.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">problem</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="identifier">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">"Issue (%c*?) problem"</span><span class="plain">)) </span><span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">problem</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">else</span><span class="plain"> </span><span class="identifier">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">"FAIL_NONTERMINAL %+"</span><span class="plain">)) </span><span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">problem</span><span class="plain">, </span><span class="string">"fail and skip"</span><span class="plain">);</span>
<span class="identifier">else</span><span class="plain"> </span><span class="identifier">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">"FAIL_NONTERMINAL"</span><span class="plain">)) </span><span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">problem</span><span class="plain">, </span><span class="string">"fail"</span><span class="plain">);</span>
<span class="identifier">preform_production_count</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|"</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="identifier">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+?)|(%c+)"</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">WRITE_TO</span><span class="plain">(</span><span class="identifier">matter</span><span class="plain">, </span><span class="string">"%S___stroke___%S"</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">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[1]);</span>
<span class="plain">}</span>
<span class="identifier">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*?)___stroke___(%c*)"</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">WRITE_TO</span><span class="plain">(</span><span class="identifier">matter</span><span class="plain">, </span><span class="string">"%S|\</span><span class="plain">\</span><span class="string">||%S"</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="identifier">exp</span><span class="plain">[0], </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="identifier">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="functiontext">Str::clear</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|\</span><span class="plain">\</span><span class="string">nonterminal{%S}|%S"</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">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[1], </span><span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[2]);</span>
<span class="plain">}</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">label</span><span class="plain">);</span>
<span class="identifier">int</span><span class="plain"> </span><span class="identifier">N</span><span class="plain"> = </span><span class="identifier">preform_production_count</span><span class="plain">;</span>
<span class="identifier">int</span><span class="plain"> </span><span class="identifier">L</span><span class="plain"> = ((</span><span class="identifier">N</span><span class="plain">-1)%26) + </span><span class="constant">1</span><span class="plain">;</span>
<span class="identifier">if</span><span class="plain"> (</span><span class="identifier">N</span><span class="plain"> &lt;= </span><span class="constant">26</span><span class="plain">) </span><span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">label</span><span class="plain">, </span><span class="string">"%c"</span><span class="plain">, </span><span class="character">'a'</span><span class="plain">+</span><span class="identifier">L</span><span class="plain">-1);</span>
<span class="identifier">else</span><span class="plain"> </span><span class="identifier">if</span><span class="plain"> (</span><span class="identifier">N</span><span class="plain"> &lt;= </span><span class="constant">52</span><span class="plain">) </span><span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">label</span><span class="plain">, </span><span class="string">"%c%c"</span><span class="plain">, </span><span class="character">'a'</span><span class="plain">+</span><span class="identifier">L</span><span class="plain">-1, </span><span class="character">'a'</span><span class="plain">+</span><span class="identifier">L</span><span class="plain">-1);</span>
<span class="identifier">else</span><span class="plain"> </span><span class="identifier">if</span><span class="plain"> (</span><span class="identifier">N</span><span class="plain"> &lt;= </span><span class="constant">78</span><span class="plain">) </span><span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">label</span><span class="plain">, </span><span class="string">"%c%c%c"</span><span class="plain">, </span><span class="character">'a'</span><span class="plain">+</span><span class="identifier">L</span><span class="plain">-1, </span><span class="character">'a'</span><span class="plain">+</span><span class="identifier">L</span><span class="plain">-1, </span><span class="character">'a'</span><span class="plain">+</span><span class="identifier">L</span><span class="plain">-1);</span>
<span class="identifier">else</span><span class="plain"> {</span>
<span class="identifier">int</span><span class="plain"> </span><span class="identifier">n</span><span class="plain"> = (</span><span class="identifier">N</span><span class="plain">-1)/26;</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">label</span><span class="plain">, </span><span class="string">"%c${}^{%d}$"</span><span class="plain">, </span><span class="character">'a'</span><span class="plain">+</span><span class="identifier">L</span><span class="plain">-1, </span><span class="identifier">n</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"\</span><span class="plain">\</span><span class="string">qquad {\</span><span class="plain">\</span><span class="string">hbox to 0.4in{\</span><span class="plain">\</span><span class="string">it %S\</span><span class="plain">\</span><span class="string">hfil}}%S"</span><span class="plain">, </span><span class="identifier">label</span><span class="plain">, </span><span class="identifier">matter</span><span class="plain">);</span>
<span class="identifier">if</span><span class="plain"> (</span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">problem</span><span class="plain">) &gt; </span><span class="constant">0</span><span class="plain">)</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"\</span><span class="plain">\</span><span class="string">hfill$\</span><span class="plain">\</span><span class="string">longrightarrow$ {\</span><span class="plain">\</span><span class="string">ttninepoint\</span><span class="plain">\</span><span class="string">it %S}"</span><span class="plain">, </span><span class="identifier">problem</span><span class="plain">);</span>
<span class="identifier">else</span><span class="plain"> </span><span class="identifier">if</span><span class="plain"> (</span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">concluding_comment</span><span class="plain">) &gt; </span><span class="constant">0</span><span class="plain">) {</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" \</span><span class="plain">\</span><span class="string">hfill{\</span><span class="plain">\</span><span class="string">ttninepoint\</span><span class="plain">\</span><span class="string">it "</span><span class="plain">);</span>
<span class="identifier">if</span><span class="plain"> (</span><span class="identifier">concluding_comment</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">concluding_comment</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"}"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">label</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">problem</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="#SP24">&#167;24</a>.</p>
<p class="inwebparagraph"><a id="SP25"></a><b>&#167;25. Post-processing. </b></p>
<pre class="display">
<span class="identifier">void</span><span class="plain"> </span><span class="functiontext">TeX::post_process_PDF</span><span class="plain">(</span><span class="reserved">weave_format</span><span class="plain"> *</span><span class="identifier">self</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="identifier">int</span><span class="plain"> </span><span class="identifier">open</span><span class="plain">) {</span>
<span class="functiontext">RunningTeX::post_process_weave</span><span class="plain">(</span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">open</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">void</span><span class="plain"> </span><span class="functiontext">TeX::post_process_DVI</span><span class="plain">(</span><span class="reserved">weave_format</span><span class="plain"> *</span><span class="identifier">self</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="identifier">int</span><span class="plain"> </span><span class="identifier">open</span><span class="plain">) {</span>
<span class="functiontext">RunningTeX::post_process_weave</span><span class="plain">(</span><span class="identifier">wv</span><span class="plain">, </span><span class="identifier">open</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 TeX::post_process_PDF is used in <a href="#SP1_3">&#167;1.3</a>.</p>
<p class="endnote">The function TeX::post_process_DVI is used in <a href="#SP1_2">&#167;1.2</a>.</p>
<p class="inwebparagraph"><a id="SP26"></a><b>&#167;26. </b></p>
<pre class="display">
<span class="identifier">void</span><span class="plain"> </span><span class="functiontext">TeX::post_process_report</span><span class="plain">(</span><span class="reserved">weave_format</span><span class="plain"> *</span><span class="identifier">self</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="functiontext">RunningTeX::report_on_post_processing</span><span class="plain">(</span><span class="identifier">wv</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function TeX::post_process_report is used in <a href="#SP1_2">&#167;1.2</a>.</p>
<p class="inwebparagraph"><a id="SP27"></a><b>&#167;27. </b></p>
<pre class="display">
<span class="identifier">int</span><span class="plain"> </span><span class="functiontext">TeX::post_process_substitute</span><span class="plain">(</span><span class="reserved">weave_format</span><span class="plain"> *</span><span class="identifier">self</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">OUT</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">detail</span><span class="plain">, </span><span class="reserved">weave_pattern</span><span class="plain"> *</span><span class="identifier">pattern</span><span class="plain">) {</span>
<span class="identifier">return</span><span class="plain"> </span><span class="functiontext">RunningTeX::substitute_post_processing_data</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">detail</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function TeX::post_process_substitute is used in <a href="#SP1_2">&#167;1.2</a>, <a href="#SP1_3">&#167;1.3</a>, <a href="#SP1_1_1">&#167;1.1.1</a>.</p>
<p class="inwebparagraph"><a id="SP28"></a><b>&#167;28. Removing math mode. </b>"Math mode", in TeX jargon, is what happens when a mathematical formula
is written inside dollar signs: in <code class="display"><span class="extract">Answer is $x+y^2$</span></code>, the math mode
content is <code class="display"><span class="extract">x+y^2</span></code>. But since math mode doesn't (easily) exist in HTML,
for example, we want to strip it out if the format is not TeX-related.
To do this, the weaver calls the following.
</p>
<pre class="display">
<span class="identifier">void</span><span class="plain"> </span><span class="functiontext">TeX::remove_math_mode</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">text</span><span class="plain">) {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">math_matter</span><span class="plain">);</span>
<span class="functiontext">TeX::remove_math_mode_range</span><span class="plain">(</span><span class="identifier">math_matter</span><span class="plain">, </span><span class="identifier">text</span><span class="plain">, </span><span class="constant">0</span><span class="plain">, </span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">text</span><span class="plain">)-1);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%S"</span><span class="plain">, </span><span class="identifier">math_matter</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">math_matter</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">void</span><span class="plain"> </span><span class="functiontext">TeX::remove_math_mode_range</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">int</span><span class="plain"> </span><span class="identifier">from</span><span class="plain">, </span><span class="identifier">int</span><span class="plain"> </span><span class="identifier">to</span><span class="plain">) {</span>
<span class="identifier">for</span><span class="plain"> (</span><span class="identifier">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">=</span><span class="identifier">from</span><span class="plain">; </span><span class="identifier">i</span><span class="plain"> &lt;= </span><span class="identifier">to</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">++) {</span>
&lt;<span class="cwebmacro">Remove the over construction</span> <span class="cwebmacronumber">28.1</span>&gt;<span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">for</span><span class="plain"> (</span><span class="identifier">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">=</span><span class="identifier">from</span><span class="plain">; </span><span class="identifier">i</span><span class="plain"> &lt;= </span><span class="identifier">to</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">++) {</span>
&lt;<span class="cwebmacro">Remove the rm and it constructions</span> <span class="cwebmacronumber">28.2</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Remove the sqrt constructions</span> <span class="cwebmacronumber">28.3</span>&gt;<span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">int</span><span class="plain"> </span><span class="identifier">math_mode</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="identifier">for</span><span class="plain"> (</span><span class="identifier">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">=</span><span class="identifier">from</span><span class="plain">; </span><span class="identifier">i</span><span class="plain"> &lt;= </span><span class="identifier">to</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">++) {</span>
<span class="identifier">switch</span><span class="plain"> (</span><span class="functiontext">Str::get_at</span><span class="plain">(</span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">)) {</span>
<span class="identifier">case</span><span class="plain"> </span><span class="character">'$'</span><span class="plain">:</span>
<span class="identifier">if</span><span class="plain"> (</span><span class="functiontext">Str::get_at</span><span class="plain">(</span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">+1) == </span><span class="character">'$'</span><span class="plain">) </span><span class="identifier">i</span><span class="plain">++;</span>
<span class="identifier">math_mode</span><span class="plain"> = (</span><span class="identifier">math_mode</span><span class="plain">)?</span><span class="identifier">FALSE:TRUE</span><span class="plain">; </span><span class="identifier">break</span><span class="plain">;</span>
<span class="identifier">case</span><span class="plain"> </span><span class="character">'~'</span><span class="plain">: </span><span class="identifier">if</span><span class="plain"> (</span><span class="identifier">math_mode</span><span class="plain">) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" "</span><span class="plain">); </span><span class="identifier">else</span><span class="plain"> </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"~"</span><span class="plain">); </span><span class="identifier">break</span><span class="plain">;</span>
<span class="identifier">case</span><span class="plain"> </span><span class="character">'\</span><span class="plain">\</span><span class="character">'</span><span class="plain">: </span>&lt;<span class="cwebmacro">Do something to strip out a TeX macro</span> <span class="cwebmacronumber">28.4</span>&gt;<span class="plain">; </span><span class="identifier">break</span><span class="plain">;</span>
<span class="identifier">default:</span><span class="plain"> </span><span class="identifier">PUT</span><span class="plain">(</span><span class="functiontext">Str::get_at</span><span class="plain">(</span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">)); </span><span class="identifier">break</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function TeX::remove_math_mode is used in 5/wf (<a href="5-wf.html#SP23">&#167;23</a>).</p>
<p class="endnote">The function TeX::remove_math_mode_range is used in <a href="#SP28_1">&#167;28.1</a>, <a href="#SP28_2">&#167;28.2</a>, <a href="#SP28_3">&#167;28.3</a>.</p>
<p class="inwebparagraph"><a id="SP28_1"></a><b>&#167;28.1. </b>Here we remove <code class="display"><span class="extract">{{top}\over{bottom}}</span></code>, converting it to <code class="display"><span class="extract">((top) / (bottom))</span></code>.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Remove the over construction</span> <span class="cwebmacronumber">28.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">if</span><span class="plain"> ((</span><span class="functiontext">Str::get_at</span><span class="plain">(</span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">) == </span><span class="character">'\</span><span class="plain">\</span><span class="character">'</span><span class="plain">) &amp;&amp;</span>
<span class="plain">(</span><span class="functiontext">Str::get_at</span><span class="plain">(</span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">+1) == </span><span class="character">'o'</span><span class="plain">) &amp;&amp; (</span><span class="functiontext">Str::get_at</span><span class="plain">(</span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">+2) == </span><span class="character">'v'</span><span class="plain">) &amp;&amp;</span>
<span class="plain">(</span><span class="functiontext">Str::get_at</span><span class="plain">(</span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">+3) == </span><span class="character">'e'</span><span class="plain">) &amp;&amp; (</span><span class="functiontext">Str::get_at</span><span class="plain">(</span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">+4) == </span><span class="character">'r'</span><span class="plain">) &amp;&amp;</span>
<span class="plain">(</span><span class="functiontext">Str::get_at</span><span class="plain">(</span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">+5) == </span><span class="character">'{'</span><span class="plain">)) {</span>
<span class="identifier">int</span><span class="plain"> </span><span class="identifier">bl</span><span class="plain"> = </span><span class="constant">1</span><span class="plain">;</span>
<span class="identifier">int</span><span class="plain"> </span><span class="identifier">j</span><span class="plain"> = </span><span class="identifier">i</span><span class="plain">-1;</span>
<span class="identifier">for</span><span class="plain"> (; </span><span class="identifier">j</span><span class="plain"> &gt;= </span><span class="identifier">from</span><span class="plain">; </span><span class="identifier">j</span><span class="plain">--) {</span>
<span class="identifier">wchar_t</span><span class="plain"> </span><span class="identifier">c</span><span class="plain"> = </span><span class="functiontext">Str::get_at</span><span class="plain">(</span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">j</span><span class="plain">);</span>
<span class="identifier">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain"> == </span><span class="character">'{'</span><span class="plain">) {</span>
<span class="identifier">bl</span><span class="plain">--;</span>
<span class="identifier">if</span><span class="plain"> (</span><span class="identifier">bl</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">) </span><span class="identifier">break</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain"> == </span><span class="character">'}'</span><span class="plain">) </span><span class="identifier">bl</span><span class="plain">++;</span>
<span class="plain">}</span>
<span class="functiontext">TeX::remove_math_mode_range</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">from</span><span class="plain">, </span><span class="identifier">j</span><span class="plain">-1);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"(("</span><span class="plain">);</span>
<span class="functiontext">TeX::remove_math_mode_range</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">j</span><span class="plain">+2, </span><span class="identifier">i</span><span class="plain">-2);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">") / ("</span><span class="plain">);</span>
<span class="identifier">j</span><span class="plain">=</span><span class="identifier">i</span><span class="plain">+6; </span><span class="identifier">bl</span><span class="plain"> = </span><span class="constant">1</span><span class="plain">;</span>
<span class="identifier">for</span><span class="plain"> (; </span><span class="identifier">j</span><span class="plain"> &lt;= </span><span class="identifier">to</span><span class="plain">; </span><span class="identifier">j</span><span class="plain">++) {</span>
<span class="identifier">wchar_t</span><span class="plain"> </span><span class="identifier">c</span><span class="plain"> = </span><span class="functiontext">Str::get_at</span><span class="plain">(</span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">j</span><span class="plain">);</span>
<span class="identifier">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain"> == </span><span class="character">'}'</span><span class="plain">) {</span>
<span class="identifier">bl</span><span class="plain">--;</span>
<span class="identifier">if</span><span class="plain"> (</span><span class="identifier">bl</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">) </span><span class="identifier">break</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain"> == </span><span class="character">'{'</span><span class="plain">) </span><span class="identifier">bl</span><span class="plain">++;</span>
<span class="plain">}</span>
<span class="functiontext">TeX::remove_math_mode_range</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">+6, </span><span class="identifier">j</span><span class="plain">-1);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"))"</span><span class="plain">);</span>
<span class="functiontext">TeX::remove_math_mode_range</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">j</span><span class="plain">+2, </span><span class="identifier">to</span><span class="plain">);</span>
<span class="identifier">return</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP28">&#167;28</a>.</p>
<p class="inwebparagraph"><a id="SP28_2"></a><b>&#167;28.2. </b>Here we remove <code class="display"><span class="extract">{\rm text}</span></code>, converting it to <code class="display"><span class="extract">text</span></code>, and similarly <code class="display"><span class="extract">\it</span></code>.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Remove the rm and it constructions</span> <span class="cwebmacronumber">28.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">if</span><span class="plain"> ((</span><span class="functiontext">Str::get_at</span><span class="plain">(</span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">) == </span><span class="character">'{'</span><span class="plain">) &amp;&amp; (</span><span class="functiontext">Str::get_at</span><span class="plain">(</span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">+1) == </span><span class="character">'\</span><span class="plain">\</span><span class="character">'</span><span class="plain">) &amp;&amp;</span>
<span class="plain">(((</span><span class="functiontext">Str::get_at</span><span class="plain">(</span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">+2) == </span><span class="character">'r'</span><span class="plain">) &amp;&amp; (</span><span class="functiontext">Str::get_at</span><span class="plain">(</span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">+3) == </span><span class="character">'m'</span><span class="plain">)) ||</span>
<span class="plain">((</span><span class="functiontext">Str::get_at</span><span class="plain">(</span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">+2) == </span><span class="character">'i'</span><span class="plain">) &amp;&amp; (</span><span class="functiontext">Str::get_at</span><span class="plain">(</span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">+3) == </span><span class="character">'t'</span><span class="plain">))) &amp;&amp;</span>
<span class="plain">(</span><span class="functiontext">Str::get_at</span><span class="plain">(</span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">+4) == </span><span class="character">' '</span><span class="plain">)) {</span>
<span class="functiontext">TeX::remove_math_mode_range</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">from</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">-1);</span>
<span class="identifier">int</span><span class="plain"> </span><span class="identifier">j</span><span class="plain">=</span><span class="identifier">i</span><span class="plain">+5;</span>
<span class="identifier">for</span><span class="plain"> (; </span><span class="identifier">j</span><span class="plain"> &lt;= </span><span class="identifier">to</span><span class="plain">; </span><span class="identifier">j</span><span class="plain">++)</span>
<span class="identifier">if</span><span class="plain"> (</span><span class="functiontext">Str::get_at</span><span class="plain">(</span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">j</span><span class="plain">) == </span><span class="character">'}'</span><span class="plain">)</span>
<span class="identifier">break</span><span class="plain">;</span>
<span class="functiontext">TeX::remove_math_mode_range</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">+5, </span><span class="identifier">j</span><span class="plain">-1);</span>
<span class="functiontext">TeX::remove_math_mode_range</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">j</span><span class="plain">+1, </span><span class="identifier">to</span><span class="plain">);</span>
<span class="identifier">return</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP28">&#167;28</a>.</p>
<p class="inwebparagraph"><a id="SP28_3"></a><b>&#167;28.3. </b>Here we remove <code class="display"><span class="extract">\sqrt{N}</span></code>, converting it to <code class="display"><span class="extract">sqrt(N)</span></code>. As a special case,
we also look out for <code class="display"><span class="extract">{}^3\sqrt{N}</span></code> for cube root.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Remove the sqrt constructions</span> <span class="cwebmacronumber">28.3</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">if</span><span class="plain"> ((</span><span class="functiontext">Str::get_at</span><span class="plain">(</span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">) == </span><span class="character">'\</span><span class="plain">\</span><span class="character">'</span><span class="plain">) &amp;&amp;</span>
<span class="plain">(</span><span class="functiontext">Str::get_at</span><span class="plain">(</span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">+1) == </span><span class="character">'s'</span><span class="plain">) &amp;&amp; (</span><span class="functiontext">Str::get_at</span><span class="plain">(</span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">+2) == </span><span class="character">'q'</span><span class="plain">) &amp;&amp;</span>
<span class="plain">(</span><span class="functiontext">Str::get_at</span><span class="plain">(</span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">+3) == </span><span class="character">'r'</span><span class="plain">) &amp;&amp; (</span><span class="functiontext">Str::get_at</span><span class="plain">(</span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">+4) == </span><span class="character">'t'</span><span class="plain">) &amp;&amp;</span>
<span class="plain">(</span><span class="functiontext">Str::get_at</span><span class="plain">(</span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">+5) == </span><span class="character">'{'</span><span class="plain">)) {</span>
<span class="identifier">if</span><span class="plain"> ((</span><span class="functiontext">Str::get_at</span><span class="plain">(</span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">-4) == </span><span class="character">'{'</span><span class="plain">) &amp;&amp;</span>
<span class="plain">(</span><span class="functiontext">Str::get_at</span><span class="plain">(</span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">-3) == </span><span class="character">'}'</span><span class="plain">) &amp;&amp;</span>
<span class="plain">(</span><span class="functiontext">Str::get_at</span><span class="plain">(</span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">-2) == </span><span class="character">'^'</span><span class="plain">) &amp;&amp;</span>
<span class="plain">(</span><span class="functiontext">Str::get_at</span><span class="plain">(</span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">-1) == </span><span class="character">'3'</span><span class="plain">)) {</span>
<span class="functiontext">TeX::remove_math_mode_range</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">from</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">-5);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" curt("</span><span class="plain">);</span>
<span class="plain">} </span><span class="identifier">else</span><span class="plain"> {</span>
<span class="functiontext">TeX::remove_math_mode_range</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">from</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">-1);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" sqrt("</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">int</span><span class="plain"> </span><span class="identifier">j</span><span class="plain">=</span><span class="identifier">i</span><span class="plain">+6, </span><span class="identifier">bl</span><span class="plain"> = </span><span class="constant">1</span><span class="plain">;</span>
<span class="identifier">for</span><span class="plain"> (; </span><span class="identifier">j</span><span class="plain"> &lt;= </span><span class="identifier">to</span><span class="plain">; </span><span class="identifier">j</span><span class="plain">++) {</span>
<span class="identifier">wchar_t</span><span class="plain"> </span><span class="identifier">c</span><span class="plain"> = </span><span class="functiontext">Str::get_at</span><span class="plain">(</span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">j</span><span class="plain">);</span>
<span class="identifier">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain"> == </span><span class="character">'}'</span><span class="plain">) {</span>
<span class="identifier">bl</span><span class="plain">--;</span>
<span class="identifier">if</span><span class="plain"> (</span><span class="identifier">bl</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">) </span><span class="identifier">break</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain"> == </span><span class="character">'{'</span><span class="plain">) </span><span class="identifier">bl</span><span class="plain">++;</span>
<span class="plain">}</span>
<span class="functiontext">TeX::remove_math_mode_range</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">+6, </span><span class="identifier">j</span><span class="plain">-1);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">")"</span><span class="plain">);</span>
<span class="functiontext">TeX::remove_math_mode_range</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">j</span><span class="plain">+1, </span><span class="identifier">to</span><span class="plain">);</span>
<span class="identifier">return</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP28">&#167;28</a>.</p>
<p class="inwebparagraph"><a id="SP28_4"></a><b>&#167;28.4. </b><code class="display">
&lt;<span class="cwebmacrodefn">Do something to strip out a TeX macro</span> <span class="cwebmacronumber">28.4</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">);</span>
<span class="identifier">i</span><span class="plain">++;</span>
<span class="identifier">while</span><span class="plain"> ((</span><span class="identifier">i</span><span class="plain"> &lt; </span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">text</span><span class="plain">)) &amp;&amp; (</span><span class="functiontext">Characters::isalpha</span><span class="plain">(</span><span class="functiontext">Str::get_at</span><span class="plain">(</span><span class="identifier">text</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="reserved">macro</span><span class="plain">, </span><span class="functiontext">Str::get_at</span><span class="plain">(</span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">++));</span>
<span class="identifier">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"not"</span><span class="plain">)) </span>&lt;<span class="cwebmacro">Remove the not prefix</span> <span class="cwebmacronumber">28.4.2</span>&gt;
<span class="identifier">else</span><span class="plain"> </span>&lt;<span class="cwebmacro">Remove a general macro</span> <span class="cwebmacronumber">28.4.1</span>&gt;<span class="plain">;</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">);</span>
<span class="identifier">i</span><span class="plain">--;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP28">&#167;28</a>.</p>
<p class="inwebparagraph"><a id="SP28_4_1"></a><b>&#167;28.4.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Remove a general macro</span> <span class="cwebmacronumber">28.4.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"leq"</span><span class="plain">)) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;="</span><span class="plain">);</span>
<span class="identifier">else</span><span class="plain"> </span><span class="identifier">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"geq"</span><span class="plain">)) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&gt;="</span><span class="plain">);</span>
<span class="identifier">else</span><span class="plain"> </span><span class="identifier">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"sim"</span><span class="plain">)) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"~"</span><span class="plain">);</span>
<span class="identifier">else</span><span class="plain"> </span><span class="identifier">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"hbox"</span><span class="plain">)) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">""</span><span class="plain">);</span>
<span class="identifier">else</span><span class="plain"> </span><span class="identifier">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"left"</span><span class="plain">)) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">""</span><span class="plain">);</span>
<span class="identifier">else</span><span class="plain"> </span><span class="identifier">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"right"</span><span class="plain">)) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">""</span><span class="plain">);</span>
<span class="identifier">else</span><span class="plain"> </span><span class="identifier">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Rightarrow"</span><span class="plain">)) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"=&gt;"</span><span class="plain">);</span>
<span class="identifier">else</span><span class="plain"> </span><span class="identifier">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Leftrightarrow"</span><span class="plain">)) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;=&gt;"</span><span class="plain">);</span>
<span class="identifier">else</span><span class="plain"> </span><span class="identifier">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"to"</span><span class="plain">)) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"--&gt;"</span><span class="plain">);</span>
<span class="identifier">else</span><span class="plain"> </span><span class="identifier">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"rightarrow"</span><span class="plain">)) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"--&gt;"</span><span class="plain">);</span>
<span class="identifier">else</span><span class="plain"> </span><span class="identifier">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"longrightarrow"</span><span class="plain">)) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"--&gt;"</span><span class="plain">);</span>
<span class="identifier">else</span><span class="plain"> </span><span class="identifier">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"leftarrow"</span><span class="plain">)) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;--"</span><span class="plain">);</span>
<span class="identifier">else</span><span class="plain"> </span><span class="identifier">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"longleftarrow"</span><span class="plain">)) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;--"</span><span class="plain">);</span>
<span class="identifier">else</span><span class="plain"> </span><span class="identifier">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"lbrace"</span><span class="plain">)) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"{"</span><span class="plain">);</span>
<span class="identifier">else</span><span class="plain"> </span><span class="identifier">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"mid"</span><span class="plain">)) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"|"</span><span class="plain">);</span>
<span class="identifier">else</span><span class="plain"> </span><span class="identifier">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"rbrace"</span><span class="plain">)) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"}"</span><span class="plain">);</span>
<span class="identifier">else</span><span class="plain"> </span><span class="identifier">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"cdot"</span><span class="plain">)) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"."</span><span class="plain">);</span>
<span class="identifier">else</span><span class="plain"> </span><span class="identifier">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"cdots"</span><span class="plain">)) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"..."</span><span class="plain">);</span>
<span class="identifier">else</span><span class="plain"> </span><span class="identifier">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"dots"</span><span class="plain">)) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"..."</span><span class="plain">);</span>
<span class="identifier">else</span><span class="plain"> </span><span class="identifier">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"times"</span><span class="plain">)) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"*"</span><span class="plain">);</span>
<span class="identifier">else</span><span class="plain"> </span><span class="identifier">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"quad"</span><span class="plain">)) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" "</span><span class="plain">);</span>
<span class="identifier">else</span><span class="plain"> </span><span class="identifier">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"qquad"</span><span class="plain">)) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" "</span><span class="plain">);</span>
<span class="identifier">else</span><span class="plain"> </span><span class="identifier">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"TeX"</span><span class="plain">)) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"TeX"</span><span class="plain">);</span>
<span class="identifier">else</span><span class="plain"> </span><span class="identifier">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"neq"</span><span class="plain">)) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"!="</span><span class="plain">);</span>
<span class="identifier">else</span><span class="plain"> </span><span class="identifier">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"noteq"</span><span class="plain">)) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"!="</span><span class="plain">);</span>
<span class="identifier">else</span><span class="plain"> </span><span class="identifier">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"ell"</span><span class="plain">)) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"l"</span><span class="plain">);</span>
<span class="identifier">else</span><span class="plain"> </span><span class="identifier">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"log"</span><span class="plain">)) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"log"</span><span class="plain">);</span>
<span class="identifier">else</span><span class="plain"> </span><span class="identifier">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"exp"</span><span class="plain">)) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"exp"</span><span class="plain">);</span>
<span class="identifier">else</span><span class="plain"> </span><span class="identifier">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"sin"</span><span class="plain">)) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"sin"</span><span class="plain">);</span>
<span class="identifier">else</span><span class="plain"> </span><span class="identifier">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"cos"</span><span class="plain">)) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"cos"</span><span class="plain">);</span>
<span class="identifier">else</span><span class="plain"> </span><span class="identifier">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"tan"</span><span class="plain">)) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"tan"</span><span class="plain">);</span>
<span class="identifier">else</span><span class="plain"> </span><span class="identifier">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"top"</span><span class="plain">)) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"T"</span><span class="plain">);</span>
<span class="identifier">else</span><span class="plain"> </span><span class="identifier">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Alpha"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) </span><span class="constant">0x0391</span><span class="plain">);</span>
<span class="identifier">else</span><span class="plain"> </span><span class="identifier">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Beta"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) </span><span class="constant">0x0392</span><span class="plain">);</span>
<span class="identifier">else</span><span class="plain"> </span><span class="identifier">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Gamma"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) </span><span class="constant">0x0393</span><span class="plain">);</span>
<span class="identifier">else</span><span class="plain"> </span><span class="identifier">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Delta"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) </span><span class="constant">0x0394</span><span class="plain">);</span>
<span class="identifier">else</span><span class="plain"> </span><span class="identifier">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Epsilon"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) </span><span class="constant">0x0395</span><span class="plain">);</span>
<span class="identifier">else</span><span class="plain"> </span><span class="identifier">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Zeta"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) </span><span class="constant">0x0396</span><span class="plain">);</span>
<span class="identifier">else</span><span class="plain"> </span><span class="identifier">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Eta"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) </span><span class="constant">0x0397</span><span class="plain">);</span>
<span class="identifier">else</span><span class="plain"> </span><span class="identifier">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Theta"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) </span><span class="constant">0x0398</span><span class="plain">);</span>
<span class="identifier">else</span><span class="plain"> </span><span class="identifier">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Iota"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) </span><span class="constant">0x0399</span><span class="plain">);</span>
<span class="identifier">else</span><span class="plain"> </span><span class="identifier">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Kappa"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) </span><span class="constant">0x039A</span><span class="plain">);</span>
<span class="identifier">else</span><span class="plain"> </span><span class="identifier">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Lambda"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) </span><span class="constant">0x039B</span><span class="plain">);</span>
<span class="identifier">else</span><span class="plain"> </span><span class="identifier">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Mu"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) </span><span class="constant">0x039C</span><span class="plain">);</span>
<span class="identifier">else</span><span class="plain"> </span><span class="identifier">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Nu"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) </span><span class="constant">0x039D</span><span class="plain">);</span>
<span class="identifier">else</span><span class="plain"> </span><span class="identifier">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Xi"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) </span><span class="constant">0x039E</span><span class="plain">);</span>
<span class="identifier">else</span><span class="plain"> </span><span class="identifier">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Omicron"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) </span><span class="constant">0x039F</span><span class="plain">);</span>
<span class="identifier">else</span><span class="plain"> </span><span class="identifier">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Pi"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) </span><span class="constant">0x03A0</span><span class="plain">);</span>
<span class="identifier">else</span><span class="plain"> </span><span class="identifier">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Rho"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) </span><span class="constant">0x03A1</span><span class="plain">);</span>
<span class="identifier">else</span><span class="plain"> </span><span class="identifier">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Varsigma"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) </span><span class="constant">0x03A2</span><span class="plain">);</span>
<span class="identifier">else</span><span class="plain"> </span><span class="identifier">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Sigma"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) </span><span class="constant">0x03A3</span><span class="plain">);</span>
<span class="identifier">else</span><span class="plain"> </span><span class="identifier">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Tau"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) </span><span class="constant">0x03A4</span><span class="plain">);</span>
<span class="identifier">else</span><span class="plain"> </span><span class="identifier">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Upsilon"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) </span><span class="constant">0x03A5</span><span class="plain">);</span>
<span class="identifier">else</span><span class="plain"> </span><span class="identifier">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Phi"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) </span><span class="constant">0x03A6</span><span class="plain">);</span>
<span class="identifier">else</span><span class="plain"> </span><span class="identifier">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Chi"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) </span><span class="constant">0x03A7</span><span class="plain">);</span>
<span class="identifier">else</span><span class="plain"> </span><span class="identifier">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Psi"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) </span><span class="constant">0x03A8</span><span class="plain">);</span>
<span class="identifier">else</span><span class="plain"> </span><span class="identifier">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Omega"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) </span><span class="constant">0x03A9</span><span class="plain">);</span>
<span class="identifier">else</span><span class="plain"> </span><span class="identifier">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"alpha"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) </span><span class="constant">0x03B1</span><span class="plain">);</span>
<span class="identifier">else</span><span class="plain"> </span><span class="identifier">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"beta"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) </span><span class="constant">0x03B2</span><span class="plain">);</span>
<span class="identifier">else</span><span class="plain"> </span><span class="identifier">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"gamma"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) </span><span class="constant">0x03B3</span><span class="plain">);</span>
<span class="identifier">else</span><span class="plain"> </span><span class="identifier">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"delta"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) </span><span class="constant">0x03B4</span><span class="plain">);</span>
<span class="identifier">else</span><span class="plain"> </span><span class="identifier">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"epsilon"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) </span><span class="constant">0x03B5</span><span class="plain">);</span>
<span class="identifier">else</span><span class="plain"> </span><span class="identifier">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"zeta"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) </span><span class="constant">0x03B6</span><span class="plain">);</span>
<span class="identifier">else</span><span class="plain"> </span><span class="identifier">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"eta"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) </span><span class="constant">0x03B7</span><span class="plain">);</span>
<span class="identifier">else</span><span class="plain"> </span><span class="identifier">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"theta"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) </span><span class="constant">0x03B8</span><span class="plain">);</span>
<span class="identifier">else</span><span class="plain"> </span><span class="identifier">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"iota"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) </span><span class="constant">0x03B9</span><span class="plain">);</span>
<span class="identifier">else</span><span class="plain"> </span><span class="identifier">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"kappa"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) </span><span class="constant">0x03BA</span><span class="plain">);</span>
<span class="identifier">else</span><span class="plain"> </span><span class="identifier">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"lambda"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) </span><span class="constant">0x03BB</span><span class="plain">);</span>
<span class="identifier">else</span><span class="plain"> </span><span class="identifier">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"mu"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) </span><span class="constant">0x03BC</span><span class="plain">);</span>
<span class="identifier">else</span><span class="plain"> </span><span class="identifier">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"nu"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) </span><span class="constant">0x03BD</span><span class="plain">);</span>
<span class="identifier">else</span><span class="plain"> </span><span class="identifier">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"xi"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) </span><span class="constant">0x03BE</span><span class="plain">);</span>
<span class="identifier">else</span><span class="plain"> </span><span class="identifier">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"omicron"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) </span><span class="constant">0x03BF</span><span class="plain">);</span>
<span class="identifier">else</span><span class="plain"> </span><span class="identifier">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"pi"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) </span><span class="constant">0x03C0</span><span class="plain">);</span>
<span class="identifier">else</span><span class="plain"> </span><span class="identifier">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"rho"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) </span><span class="constant">0x03C1</span><span class="plain">);</span>
<span class="identifier">else</span><span class="plain"> </span><span class="identifier">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"varsigma"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) </span><span class="constant">0x03C2</span><span class="plain">);</span>
<span class="identifier">else</span><span class="plain"> </span><span class="identifier">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"sigma"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) </span><span class="constant">0x03C3</span><span class="plain">);</span>
<span class="identifier">else</span><span class="plain"> </span><span class="identifier">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"tau"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) </span><span class="constant">0x03C4</span><span class="plain">);</span>
<span class="identifier">else</span><span class="plain"> </span><span class="identifier">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"upsilon"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) </span><span class="constant">0x03C5</span><span class="plain">);</span>
<span class="identifier">else</span><span class="plain"> </span><span class="identifier">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"phi"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) </span><span class="constant">0x03C6</span><span class="plain">);</span>
<span class="identifier">else</span><span class="plain"> </span><span class="identifier">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"chi"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) </span><span class="constant">0x03C7</span><span class="plain">);</span>
<span class="identifier">else</span><span class="plain"> </span><span class="identifier">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"psi"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) </span><span class="constant">0x03C8</span><span class="plain">);</span>
<span class="identifier">else</span><span class="plain"> </span><span class="identifier">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"omega"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) </span><span class="constant">0x03C9</span><span class="plain">);</span>
<span class="identifier">else</span><span class="plain"> </span><span class="identifier">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"exists"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) </span><span class="constant">0x2203</span><span class="plain">);</span>
<span class="identifier">else</span><span class="plain"> </span><span class="identifier">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"in"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) </span><span class="constant">0x2208</span><span class="plain">);</span>
<span class="identifier">else</span><span class="plain"> </span><span class="identifier">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"forall"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) </span><span class="constant">0x2200</span><span class="plain">);</span>
<span class="identifier">else</span><span class="plain"> </span><span class="identifier">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"cap"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) </span><span class="constant">0x2229</span><span class="plain">);</span>
<span class="identifier">else</span><span class="plain"> </span><span class="identifier">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"emptyset"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) </span><span class="constant">0x2205</span><span class="plain">);</span>
<span class="identifier">else</span><span class="plain"> </span><span class="identifier">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"subseteq"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) </span><span class="constant">0x2286</span><span class="plain">);</span>
<span class="identifier">else</span><span class="plain"> </span><span class="identifier">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"land"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) </span><span class="constant">0x2227</span><span class="plain">);</span>
<span class="identifier">else</span><span class="plain"> </span><span class="identifier">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"lor"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) </span><span class="constant">0x2228</span><span class="plain">);</span>
<span class="identifier">else</span><span class="plain"> </span><span class="identifier">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"lnot"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) </span><span class="constant">0x00AC</span><span class="plain">);</span>
<span class="identifier">else</span><span class="plain"> </span><span class="identifier">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"sum"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) </span><span class="constant">0x03A3</span><span class="plain">);</span>
<span class="identifier">else</span><span class="plain"> </span><span class="identifier">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"prod"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) </span><span class="constant">0x03A0</span><span class="plain">);</span>
<span class="identifier">else</span><span class="plain"> {</span>
<span class="identifier">if</span><span class="plain"> (</span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">) &gt; </span><span class="constant">0</span><span class="plain">)</span>
<span class="identifier">PRINT</span><span class="plain">(</span><span class="string">"Passing through unknown TeX macro \</span><span class="plain">\</span><span class="string">%S: %S"</span><span class="plain">, </span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">text</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"\</span><span class="plain">\</span><span class="string">%S"</span><span class="plain">, </span><span class="reserved">macro</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP28_4">&#167;28.4</a>.</p>
<p class="inwebparagraph"><a id="SP28_4_2"></a><b>&#167;28.4.2. </b>For Inform's purposes, we need to deal with just <code class="display"><span class="extract">\not\exists</span></code> and <code class="display"><span class="extract">\not\forall</span></code>.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Remove the not prefix</span> <span class="cwebmacronumber">28.4.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">if</span><span class="plain"> (</span><span class="functiontext">Str::get_at</span><span class="plain">(</span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">) == </span><span class="character">'\</span><span class="plain">\</span><span class="character">'</span><span class="plain">) {</span>
<span class="functiontext">Str::clear</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">);</span>
<span class="identifier">i</span><span class="plain">++;</span>
<span class="identifier">while</span><span class="plain"> ((</span><span class="identifier">i</span><span class="plain"> &lt; </span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">text</span><span class="plain">)) &amp;&amp; (</span><span class="functiontext">Characters::isalpha</span><span class="plain">(</span><span class="functiontext">Str::get_at</span><span class="plain">(</span><span class="identifier">text</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="reserved">macro</span><span class="plain">, </span><span class="functiontext">Str::get_at</span><span class="plain">(</span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">++));</span>
<span class="identifier">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"exists"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) </span><span class="constant">0x2204</span><span class="plain">);</span>
<span class="identifier">else</span><span class="plain"> </span><span class="identifier">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"forall"</span><span class="plain">)) { </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) </span><span class="constant">0x00AC</span><span class="plain">); </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) </span><span class="constant">0x2200</span><span class="plain">); }</span>
<span class="identifier">else</span><span class="plain"> {</span>
<span class="identifier">PRINT</span><span class="plain">(</span><span class="string">"Don't know how to apply '\</span><span class="plain">\</span><span class="string">not' to '\</span><span class="plain">\</span><span class="string">%S'\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="reserved">macro</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">} </span><span class="identifier">else</span><span class="plain"> {</span>
<span class="identifier">PRINT</span><span class="plain">(</span><span class="string">"Don't know how to apply '\</span><span class="plain">\</span><span class="string">not' here\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP28_4">&#167;28.4</a>.</p>
<hr class="tocbar">
<ul class="toc"><li><a href="5-ptf.html">Back to 'Plain Text Format'</a></li><li><a href="5-hf.html">Continue with 'HTML Formats'</a></li></ul><hr class="tocbar">
<!--End of weave-->
</main>
</body>
</html>