From be52c3913dd7ab1c26387e5434fd1c612e6018ee Mon Sep 17 00:00:00 2001 From: Graham Nelson Date: Sun, 26 Apr 2020 13:07:06 +0100 Subject: [PATCH] Finished TeX renderer --- Chapter 1/Patterns.w | 2 +- Chapter 5/Format Methods.w | 17 +- Chapter 5/HTML Formats.w | 2 +- Chapter 5/Plain Text Format.w | 47 +- Chapter 5/Running Through TeX.w | 123 -- Chapter 5/TeX Format.w | 580 ++------- Chapter 5/TeX Utilities.w | 376 ++++++ Contents.w | 2 +- Patterns/PDFTeX/pattern.txt | 2 - Tangled/inweb.c | 2071 +++++++++++++------------------ docs/goldbach/goldbach.pdf | Bin 141357 -> 252023 bytes docs/goldbach/goldbach.tex | 28 +- docs/inweb/1-ptt.html | 2 +- docs/inweb/1-ts.html | 6 +- docs/inweb/3-tc.html | 6 +- docs/inweb/4-is.html | 4 +- docs/inweb/5-fm.html | 30 +- docs/inweb/5-hf.html | 2 +- docs/inweb/5-ptf.html | 95 +- docs/inweb/5-rtt.html | 194 --- docs/inweb/5-tf.html | 975 +++++---------- docs/inweb/5-tu.html | 468 +++++++ docs/inweb/5-wp.html | 2 +- docs/inweb/index.html | 4 +- inweb.mk | 1 + scripts/makescript.txt | 1 + 26 files changed, 2264 insertions(+), 2776 deletions(-) delete mode 100644 Chapter 5/Running Through TeX.w create mode 100644 Chapter 5/TeX Utilities.w delete mode 100644 docs/inweb/5-rtt.html create mode 100644 docs/inweb/5-tu.html diff --git a/Chapter 1/Patterns.w b/Chapter 1/Patterns.w index 6b86ca8..e6bb0f3 100644 --- a/Chapter 1/Patterns.w +++ b/Chapter 1/Patterns.w @@ -222,7 +222,7 @@ void Patterns::post_process(weave_pattern *pattern, weave_order *wv, int verbose } else PUT_TO(cmd, Str::get_at(T, i)); } if ((Str::includes_at(cmd, 0, I"PROCESS ")) && (last_F)) { - RunningTeX::post_process_weave(wv, last_F); + TeXUtilities::post_process_weave(wv, last_F); } else { if (verbosely) PRINT("(%S)\n", cmd); int rv = Shell::run(cmd); diff --git a/Chapter 5/Format Methods.w b/Chapter 5/Format Methods.w index 0676d2c..e5f6153 100644 --- a/Chapter 5/Format Methods.w +++ b/Chapter 5/Format Methods.w @@ -107,19 +107,6 @@ void Formats::render(text_stream *OUT, heterogeneous_tree *tree, filename *into) DISCARD_TEXT(template); } -@ When whole chapters are wovem, or all-in-one weaves include multiple -chapters, the format can add a table of chapter contents, or some similar -interstitial material. This is how: - -@e CHAPTER_TP_FOR_MTID - -= -VMETHOD_TYPE(CHAPTER_TP_FOR_MTID, weave_format *wf, text_stream *OUT, weave_order *wv, chapter *C) -void Formats::chapter_title_page(OUTPUT_STREAM, weave_order *wv, chapter *C) { - weave_format *wf = wv->format; - VMETHOD_CALL(wf, CHAPTER_TP_FOR_MTID, OUT, wv, C); -} - @ The weaver has special typographical support for the stand-alone Inform document of Preform grammar, and this is the hook for it. Most formats should ignore it. @@ -162,7 +149,7 @@ handled by //Patterns::post_process// directly. = VMETHOD_TYPE(POST_PROCESS_REPORT_POS_MTID, weave_format *wf, weave_order *wv) void Formats::report_on_post_processing(weave_order *wv) { - RunningTeX::report_on_post_processing(wv); + TeXUtilities::report_on_post_processing(wv); VMETHOD_CALL(wv->format, POST_PROCESS_REPORT_POS_MTID, wv); } @@ -176,7 +163,7 @@ IMETHOD_TYPE(POST_PROCESS_SUBSTITUTE_POS_MTID, weave_format *wf, text_stream *OU weave_order *wv, text_stream *detail, weave_pattern *pattern) int Formats::substitute_post_processing_data(OUTPUT_STREAM, weave_order *wv, text_stream *detail, weave_pattern *pattern) { - int rv = RunningTeX::substitute_post_processing_data(OUT, wv, detail); + int rv = TeXUtilities::substitute_post_processing_data(OUT, wv, detail); IMETHOD_CALL(rv, wv->format, POST_PROCESS_SUBSTITUTE_POS_MTID, OUT, wv, detail, pattern); return rv; } diff --git a/Chapter 5/HTML Formats.w b/Chapter 5/HTML Formats.w index f46090a..1cdeb58 100644 --- a/Chapter 5/HTML Formats.w +++ b/Chapter 5/HTML Formats.w @@ -700,7 +700,7 @@ that service uses to identify the video/audio in question. text_stream *plugin_name = hrs->wv->pattern->mathematics_plugin; if (Str::len(plugin_name) == 0) { TEMPORARY_TEXT(R); - TeX::remove_math_mode(R, C->content); + TeXUtilities::remove_math_mode(R, C->content); HTMLFormat::escape_text(OUT, R); DISCARD_TEXT(R); } else { diff --git a/Chapter 5/Plain Text Format.w b/Chapter 5/Plain Text Format.w index 5915315..1d98329 100644 --- a/Chapter 5/Plain Text Format.w +++ b/Chapter 5/Plain Text Format.w @@ -9,7 +9,6 @@ interesting, but ought to be available. void PlainText::create(void) { weave_format *wf = Formats::create_weave_format(I"plain", I".txt"); METHOD_ADD(wf, RENDER_FOR_MTID, PlainText::render); - METHOD_ADD(wf, CHAPTER_TP_FOR_MTID, PlainText::chapter_title_page); } @h Methods. @@ -32,13 +31,24 @@ void PlainText::render(weave_format *self, text_stream *OUT, heterogeneous_tree int PlainText::render_visit(tree_node *N, void *state, int L) { PlainText_render_state *prs = (PlainText_render_state *) state; text_stream *OUT = prs->OUT; - if (N->type == weave_document_node_type) @ - else if (N->type == weave_head_node_type) @ - else if (N->type == weave_body_node_type) @ - else if (N->type == weave_tail_node_type) @ + if ((N->type == weave_document_node_type) || + (N->type == weave_head_node_type) || + (N->type == weave_body_node_type) || + (N->type == weave_tail_node_type) || + (N->type == weave_chapter_title_page_node_type) || + (N->type == weave_chapter_footer_node_type) || + (N->type == weave_figure_node_type) || + (N->type == weave_audio_node_type) || + (N->type == weave_material_node_type) || + (N->type == weave_chapter_node_type) || + (N->type == weave_carousel_slide_node_type) || + (N->type == weave_toc_node_type) || + (N->type == weave_toc_line_node_type) || + (N->type == weave_grammar_index_node_type) || + (N->type == weave_inline_node_type)) @ + else if (N->type == weave_verbatim_node_type) @ else if (N->type == weave_chapter_header_node_type) @ - else if (N->type == weave_chapter_footer_node_type) @ else if (N->type == weave_section_header_node_type) @ else if (N->type == weave_section_footer_node_type) @ else if (N->type == weave_section_purpose_node_type) @ @@ -48,21 +58,13 @@ int PlainText::render_visit(tree_node *N, void *state, int L) { else if (N->type == weave_linebreak_node_type) @ else if (N->type == weave_paragraph_heading_node_type) @ else if (N->type == weave_endnote_node_type) @ - else if (N->type == weave_figure_node_type) @ - else if (N->type == weave_audio_node_type) @ - else if (N->type == weave_material_node_type) @ else if (N->type == weave_embed_node_type) @ else if (N->type == weave_pmac_node_type) @ else if (N->type == weave_vskip_node_type) @ - else if (N->type == weave_chapter_node_type) @ else if (N->type == weave_section_node_type) @ else if (N->type == weave_code_line_node_type) @ else if (N->type == weave_function_usage_node_type) @ else if (N->type == weave_commentary_node_type) @ - else if (N->type == weave_carousel_slide_node_type) @ - else if (N->type == weave_toc_node_type) @ - else if (N->type == weave_toc_line_node_type) @ - else if (N->type == weave_chapter_title_page_node_type) @ else if (N->type == weave_defn_node_type) @ else if (N->type == weave_source_code_node_type) @ else if (N->type == weave_url_node_type) @ @@ -71,10 +73,9 @@ int PlainText::render_visit(tree_node *N, void *state, int L) { else if (N->type == weave_display_line_node_type) @ else if (N->type == weave_function_defn_node_type) @ else if (N->type == weave_item_node_type) @ - else if (N->type == weave_grammar_index_node_type) @ - else if (N->type == weave_inline_node_type) @ else if (N->type == weave_locale_node_type) @ else if (N->type == weave_maths_node_type) @ + else internal_error("unable to render unknown node"); return TRUE; } @@ -165,10 +166,6 @@ int PlainText::render_visit(tree_node *N, void *state, int L) { WRITE("%S", C->text); if (C->in_code) WRITE(" */ "); -@ = - weave_chapter_title_page_node *C = RETRIEVE_POINTER_weave_chapter_title_page_node(N->content); - LOG("It was %d\n", C->allocation_id); - @ = weave_defn_node *C = RETRIEVE_POINTER_weave_defn_node(N->content); WRITE("%S ", C->keyword); @@ -216,13 +213,3 @@ int PlainText::render_visit(tree_node *N, void *state, int L) { @ = for (tree_node *M = N->child; M; M = M->next) Trees::traverse_from(M, &PlainText::render_visit, (void *) prs, L+1); - -@ = -void PlainText::chapter_title_page(weave_format *self, text_stream *OUT, - weave_order *wv, chapter *C) { - WRITE("%S\n\n", C->md->rubric); - section *S; - LOOP_OVER_LINKED_LIST(S, section, C->sections) - WRITE(" %S: %S\n %S\n", - S->md->sect_range, S->md->sect_title, S->sect_purpose); -} diff --git a/Chapter 5/Running Through TeX.w b/Chapter 5/Running Through TeX.w deleted file mode 100644 index e403515..0000000 --- a/Chapter 5/Running Through TeX.w +++ /dev/null @@ -1,123 +0,0 @@ -[RunningTeX::] Running Through TeX. - -To post-process a weave by running it through TeX, or one of its -variant typesetting programs. - -@h Running TeX. -Although we are running |pdftex|, a modern variant of TeX, rather than the -original, they are very similar as command-line tools; the difference is -that the output is a PDF file rather than a DVI file, Knuth's original stab -at the same basic idea. - -In particular, we call it in |-interaction=scrollmode| so that any errors -whizz by rather than interrupting or halting the session. Because of that, we -spool the output onto a console file which we can then read in and parse to -find the number of errors actually generated. Prime among errors is the -"overfull hbox error", a defect of TeX resulting from its inability to adjust -letter spacing, so that it requires us to adjust the copy to fit the margins -of the page properly. (In practice we get this here by having code lines which -are too wide to display.) - -@ = -void RunningTeX::post_process_weave(weave_order *wv, filename *CF) { - tex_results *res = CREATE(tex_results); - @; - wv->post_processing_results = res; - @; -} - -@ We're going to have to read in a console file of TeX output to work out -what happened, and this structure will store what we find: - -= -typedef struct tex_results { - int overfull_hbox_count; - int tex_error_count; - int page_count; - int pdf_size; - struct filename *PDF_filename; - MEMORY_MANAGEMENT -} tex_results; - -@ = - res->overfull_hbox_count = 0; - res->tex_error_count = 0; - res->page_count = 0; - res->pdf_size = 0; - res->PDF_filename = Filenames::set_extension(CF, I".pdf"); - -@ TeX helpfully reports the size and page count of what it produces, and -we're not too proud to scrape that information out of the console file, besides -the error messages (which begin with an exclamation mark in column 1). - -@ = - TextFiles::read(CF, FALSE, - "can't open console file", TRUE, RunningTeX::scan_console_line, NULL, - (void *) res); - -@ = -void RunningTeX::scan_console_line(text_stream *line, text_file_position *tfp, - void *res_V) { - tex_results *res = (tex_results *) res_V; - match_results mr = Regexp::create_mr(); - if (Regexp::match(&mr, line, - L"Output written %c*? %((%d+) page%c*?(%d+) bytes%).")) { - res->page_count = Str::atoi(mr.exp[0], 0); - res->pdf_size = Str::atoi(mr.exp[1], 0); - } - if (Regexp::match(&mr, line, L"%c+verfull \\hbox%c+")) - res->overfull_hbox_count++; - else if (Str::get_first_char(line) == '!') { - res->tex_error_count++; - } - Regexp::dispose_of(&mr); -} - -@h Reporting. - -= -void RunningTeX::report_on_post_processing(weave_order *wv) { - tex_results *res = wv->post_processing_results; - if (res) { - PRINT(": %dpp %dK", res->page_count, res->pdf_size/1024); - if (res->overfull_hbox_count > 0) - PRINT(", %d overfull hbox(es)", res->overfull_hbox_count); - if (res->tex_error_count > 0) - PRINT(", %d error(s)", res->tex_error_count); - } -} - -@ And here are some details to do with the results of post-processing. - -= -int RunningTeX::substitute_post_processing_data(text_stream *to, weave_order *wv, - text_stream *detail) { - if (wv) { - tex_results *res = wv->post_processing_results; - if (res) { - if (Str::eq_wide_string(detail, L"PDF Size")) { - WRITE_TO(to, "%dKB", res->pdf_size/1024); - } else if (Str::eq_wide_string(detail, L"Extent")) { - WRITE_TO(to, "%dpp", res->page_count); - } else if (Str::eq_wide_string(detail, L"Leafname")) { - Str::copy(to, Filenames::get_leafname(res->PDF_filename)); - } else if (Str::eq_wide_string(detail, L"Errors")) { - Str::clear(to); - if ((res->overfull_hbox_count > 0) || (res->tex_error_count > 0)) - WRITE_TO(to, ": "); - if (res->overfull_hbox_count > 0) - WRITE_TO(to, "%d overfull line%s", - res->overfull_hbox_count, - (res->overfull_hbox_count>1)?"s":""); - if ((res->overfull_hbox_count > 0) && (res->tex_error_count > 0)) - WRITE_TO(to, ", "); - if (res->tex_error_count > 0) - WRITE_TO(to, "%d TeX error%s", - res->tex_error_count, - (res->tex_error_count>1)?"s":""); - } else return FALSE; - return TRUE; - } - } - return FALSE; -} diff --git a/Chapter 5/TeX Format.w b/Chapter 5/TeX Format.w index e156e2a..af7d9e6 100644 --- a/Chapter 5/TeX Format.w +++ b/Chapter 5/TeX Format.w @@ -7,72 +7,65 @@ software, TeX. = void TeX::create(void) { - @; - @; - @; -} - -@ = weave_format *wf = Formats::create_weave_format(I"TeX", I".tex"); METHOD_ADD(wf, RENDER_FOR_MTID, TeX::render_TeX); - METHOD_ADD(wf, CHAPTER_TP_FOR_MTID, TeX::chapter_title_page); METHOD_ADD(wf, PREFORM_DOCUMENT_FOR_MTID, TeX::preform_document); +} -@ = - weave_format *wf = Formats::create_weave_format(I"DVI", I".tex"); - METHOD_ADD(wf, RENDER_FOR_MTID, TeX::render_DVI); - METHOD_ADD(wf, CHAPTER_TP_FOR_MTID, TeX::chapter_title_page); - METHOD_ADD(wf, PREFORM_DOCUMENT_FOR_MTID, TeX::preform_document); +@h Rendering. +At present, this renderer only makes the dialect of TeX needed for |pdftex|, +which involves various extension commands: the curse of modern TeX is the +combination of an outdated original, and a proliferation of non-canonical +extensions, but |pdftex| is pretty good. All the same, we should perhaps +consider adding LaTeX, or XeTeX. -@ = - weave_format *wf = Formats::create_weave_format(I"PDF", I".tex"); - METHOD_ADD(wf, RENDER_FOR_MTID, TeX::render_PDF); - METHOD_ADD(wf, CHAPTER_TP_FOR_MTID, TeX::chapter_title_page); - METHOD_ADD(wf, PREFORM_DOCUMENT_FOR_MTID, TeX::preform_document); +@e PDFTEX_TEX_FORM from 1 -@h Methods. -For documentation, see "Weave Fornats". += +void TeX::render_TeX(weave_format *self, text_stream *OUT, heterogeneous_tree *tree) { + TeX::render_inner(OUT, tree, PDFTEX_TEX_FORM); +} + +@ From here on, then, the renderer, which should generate TeX which is as +generic as possible, but with special features depending on |trs->TeX_form|. = typedef struct TeX_render_state { struct text_stream *OUT; struct weave_order *wv; - int as_DVI; - int as_PDF; + int TeX_form; } TeX_render_state; -void TeX::render_TeX(weave_format *self, text_stream *OUT, heterogeneous_tree *tree) { - TeX::render_inner(self, OUT, tree, FALSE, FALSE); -} -void TeX::render_DVI(weave_format *self, text_stream *OUT, heterogeneous_tree *tree) { - TeX::render_inner(self, OUT, tree, TRUE, FALSE); -} -void TeX::render_PDF(weave_format *self, text_stream *OUT, heterogeneous_tree *tree) { - TeX::render_inner(self, OUT, tree, FALSE, TRUE); -} - -void TeX::render_inner(weave_format *self, text_stream *OUT, heterogeneous_tree *tree, int as_dvi, int as_pdf) { +void TeX::render_inner(text_stream *OUT, heterogeneous_tree *tree, int form) { weave_document_node *C = RETRIEVE_POINTER_weave_document_node(tree->root->content); TeX_render_state trs; trs.OUT = OUT; trs.wv = C->wv; - trs.as_DVI = as_dvi; - trs.as_PDF = as_pdf; + trs.TeX_form = form; Trees::traverse_from(tree->root, &TeX::render_visit, (void *) &trs, 0); } +@ For the reason why footnotes are omitted, see below: they aren't really. + += int TeX::render_visit(tree_node *N, void *state, int L) { TeX_render_state *trs = (TeX_render_state *) state; text_stream *OUT = trs->OUT; - if (N->type == weave_document_node_type) @ + if ((N->type == weave_document_node_type) || + (N->type == weave_body_node_type) || + (N->type == weave_chapter_title_page_node_type) || + (N->type == weave_chapter_footer_node_type) || + (N->type == weave_section_footer_node_type) || + (N->type == weave_audio_node_type) || + (N->type == weave_chapter_node_type) || + (N->type == weave_carousel_slide_node_type) || + (N->type == weave_begin_footnote_text_node_type)) @ + else if (N->type == weave_head_node_type) @ - else if (N->type == weave_body_node_type) @ else if (N->type == weave_tail_node_type) @ else if (N->type == weave_verbatim_node_type) @ else if (N->type == weave_chapter_header_node_type) @ - else if (N->type == weave_chapter_footer_node_type) @ else if (N->type == weave_section_header_node_type) @ - else if (N->type == weave_section_footer_node_type) @ else if (N->type == weave_section_purpose_node_type) @ else if (N->type == weave_subheading_node_type) @ else if (N->type == weave_bar_node_type) @ @@ -81,25 +74,20 @@ int TeX::render_visit(tree_node *N, void *state, int L) { else if (N->type == weave_paragraph_heading_node_type) @ else if (N->type == weave_endnote_node_type) @ else if (N->type == weave_figure_node_type) @ - else if (N->type == weave_audio_node_type) @ else if (N->type == weave_material_node_type) @ else if (N->type == weave_embed_node_type) @ else if (N->type == weave_pmac_node_type) @ else if (N->type == weave_vskip_node_type) @ - else if (N->type == weave_chapter_node_type) @ else if (N->type == weave_section_node_type) @ else if (N->type == weave_code_line_node_type) @ else if (N->type == weave_function_usage_node_type) @ else if (N->type == weave_commentary_node_type) @ - else if (N->type == weave_carousel_slide_node_type) @ else if (N->type == weave_toc_node_type) @ else if (N->type == weave_toc_line_node_type) @ - else if (N->type == weave_chapter_title_page_node_type) @ else if (N->type == weave_defn_node_type) @ else if (N->type == weave_source_code_node_type) @ else if (N->type == weave_url_node_type) @ else if (N->type == weave_footnote_cue_node_type) @ - else if (N->type == weave_begin_footnote_text_node_type) @ else if (N->type == weave_display_line_node_type) @ else if (N->type == weave_function_defn_node_type) @ else if (N->type == weave_item_node_type) @ @@ -107,6 +95,7 @@ int TeX::render_visit(tree_node *N, void *state, int L) { else if (N->type == weave_inline_node_type) @ else if (N->type == weave_locale_node_type) @ else if (N->type == weave_maths_node_type) @ + else internal_error("unable to render unknown node"); return TRUE; } @@ -122,20 +111,31 @@ int TeX::render_visit(tree_node *N, void *state, int L) { @ = weave_chapter_header_node *C = RETRIEVE_POINTER_weave_chapter_header_node(N->content); - if (Str::ne(C->chap->md->ch_range, I"S")) - TeX::paragraph_heading(trs->wv->format, OUT, trs->wv, FIRST_IN_LINKED_LIST(section, C->chap->sections), NULL, C->chap->md->ch_title, 3, FALSE); + if (Str::ne(C->chap->md->ch_range, I"S")) { + TeX::general_heading(OUT, trs->wv, + FIRST_IN_LINKED_LIST(section, C->chap->sections), NULL, C->chap->md->ch_title, + 3, FALSE); + WRITE("%S\\medskip\n", C->chap->md->rubric); + section *S; + LOOP_OVER_LINKED_LIST(S, section, C->chap->sections) { + WRITE("\\smallskip\\noindent "); + if (trs->wv->pattern->number_sections) WRITE("%d. ", S->printed_number); + WRITE("{\\it %S}\\qquad\n%S", S->md->sect_title, S->sect_purpose); + } + } @ = weave_section_header_node *C = RETRIEVE_POINTER_weave_section_header_node(N->content); - TeX::paragraph_heading(trs->wv->format, OUT, trs->wv, C->sect, NULL, C->sect->md->sect_title, 2, FALSE); + TeX::general_heading(OUT, trs->wv, C->sect, NULL, + C->sect->md->sect_title, 2, FALSE); @ = weave_section_purpose_node *C = RETRIEVE_POINTER_weave_section_purpose_node(N->content); - TeX::subheading(trs->wv->format, OUT, trs->wv, 2, C->purpose, NULL); + WRITE("\\smallskip\\par\\noindent{\\it %S}\\smallskip\\noindent\n", C->purpose); @ = weave_subheading_node *C = RETRIEVE_POINTER_weave_subheading_node(N->content); - TeX::subheading(trs->wv->format, OUT, trs->wv, 1, C->text, NULL); + WRITE("\\par\\noindent{\\bf %S}\\mark{%S}\\medskip\n", C->text, NULL); @ = WRITE("\\par\\medskip\\noindent\\hrule\\medskip\\noindent\n"); @@ -147,8 +147,10 @@ int TeX::render_visit(tree_node *N, void *state, int L) { WRITE("\n"); @ = - weave_paragraph_heading_node *C = RETRIEVE_POINTER_weave_paragraph_heading_node(N->content); - TeX::paragraph_heading(trs->wv->format, OUT, trs->wv, C->para->under_section, C->para, I"Dunno", 0, FALSE); + weave_paragraph_heading_node *C = + RETRIEVE_POINTER_weave_paragraph_heading_node(N->content); + TeX::general_heading(OUT, trs->wv, C->para->under_section, + C->para, I"", 0, FALSE); @ = WRITE("\\par\\noindent\\penalty10000\n"); @@ -165,19 +167,17 @@ 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. @ = - if (trs->as_PDF) { - weave_figure_node *C = RETRIEVE_POINTER_weave_figure_node(N->content); - WRITE("\\pdfximage"); - if (C->w >= 0) - WRITE(" width %d cm{../Figures/%S}\n", C->w, C->figname); - else if (C->h >= 0) - WRITE(" height %d cm{../Figures/%S}\n", C->h, C->figname); - else - WRITE("{../Figures/%S}\n", C->figname); - WRITE("\\smallskip\\noindent" - "\\hbox to\\hsize{\\hfill\\pdfrefximage \\pdflastximage\\hfill}" - "\\smallskip\n"); - } + weave_figure_node *C = RETRIEVE_POINTER_weave_figure_node(N->content); + filename *F = Filenames::in( + Pathnames::down(trs->wv->weave_web->md->path_to_web, I"Figures"), + C->figname); + WRITE("\\pdfximage"); + if (C->w >= 0) WRITE(" width %d cm{%f}\n", C->w/POINTS_PER_CM, F); + else if (C->h >= 0) WRITE(" height %d cm{%f}\n", C->h/POINTS_PER_CM, F); + else WRITE("{%f}\n", F); + WRITE("\\smallskip\\noindent" + "\\hbox to\\hsize{\\hfill\\pdfrefximage \\pdflastximage\\hfill}" + "\\smallskip\n"); @ = weave_material_node *C = RETRIEVE_POINTER_weave_material_node(N->content); @@ -212,7 +212,7 @@ to a given width, into the text at the current position. WRITE("\\endlines\n"); @ = - @; + return FALSE; @ = @; @@ -239,11 +239,7 @@ to a given width, into the text at the current position. @ = weave_pmac_node *C = RETRIEVE_POINTER_weave_pmac_node(N->content); - if (trs->as_PDF) - TeX::para_macro_PDF_1(trs->wv->format, OUT, trs->wv, C->pmac, C->defn); - TeX::para_macro(trs->wv->format, OUT, trs->wv, C->pmac, C->defn); - if (trs->as_PDF) - TeX::para_macro_PDF_2(trs->wv->format, OUT, trs->wv, C->pmac, C->defn); + TeX::para_macro(OUT, trs->wv, C->pmac, C->defn); @ = weave_vskip_node *C = RETRIEVE_POINTER_weave_vskip_node(N->content); @@ -263,14 +259,16 @@ to a given width, into the text at the current position. return FALSE; @ = - weave_function_usage_node *C = RETRIEVE_POINTER_weave_function_usage_node(N->content); + weave_function_usage_node *C = + RETRIEVE_POINTER_weave_function_usage_node(N->content); WRITE("%S", C->fn->function_name); return FALSE; @ = - weave_commentary_node *C = RETRIEVE_POINTER_weave_commentary_node(N->content); + weave_commentary_node *C = + RETRIEVE_POINTER_weave_commentary_node(N->content); if (C->in_code) WRITE(" |\\hfill{\\ttninepoint\\it "); - TeX::commentary_text(NULL, OUT, trs->wv, C->text); + TeX::commentary_text(OUT, trs->wv, C->text); if (C->in_code) WRITE("}|"); @ = @@ -286,38 +284,75 @@ to a given width, into the text at the current position. weave_toc_line_node *C = RETRIEVE_POINTER_weave_toc_line_node(N->content); WRITE("%S~%S", C->text1, C->text2); -@ = - weave_chapter_title_page_node *C = RETRIEVE_POINTER_weave_chapter_title_page_node(N->content); - LOG("It was %d\n", C->allocation_id); - @ = weave_defn_node *C = RETRIEVE_POINTER_weave_defn_node(N->content); WRITE("|{\\ninebf %S} |", C->keyword); @ = - weave_source_code_node *C = RETRIEVE_POINTER_weave_source_code_node(N->content); + weave_source_code_node *C = + RETRIEVE_POINTER_weave_source_code_node(N->content); int starts = FALSE; if (N == N->parent->child) starts = TRUE; - TeX::source_code(trs->wv->format, OUT, trs->wv, + TeX::source_code(OUT, trs->wv, C->matter, C->colouring, starts); @ = weave_url_node *C = RETRIEVE_POINTER_weave_url_node(N->content); WRITE("%S", C->url); +@ The TeX macro for footnotes means that the text has to accompany the cue, +which is tricky for us now because the footnote text is somewhere else in +the weave tree -- so, we go for a little walk: + @ = weave_footnote_cue_node *C = RETRIEVE_POINTER_weave_footnote_cue_node(N->content); - WRITE("[%S]", C->cue_text); + WRITE("\\footnote{${}^{%S}$}{", C->cue_text); + tree_node *M = N; + while ((M) && (M->type != weave_paragraph_heading_node_type)) M = M->parent; + if (M == NULL) internal_error("tree without section nodes"); + M = M->child; + int found = FALSE; + while (M) { + if (M->type == weave_material_node_type) { + weave_material_node *MC = RETRIEVE_POINTER_weave_material_node(M->content); + if (MC->material_type == FOOTNOTES_MATERIAL) { + tree_node *F = M->child; + while (F) { + if (F->type == weave_begin_footnote_text_node_type) { + weave_begin_footnote_text_node *FC = + RETRIEVE_POINTER_weave_begin_footnote_text_node(F->content); + if (Str::eq(FC->cue_text, C->cue_text)) + @; + } + F = F->next; + } + } + } + M = M->next; + } + WRITE("}"); + if (found == FALSE) internal_error("cue without text"); -@ = - WRITE("\n"); +@ And so here's the text. Note that we render only its second and subsequent +child nodes: that's because the first child is a copy of the footnote cue, +and TeX renders that automatically. + +(The TeX renderer otherwise ignores footnote texts, so if these nodes +are not rendered here, they never will be.) + +@ = + for (tree_node *X = F->child->next; X; X = X->next) + Trees::traverse_from(X, &TeX::render_visit, (void *) trs, L+1); + found = TRUE; @ = - weave_display_line_node *C = RETRIEVE_POINTER_weave_display_line_node(N->content); + weave_display_line_node *C = + RETRIEVE_POINTER_weave_display_line_node(N->content); WRITE("\\quotesource{%S}\n", C->text); @ = - weave_function_defn_node *C = RETRIEVE_POINTER_weave_function_defn_node(N->content); + weave_function_defn_node *C = + RETRIEVE_POINTER_weave_function_defn_node(N->content); TeX::change_colour_PDF(OUT, FUNCTION_COLOUR, TRUE); WRITE("%S", C->fn->function_name); TeX::change_colour_PDF(OUT, PLAIN_COLOUR, TRUE); @@ -357,61 +392,9 @@ to a given width, into the text at the current position. for (tree_node *M = N->child; M; M = M->next) Trees::traverse_from(M, &TeX::render_visit, (void *) trs, L+1); -@ = -int TeX::yes(weave_format *self, weave_order *wv) { - return TRUE; -} - -@ = -void TeX::subheading(weave_format *self, text_stream *OUT, weave_order *wv, - int level, text_stream *comment, text_stream *head) { - switch (level) { - case 1: - WRITE("\\par\\noindent{\\bf %S}\\mark{%S}\\medskip\n", - comment, head); - break; - case 2: - WRITE("\\smallskip\\par\\noindent{\\it %S}\\smallskip\\noindent\n", - comment); - if (head) TeX::commentary_text(self, OUT, wv, head); - break; - } -} - -@ = -void TeX::toc(weave_format *self, text_stream *OUT, weave_order *wv, int stage, - text_stream *text1, text_stream *text2, paragraph *P) { - switch (stage) { - case 1: - WRITE("\\medskip\\hrule\\smallskip\\par\\noindent{\\usagefont "); - break; - case 2: - WRITE("; "); - break; - case 3: - WRITE("%S~%S", text1, text2); - break; - case 4: - WRITE("}\\par\\medskip\\hrule\\bigskip\n"); - break; - } -} - -@ = -void TeX::chapter_title_page(weave_format *self, text_stream *OUT, weave_order *wv, - chapter *C) { - WRITE("%S\\medskip\n", C->md->rubric); - section *S; - LOOP_OVER_LINKED_LIST(S, section, C->sections) { - WRITE("\\smallskip\\noindent "); - if (wv->pattern->number_sections) WRITE("%d. ", S->printed_number); - WRITE("{\\it %S}\\qquad\n%S", S->md->sect_title, S->sect_purpose); - } -} - @ = text_stream *P_literal = NULL; -void TeX::paragraph_heading(weave_format *self, text_stream *OUT, weave_order *wv, +void TeX::general_heading(text_stream *OUT, weave_order *wv, section *S, paragraph *P, text_stream *heading_text, int weight, int no_skip) { text_stream *TeX_macro = NULL; @; @@ -508,11 +491,12 @@ escape from code mode, escape it using a backslash, then re-enter code mode once again: = -void TeX::source_code(weave_format *self, text_stream *OUT, weave_order *wv, +void TeX::source_code(text_stream *OUT, weave_order *wv, text_stream *matter, text_stream *colouring, int starts) { int current_colour = PLAIN_COLOUR, colour_wanted = PLAIN_COLOUR; for (int i=0; i < Str::len(matter); i++) { - colour_wanted = Str::get_at(colouring, i); @; + colour_wanted = Str::get_at(colouring, i); + @; if (Str::get_at(matter, i) == '|') WRITE("|\\||"); else WRITE("%c", Str::get_at(matter, i)); } @@ -556,11 +540,7 @@ In the PDF format, these three are all called, in sequence below; in TeX or DVI, only the middle one is. = -void TeX::para_macro_PDF_1(weave_format *self, text_stream *OUT, weave_order *wv, - para_macro *pmac, int defn) { -} -void TeX::para_macro(weave_format *self, text_stream *OUT, weave_order *wv, - para_macro *pmac, int defn) { +void TeX::para_macro(text_stream *OUT, weave_order *wv, para_macro *pmac, int defn) { if (defn) WRITE("|\\pdfdest num %d fit ", pmac->allocation_id + 100); @@ -578,18 +558,9 @@ void TeX::para_macro(weave_format *self, text_stream *OUT, weave_order *wv, else WRITE("\\pdfendlink|"); } -void TeX::para_macro_PDF_2(weave_format *self, text_stream *OUT, weave_order *wv, - para_macro *pmac, int defn) { -} @ = -void TeX::after_definitions(weave_format *self, text_stream *OUT, weave_order *wv) { - WRITE("\\smallskip\n"); -} - -@ = -void TeX::commentary_text(weave_format *self, text_stream *OUT, weave_order *wv, - text_stream *id) { +void TeX::commentary_text(text_stream *OUT, weave_order *wv, text_stream *id) { int math_mode = FALSE; for (int i=0; i < Str::len(id); i++) { switch (Str::get_at(id, i)) { @@ -610,26 +581,12 @@ void TeX::commentary_text(weave_format *self, text_stream *OUT, weave_order *wv, } } -@ = -void TeX::locale(weave_format *self, text_stream *OUT, weave_order *wv, - paragraph *par1, paragraph *par2) { - WRITE("$\\%S$%S", par1->ornament, par1->paragraph_number); - if (par2) WRITE("-%S", par2->paragraph_number); -} - -@ = -void TeX::tail(weave_format *self, text_stream *OUT, weave_order *wv, - text_stream *comment, section *S) { - WRITE("%% %S\n", comment); - WRITE("\\end\n"); -} - @ The following is called only when the language is InC, and the weave is of the special Preform grammar document. = -int TeX::preform_document(weave_format *self, text_stream *OUT, web *W, weave_order *wv, - chapter *C, section *S, source_line *L, text_stream *matter, +int TeX::preform_document(weave_format *self, text_stream *OUT, web *W, + weave_order *wv, chapter *C, section *S, source_line *L, text_stream *matter, text_stream *concluding_comment) { if (L->preform_nonterminal_defined) { preform_production_count = 0; @@ -663,9 +620,12 @@ int TeX::preform_document(weave_format *self, text_stream *OUT, web *W, weave_or @ = TEMPORARY_TEXT(problem); match_results mr = Regexp::create_mr(); - if (Regexp::match(&mr, matter, L"Issue (%c*?) problem")) Str::copy(problem, mr.exp[0]); - else if (Regexp::match(&mr, matter, L"FAIL_NONTERMINAL %+")) WRITE_TO(problem, "fail and skip"); - else if (Regexp::match(&mr, matter, L"FAIL_NONTERMINAL")) WRITE_TO(problem, "fail"); + if (Regexp::match(&mr, matter, L"Issue (%c*?) problem")) + Str::copy(problem, mr.exp[0]); + else if (Regexp::match(&mr, matter, L"FAIL_NONTERMINAL %+")) + WRITE_TO(problem, "fail and skip"); + else if (Regexp::match(&mr, matter, L"FAIL_NONTERMINAL")) + WRITE_TO(problem, "fail"); preform_production_count++; WRITE_TO(matter, "|%S|", L->text_operand); while (Regexp::match(&mr, matter, L"(%c+?)|(%c+)")) { @@ -697,284 +657,10 @@ int TeX::preform_document(weave_format *self, text_stream *OUT, web *W, weave_or else if (Str::len(concluding_comment) > 0) { WRITE(" \\hfill{\\ttninepoint\\it "); if (Str::len(concluding_comment) > 0) - TeX::commentary_text(NULL, OUT, wv, concluding_comment); -// Formats::text_comment(OUT, wv, concluding_comment); + TeX::commentary_text(OUT, wv, concluding_comment); WRITE("}"); } WRITE("\n"); DISCARD_TEXT(label); DISCARD_TEXT(problem); Regexp::dispose_of(&mr); - -@h Post-processing. - -= -void TeX::post_process_report(weave_format *self, weave_order *wv) { - RunningTeX::report_on_post_processing(wv); -} - -@ = -int TeX::post_process_substitute(weave_format *self, text_stream *OUT, - weave_order *wv, text_stream *detail, weave_pattern *pattern) { - return RunningTeX::substitute_post_processing_data(OUT, wv, detail); -} - -@h Removing math mode. -"Math mode", in TeX jargon, is what happens when a mathematical formula -is written inside dollar signs: in |Answer is $x+y^2$|, the math mode -content is |x+y^2|. 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. - -= -void TeX::remove_math_mode(OUTPUT_STREAM, text_stream *text) { - TEMPORARY_TEXT(math_matter); - TeX::remove_math_mode_range(math_matter, text, 0, Str::len(text)-1); - WRITE("%S", math_matter); - DISCARD_TEXT(math_matter); -} - -void TeX::remove_math_mode_range(OUTPUT_STREAM, text_stream *text, int from, int to) { - for (int i=from; i <= to; i++) { - @; - } - for (int i=from; i <= to; i++) { - @; - @; - } - int math_mode = FALSE; - for (int i=from; i <= to; i++) { - switch (Str::get_at(text, i)) { - case '$': - if (Str::get_at(text, i+1) == '$') i++; - math_mode = (math_mode)?FALSE:TRUE; break; - case '~': if (math_mode) WRITE(" "); else WRITE("~"); break; - case '\\': @; break; - default: PUT(Str::get_at(text, i)); break; - } - } -} - -@ Here we remove |{{top}\over{bottom}}|, converting it to |((top) / (bottom))|. - -@ = - if ((Str::get_at(text, i) == '\\') && - (Str::get_at(text, i+1) == 'o') && (Str::get_at(text, i+2) == 'v') && - (Str::get_at(text, i+3) == 'e') && (Str::get_at(text, i+4) == 'r') && - (Str::get_at(text, i+5) == '{')) { - int bl = 1; - int j = i-1; - for (; j >= from; j--) { - wchar_t c = Str::get_at(text, j); - if (c == '{') { - bl--; - if (bl == 0) break; - } - if (c == '}') bl++; - } - TeX::remove_math_mode_range(OUT, text, from, j-1); - WRITE("(("); - TeX::remove_math_mode_range(OUT, text, j+2, i-2); - WRITE(") / ("); - j=i+6; bl = 1; - for (; j <= to; j++) { - wchar_t c = Str::get_at(text, j); - if (c == '}') { - bl--; - if (bl == 0) break; - } - if (c == '{') bl++; - } - TeX::remove_math_mode_range(OUT, text, i+6, j-1); - WRITE("))"); - TeX::remove_math_mode_range(OUT, text, j+2, to); - return; - } - -@ Here we remove |{\rm text}|, converting it to |text|, and similarly |\it|. - -@ = - if ((Str::get_at(text, i) == '{') && (Str::get_at(text, i+1) == '\\') && - (((Str::get_at(text, i+2) == 'r') && (Str::get_at(text, i+3) == 'm')) || - ((Str::get_at(text, i+2) == 'i') && (Str::get_at(text, i+3) == 't'))) && - (Str::get_at(text, i+4) == ' ')) { - TeX::remove_math_mode_range(OUT, text, from, i-1); - int j=i+5; - for (; j <= to; j++) - if (Str::get_at(text, j) == '}') - break; - TeX::remove_math_mode_range(OUT, text, i+5, j-1); - TeX::remove_math_mode_range(OUT, text, j+1, to); - return; - } - -@ Here we remove |\sqrt{N}|, converting it to |sqrt(N)|. As a special case, -we also look out for |{}^3\sqrt{N}| for cube root. - -@ = - if ((Str::get_at(text, i) == '\\') && - (Str::get_at(text, i+1) == 's') && (Str::get_at(text, i+2) == 'q') && - (Str::get_at(text, i+3) == 'r') && (Str::get_at(text, i+4) == 't') && - (Str::get_at(text, i+5) == '{')) { - if ((Str::get_at(text, i-4) == '{') && - (Str::get_at(text, i-3) == '}') && - (Str::get_at(text, i-2) == '^') && - (Str::get_at(text, i-1) == '3')) { - TeX::remove_math_mode_range(OUT, text, from, i-5); - WRITE(" curt("); - } else { - TeX::remove_math_mode_range(OUT, text, from, i-1); - WRITE(" sqrt("); - } - int j=i+6, bl = 1; - for (; j <= to; j++) { - wchar_t c = Str::get_at(text, j); - if (c == '}') { - bl--; - if (bl == 0) break; - } - if (c == '{') bl++; - } - TeX::remove_math_mode_range(OUT, text, i+6, j-1); - WRITE(")"); - TeX::remove_math_mode_range(OUT, text, j+1, to); - return; - } - -@ = - TEMPORARY_TEXT(macro); - i++; - while ((i < Str::len(text)) && (Characters::isalpha(Str::get_at(text, i)))) - PUT_TO(macro, Str::get_at(text, i++)); - if (Str::eq(macro, I"not")) @ - else @; - DISCARD_TEXT(macro); - i--; - -@ = - if (Str::eq(macro, I"leq")) WRITE("<="); - else if (Str::eq(macro, I"geq")) WRITE(">="); - else if (Str::eq(macro, I"sim")) WRITE("~"); - else if (Str::eq(macro, I"hbox")) WRITE(""); - else if (Str::eq(macro, I"left")) WRITE(""); - else if (Str::eq(macro, I"right")) WRITE(""); - else if (Str::eq(macro, I"Rightarrow")) WRITE("=>"); - else if (Str::eq(macro, I"Leftrightarrow")) WRITE("<=>"); - else if (Str::eq(macro, I"to")) WRITE("-->"); - else if (Str::eq(macro, I"rightarrow")) WRITE("-->"); - else if (Str::eq(macro, I"longrightarrow")) WRITE("-->"); - else if (Str::eq(macro, I"leftarrow")) WRITE("<--"); - else if (Str::eq(macro, I"longleftarrow")) WRITE("<--"); - else if (Str::eq(macro, I"lbrace")) WRITE("{"); - else if (Str::eq(macro, I"mid")) WRITE("|"); - else if (Str::eq(macro, I"rbrace")) WRITE("}"); - else if (Str::eq(macro, I"cdot")) WRITE("."); - else if (Str::eq(macro, I"cdots")) WRITE("..."); - else if (Str::eq(macro, I"dots")) WRITE("..."); - else if (Str::eq(macro, I"times")) WRITE("*"); - else if (Str::eq(macro, I"quad")) WRITE(" "); - else if (Str::eq(macro, I"qquad")) WRITE(" "); - else if (Str::eq(macro, I"TeX")) WRITE("TeX"); - else if (Str::eq(macro, I"neq")) WRITE("!="); - else if (Str::eq(macro, I"noteq")) WRITE("!="); - else if (Str::eq(macro, I"ell")) WRITE("l"); - else if (Str::eq(macro, I"log")) WRITE("log"); - else if (Str::eq(macro, I"exp")) WRITE("exp"); - else if (Str::eq(macro, I"sin")) WRITE("sin"); - else if (Str::eq(macro, I"cos")) WRITE("cos"); - else if (Str::eq(macro, I"tan")) WRITE("tan"); - else if (Str::eq(macro, I"top")) WRITE("T"); - else if (Str::eq(macro, I"Alpha")) PUT((wchar_t) 0x0391); - else if (Str::eq(macro, I"Beta")) PUT((wchar_t) 0x0392); - else if (Str::eq(macro, I"Gamma")) PUT((wchar_t) 0x0393); - else if (Str::eq(macro, I"Delta")) PUT((wchar_t) 0x0394); - else if (Str::eq(macro, I"Epsilon")) PUT((wchar_t) 0x0395); - else if (Str::eq(macro, I"Zeta")) PUT((wchar_t) 0x0396); - else if (Str::eq(macro, I"Eta")) PUT((wchar_t) 0x0397); - else if (Str::eq(macro, I"Theta")) PUT((wchar_t) 0x0398); - else if (Str::eq(macro, I"Iota")) PUT((wchar_t) 0x0399); - else if (Str::eq(macro, I"Kappa")) PUT((wchar_t) 0x039A); - else if (Str::eq(macro, I"Lambda")) PUT((wchar_t) 0x039B); - else if (Str::eq(macro, I"Mu")) PUT((wchar_t) 0x039C); - else if (Str::eq(macro, I"Nu")) PUT((wchar_t) 0x039D); - else if (Str::eq(macro, I"Xi")) PUT((wchar_t) 0x039E); - else if (Str::eq(macro, I"Omicron")) PUT((wchar_t) 0x039F); - else if (Str::eq(macro, I"Pi")) PUT((wchar_t) 0x03A0); - else if (Str::eq(macro, I"Rho")) PUT((wchar_t) 0x03A1); - else if (Str::eq(macro, I"Varsigma")) PUT((wchar_t) 0x03A2); - else if (Str::eq(macro, I"Sigma")) PUT((wchar_t) 0x03A3); - else if (Str::eq(macro, I"Tau")) PUT((wchar_t) 0x03A4); - else if (Str::eq(macro, I"Upsilon")) PUT((wchar_t) 0x03A5); - else if (Str::eq(macro, I"Phi")) PUT((wchar_t) 0x03A6); - else if (Str::eq(macro, I"Chi")) PUT((wchar_t) 0x03A7); - else if (Str::eq(macro, I"Psi")) PUT((wchar_t) 0x03A8); - else if (Str::eq(macro, I"Omega")) PUT((wchar_t) 0x03A9); - else if (Str::eq(macro, I"alpha")) PUT((wchar_t) 0x03B1); - else if (Str::eq(macro, I"beta")) PUT((wchar_t) 0x03B2); - else if (Str::eq(macro, I"gamma")) PUT((wchar_t) 0x03B3); - else if (Str::eq(macro, I"delta")) PUT((wchar_t) 0x03B4); - else if (Str::eq(macro, I"epsilon")) PUT((wchar_t) 0x03B5); - else if (Str::eq(macro, I"zeta")) PUT((wchar_t) 0x03B6); - else if (Str::eq(macro, I"eta")) PUT((wchar_t) 0x03B7); - else if (Str::eq(macro, I"theta")) PUT((wchar_t) 0x03B8); - else if (Str::eq(macro, I"iota")) PUT((wchar_t) 0x03B9); - else if (Str::eq(macro, I"kappa")) PUT((wchar_t) 0x03BA); - else if (Str::eq(macro, I"lambda")) PUT((wchar_t) 0x03BB); - else if (Str::eq(macro, I"mu")) PUT((wchar_t) 0x03BC); - else if (Str::eq(macro, I"nu")) PUT((wchar_t) 0x03BD); - else if (Str::eq(macro, I"xi")) PUT((wchar_t) 0x03BE); - else if (Str::eq(macro, I"omicron")) PUT((wchar_t) 0x03BF); - else if (Str::eq(macro, I"pi")) PUT((wchar_t) 0x03C0); - else if (Str::eq(macro, I"rho")) PUT((wchar_t) 0x03C1); - else if (Str::eq(macro, I"varsigma")) PUT((wchar_t) 0x03C2); - else if (Str::eq(macro, I"sigma")) PUT((wchar_t) 0x03C3); - else if (Str::eq(macro, I"tau")) PUT((wchar_t) 0x03C4); - else if (Str::eq(macro, I"upsilon")) PUT((wchar_t) 0x03C5); - else if (Str::eq(macro, I"phi")) PUT((wchar_t) 0x03C6); - else if (Str::eq(macro, I"chi")) PUT((wchar_t) 0x03C7); - else if (Str::eq(macro, I"psi")) PUT((wchar_t) 0x03C8); - else if (Str::eq(macro, I"omega")) PUT((wchar_t) 0x03C9); - else if (Str::eq(macro, I"exists")) PUT((wchar_t) 0x2203); - else if (Str::eq(macro, I"in")) PUT((wchar_t) 0x2208); - else if (Str::eq(macro, I"forall")) PUT((wchar_t) 0x2200); - else if (Str::eq(macro, I"cap")) PUT((wchar_t) 0x2229); - else if (Str::eq(macro, I"emptyset")) PUT((wchar_t) 0x2205); - else if (Str::eq(macro, I"subseteq")) PUT((wchar_t) 0x2286); - else if (Str::eq(macro, I"land")) PUT((wchar_t) 0x2227); - else if (Str::eq(macro, I"lor")) PUT((wchar_t) 0x2228); - else if (Str::eq(macro, I"lnot")) PUT((wchar_t) 0x00AC); - else if (Str::eq(macro, I"sum")) PUT((wchar_t) 0x03A3); - else if (Str::eq(macro, I"prod")) PUT((wchar_t) 0x03A0); - else { - if (Str::len(macro) > 0) { - int suspect = TRUE; - LOOP_THROUGH_TEXT(pos, macro) { - wchar_t c = Str::get(pos); - if ((c >= 'A') && (c <= 'Z')) continue; - if ((c >= 'a') && (c <= 'z')) continue; - suspect = FALSE; - } - if (Str::eq(macro, I"n")) suspect = FALSE; - if (Str::eq(macro, I"t")) suspect = FALSE; - if (suspect) - PRINT("[Passing through unknown TeX macro \\%S:\n %S\n", macro, text); - } - WRITE("\\%S", macro); - } - -@ For Inform's purposes, we need to deal with just |\not\exists| and |\not\forall|. - -@ = - if (Str::get_at(text, i) == '\\') { - Str::clear(macro); - i++; - while ((i < Str::len(text)) && (Characters::isalpha(Str::get_at(text, i)))) - PUT_TO(macro, Str::get_at(text, i++)); - if (Str::eq(macro, I"exists")) PUT((wchar_t) 0x2204); - else if (Str::eq(macro, I"forall")) { PUT((wchar_t) 0x00AC); PUT((wchar_t) 0x2200); } - else { - PRINT("Don't know how to apply '\\not' to '\\%S'\n", macro); - } - } else { - PRINT("Don't know how to apply '\\not' here\n"); - } diff --git a/Chapter 5/TeX Utilities.w b/Chapter 5/TeX Utilities.w new file mode 100644 index 0000000..4e4cc47 --- /dev/null +++ b/Chapter 5/TeX Utilities.w @@ -0,0 +1,376 @@ +[TeXUtilities::] TeX Utilities. + +A few conveniences for using Inweb with TeX. + +@h Post-processing TeX console output. +Pattern commands post-processing TeX tend to run TeX-like tools in +"scrollmode", so that any errors whizz by rather than interrupting or halting +the session. Prime among errors is the "overfull hbox error", a defect of TeX +resulting from its inability to adjust letter spacing, so that it requires us +to adjust the copy to fit the margins of the page properly. (In practice we +get this here by having code lines which are too wide to display.) + +Also, TeX helpfully reports the size and page count of what it produces, and +we're not too proud to scrape that information out of the console file, besides +the error messages (which begin with an exclamation mark in column 1). + +This structure will store what we find: + += +typedef struct tex_results { + int overfull_hbox_count; + int tex_error_count; + int page_count; + int pdf_size; + struct filename *PDF_filename; + MEMORY_MANAGEMENT +} tex_results; + +@ = +tex_results *TeXUtilities::new_results(weave_order *wv, filename *CF) { + tex_results *res = CREATE(tex_results); + res->overfull_hbox_count = 0; + res->tex_error_count = 0; + res->page_count = 0; + res->pdf_size = 0; + res->PDF_filename = Filenames::set_extension(CF, I".pdf"); + return res; +} + +@ So, then, here's the function called from //Patterns// in response to +the special |PROCESS| command: + += +void TeXUtilities::post_process_weave(weave_order *wv, filename *CF) { + wv->post_processing_results = TeXUtilities::new_results(wv, CF); + TextFiles::read(CF, FALSE, + "can't open console file", TRUE, TeXUtilities::scan_console_line, NULL, + (void *) wv->post_processing_results); +} + +@ = +void TeXUtilities::scan_console_line(text_stream *line, text_file_position *tfp, + void *res_V) { + tex_results *res = (tex_results *) res_V; + match_results mr = Regexp::create_mr(); + if (Regexp::match(&mr, line, + L"Output written %c*? %((%d+) page%c*?(%d+) bytes%).")) { + res->page_count = Str::atoi(mr.exp[0], 0); + res->pdf_size = Str::atoi(mr.exp[1], 0); + } + if (Regexp::match(&mr, line, L"%c+verfull \\hbox%c+")) + res->overfull_hbox_count++; + else if (Str::get_first_char(line) == '!') { + res->tex_error_count++; + } + Regexp::dispose_of(&mr); +} + +@h Reporting. + += +void TeXUtilities::report_on_post_processing(weave_order *wv) { + tex_results *res = wv->post_processing_results; + if (res) { + PRINT(": %dpp %dK", res->page_count, res->pdf_size/1024); + if (res->overfull_hbox_count > 0) + PRINT(", %d overfull hbox(es)", res->overfull_hbox_count); + if (res->tex_error_count > 0) + PRINT(", %d error(s)", res->tex_error_count); + } +} + +@ And here are some details to do with the results of post-processing. + += +int TeXUtilities::substitute_post_processing_data(text_stream *to, weave_order *wv, + text_stream *detail) { + if (wv) { + tex_results *res = wv->post_processing_results; + if (res) { + if (Str::eq_wide_string(detail, L"PDF Size")) { + WRITE_TO(to, "%dKB", res->pdf_size/1024); + } else if (Str::eq_wide_string(detail, L"Extent")) { + WRITE_TO(to, "%dpp", res->page_count); + } else if (Str::eq_wide_string(detail, L"Leafname")) { + Str::copy(to, Filenames::get_leafname(res->PDF_filename)); + } else if (Str::eq_wide_string(detail, L"Errors")) { + Str::clear(to); + if ((res->overfull_hbox_count > 0) || (res->tex_error_count > 0)) + WRITE_TO(to, ": "); + if (res->overfull_hbox_count > 0) + WRITE_TO(to, "%d overfull line%s", + res->overfull_hbox_count, + (res->overfull_hbox_count>1)?"s":""); + if ((res->overfull_hbox_count > 0) && (res->tex_error_count > 0)) + WRITE_TO(to, ", "); + if (res->tex_error_count > 0) + WRITE_TO(to, "%d TeX error%s", + res->tex_error_count, + (res->tex_error_count>1)?"s":""); + } else return FALSE; + return TRUE; + } + } + return FALSE; +} + +@h Removing math mode. +"Math mode", in TeX jargon, is what happens when a mathematical formula +is written inside dollar signs: in |Answer is $x+y^2$|, the math mode +content is |x+y^2|. 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. + += +void TeXUtilities::remove_math_mode(OUTPUT_STREAM, text_stream *text) { + TEMPORARY_TEXT(math_matter); + TeXUtilities::remove_math_mode_range(math_matter, text, 0, Str::len(text)-1); + WRITE("%S", math_matter); + DISCARD_TEXT(math_matter); +} + +void TeXUtilities::remove_math_mode_range(OUTPUT_STREAM, text_stream *text, int from, int to) { + for (int i=from; i <= to; i++) { + @; + } + for (int i=from; i <= to; i++) { + @; + @; + } + int math_mode = FALSE; + for (int i=from; i <= to; i++) { + switch (Str::get_at(text, i)) { + case '$': + if (Str::get_at(text, i+1) == '$') i++; + math_mode = (math_mode)?FALSE:TRUE; break; + case '~': if (math_mode) WRITE(" "); else WRITE("~"); break; + case '\\': @; break; + default: PUT(Str::get_at(text, i)); break; + } + } +} + +@ Here we remove |{{top}\over{bottom}}|, converting it to |((top) / (bottom))|. + +@ = + if ((Str::get_at(text, i) == '\\') && + (Str::get_at(text, i+1) == 'o') && (Str::get_at(text, i+2) == 'v') && + (Str::get_at(text, i+3) == 'e') && (Str::get_at(text, i+4) == 'r') && + (Str::get_at(text, i+5) == '{')) { + int bl = 1; + int j = i-1; + for (; j >= from; j--) { + wchar_t c = Str::get_at(text, j); + if (c == '{') { + bl--; + if (bl == 0) break; + } + if (c == '}') bl++; + } + TeXUtilities::remove_math_mode_range(OUT, text, from, j-1); + WRITE("(("); + TeXUtilities::remove_math_mode_range(OUT, text, j+2, i-2); + WRITE(") / ("); + j=i+6; bl = 1; + for (; j <= to; j++) { + wchar_t c = Str::get_at(text, j); + if (c == '}') { + bl--; + if (bl == 0) break; + } + if (c == '{') bl++; + } + TeXUtilities::remove_math_mode_range(OUT, text, i+6, j-1); + WRITE("))"); + TeXUtilities::remove_math_mode_range(OUT, text, j+2, to); + return; + } + +@ Here we remove |{\rm text}|, converting it to |text|, and similarly |\it|. + +@ = + if ((Str::get_at(text, i) == '{') && (Str::get_at(text, i+1) == '\\') && + (((Str::get_at(text, i+2) == 'r') && (Str::get_at(text, i+3) == 'm')) || + ((Str::get_at(text, i+2) == 'i') && (Str::get_at(text, i+3) == 't'))) && + (Str::get_at(text, i+4) == ' ')) { + TeXUtilities::remove_math_mode_range(OUT, text, from, i-1); + int j=i+5; + for (; j <= to; j++) + if (Str::get_at(text, j) == '}') + break; + TeXUtilities::remove_math_mode_range(OUT, text, i+5, j-1); + TeXUtilities::remove_math_mode_range(OUT, text, j+1, to); + return; + } + +@ Here we remove |\sqrt{N}|, converting it to |sqrt(N)|. As a special case, +we also look out for |{}^3\sqrt{N}| for cube root. + +@ = + if ((Str::get_at(text, i) == '\\') && + (Str::get_at(text, i+1) == 's') && (Str::get_at(text, i+2) == 'q') && + (Str::get_at(text, i+3) == 'r') && (Str::get_at(text, i+4) == 't') && + (Str::get_at(text, i+5) == '{')) { + if ((Str::get_at(text, i-4) == '{') && + (Str::get_at(text, i-3) == '}') && + (Str::get_at(text, i-2) == '^') && + (Str::get_at(text, i-1) == '3')) { + TeXUtilities::remove_math_mode_range(OUT, text, from, i-5); + WRITE(" curt("); + } else { + TeXUtilities::remove_math_mode_range(OUT, text, from, i-1); + WRITE(" sqrt("); + } + int j=i+6, bl = 1; + for (; j <= to; j++) { + wchar_t c = Str::get_at(text, j); + if (c == '}') { + bl--; + if (bl == 0) break; + } + if (c == '{') bl++; + } + TeXUtilities::remove_math_mode_range(OUT, text, i+6, j-1); + WRITE(")"); + TeXUtilities::remove_math_mode_range(OUT, text, j+1, to); + return; + } + +@ = + TEMPORARY_TEXT(macro); + i++; + while ((i < Str::len(text)) && (Characters::isalpha(Str::get_at(text, i)))) + PUT_TO(macro, Str::get_at(text, i++)); + if (Str::eq(macro, I"not")) @ + else @; + DISCARD_TEXT(macro); + i--; + +@ = + if (Str::eq(macro, I"leq")) WRITE("<="); + else if (Str::eq(macro, I"geq")) WRITE(">="); + else if (Str::eq(macro, I"sim")) WRITE("~"); + else if (Str::eq(macro, I"hbox")) WRITE(""); + else if (Str::eq(macro, I"left")) WRITE(""); + else if (Str::eq(macro, I"right")) WRITE(""); + else if (Str::eq(macro, I"Rightarrow")) WRITE("=>"); + else if (Str::eq(macro, I"Leftrightarrow")) WRITE("<=>"); + else if (Str::eq(macro, I"to")) WRITE("-->"); + else if (Str::eq(macro, I"rightarrow")) WRITE("-->"); + else if (Str::eq(macro, I"longrightarrow")) WRITE("-->"); + else if (Str::eq(macro, I"leftarrow")) WRITE("<--"); + else if (Str::eq(macro, I"longleftarrow")) WRITE("<--"); + else if (Str::eq(macro, I"lbrace")) WRITE("{"); + else if (Str::eq(macro, I"mid")) WRITE("|"); + else if (Str::eq(macro, I"rbrace")) WRITE("}"); + else if (Str::eq(macro, I"cdot")) WRITE("."); + else if (Str::eq(macro, I"cdots")) WRITE("..."); + else if (Str::eq(macro, I"dots")) WRITE("..."); + else if (Str::eq(macro, I"times")) WRITE("*"); + else if (Str::eq(macro, I"quad")) WRITE(" "); + else if (Str::eq(macro, I"qquad")) WRITE(" "); + else if (Str::eq(macro, I"TeX")) WRITE("TeX"); + else if (Str::eq(macro, I"neq")) WRITE("!="); + else if (Str::eq(macro, I"noteq")) WRITE("!="); + else if (Str::eq(macro, I"ell")) WRITE("l"); + else if (Str::eq(macro, I"log")) WRITE("log"); + else if (Str::eq(macro, I"exp")) WRITE("exp"); + else if (Str::eq(macro, I"sin")) WRITE("sin"); + else if (Str::eq(macro, I"cos")) WRITE("cos"); + else if (Str::eq(macro, I"tan")) WRITE("tan"); + else if (Str::eq(macro, I"top")) WRITE("T"); + else if (Str::eq(macro, I"Alpha")) PUT((wchar_t) 0x0391); + else if (Str::eq(macro, I"Beta")) PUT((wchar_t) 0x0392); + else if (Str::eq(macro, I"Gamma")) PUT((wchar_t) 0x0393); + else if (Str::eq(macro, I"Delta")) PUT((wchar_t) 0x0394); + else if (Str::eq(macro, I"Epsilon")) PUT((wchar_t) 0x0395); + else if (Str::eq(macro, I"Zeta")) PUT((wchar_t) 0x0396); + else if (Str::eq(macro, I"Eta")) PUT((wchar_t) 0x0397); + else if (Str::eq(macro, I"Theta")) PUT((wchar_t) 0x0398); + else if (Str::eq(macro, I"Iota")) PUT((wchar_t) 0x0399); + else if (Str::eq(macro, I"Kappa")) PUT((wchar_t) 0x039A); + else if (Str::eq(macro, I"Lambda")) PUT((wchar_t) 0x039B); + else if (Str::eq(macro, I"Mu")) PUT((wchar_t) 0x039C); + else if (Str::eq(macro, I"Nu")) PUT((wchar_t) 0x039D); + else if (Str::eq(macro, I"Xi")) PUT((wchar_t) 0x039E); + else if (Str::eq(macro, I"Omicron")) PUT((wchar_t) 0x039F); + else if (Str::eq(macro, I"Pi")) PUT((wchar_t) 0x03A0); + else if (Str::eq(macro, I"Rho")) PUT((wchar_t) 0x03A1); + else if (Str::eq(macro, I"Varsigma")) PUT((wchar_t) 0x03A2); + else if (Str::eq(macro, I"Sigma")) PUT((wchar_t) 0x03A3); + else if (Str::eq(macro, I"Tau")) PUT((wchar_t) 0x03A4); + else if (Str::eq(macro, I"Upsilon")) PUT((wchar_t) 0x03A5); + else if (Str::eq(macro, I"Phi")) PUT((wchar_t) 0x03A6); + else if (Str::eq(macro, I"Chi")) PUT((wchar_t) 0x03A7); + else if (Str::eq(macro, I"Psi")) PUT((wchar_t) 0x03A8); + else if (Str::eq(macro, I"Omega")) PUT((wchar_t) 0x03A9); + else if (Str::eq(macro, I"alpha")) PUT((wchar_t) 0x03B1); + else if (Str::eq(macro, I"beta")) PUT((wchar_t) 0x03B2); + else if (Str::eq(macro, I"gamma")) PUT((wchar_t) 0x03B3); + else if (Str::eq(macro, I"delta")) PUT((wchar_t) 0x03B4); + else if (Str::eq(macro, I"epsilon")) PUT((wchar_t) 0x03B5); + else if (Str::eq(macro, I"zeta")) PUT((wchar_t) 0x03B6); + else if (Str::eq(macro, I"eta")) PUT((wchar_t) 0x03B7); + else if (Str::eq(macro, I"theta")) PUT((wchar_t) 0x03B8); + else if (Str::eq(macro, I"iota")) PUT((wchar_t) 0x03B9); + else if (Str::eq(macro, I"kappa")) PUT((wchar_t) 0x03BA); + else if (Str::eq(macro, I"lambda")) PUT((wchar_t) 0x03BB); + else if (Str::eq(macro, I"mu")) PUT((wchar_t) 0x03BC); + else if (Str::eq(macro, I"nu")) PUT((wchar_t) 0x03BD); + else if (Str::eq(macro, I"xi")) PUT((wchar_t) 0x03BE); + else if (Str::eq(macro, I"omicron")) PUT((wchar_t) 0x03BF); + else if (Str::eq(macro, I"pi")) PUT((wchar_t) 0x03C0); + else if (Str::eq(macro, I"rho")) PUT((wchar_t) 0x03C1); + else if (Str::eq(macro, I"varsigma")) PUT((wchar_t) 0x03C2); + else if (Str::eq(macro, I"sigma")) PUT((wchar_t) 0x03C3); + else if (Str::eq(macro, I"tau")) PUT((wchar_t) 0x03C4); + else if (Str::eq(macro, I"upsilon")) PUT((wchar_t) 0x03C5); + else if (Str::eq(macro, I"phi")) PUT((wchar_t) 0x03C6); + else if (Str::eq(macro, I"chi")) PUT((wchar_t) 0x03C7); + else if (Str::eq(macro, I"psi")) PUT((wchar_t) 0x03C8); + else if (Str::eq(macro, I"omega")) PUT((wchar_t) 0x03C9); + else if (Str::eq(macro, I"exists")) PUT((wchar_t) 0x2203); + else if (Str::eq(macro, I"in")) PUT((wchar_t) 0x2208); + else if (Str::eq(macro, I"forall")) PUT((wchar_t) 0x2200); + else if (Str::eq(macro, I"cap")) PUT((wchar_t) 0x2229); + else if (Str::eq(macro, I"emptyset")) PUT((wchar_t) 0x2205); + else if (Str::eq(macro, I"subseteq")) PUT((wchar_t) 0x2286); + else if (Str::eq(macro, I"land")) PUT((wchar_t) 0x2227); + else if (Str::eq(macro, I"lor")) PUT((wchar_t) 0x2228); + else if (Str::eq(macro, I"lnot")) PUT((wchar_t) 0x00AC); + else if (Str::eq(macro, I"sum")) PUT((wchar_t) 0x03A3); + else if (Str::eq(macro, I"prod")) PUT((wchar_t) 0x03A0); + else { + if (Str::len(macro) > 0) { + int suspect = TRUE; + LOOP_THROUGH_TEXT(pos, macro) { + wchar_t c = Str::get(pos); + if ((c >= 'A') && (c <= 'Z')) continue; + if ((c >= 'a') && (c <= 'z')) continue; + suspect = FALSE; + } + if (Str::eq(macro, I"n")) suspect = FALSE; + if (Str::eq(macro, I"t")) suspect = FALSE; + if (suspect) + PRINT("[Passing through unknown TeX macro \\%S:\n %S\n", macro, text); + } + WRITE("\\%S", macro); + } + +@ For Inform's purposes, we need to deal with just |\not\exists| and |\not\forall|. + +@ = + if (Str::get_at(text, i) == '\\') { + Str::clear(macro); + i++; + while ((i < Str::len(text)) && (Characters::isalpha(Str::get_at(text, i)))) + PUT_TO(macro, Str::get_at(text, i++)); + if (Str::eq(macro, I"exists")) PUT((wchar_t) 0x2204); + else if (Str::eq(macro, I"forall")) { PUT((wchar_t) 0x00AC); PUT((wchar_t) 0x2200); } + else { + PRINT("Don't know how to apply '\\not' to '\\%S'\n", macro); + } + } else { + PRINT("Don't know how to apply '\\not' here\n"); + } diff --git a/Contents.w b/Contents.w index fd7297e..5fc31a4 100644 --- a/Contents.w +++ b/Contents.w @@ -71,7 +71,7 @@ Chapter 5: Formats HTML Formats Debugging Format Weave Plugins - Running Through TeX + TeX Utilities Chapter 6: Extras "Additional features for turning webs into open-source projects." diff --git a/Patterns/PDFTeX/pattern.txt b/Patterns/PDFTeX/pattern.txt index 869fca1..b1cdd17 100644 --- a/Patterns/PDFTeX/pattern.txt +++ b/Patterns/PDFTeX/pattern.txt @@ -4,5 +4,3 @@ command: pdftex -output-directory=WOVENPATH -interaction=scrollmode WOVEN.tex >W command: PROCESS WOVEN.log command: rm WOVEN.log command: rm WOVEN.console -command: bbedit WOVEN.tex -command: open WOVEN.pdf diff --git a/Tangled/inweb.c b/Tangled/inweb.c index 343aee5..4b0fe3f 100644 --- a/Tangled/inweb.c +++ b/Tangled/inweb.c @@ -994,16 +994,16 @@ void __stdcall LeaveCriticalSection(struct Win32_Critical_Section* cs); #define BEGIN_WEAVING_FOR_MTID 36 #define END_WEAVING_FOR_MTID 37 #define RENDER_FOR_MTID 38 -#define CHAPTER_TP_FOR_MTID 39 -#define PREFORM_DOCUMENT_FOR_MTID 40 -#define POST_PROCESS_POS_MTID 41 -#define POST_PROCESS_REPORT_POS_MTID 42 -#define POST_PROCESS_SUBSTITUTE_POS_MTID 43 +#define PREFORM_DOCUMENT_FOR_MTID 39 +#define POST_PROCESS_POS_MTID 40 +#define POST_PROCESS_REPORT_POS_MTID 41 +#define POST_PROCESS_SUBSTITUTE_POS_MTID 42 +#define PDFTEX_TEX_FORM 1 #define NO_DEFINED_CLSW_VALUES 35 #define NO_DEFINED_DA_VALUES 4 #define NO_DEFINED_MT_VALUES 115 #define NO_DEFINED_MREASON_VALUES 5 -#define NO_DEFINED_MTID_VALUES 43 +#define NO_DEFINED_MTID_VALUES 42 #define NO_DEFINED_CLSF_VALUES 5 #define NO_DEFINED_CLSG_VALUES 7 #define NO_DEFINED_SEMVERPART_VALUES 3 @@ -1016,6 +1016,7 @@ void __stdcall LeaveCriticalSection(struct Win32_Critical_Section* cs); #define NO_DEFINED_CMD_VALUES 12 #define NO_DEFINED_SECTIONCAT_VALUES 3 #define NO_DEFINED_MATERIAL_VALUES 6 +#define NO_DEFINED_FORM_VALUES 1 #line 41 "inweb/foundation-module/Chapter 2/Debugging Log.w" typedef struct debugging_aspect { struct text_stream *hyphenated_name; /* e.g., "memory-usage" */ @@ -2138,17 +2139,16 @@ typedef struct weave_format { METHOD_CALLS MEMORY_MANAGEMENT } weave_format; -#line 19 "inweb/Chapter 5/Plain Text Format.w" +#line 18 "inweb/Chapter 5/Plain Text Format.w" typedef struct PlainText_render_state { struct text_stream *OUT; struct weave_order *wv; } PlainText_render_state; -#line 37 "inweb/Chapter 5/TeX Format.w" +#line 33 "inweb/Chapter 5/TeX Format.w" typedef struct TeX_render_state { struct text_stream *OUT; struct weave_order *wv; - int as_DVI; - int as_PDF; + int TeX_form; } TeX_render_state; #line 29 "inweb/Chapter 5/HTML Formats.w" typedef struct HTML_render_state { @@ -2181,7 +2181,7 @@ typedef struct colour_scheme { int last_included_in_round; MEMORY_MANAGEMENT } colour_scheme; -#line 33 "inweb/Chapter 5/Running Through TeX.w" +#line 20 "inweb/Chapter 5/TeX Utilities.w" typedef struct tex_results { int overfull_hbox_count; int tex_error_count; @@ -4045,74 +4045,40 @@ int Formats__begin_weaving(web *W, weave_pattern *pattern) ; void Formats__end_weaving(web *W, weave_pattern *pattern) ; #line 95 "inweb/Chapter 5/Format Methods.w" void Formats__render(text_stream *OUT, heterogeneous_tree *tree, filename *into) ; -#line 118 "inweb/Chapter 5/Format Methods.w" -void Formats__chapter_title_page(OUTPUT_STREAM, weave_order *wv, chapter *C) ; -#line 133 "inweb/Chapter 5/Format Methods.w" +#line 120 "inweb/Chapter 5/Format Methods.w" int Formats__preform_document(OUTPUT_STREAM, weave_order *wv, web *W, chapter *C, section *S, source_line *L, text_stream *matter, text_stream *concluding_comment) ; -#line 152 "inweb/Chapter 5/Format Methods.w" +#line 139 "inweb/Chapter 5/Format Methods.w" void Formats__post_process_weave(weave_order *wv, int open_afterwards) ; -#line 164 "inweb/Chapter 5/Format Methods.w" +#line 151 "inweb/Chapter 5/Format Methods.w" void Formats__report_on_post_processing(weave_order *wv) ; -#line 177 "inweb/Chapter 5/Format Methods.w" +#line 164 "inweb/Chapter 5/Format Methods.w" int Formats__substitute_post_processing_data(OUTPUT_STREAM, weave_order *wv, text_stream *detail, weave_pattern *pattern) ; #line 9 "inweb/Chapter 5/Plain Text Format.w" void PlainText__create(void) ; -#line 24 "inweb/Chapter 5/Plain Text Format.w" +#line 23 "inweb/Chapter 5/Plain Text Format.w" void PlainText__render(weave_format *self, text_stream *OUT, heterogeneous_tree *tree) ; -#line 32 "inweb/Chapter 5/Plain Text Format.w" +#line 31 "inweb/Chapter 5/Plain Text Format.w" int PlainText__render_visit(tree_node *N, void *state, int L) ; -#line 221 "inweb/Chapter 5/Plain Text Format.w" -void PlainText__chapter_title_page(weave_format *self, text_stream *OUT, weave_order *wv, chapter *C) ; #line 9 "inweb/Chapter 5/TeX Format.w" void TeX__create(void) ; -#line 44 "inweb/Chapter 5/TeX Format.w" +#line 25 "inweb/Chapter 5/TeX Format.w" void TeX__render_TeX(weave_format *self, text_stream *OUT, heterogeneous_tree *tree) ; -#line 47 "inweb/Chapter 5/TeX Format.w" -void TeX__render_DVI(weave_format *self, text_stream *OUT, heterogeneous_tree *tree) ; -#line 50 "inweb/Chapter 5/TeX Format.w" -void TeX__render_PDF(weave_format *self, text_stream *OUT, heterogeneous_tree *tree) ; -#line 54 "inweb/Chapter 5/TeX Format.w" -void TeX__render_inner(weave_format *self, text_stream *OUT, heterogeneous_tree *tree, int as_dvi, int as_pdf) ; -#line 64 "inweb/Chapter 5/TeX Format.w" +#line 39 "inweb/Chapter 5/TeX Format.w" +void TeX__render_inner(text_stream *OUT, heterogeneous_tree *tree, int form) ; +#line 51 "inweb/Chapter 5/TeX Format.w" int TeX__render_visit(tree_node *N, void *state, int L) ; -#line 361 "inweb/Chapter 5/TeX Format.w" -int TeX__yes(weave_format *self, weave_order *wv) ; -#line 366 "inweb/Chapter 5/TeX Format.w" -void TeX__subheading(weave_format *self, text_stream *OUT, weave_order *wv, int level, text_stream *comment, text_stream *head) ; -#line 382 "inweb/Chapter 5/TeX Format.w" -void TeX__toc(weave_format *self, text_stream *OUT, weave_order *wv, int stage, text_stream *text1, text_stream *text2, paragraph *P) ; -#line 401 "inweb/Chapter 5/TeX Format.w" -void TeX__chapter_title_page(weave_format *self, text_stream *OUT, weave_order *wv, chapter *C) ; -#line 414 "inweb/Chapter 5/TeX Format.w" -void TeX__paragraph_heading(weave_format *self, text_stream *OUT, weave_order *wv, section *S, paragraph *P, text_stream *heading_text, int weight, int no_skip) ; -#line 511 "inweb/Chapter 5/TeX Format.w" -void TeX__source_code(weave_format *self, text_stream *OUT, weave_order *wv, text_stream *matter, text_stream *colouring, int starts) ; -#line 536 "inweb/Chapter 5/TeX Format.w" +#line 397 "inweb/Chapter 5/TeX Format.w" +void TeX__paragraph_heading(text_stream *OUT, weave_order *wv, section *S, paragraph *P, text_stream *heading_text, int weight, int no_skip) ; +#line 494 "inweb/Chapter 5/TeX Format.w" +void TeX__source_code(text_stream *OUT, weave_order *wv, text_stream *matter, text_stream *colouring, int starts) ; +#line 520 "inweb/Chapter 5/TeX Format.w" void TeX__change_colour_PDF(text_stream *OUT, int col, int in_code) ; -#line 559 "inweb/Chapter 5/TeX Format.w" -void TeX__para_macro_PDF_1(weave_format *self, text_stream *OUT, weave_order *wv, para_macro *pmac, int defn) ; -#line 562 "inweb/Chapter 5/TeX Format.w" -void TeX__para_macro(weave_format *self, text_stream *OUT, weave_order *wv, para_macro *pmac, int defn) ; -#line 581 "inweb/Chapter 5/TeX Format.w" -void TeX__para_macro_PDF_2(weave_format *self, text_stream *OUT, weave_order *wv, para_macro *pmac, int defn) ; -#line 586 "inweb/Chapter 5/TeX Format.w" -void TeX__after_definitions(weave_format *self, text_stream *OUT, weave_order *wv) ; -#line 591 "inweb/Chapter 5/TeX Format.w" -void TeX__commentary_text(weave_format *self, text_stream *OUT, weave_order *wv, text_stream *id) ; -#line 614 "inweb/Chapter 5/TeX Format.w" -void TeX__locale(weave_format *self, text_stream *OUT, weave_order *wv, paragraph *par1, paragraph *par2) ; -#line 621 "inweb/Chapter 5/TeX Format.w" -void TeX__tail(weave_format *self, text_stream *OUT, weave_order *wv, text_stream *comment, section *S) ; -#line 631 "inweb/Chapter 5/TeX Format.w" -int TeX__preform_document(weave_format *self, text_stream *OUT, web *W, weave_order *wv, chapter *C, section *S, source_line *L, text_stream *matter, text_stream *concluding_comment) ; -#line 712 "inweb/Chapter 5/TeX Format.w" -void TeX__post_process_report(weave_format *self, weave_order *wv) ; -#line 717 "inweb/Chapter 5/TeX Format.w" -int TeX__post_process_substitute(weave_format *self, text_stream *OUT, weave_order *wv, text_stream *detail, weave_pattern *pattern) ; -#line 730 "inweb/Chapter 5/TeX Format.w" -void TeX__remove_math_mode(OUTPUT_STREAM, text_stream *text) ; -#line 737 "inweb/Chapter 5/TeX Format.w" -void TeX__remove_math_mode_range(OUTPUT_STREAM, text_stream *text, int from, int to) ; +#line 543 "inweb/Chapter 5/TeX Format.w" +void TeX__para_macro(text_stream *OUT, weave_order *wv, para_macro *pmac, int defn) ; +#line 563 "inweb/Chapter 5/TeX Format.w" +void TeX__commentary_text(text_stream *OUT, weave_order *wv, text_stream *id) ; +#line 588 "inweb/Chapter 5/TeX Format.w" +int TeX__preform_document(weave_format *self, text_stream *OUT, web *W, weave_order *wv, chapter *C, section *S, source_line *L, text_stream *matter, text_stream *concluding_comment) ; #line 9 "inweb/Chapter 5/HTML Formats.w" void HTMLFormat__create(void) ; #line 44 "inweb/Chapter 5/HTML Formats.w" @@ -4163,14 +4129,20 @@ void WeavePlugins__include_colour_scheme(OUTPUT_STREAM, web *W, colour_scheme * void WeavePlugins__include_CSS_file(OUTPUT_STREAM, web *W, filename *F, text_stream *css, text_stream *trans, weave_pattern *pattern, filename *from) ; #line 206 "inweb/Chapter 5/Weave Plugins.w" void WeavePlugins__include_TeX_macros(OUTPUT_STREAM, web *W, filename *F, text_stream *css, text_stream *trans, weave_pattern *pattern, filename *from) ; -#line 22 "inweb/Chapter 5/Running Through TeX.w" -void RunningTeX__post_process_weave(weave_order *wv, filename *CF) ; -#line 59 "inweb/Chapter 5/Running Through TeX.w" -void RunningTeX__scan_console_line(text_stream *line, text_file_position *tfp, void *res_V) ; -#line 79 "inweb/Chapter 5/Running Through TeX.w" -void RunningTeX__report_on_post_processing(weave_order *wv) ; -#line 93 "inweb/Chapter 5/Running Through TeX.w" -int RunningTeX__substitute_post_processing_data(text_stream *to, weave_order *wv, text_stream *detail) ; +#line 30 "inweb/Chapter 5/TeX Utilities.w" +tex_results * TeXUtilities__new_results(weave_order *wv, filename *CF) ; +#line 44 "inweb/Chapter 5/TeX Utilities.w" +void TeXUtilities__post_process_weave(weave_order *wv, filename *CF) ; +#line 52 "inweb/Chapter 5/TeX Utilities.w" +void TeXUtilities__scan_console_line(text_stream *line, text_file_position *tfp, void *res_V) ; +#line 72 "inweb/Chapter 5/TeX Utilities.w" +void TeXUtilities__report_on_post_processing(weave_order *wv) ; +#line 86 "inweb/Chapter 5/TeX Utilities.w" +int TeXUtilities__substitute_post_processing_data(text_stream *to, weave_order *wv, text_stream *detail) ; +#line 126 "inweb/Chapter 5/TeX Utilities.w" +void TeXUtilities__remove_math_mode(OUTPUT_STREAM, text_stream *text) ; +#line 133 "inweb/Chapter 5/TeX Utilities.w" +void TeXUtilities__remove_math_mode_range(OUTPUT_STREAM, text_stream *text, int from, int to) ; #line 24 "inweb/Chapter 6/Makefiles.w" void Makefiles__write(web *W, filename *prototype, filename *F, module_search *I) ; #line 49 "inweb/Chapter 6/Makefiles.w" @@ -4840,9 +4812,6 @@ text_stream *TL_IS_588 = NULL; text_stream *TL_IS_589 = NULL; text_stream *TL_IS_590 = NULL; text_stream *TL_IS_591 = NULL; -text_stream *TL_IS_592 = NULL; -text_stream *TL_IS_593 = NULL; -text_stream *TL_IS_594 = NULL; void register_tangled_text_literals(void); #line 57 "inweb/foundation-module/Chapter 2/Streams.w" #define WRITE(args...) Writers__printf(OUT, args) @@ -15458,7 +15427,7 @@ void Patterns__post_process(weave_pattern *pattern, weave_order *wv, int verbose } else PUT_TO(cmd, Str__get_at(T, i)); } if ((Str__includes_at(cmd, 0, TL_IS_143)) && (last_F)) { - RunningTeX__post_process_weave(wv, last_F); + TeXUtilities__post_process_weave(wv, last_F); } else { if (verbosely) PRINT("(%S)\n", cmd); int rv = Shell__run(cmd); @@ -23776,15 +23745,6 @@ void Formats__render(text_stream *OUT, heterogeneous_tree *tree, filename *into) #line 115 "inweb/Chapter 5/Format Methods.w" #line 117 "inweb/Chapter 5/Format Methods.w" -VMETHOD_TYPE(CHAPTER_TP_FOR_MTID, weave_format *wf, text_stream *OUT, weave_order *wv, chapter *C) -void Formats__chapter_title_page(OUTPUT_STREAM, weave_order *wv, chapter *C) { - weave_format *wf = wv->format; - VMETHOD_CALL(wf, CHAPTER_TP_FOR_MTID, OUT, wv, C); -} - -#line 128 "inweb/Chapter 5/Format Methods.w" - -#line 130 "inweb/Chapter 5/Format Methods.w" IMETHOD_TYPE(PREFORM_DOCUMENT_FOR_MTID, weave_format *wf, text_stream *OUT, weave_order *wv, web *W, chapter *C, section *S, source_line *L, text_stream *matter, text_stream *concluding_comment) @@ -23798,31 +23758,31 @@ int Formats__preform_document(OUTPUT_STREAM, weave_order *wv, web *W, return rv; } -#line 149 "inweb/Chapter 5/Format Methods.w" +#line 136 "inweb/Chapter 5/Format Methods.w" -#line 151 "inweb/Chapter 5/Format Methods.w" +#line 138 "inweb/Chapter 5/Format Methods.w" VMETHOD_TYPE(POST_PROCESS_POS_MTID, weave_format *wf, weave_order *wv, int open_afterwards) void Formats__post_process_weave(weave_order *wv, int open_afterwards) { VMETHOD_CALL(wv->format, POST_PROCESS_POS_MTID, wv, open_afterwards); } -#line 161 "inweb/Chapter 5/Format Methods.w" +#line 148 "inweb/Chapter 5/Format Methods.w" -#line 163 "inweb/Chapter 5/Format Methods.w" +#line 150 "inweb/Chapter 5/Format Methods.w" VMETHOD_TYPE(POST_PROCESS_REPORT_POS_MTID, weave_format *wf, weave_order *wv) void Formats__report_on_post_processing(weave_order *wv) { - RunningTeX__report_on_post_processing(wv); + TeXUtilities__report_on_post_processing(wv); VMETHOD_CALL(wv->format, POST_PROCESS_REPORT_POS_MTID, wv); } -#line 173 "inweb/Chapter 5/Format Methods.w" +#line 160 "inweb/Chapter 5/Format Methods.w" -#line 175 "inweb/Chapter 5/Format Methods.w" +#line 162 "inweb/Chapter 5/Format Methods.w" IMETHOD_TYPE(POST_PROCESS_SUBSTITUTE_POS_MTID, weave_format *wf, text_stream *OUT, weave_order *wv, text_stream *detail, weave_pattern *pattern) int Formats__substitute_post_processing_data(OUTPUT_STREAM, weave_order *wv, text_stream *detail, weave_pattern *pattern) { - int rv = RunningTeX__substitute_post_processing_data(OUT, wv, detail); + int rv = TeXUtilities__substitute_post_processing_data(OUT, wv, detail); IMETHOD_CALL(rv, wv->format, POST_PROCESS_SUBSTITUTE_POS_MTID, OUT, wv, detail, pattern); return rv; } @@ -23831,10 +23791,9 @@ int Formats__substitute_post_processing_data(OUTPUT_STREAM, weave_order *wv, void PlainText__create(void) { weave_format *wf = Formats__create_weave_format(TL_IS_398, TL_IS_399); METHOD_ADD(wf, RENDER_FOR_MTID, PlainText__render); - METHOD_ADD(wf, CHAPTER_TP_FOR_MTID, PlainText__chapter_title_page); } -#line 23 "inweb/Chapter 5/Plain Text Format.w" +#line 22 "inweb/Chapter 5/Plain Text Format.w" void PlainText__render(weave_format *self, text_stream *OUT, heterogeneous_tree *tree) { PlainText_render_state prs; @@ -23847,50 +23806,41 @@ void PlainText__render(weave_format *self, text_stream *OUT, heterogeneous_tree int PlainText__render_visit(tree_node *N, void *state, int L) { PlainText_render_state *prs = (PlainText_render_state *) state; text_stream *OUT = prs->OUT; - if (N->type == weave_document_node_type) + if ((N->type == weave_document_node_type) || + (N->type == weave_head_node_type) || + (N->type == weave_body_node_type) || + (N->type == weave_tail_node_type) || + (N->type == weave_chapter_title_page_node_type) || + (N->type == weave_chapter_footer_node_type) || + (N->type == weave_figure_node_type) || + (N->type == weave_audio_node_type) || + (N->type == weave_material_node_type) || + (N->type == weave_chapter_node_type) || + (N->type == weave_carousel_slide_node_type) || + (N->type == weave_toc_node_type) || + (N->type == weave_toc_line_node_type) || + (N->type == weave_grammar_index_node_type) || + (N->type == weave_inline_node_type)) { -#line 132 "inweb/Chapter 5/Plain Text Format.w" +#line 133 "inweb/Chapter 5/Plain Text Format.w" ; } -#line 35 "inweb/Chapter 5/Plain Text Format.w" +#line 48 "inweb/Chapter 5/Plain Text Format.w" - else if (N->type == weave_head_node_type) -{ -#line 132 "inweb/Chapter 5/Plain Text Format.w" - ; - -} -#line 36 "inweb/Chapter 5/Plain Text Format.w" - - else if (N->type == weave_body_node_type) -{ -#line 132 "inweb/Chapter 5/Plain Text Format.w" - ; - -} -#line 37 "inweb/Chapter 5/Plain Text Format.w" - - else if (N->type == weave_tail_node_type) -{ -#line 132 "inweb/Chapter 5/Plain Text Format.w" - ; - -} -#line 38 "inweb/Chapter 5/Plain Text Format.w" else if (N->type == weave_verbatim_node_type) { -#line 128 "inweb/Chapter 5/Plain Text Format.w" +#line 129 "inweb/Chapter 5/Plain Text Format.w" weave_verbatim_node *C = RETRIEVE_POINTER_weave_verbatim_node(N->content); WRITE("%S", C->content); } -#line 39 "inweb/Chapter 5/Plain Text Format.w" +#line 50 "inweb/Chapter 5/Plain Text Format.w" else if (N->type == weave_chapter_header_node_type) { -#line 83 "inweb/Chapter 5/Plain Text Format.w" +#line 84 "inweb/Chapter 5/Plain Text Format.w" weave_chapter_header_node *C = RETRIEVE_POINTER_weave_chapter_header_node(N->content); WRITE("%S\n\n", C->chap->md->ch_title); section *S; @@ -23900,78 +23850,70 @@ int PlainText__render_visit(tree_node *N, void *state, int L) { WRITE("\n"); } -#line 40 "inweb/Chapter 5/Plain Text Format.w" - - else if (N->type == weave_chapter_footer_node_type) -{ -#line 132 "inweb/Chapter 5/Plain Text Format.w" - ; - -} -#line 41 "inweb/Chapter 5/Plain Text Format.w" +#line 51 "inweb/Chapter 5/Plain Text Format.w" else if (N->type == weave_section_header_node_type) { -#line 92 "inweb/Chapter 5/Plain Text Format.w" +#line 93 "inweb/Chapter 5/Plain Text Format.w" weave_section_header_node *C = RETRIEVE_POINTER_weave_section_header_node(N->content); WRITE("%S\n\n", C->sect->md->sect_title); } -#line 42 "inweb/Chapter 5/Plain Text Format.w" +#line 52 "inweb/Chapter 5/Plain Text Format.w" else if (N->type == weave_section_footer_node_type) { -#line 96 "inweb/Chapter 5/Plain Text Format.w" +#line 97 "inweb/Chapter 5/Plain Text Format.w" WRITE("\n\n"); } -#line 43 "inweb/Chapter 5/Plain Text Format.w" +#line 53 "inweb/Chapter 5/Plain Text Format.w" else if (N->type == weave_section_purpose_node_type) { -#line 99 "inweb/Chapter 5/Plain Text Format.w" +#line 100 "inweb/Chapter 5/Plain Text Format.w" weave_section_purpose_node *C = RETRIEVE_POINTER_weave_section_purpose_node(N->content); WRITE("%S\n\n", C->purpose); } -#line 44 "inweb/Chapter 5/Plain Text Format.w" +#line 54 "inweb/Chapter 5/Plain Text Format.w" else if (N->type == weave_subheading_node_type) { -#line 103 "inweb/Chapter 5/Plain Text Format.w" +#line 104 "inweb/Chapter 5/Plain Text Format.w" weave_subheading_node *C = RETRIEVE_POINTER_weave_subheading_node(N->content); WRITE("%S\n\n", C->text); } -#line 45 "inweb/Chapter 5/Plain Text Format.w" +#line 55 "inweb/Chapter 5/Plain Text Format.w" else if (N->type == weave_bar_node_type) { -#line 107 "inweb/Chapter 5/Plain Text Format.w" +#line 108 "inweb/Chapter 5/Plain Text Format.w" WRITE("\n----------------------------------------------------------------------\n\n"); } -#line 46 "inweb/Chapter 5/Plain Text Format.w" +#line 56 "inweb/Chapter 5/Plain Text Format.w" else if (N->type == weave_pagebreak_node_type) { -#line 110 "inweb/Chapter 5/Plain Text Format.w" +#line 111 "inweb/Chapter 5/Plain Text Format.w" ; } -#line 47 "inweb/Chapter 5/Plain Text Format.w" +#line 57 "inweb/Chapter 5/Plain Text Format.w" else if (N->type == weave_linebreak_node_type) { -#line 113 "inweb/Chapter 5/Plain Text Format.w" +#line 114 "inweb/Chapter 5/Plain Text Format.w" WRITE("\n"); } -#line 48 "inweb/Chapter 5/Plain Text Format.w" +#line 58 "inweb/Chapter 5/Plain Text Format.w" else if (N->type == weave_paragraph_heading_node_type) { -#line 116 "inweb/Chapter 5/Plain Text Format.w" +#line 117 "inweb/Chapter 5/Plain Text Format.w" weave_paragraph_heading_node *C = RETRIEVE_POINTER_weave_paragraph_heading_node(N->content); WRITE("\n"); WRITE("%S%S", C->para->ornament, C->para->paragraph_number); @@ -23979,252 +23921,171 @@ int PlainText__render_visit(tree_node *N, void *state, int L) { WRITE(". "); } -#line 49 "inweb/Chapter 5/Plain Text Format.w" +#line 59 "inweb/Chapter 5/Plain Text Format.w" else if (N->type == weave_endnote_node_type) { -#line 123 "inweb/Chapter 5/Plain Text Format.w" +#line 124 "inweb/Chapter 5/Plain Text Format.w" { -#line 217 "inweb/Chapter 5/Plain Text Format.w" +#line 214 "inweb/Chapter 5/Plain Text Format.w" for (tree_node *M = N->child; M; M = M->next) Trees__traverse_from(M, &PlainText__render_visit, (void *) prs, L+1); } -#line 123 "inweb/Chapter 5/Plain Text Format.w" +#line 124 "inweb/Chapter 5/Plain Text Format.w" ; WRITE("\n"); return FALSE; } -#line 50 "inweb/Chapter 5/Plain Text Format.w" - - else if (N->type == weave_figure_node_type) -{ -#line 132 "inweb/Chapter 5/Plain Text Format.w" - ; - -} -#line 51 "inweb/Chapter 5/Plain Text Format.w" - - else if (N->type == weave_audio_node_type) -{ -#line 132 "inweb/Chapter 5/Plain Text Format.w" - ; - -} -#line 52 "inweb/Chapter 5/Plain Text Format.w" - - else if (N->type == weave_material_node_type) -{ -#line 132 "inweb/Chapter 5/Plain Text Format.w" - ; - -} -#line 53 "inweb/Chapter 5/Plain Text Format.w" +#line 60 "inweb/Chapter 5/Plain Text Format.w" else if (N->type == weave_embed_node_type) { -#line 135 "inweb/Chapter 5/Plain Text Format.w" +#line 136 "inweb/Chapter 5/Plain Text Format.w" weave_embed_node *C = RETRIEVE_POINTER_weave_embed_node(N->content); WRITE("[See %S video with ID %S.]\n", C->service, C->ID); } -#line 54 "inweb/Chapter 5/Plain Text Format.w" +#line 61 "inweb/Chapter 5/Plain Text Format.w" else if (N->type == weave_pmac_node_type) { -#line 139 "inweb/Chapter 5/Plain Text Format.w" +#line 140 "inweb/Chapter 5/Plain Text Format.w" weave_pmac_node *C = RETRIEVE_POINTER_weave_pmac_node(N->content); WRITE("<%S (%S)>%s", C->pmac->macro_name, C->pmac->defining_paragraph->paragraph_number, (C->defn)?" =":""); } -#line 55 "inweb/Chapter 5/Plain Text Format.w" +#line 62 "inweb/Chapter 5/Plain Text Format.w" else if (N->type == weave_vskip_node_type) { -#line 145 "inweb/Chapter 5/Plain Text Format.w" +#line 146 "inweb/Chapter 5/Plain Text Format.w" WRITE("\n"); } -#line 56 "inweb/Chapter 5/Plain Text Format.w" - - else if (N->type == weave_chapter_node_type) -{ -#line 132 "inweb/Chapter 5/Plain Text Format.w" - ; - -} -#line 57 "inweb/Chapter 5/Plain Text Format.w" +#line 63 "inweb/Chapter 5/Plain Text Format.w" else if (N->type == weave_section_node_type) { -#line 148 "inweb/Chapter 5/Plain Text Format.w" +#line 149 "inweb/Chapter 5/Plain Text Format.w" weave_section_node *C = RETRIEVE_POINTER_weave_section_node(N->content); LOG("It was %d\n", C->allocation_id); } -#line 58 "inweb/Chapter 5/Plain Text Format.w" +#line 64 "inweb/Chapter 5/Plain Text Format.w" else if (N->type == weave_code_line_node_type) { -#line 152 "inweb/Chapter 5/Plain Text Format.w" +#line 153 "inweb/Chapter 5/Plain Text Format.w" for (tree_node *M = N->child; M; M = M->next) Trees__traverse_from(M, &PlainText__render_visit, (void *) prs, L+1); WRITE("\n"); return FALSE; } -#line 59 "inweb/Chapter 5/Plain Text Format.w" +#line 65 "inweb/Chapter 5/Plain Text Format.w" else if (N->type == weave_function_usage_node_type) { -#line 158 "inweb/Chapter 5/Plain Text Format.w" +#line 159 "inweb/Chapter 5/Plain Text Format.w" weave_function_usage_node *C = RETRIEVE_POINTER_weave_function_usage_node(N->content); WRITE("%S", C->fn->function_name); return FALSE; } -#line 60 "inweb/Chapter 5/Plain Text Format.w" +#line 66 "inweb/Chapter 5/Plain Text Format.w" else if (N->type == weave_commentary_node_type) { -#line 163 "inweb/Chapter 5/Plain Text Format.w" +#line 164 "inweb/Chapter 5/Plain Text Format.w" weave_commentary_node *C = RETRIEVE_POINTER_weave_commentary_node(N->content); if (C->in_code) WRITE(" /* "); WRITE("%S", C->text); if (C->in_code) WRITE(" */ "); } -#line 61 "inweb/Chapter 5/Plain Text Format.w" - - else if (N->type == weave_carousel_slide_node_type) -{ -#line 132 "inweb/Chapter 5/Plain Text Format.w" - ; - -} -#line 62 "inweb/Chapter 5/Plain Text Format.w" - - else if (N->type == weave_toc_node_type) -{ -#line 132 "inweb/Chapter 5/Plain Text Format.w" - ; - -} -#line 63 "inweb/Chapter 5/Plain Text Format.w" - - else if (N->type == weave_toc_line_node_type) -{ -#line 132 "inweb/Chapter 5/Plain Text Format.w" - ; - -} -#line 64 "inweb/Chapter 5/Plain Text Format.w" - - else if (N->type == weave_chapter_title_page_node_type) -{ -#line 169 "inweb/Chapter 5/Plain Text Format.w" - weave_chapter_title_page_node *C = RETRIEVE_POINTER_weave_chapter_title_page_node(N->content); - LOG("It was %d\n", C->allocation_id); - -} -#line 65 "inweb/Chapter 5/Plain Text Format.w" +#line 67 "inweb/Chapter 5/Plain Text Format.w" else if (N->type == weave_defn_node_type) { -#line 173 "inweb/Chapter 5/Plain Text Format.w" +#line 170 "inweb/Chapter 5/Plain Text Format.w" weave_defn_node *C = RETRIEVE_POINTER_weave_defn_node(N->content); WRITE("%S ", C->keyword); } -#line 66 "inweb/Chapter 5/Plain Text Format.w" +#line 68 "inweb/Chapter 5/Plain Text Format.w" else if (N->type == weave_source_code_node_type) { -#line 177 "inweb/Chapter 5/Plain Text Format.w" +#line 174 "inweb/Chapter 5/Plain Text Format.w" weave_source_code_node *C = RETRIEVE_POINTER_weave_source_code_node(N->content); WRITE("%S", C->matter); } -#line 67 "inweb/Chapter 5/Plain Text Format.w" +#line 69 "inweb/Chapter 5/Plain Text Format.w" else if (N->type == weave_url_node_type) { -#line 181 "inweb/Chapter 5/Plain Text Format.w" +#line 178 "inweb/Chapter 5/Plain Text Format.w" weave_url_node *C = RETRIEVE_POINTER_weave_url_node(N->content); WRITE("%S", C->url); } -#line 68 "inweb/Chapter 5/Plain Text Format.w" +#line 70 "inweb/Chapter 5/Plain Text Format.w" else if (N->type == weave_footnote_cue_node_type) { -#line 185 "inweb/Chapter 5/Plain Text Format.w" +#line 182 "inweb/Chapter 5/Plain Text Format.w" weave_footnote_cue_node *C = RETRIEVE_POINTER_weave_footnote_cue_node(N->content); WRITE("[%S]", C->cue_text); } -#line 69 "inweb/Chapter 5/Plain Text Format.w" +#line 71 "inweb/Chapter 5/Plain Text Format.w" else if (N->type == weave_begin_footnote_text_node_type) { -#line 189 "inweb/Chapter 5/Plain Text Format.w" +#line 186 "inweb/Chapter 5/Plain Text Format.w" WRITE("\n"); } -#line 70 "inweb/Chapter 5/Plain Text Format.w" +#line 72 "inweb/Chapter 5/Plain Text Format.w" else if (N->type == weave_display_line_node_type) { -#line 192 "inweb/Chapter 5/Plain Text Format.w" +#line 189 "inweb/Chapter 5/Plain Text Format.w" weave_display_line_node *C = RETRIEVE_POINTER_weave_display_line_node(N->content); WRITE(" %S\n", C->text); } -#line 71 "inweb/Chapter 5/Plain Text Format.w" +#line 73 "inweb/Chapter 5/Plain Text Format.w" else if (N->type == weave_function_defn_node_type) { -#line 196 "inweb/Chapter 5/Plain Text Format.w" +#line 193 "inweb/Chapter 5/Plain Text Format.w" weave_function_defn_node *C = RETRIEVE_POINTER_weave_function_defn_node(N->content); WRITE("%S", C->fn->function_name); return TRUE; } -#line 72 "inweb/Chapter 5/Plain Text Format.w" +#line 74 "inweb/Chapter 5/Plain Text Format.w" else if (N->type == weave_item_node_type) { -#line 201 "inweb/Chapter 5/Plain Text Format.w" +#line 198 "inweb/Chapter 5/Plain Text Format.w" weave_item_node *C = RETRIEVE_POINTER_weave_item_node(N->content); for (int i=1; idepth; i++) WRITE(" "); WRITE("(%S) ", C->label); -} -#line 73 "inweb/Chapter 5/Plain Text Format.w" - - else if (N->type == weave_grammar_index_node_type) -{ -#line 132 "inweb/Chapter 5/Plain Text Format.w" - ; - -} -#line 74 "inweb/Chapter 5/Plain Text Format.w" - - else if (N->type == weave_inline_node_type) -{ -#line 132 "inweb/Chapter 5/Plain Text Format.w" - ; - } #line 75 "inweb/Chapter 5/Plain Text Format.w" else if (N->type == weave_locale_node_type) { -#line 206 "inweb/Chapter 5/Plain Text Format.w" +#line 203 "inweb/Chapter 5/Plain Text Format.w" weave_locale_node *C = RETRIEVE_POINTER_weave_locale_node(N->content); WRITE("%S%S", C->par1->ornament, C->par1->paragraph_number); if (C->par2) WRITE("-%S", C->par2->paragraph_number); @@ -24234,7 +24095,7 @@ int PlainText__render_visit(tree_node *N, void *state, int L) { else if (N->type == weave_maths_node_type) { -#line 211 "inweb/Chapter 5/Plain Text Format.w" +#line 208 "inweb/Chapter 5/Plain Text Format.w" weave_maths_node *C = RETRIEVE_POINTER_weave_maths_node(N->content); if (C->displayed) WRITE("\n"); WRITE("%S", C->content); @@ -24243,116 +24104,75 @@ int PlainText__render_visit(tree_node *N, void *state, int L) { } #line 77 "inweb/Chapter 5/Plain Text Format.w" + else internal_error("unable to render unknown node"); return TRUE; } -#line 221 "inweb/Chapter 5/Plain Text Format.w" -void PlainText__chapter_title_page(weave_format *self, text_stream *OUT, - weave_order *wv, chapter *C) { - WRITE("%S\n\n", C->md->rubric); - section *S; - LOOP_OVER_LINKED_LIST(S, section, C->sections) - WRITE(" %S: %S\n %S\n", - S->md->sect_range, S->md->sect_title, S->sect_purpose); -} - #line 9 "inweb/Chapter 5/TeX Format.w" void TeX__create(void) { - -{ -#line 16 "inweb/Chapter 5/TeX Format.w" weave_format *wf = Formats__create_weave_format(TL_IS_400, TL_IS_401); METHOD_ADD(wf, RENDER_FOR_MTID, TeX__render_TeX); - METHOD_ADD(wf, CHAPTER_TP_FOR_MTID, TeX__chapter_title_page); METHOD_ADD(wf, PREFORM_DOCUMENT_FOR_MTID, TeX__preform_document); - -} -#line 10 "inweb/Chapter 5/TeX Format.w" -; - -{ -#line 22 "inweb/Chapter 5/TeX Format.w" - weave_format *wf = Formats__create_weave_format(TL_IS_402, TL_IS_403); - METHOD_ADD(wf, RENDER_FOR_MTID, TeX__render_DVI); - METHOD_ADD(wf, CHAPTER_TP_FOR_MTID, TeX__chapter_title_page); - METHOD_ADD(wf, PREFORM_DOCUMENT_FOR_MTID, TeX__preform_document); - -} -#line 11 "inweb/Chapter 5/TeX Format.w" -; - -{ -#line 28 "inweb/Chapter 5/TeX Format.w" - weave_format *wf = Formats__create_weave_format(TL_IS_404, TL_IS_405); - METHOD_ADD(wf, RENDER_FOR_MTID, TeX__render_PDF); - METHOD_ADD(wf, CHAPTER_TP_FOR_MTID, TeX__chapter_title_page); - METHOD_ADD(wf, PREFORM_DOCUMENT_FOR_MTID, TeX__preform_document); - -} -#line 12 "inweb/Chapter 5/TeX Format.w" -; } -#line 43 "inweb/Chapter 5/TeX Format.w" +#line 23 "inweb/Chapter 5/TeX Format.w" +#line 25 "inweb/Chapter 5/TeX Format.w" void TeX__render_TeX(weave_format *self, text_stream *OUT, heterogeneous_tree *tree) { - TeX__render_inner(self, OUT, tree, FALSE, FALSE); -} -void TeX__render_DVI(weave_format *self, text_stream *OUT, heterogeneous_tree *tree) { - TeX__render_inner(self, OUT, tree, TRUE, FALSE); -} -void TeX__render_PDF(weave_format *self, text_stream *OUT, heterogeneous_tree *tree) { - TeX__render_inner(self, OUT, tree, FALSE, TRUE); + TeX__render_inner(OUT, tree, PDFTEX_TEX_FORM); } -void TeX__render_inner(weave_format *self, text_stream *OUT, heterogeneous_tree *tree, int as_dvi, int as_pdf) { +#line 38 "inweb/Chapter 5/TeX Format.w" + +void TeX__render_inner(text_stream *OUT, heterogeneous_tree *tree, int form) { weave_document_node *C = RETRIEVE_POINTER_weave_document_node(tree->root->content); TeX_render_state trs; trs.OUT = OUT; trs.wv = C->wv; - trs.as_DVI = as_dvi; - trs.as_PDF = as_pdf; + trs.TeX_form = form; Trees__traverse_from(tree->root, &TeX__render_visit, (void *) &trs, 0); } +#line 51 "inweb/Chapter 5/TeX Format.w" int TeX__render_visit(tree_node *N, void *state, int L) { TeX_render_state *trs = (TeX_render_state *) state; text_stream *OUT = trs->OUT; - if (N->type == weave_document_node_type) + if ((N->type == weave_document_node_type) || + (N->type == weave_body_node_type) || + (N->type == weave_chapter_title_page_node_type) || + (N->type == weave_chapter_footer_node_type) || + (N->type == weave_section_footer_node_type) || + (N->type == weave_audio_node_type) || + (N->type == weave_chapter_node_type) || + (N->type == weave_carousel_slide_node_type) || + (N->type == weave_begin_footnote_text_node_type)) { #line 234 "inweb/Chapter 5/TeX Format.w" ; } -#line 67 "inweb/Chapter 5/TeX Format.w" +#line 62 "inweb/Chapter 5/TeX Format.w" + else if (N->type == weave_head_node_type) { -#line 115 "inweb/Chapter 5/TeX Format.w" +#line 104 "inweb/Chapter 5/TeX Format.w" weave_head_node *C = RETRIEVE_POINTER_weave_head_node(N->content); WRITE("%% %S\n", C->banner); } -#line 68 "inweb/Chapter 5/TeX Format.w" - - else if (N->type == weave_body_node_type) -{ -#line 234 "inweb/Chapter 5/TeX Format.w" - ; - -} -#line 69 "inweb/Chapter 5/TeX Format.w" +#line 64 "inweb/Chapter 5/TeX Format.w" else if (N->type == weave_tail_node_type) { -#line 119 "inweb/Chapter 5/TeX Format.w" +#line 108 "inweb/Chapter 5/TeX Format.w" weave_tail_node *C = RETRIEVE_POINTER_weave_tail_node(N->content); WRITE("%% %S\n", C->rennab); WRITE("\\end\n"); } -#line 70 "inweb/Chapter 5/TeX Format.w" +#line 65 "inweb/Chapter 5/TeX Format.w" else if (N->type == weave_verbatim_node_type) { @@ -24361,60 +24181,55 @@ int TeX__render_visit(tree_node *N, void *state, int L) { WRITE("%S", C->content); } -#line 71 "inweb/Chapter 5/TeX Format.w" +#line 66 "inweb/Chapter 5/TeX Format.w" else if (N->type == weave_chapter_header_node_type) { -#line 124 "inweb/Chapter 5/TeX Format.w" +#line 113 "inweb/Chapter 5/TeX Format.w" weave_chapter_header_node *C = RETRIEVE_POINTER_weave_chapter_header_node(N->content); - if (Str__ne(C->chap->md->ch_range, TL_IS_406)) - TeX__paragraph_heading(trs->wv->format, OUT, trs->wv, FIRST_IN_LINKED_LIST(section, C->chap->sections), NULL, C->chap->md->ch_title, 3, FALSE); + if (Str__ne(C->chap->md->ch_range, TL_IS_402)) { + TeX__paragraph_heading(OUT, trs->wv, + FIRST_IN_LINKED_LIST(section, C->chap->sections), NULL, C->chap->md->ch_title, + 3, FALSE); + WRITE("%S\\medskip\n", C->chap->md->rubric); + section *S; + LOOP_OVER_LINKED_LIST(S, section, C->chap->sections) { + WRITE("\\smallskip\\noindent "); + if (trs->wv->pattern->number_sections) WRITE("%d. ", S->printed_number); + WRITE("{\\it %S}\\qquad\n%S", S->md->sect_title, S->sect_purpose); + } + } } -#line 72 "inweb/Chapter 5/TeX Format.w" - - else if (N->type == weave_chapter_footer_node_type) -{ -#line 234 "inweb/Chapter 5/TeX Format.w" - ; - -} -#line 73 "inweb/Chapter 5/TeX Format.w" +#line 67 "inweb/Chapter 5/TeX Format.w" else if (N->type == weave_section_header_node_type) { -#line 129 "inweb/Chapter 5/TeX Format.w" +#line 128 "inweb/Chapter 5/TeX Format.w" weave_section_header_node *C = RETRIEVE_POINTER_weave_section_header_node(N->content); - TeX__paragraph_heading(trs->wv->format, OUT, trs->wv, C->sect, NULL, C->sect->md->sect_title, 2, FALSE); + TeX__paragraph_heading(OUT, trs->wv, C->sect, NULL, + C->sect->md->sect_title, 2, FALSE); } -#line 74 "inweb/Chapter 5/TeX Format.w" - - else if (N->type == weave_section_footer_node_type) -{ -#line 234 "inweb/Chapter 5/TeX Format.w" - ; - -} -#line 75 "inweb/Chapter 5/TeX Format.w" +#line 68 "inweb/Chapter 5/TeX Format.w" else if (N->type == weave_section_purpose_node_type) { #line 133 "inweb/Chapter 5/TeX Format.w" weave_section_purpose_node *C = RETRIEVE_POINTER_weave_section_purpose_node(N->content); - TeX__subheading(trs->wv->format, OUT, trs->wv, 2, C->purpose, NULL); + WRITE("\\smallskip\\par\\noindent{\\it %S}\\smallskip\\noindent\n", C->purpose); } -#line 76 "inweb/Chapter 5/TeX Format.w" +#line 69 "inweb/Chapter 5/TeX Format.w" else if (N->type == weave_subheading_node_type) { #line 137 "inweb/Chapter 5/TeX Format.w" weave_subheading_node *C = RETRIEVE_POINTER_weave_subheading_node(N->content); - TeX__subheading(trs->wv->format, OUT, trs->wv, 1, C->text, NULL); + WRITE("\\par\\noindent{\\bf %S}\\mark{%S}\\medskip\n", C->text, NULL); } -#line 77 "inweb/Chapter 5/TeX Format.w" +#line 70 "inweb/Chapter 5/TeX Format.w" else if (N->type == weave_bar_node_type) { @@ -24422,7 +24237,7 @@ int TeX__render_visit(tree_node *N, void *state, int L) { WRITE("\\par\\medskip\\noindent\\hrule\\medskip\\noindent\n"); } -#line 78 "inweb/Chapter 5/TeX Format.w" +#line 71 "inweb/Chapter 5/TeX Format.w" else if (N->type == weave_pagebreak_node_type) { @@ -24430,7 +24245,7 @@ int TeX__render_visit(tree_node *N, void *state, int L) { WRITE("\\vfill\\eject\n"); } -#line 79 "inweb/Chapter 5/TeX Format.w" +#line 72 "inweb/Chapter 5/TeX Format.w" else if (N->type == weave_linebreak_node_type) { @@ -24438,64 +24253,56 @@ int TeX__render_visit(tree_node *N, void *state, int L) { WRITE("\n"); } -#line 80 "inweb/Chapter 5/TeX Format.w" +#line 73 "inweb/Chapter 5/TeX Format.w" else if (N->type == weave_paragraph_heading_node_type) { #line 150 "inweb/Chapter 5/TeX Format.w" - weave_paragraph_heading_node *C = RETRIEVE_POINTER_weave_paragraph_heading_node(N->content); - TeX__paragraph_heading(trs->wv->format, OUT, trs->wv, C->para->under_section, C->para, TL_IS_407, 0, FALSE); + weave_paragraph_heading_node *C = + RETRIEVE_POINTER_weave_paragraph_heading_node(N->content); + TeX__paragraph_heading(OUT, trs->wv, C->para->under_section, + C->para, TL_IS_403, 0, FALSE); } -#line 81 "inweb/Chapter 5/TeX Format.w" +#line 74 "inweb/Chapter 5/TeX Format.w" else if (N->type == weave_endnote_node_type) { -#line 154 "inweb/Chapter 5/TeX Format.w" +#line 156 "inweb/Chapter 5/TeX Format.w" WRITE("\\par\\noindent\\penalty10000\n"); WRITE("{\\usagefont "); { -#line 357 "inweb/Chapter 5/TeX Format.w" +#line 392 "inweb/Chapter 5/TeX Format.w" for (tree_node *M = N->child; M; M = M->next) Trees__traverse_from(M, &TeX__render_visit, (void *) trs, L+1); } -#line 156 "inweb/Chapter 5/TeX Format.w" +#line 158 "inweb/Chapter 5/TeX Format.w" ; WRITE("}\\smallskip\n"); return FALSE; } -#line 82 "inweb/Chapter 5/TeX Format.w" +#line 75 "inweb/Chapter 5/TeX Format.w" else if (N->type == weave_figure_node_type) { -#line 168 "inweb/Chapter 5/TeX Format.w" - if (trs->as_PDF) { - weave_figure_node *C = RETRIEVE_POINTER_weave_figure_node(N->content); - WRITE("\\pdfximage"); - if (C->w >= 0) - WRITE(" width %d cm{../Figures/%S}\n", C->w, C->figname); - else if (C->h >= 0) - WRITE(" height %d cm{../Figures/%S}\n", C->h, C->figname); - else - WRITE("{../Figures/%S}\n", C->figname); - WRITE("\\smallskip\\noindent" - "\\hbox to\\hsize{\\hfill\\pdfrefximage \\pdflastximage\\hfill}" - "\\smallskip\n"); - } +#line 170 "inweb/Chapter 5/TeX Format.w" + weave_figure_node *C = RETRIEVE_POINTER_weave_figure_node(N->content); + filename *F = Filenames__in( + Pathnames__down(trs->wv->weave_web->md->path_to_web, TL_IS_404), + C->figname); + WRITE("\\pdfximage"); + if (C->w >= 0) WRITE(" width %d cm{%f}\n", C->w/POINTS_PER_CM, F); + else if (C->h >= 0) WRITE(" height %d cm{%f}\n", C->h/POINTS_PER_CM, F); + else WRITE("{%f}\n", F); + WRITE("\\smallskip\\noindent" + "\\hbox to\\hsize{\\hfill\\pdfrefximage \\pdflastximage\\hfill}" + "\\smallskip\n"); } -#line 83 "inweb/Chapter 5/TeX Format.w" - - else if (N->type == weave_audio_node_type) -{ -#line 234 "inweb/Chapter 5/TeX Format.w" - ; - -} -#line 84 "inweb/Chapter 5/TeX Format.w" +#line 76 "inweb/Chapter 5/TeX Format.w" else if (N->type == weave_material_node_type) { @@ -24514,7 +24321,7 @@ int TeX__render_visit(tree_node *N, void *state, int L) { #line 206 "inweb/Chapter 5/TeX Format.w" { -#line 357 "inweb/Chapter 5/TeX Format.w" +#line 392 "inweb/Chapter 5/TeX Format.w" for (tree_node *M = N->child; M; M = M->next) Trees__traverse_from(M, &TeX__render_visit, (void *) trs, L+1); @@ -24533,7 +24340,7 @@ int TeX__render_visit(tree_node *N, void *state, int L) { WRITE("\\beginlines\n"); { -#line 357 "inweb/Chapter 5/TeX Format.w" +#line 392 "inweb/Chapter 5/TeX Format.w" for (tree_node *M = N->child; M; M = M->next) Trees__traverse_from(M, &TeX__render_visit, (void *) trs, L+1); @@ -24549,15 +24356,7 @@ int TeX__render_visit(tree_node *N, void *state, int L) { { #line 215 "inweb/Chapter 5/TeX Format.w" - -{ -#line 357 "inweb/Chapter 5/TeX Format.w" - for (tree_node *M = N->child; M; M = M->next) - Trees__traverse_from(M, &TeX__render_visit, (void *) trs, L+1); - -} -#line 215 "inweb/Chapter 5/TeX Format.w" -; + return FALSE; } #line 196 "inweb/Chapter 5/TeX Format.w" @@ -24568,7 +24367,7 @@ int TeX__render_visit(tree_node *N, void *state, int L) { #line 218 "inweb/Chapter 5/TeX Format.w" { -#line 357 "inweb/Chapter 5/TeX Format.w" +#line 392 "inweb/Chapter 5/TeX Format.w" for (tree_node *M = N->child; M; M = M->next) Trees__traverse_from(M, &TeX__render_visit, (void *) trs, L+1); @@ -24585,7 +24384,7 @@ int TeX__render_visit(tree_node *N, void *state, int L) { #line 221 "inweb/Chapter 5/TeX Format.w" { -#line 357 "inweb/Chapter 5/TeX Format.w" +#line 392 "inweb/Chapter 5/TeX Format.w" for (tree_node *M = N->child; M; M = M->next) Trees__traverse_from(M, &TeX__render_visit, (void *) trs, L+1); @@ -24604,7 +24403,7 @@ int TeX__render_visit(tree_node *N, void *state, int L) { WRITE("\\beginlines\n"); { -#line 357 "inweb/Chapter 5/TeX Format.w" +#line 392 "inweb/Chapter 5/TeX Format.w" for (tree_node *M = N->child; M; M = M->next) Trees__traverse_from(M, &TeX__render_visit, (void *) trs, L+1); @@ -24619,7 +24418,7 @@ int TeX__render_visit(tree_node *N, void *state, int L) { return FALSE; } -#line 85 "inweb/Chapter 5/TeX Format.w" +#line 77 "inweb/Chapter 5/TeX Format.w" else if (N->type == weave_embed_node_type) { @@ -24628,101 +24427,83 @@ int TeX__render_visit(tree_node *N, void *state, int L) { LOG("It was %d\n", C->allocation_id); } -#line 86 "inweb/Chapter 5/TeX Format.w" +#line 78 "inweb/Chapter 5/TeX Format.w" else if (N->type == weave_pmac_node_type) { #line 241 "inweb/Chapter 5/TeX Format.w" weave_pmac_node *C = RETRIEVE_POINTER_weave_pmac_node(N->content); - if (trs->as_PDF) - TeX__para_macro_PDF_1(trs->wv->format, OUT, trs->wv, C->pmac, C->defn); - TeX__para_macro(trs->wv->format, OUT, trs->wv, C->pmac, C->defn); - if (trs->as_PDF) - TeX__para_macro_PDF_2(trs->wv->format, OUT, trs->wv, C->pmac, C->defn); + TeX__para_macro(OUT, trs->wv, C->pmac, C->defn); } -#line 87 "inweb/Chapter 5/TeX Format.w" +#line 79 "inweb/Chapter 5/TeX Format.w" else if (N->type == weave_vskip_node_type) { -#line 249 "inweb/Chapter 5/TeX Format.w" +#line 245 "inweb/Chapter 5/TeX Format.w" weave_vskip_node *C = RETRIEVE_POINTER_weave_vskip_node(N->content); if (C->in_comment) WRITE("\\smallskip\\par\\noindent%%\n"); else WRITE("\\smallskip\n"); } -#line 88 "inweb/Chapter 5/TeX Format.w" - - else if (N->type == weave_chapter_node_type) -{ -#line 234 "inweb/Chapter 5/TeX Format.w" - ; - -} -#line 89 "inweb/Chapter 5/TeX Format.w" +#line 80 "inweb/Chapter 5/TeX Format.w" else if (N->type == weave_section_node_type) { -#line 254 "inweb/Chapter 5/TeX Format.w" +#line 250 "inweb/Chapter 5/TeX Format.w" weave_section_node *C = RETRIEVE_POINTER_weave_section_node(N->content); LOG("It was %d\n", C->allocation_id); } -#line 90 "inweb/Chapter 5/TeX Format.w" +#line 81 "inweb/Chapter 5/TeX Format.w" else if (N->type == weave_code_line_node_type) { -#line 258 "inweb/Chapter 5/TeX Format.w" +#line 254 "inweb/Chapter 5/TeX Format.w" WRITE("\\smallskip\\par\\noindent "); WRITE("|"); { -#line 357 "inweb/Chapter 5/TeX Format.w" +#line 392 "inweb/Chapter 5/TeX Format.w" for (tree_node *M = N->child; M; M = M->next) Trees__traverse_from(M, &TeX__render_visit, (void *) trs, L+1); } -#line 260 "inweb/Chapter 5/TeX Format.w" +#line 256 "inweb/Chapter 5/TeX Format.w" ; WRITE("|"); WRITE("\n"); return FALSE; } -#line 91 "inweb/Chapter 5/TeX Format.w" +#line 82 "inweb/Chapter 5/TeX Format.w" else if (N->type == weave_function_usage_node_type) { -#line 266 "inweb/Chapter 5/TeX Format.w" - weave_function_usage_node *C = RETRIEVE_POINTER_weave_function_usage_node(N->content); +#line 262 "inweb/Chapter 5/TeX Format.w" + weave_function_usage_node *C = + RETRIEVE_POINTER_weave_function_usage_node(N->content); WRITE("%S", C->fn->function_name); return FALSE; } -#line 92 "inweb/Chapter 5/TeX Format.w" +#line 83 "inweb/Chapter 5/TeX Format.w" else if (N->type == weave_commentary_node_type) { -#line 271 "inweb/Chapter 5/TeX Format.w" - weave_commentary_node *C = RETRIEVE_POINTER_weave_commentary_node(N->content); +#line 268 "inweb/Chapter 5/TeX Format.w" + weave_commentary_node *C = + RETRIEVE_POINTER_weave_commentary_node(N->content); if (C->in_code) WRITE(" |\\hfill{\\ttninepoint\\it "); - TeX__commentary_text(NULL, OUT, trs->wv, C->text); + TeX__commentary_text(OUT, trs->wv, C->text); if (C->in_code) WRITE("}|"); } -#line 93 "inweb/Chapter 5/TeX Format.w" - - else if (N->type == weave_carousel_slide_node_type) -{ -#line 234 "inweb/Chapter 5/TeX Format.w" - ; - -} -#line 94 "inweb/Chapter 5/TeX Format.w" +#line 84 "inweb/Chapter 5/TeX Format.w" else if (N->type == weave_toc_node_type) { -#line 277 "inweb/Chapter 5/TeX Format.w" +#line 275 "inweb/Chapter 5/TeX Format.w" WRITE("\\medskip\\hrule\\smallskip\\par\\noindent{\\usagefont "); for (tree_node *M = N->child; M; M = M->next) { Trees__traverse_from(M, &TeX__render_visit, (void *) trs, L+1); @@ -24732,97 +24513,117 @@ int TeX__render_visit(tree_node *N, void *state, int L) { return FALSE; } -#line 95 "inweb/Chapter 5/TeX Format.w" +#line 85 "inweb/Chapter 5/TeX Format.w" else if (N->type == weave_toc_line_node_type) { -#line 286 "inweb/Chapter 5/TeX Format.w" +#line 284 "inweb/Chapter 5/TeX Format.w" weave_toc_line_node *C = RETRIEVE_POINTER_weave_toc_line_node(N->content); WRITE("%S~%S", C->text1, C->text2); } -#line 96 "inweb/Chapter 5/TeX Format.w" - - else if (N->type == weave_chapter_title_page_node_type) -{ -#line 290 "inweb/Chapter 5/TeX Format.w" - weave_chapter_title_page_node *C = RETRIEVE_POINTER_weave_chapter_title_page_node(N->content); - LOG("It was %d\n", C->allocation_id); - -} -#line 97 "inweb/Chapter 5/TeX Format.w" +#line 86 "inweb/Chapter 5/TeX Format.w" else if (N->type == weave_defn_node_type) { -#line 294 "inweb/Chapter 5/TeX Format.w" +#line 288 "inweb/Chapter 5/TeX Format.w" weave_defn_node *C = RETRIEVE_POINTER_weave_defn_node(N->content); WRITE("|{\\ninebf %S} |", C->keyword); } -#line 98 "inweb/Chapter 5/TeX Format.w" +#line 87 "inweb/Chapter 5/TeX Format.w" else if (N->type == weave_source_code_node_type) { -#line 298 "inweb/Chapter 5/TeX Format.w" - weave_source_code_node *C = RETRIEVE_POINTER_weave_source_code_node(N->content); +#line 292 "inweb/Chapter 5/TeX Format.w" + weave_source_code_node *C = + RETRIEVE_POINTER_weave_source_code_node(N->content); int starts = FALSE; if (N == N->parent->child) starts = TRUE; - TeX__source_code(trs->wv->format, OUT, trs->wv, + TeX__source_code(OUT, trs->wv, C->matter, C->colouring, starts); } -#line 99 "inweb/Chapter 5/TeX Format.w" +#line 88 "inweb/Chapter 5/TeX Format.w" else if (N->type == weave_url_node_type) { -#line 305 "inweb/Chapter 5/TeX Format.w" +#line 300 "inweb/Chapter 5/TeX Format.w" weave_url_node *C = RETRIEVE_POINTER_weave_url_node(N->content); WRITE("%S", C->url); } -#line 100 "inweb/Chapter 5/TeX Format.w" +#line 89 "inweb/Chapter 5/TeX Format.w" else if (N->type == weave_footnote_cue_node_type) { -#line 309 "inweb/Chapter 5/TeX Format.w" +#line 308 "inweb/Chapter 5/TeX Format.w" weave_footnote_cue_node *C = RETRIEVE_POINTER_weave_footnote_cue_node(N->content); - WRITE("[%S]", C->cue_text); - -} -#line 101 "inweb/Chapter 5/TeX Format.w" - - else if (N->type == weave_begin_footnote_text_node_type) + WRITE("\\footnote{${}^{%S}$}{", C->cue_text); + tree_node *M = N; + while ((M) && (M->type != weave_paragraph_heading_node_type)) M = M->parent; + if (M == NULL) internal_error("tree without section nodes"); + M = M->child; + int found = FALSE; + while (M) { + if (M->type == weave_material_node_type) { + weave_material_node *MC = RETRIEVE_POINTER_weave_material_node(M->content); + if (MC->material_type == FOOTNOTES_MATERIAL) { + tree_node *F = M->child; + while (F) { + if (F->type == weave_begin_footnote_text_node_type) { + weave_begin_footnote_text_node *FC = + RETRIEVE_POINTER_weave_begin_footnote_text_node(F->content); + if (Str__eq(FC->cue_text, C->cue_text)) + { -#line 313 "inweb/Chapter 5/TeX Format.w" - WRITE("\n"); +#line 344 "inweb/Chapter 5/TeX Format.w" + for (tree_node *X = F->child->next; X; X = X->next) + Trees__traverse_from(X, &TeX__render_visit, (void *) trs, L+1); + found = TRUE; } -#line 102 "inweb/Chapter 5/TeX Format.w" +#line 325 "inweb/Chapter 5/TeX Format.w" +; + } + F = F->next; + } + } + } + M = M->next; + } + WRITE("}"); + if (found == FALSE) internal_error("cue without text"); + +} +#line 90 "inweb/Chapter 5/TeX Format.w" else if (N->type == weave_display_line_node_type) { -#line 316 "inweb/Chapter 5/TeX Format.w" - weave_display_line_node *C = RETRIEVE_POINTER_weave_display_line_node(N->content); +#line 349 "inweb/Chapter 5/TeX Format.w" + weave_display_line_node *C = + RETRIEVE_POINTER_weave_display_line_node(N->content); WRITE("\\quotesource{%S}\n", C->text); } -#line 103 "inweb/Chapter 5/TeX Format.w" +#line 91 "inweb/Chapter 5/TeX Format.w" else if (N->type == weave_function_defn_node_type) { -#line 320 "inweb/Chapter 5/TeX Format.w" - weave_function_defn_node *C = RETRIEVE_POINTER_weave_function_defn_node(N->content); +#line 354 "inweb/Chapter 5/TeX Format.w" + weave_function_defn_node *C = + RETRIEVE_POINTER_weave_function_defn_node(N->content); TeX__change_colour_PDF(OUT, FUNCTION_COLOUR, TRUE); WRITE("%S", C->fn->function_name); TeX__change_colour_PDF(OUT, PLAIN_COLOUR, TRUE); return FALSE; } -#line 104 "inweb/Chapter 5/TeX Format.w" +#line 92 "inweb/Chapter 5/TeX Format.w" else if (N->type == weave_item_node_type) { -#line 327 "inweb/Chapter 5/TeX Format.w" +#line 362 "inweb/Chapter 5/TeX Format.w" weave_item_node *C = RETRIEVE_POINTER_weave_item_node(N->content); if (Str__len(C->label) > 0) { if (C->depth == 1) WRITE("\\item{(%S)}", C->label); @@ -24833,143 +24634,92 @@ int TeX__render_visit(tree_node *N, void *state, int L) { } } -#line 105 "inweb/Chapter 5/TeX Format.w" +#line 93 "inweb/Chapter 5/TeX Format.w" else if (N->type == weave_grammar_index_node_type) { -#line 337 "inweb/Chapter 5/TeX Format.w" +#line 372 "inweb/Chapter 5/TeX Format.w" InCSupport__weave_grammar_index(OUT); } -#line 106 "inweb/Chapter 5/TeX Format.w" +#line 94 "inweb/Chapter 5/TeX Format.w" else if (N->type == weave_inline_node_type) { -#line 340 "inweb/Chapter 5/TeX Format.w" +#line 375 "inweb/Chapter 5/TeX Format.w" WRITE("|"); { -#line 357 "inweb/Chapter 5/TeX Format.w" +#line 392 "inweb/Chapter 5/TeX Format.w" for (tree_node *M = N->child; M; M = M->next) Trees__traverse_from(M, &TeX__render_visit, (void *) trs, L+1); } -#line 341 "inweb/Chapter 5/TeX Format.w" +#line 376 "inweb/Chapter 5/TeX Format.w" ; WRITE("|"); return FALSE; } -#line 107 "inweb/Chapter 5/TeX Format.w" +#line 95 "inweb/Chapter 5/TeX Format.w" else if (N->type == weave_locale_node_type) { -#line 346 "inweb/Chapter 5/TeX Format.w" +#line 381 "inweb/Chapter 5/TeX Format.w" weave_locale_node *C = RETRIEVE_POINTER_weave_locale_node(N->content); WRITE("$\\%S$%S", C->par1->ornament, C->par1->paragraph_number); if (C->par2) WRITE("-%S", C->par2->paragraph_number); } -#line 108 "inweb/Chapter 5/TeX Format.w" +#line 96 "inweb/Chapter 5/TeX Format.w" else if (N->type == weave_maths_node_type) { -#line 351 "inweb/Chapter 5/TeX Format.w" +#line 386 "inweb/Chapter 5/TeX Format.w" weave_maths_node *C = RETRIEVE_POINTER_weave_maths_node(N->content); if (C->displayed) WRITE("$$"); else WRITE("$"); WRITE("%S", C->content); if (C->displayed) WRITE("$$"); else WRITE("$"); } -#line 109 "inweb/Chapter 5/TeX Format.w" +#line 97 "inweb/Chapter 5/TeX Format.w" + else internal_error("unable to render unknown node"); return TRUE; } -#line 361 "inweb/Chapter 5/TeX Format.w" -int TeX__yes(weave_format *self, weave_order *wv) { - return TRUE; -} - -#line 366 "inweb/Chapter 5/TeX Format.w" -void TeX__subheading(weave_format *self, text_stream *OUT, weave_order *wv, - int level, text_stream *comment, text_stream *head) { - switch (level) { - case 1: - WRITE("\\par\\noindent{\\bf %S}\\mark{%S}\\medskip\n", - comment, head); - break; - case 2: - WRITE("\\smallskip\\par\\noindent{\\it %S}\\smallskip\\noindent\n", - comment); - if (head) TeX__commentary_text(self, OUT, wv, head); - break; - } -} - -#line 382 "inweb/Chapter 5/TeX Format.w" -void TeX__toc(weave_format *self, text_stream *OUT, weave_order *wv, int stage, - text_stream *text1, text_stream *text2, paragraph *P) { - switch (stage) { - case 1: - WRITE("\\medskip\\hrule\\smallskip\\par\\noindent{\\usagefont "); - break; - case 2: - WRITE("; "); - break; - case 3: - WRITE("%S~%S", text1, text2); - break; - case 4: - WRITE("}\\par\\medskip\\hrule\\bigskip\n"); - break; - } -} - -#line 401 "inweb/Chapter 5/TeX Format.w" -void TeX__chapter_title_page(weave_format *self, text_stream *OUT, weave_order *wv, - chapter *C) { - WRITE("%S\\medskip\n", C->md->rubric); - section *S; - LOOP_OVER_LINKED_LIST(S, section, C->sections) { - WRITE("\\smallskip\\noindent "); - if (wv->pattern->number_sections) WRITE("%d. ", S->printed_number); - WRITE("{\\it %S}\\qquad\n%S", S->md->sect_title, S->sect_purpose); - } -} - -#line 413 "inweb/Chapter 5/TeX Format.w" +#line 396 "inweb/Chapter 5/TeX Format.w" text_stream *P_literal = NULL; -void TeX__paragraph_heading(weave_format *self, text_stream *OUT, weave_order *wv, +void TeX__paragraph_heading(text_stream *OUT, weave_order *wv, section *S, paragraph *P, text_stream *heading_text, int weight, int no_skip) { text_stream *TeX_macro = NULL; { -#line 458 "inweb/Chapter 5/TeX Format.w" +#line 441 "inweb/Chapter 5/TeX Format.w" switch (weight) { - case 0: TeX_macro = TL_IS_408; break; - case 1: TeX_macro = TL_IS_409; break; - case 2: TeX_macro = TL_IS_410; break; - default: TeX_macro = TL_IS_411; break; + case 0: TeX_macro = TL_IS_405; break; + case 1: TeX_macro = TL_IS_406; break; + case 2: TeX_macro = TL_IS_407; break; + default: TeX_macro = TL_IS_408; break; } if (wv->theme_match) { switch (weight) { - case 0: TeX_macro = TL_IS_412; break; - case 1: TeX_macro = TL_IS_413; break; - case 2: TeX_macro = TL_IS_414; break; - default: TeX_macro = TL_IS_415; break; + case 0: TeX_macro = TL_IS_409; break; + case 1: TeX_macro = TL_IS_410; break; + case 2: TeX_macro = TL_IS_411; break; + default: TeX_macro = TL_IS_412; break; } } if (no_skip) { switch (weight) { - case 0: TeX_macro = TL_IS_416; break; - case 1: TeX_macro = TL_IS_417; break; + case 0: TeX_macro = TL_IS_413; break; + case 1: TeX_macro = TL_IS_414; break; } } } -#line 417 "inweb/Chapter 5/TeX Format.w" +#line 400 "inweb/Chapter 5/TeX Format.w" ; if (P_literal == NULL) P_literal = Str__new_from_wide_string(L"P"); @@ -24978,7 +24728,7 @@ void TeX__paragraph_heading(weave_format *self, text_stream *OUT, weave_order *w TEMPORARY_TEXT(mark); { -#line 489 "inweb/Chapter 5/TeX Format.w" +#line 472 "inweb/Chapter 5/TeX Format.w" text_stream *chaptermark = Str__new(); text_stream *sectionmark = Str__new(); if (weight == 3) { @@ -24996,7 +24746,7 @@ void TeX__paragraph_heading(weave_format *self, text_stream *OUT, weave_order *w WRITE_TO(mark, "%S%S\\quad$\\%S$%S", chaptermark, sectionmark, orn, N); } -#line 423 "inweb/Chapter 5/TeX Format.w" +#line 406 "inweb/Chapter 5/TeX Format.w" ; TEMPORARY_TEXT(modified); Str__copy(modified, heading_text); @@ -25016,39 +24766,40 @@ void TeX__paragraph_heading(weave_format *self, text_stream *OUT, weave_order *w Regexp__dispose_of(&mr); } -#line 511 "inweb/Chapter 5/TeX Format.w" -void TeX__source_code(weave_format *self, text_stream *OUT, weave_order *wv, +#line 494 "inweb/Chapter 5/TeX Format.w" +void TeX__source_code(text_stream *OUT, weave_order *wv, text_stream *matter, text_stream *colouring, int starts) { int current_colour = PLAIN_COLOUR, colour_wanted = PLAIN_COLOUR; for (int i=0; i < Str__len(matter); i++) { - colour_wanted = Str__get_at(colouring, i); + colour_wanted = Str__get_at(colouring, i); + { -#line 530 "inweb/Chapter 5/TeX Format.w" +#line 514 "inweb/Chapter 5/TeX Format.w" if (colour_wanted != current_colour) { TeX__change_colour_PDF(OUT, colour_wanted, TRUE); current_colour = colour_wanted; } } -#line 515 "inweb/Chapter 5/TeX Format.w" +#line 499 "inweb/Chapter 5/TeX Format.w" ; if (Str__get_at(matter, i) == '|') WRITE("|\\||"); else WRITE("%c", Str__get_at(matter, i)); } colour_wanted = PLAIN_COLOUR; { -#line 530 "inweb/Chapter 5/TeX Format.w" +#line 514 "inweb/Chapter 5/TeX Format.w" if (colour_wanted != current_colour) { TeX__change_colour_PDF(OUT, colour_wanted, TRUE); current_colour = colour_wanted; } } -#line 519 "inweb/Chapter 5/TeX Format.w" +#line 503 "inweb/Chapter 5/TeX Format.w" ; } -#line 536 "inweb/Chapter 5/TeX Format.w" +#line 520 "inweb/Chapter 5/TeX Format.w" void TeX__change_colour_PDF(text_stream *OUT, int col, int in_code) { char *inout = ""; if (in_code) inout = "|"; @@ -25064,12 +24815,8 @@ void TeX__change_colour_PDF(text_stream *OUT, int col, int in_code) { } } -#line 559 "inweb/Chapter 5/TeX Format.w" -void TeX__para_macro_PDF_1(weave_format *self, text_stream *OUT, weave_order *wv, - para_macro *pmac, int defn) { -} -void TeX__para_macro(weave_format *self, text_stream *OUT, weave_order *wv, - para_macro *pmac, int defn) { +#line 543 "inweb/Chapter 5/TeX Format.w" +void TeX__para_macro(text_stream *OUT, weave_order *wv, para_macro *pmac, int defn) { if (defn) WRITE("|\\pdfdest num %d fit ", pmac->allocation_id + 100); @@ -25087,18 +24834,9 @@ void TeX__para_macro(weave_format *self, text_stream *OUT, weave_order *wv, else WRITE("\\pdfendlink|"); } -void TeX__para_macro_PDF_2(weave_format *self, text_stream *OUT, weave_order *wv, - para_macro *pmac, int defn) { -} -#line 586 "inweb/Chapter 5/TeX Format.w" -void TeX__after_definitions(weave_format *self, text_stream *OUT, weave_order *wv) { - WRITE("\\smallskip\n"); -} - -#line 591 "inweb/Chapter 5/TeX Format.w" -void TeX__commentary_text(weave_format *self, text_stream *OUT, weave_order *wv, - text_stream *id) { +#line 563 "inweb/Chapter 5/TeX Format.w" +void TeX__commentary_text(text_stream *OUT, weave_order *wv, text_stream *id) { int math_mode = FALSE; for (int i=0; i < Str__len(id); i++) { switch (Str__get_at(id, i)) { @@ -25119,29 +24857,15 @@ void TeX__commentary_text(weave_format *self, text_stream *OUT, weave_order *wv, } } -#line 614 "inweb/Chapter 5/TeX Format.w" -void TeX__locale(weave_format *self, text_stream *OUT, weave_order *wv, - paragraph *par1, paragraph *par2) { - WRITE("$\\%S$%S", par1->ornament, par1->paragraph_number); - if (par2) WRITE("-%S", par2->paragraph_number); -} - -#line 621 "inweb/Chapter 5/TeX Format.w" -void TeX__tail(weave_format *self, text_stream *OUT, weave_order *wv, - text_stream *comment, section *S) { - WRITE("%% %S\n", comment); - WRITE("\\end\n"); -} - -#line 631 "inweb/Chapter 5/TeX Format.w" -int TeX__preform_document(weave_format *self, text_stream *OUT, web *W, weave_order *wv, - chapter *C, section *S, source_line *L, text_stream *matter, +#line 588 "inweb/Chapter 5/TeX Format.w" +int TeX__preform_document(weave_format *self, text_stream *OUT, web *W, + weave_order *wv, chapter *C, section *S, source_line *L, text_stream *matter, text_stream *concluding_comment) { if (L->preform_nonterminal_defined) { preform_production_count = 0; { -#line 648 "inweb/Chapter 5/TeX Format.w" +#line 605 "inweb/Chapter 5/TeX Format.w" WRITE("\\nonterminal{%S} |::=|", L->preform_nonterminal_defined->unangled_name); if (L->preform_nonterminal_defined->as_function) { @@ -25158,19 +24882,22 @@ int TeX__preform_document(weave_format *self, text_stream *OUT, web *W, weave_or WRITE("\n"); } -#line 636 "inweb/Chapter 5/TeX Format.w" +#line 593 "inweb/Chapter 5/TeX Format.w" ; return TRUE; } else { if (L->category == PREFORM_GRAMMAR_LCAT) { { -#line 664 "inweb/Chapter 5/TeX Format.w" +#line 621 "inweb/Chapter 5/TeX Format.w" TEMPORARY_TEXT(problem); match_results mr = Regexp__create_mr(); - if (Regexp__match(&mr, matter, L"Issue (%c*?) problem")) Str__copy(problem, mr.exp[0]); - else if (Regexp__match(&mr, matter, L"FAIL_NONTERMINAL %+")) WRITE_TO(problem, "fail and skip"); - else if (Regexp__match(&mr, matter, L"FAIL_NONTERMINAL")) WRITE_TO(problem, "fail"); + if (Regexp__match(&mr, matter, L"Issue (%c*?) problem")) + Str__copy(problem, mr.exp[0]); + else if (Regexp__match(&mr, matter, L"FAIL_NONTERMINAL %+")) + WRITE_TO(problem, "fail and skip"); + else if (Regexp__match(&mr, matter, L"FAIL_NONTERMINAL")) + WRITE_TO(problem, "fail"); preform_production_count++; WRITE_TO(matter, "|%S|", L->text_operand); while (Regexp__match(&mr, matter, L"(%c+?)|(%c+)")) { @@ -25202,8 +24929,7 @@ int TeX__preform_document(weave_format *self, text_stream *OUT, web *W, weave_or else if (Str__len(concluding_comment) > 0) { WRITE(" \\hfill{\\ttninepoint\\it "); if (Str__len(concluding_comment) > 0) - TeX__commentary_text(NULL, OUT, wv, concluding_comment); -// Formats__text_comment(OUT, wv, concluding_comment); + TeX__commentary_text(OUT, wv, concluding_comment); WRITE("}"); } WRITE("\n"); @@ -25212,7 +24938,7 @@ int TeX__preform_document(weave_format *self, text_stream *OUT, web *W, weave_or Regexp__dispose_of(&mr); } -#line 640 "inweb/Chapter 5/TeX Format.w" +#line 597 "inweb/Chapter 5/TeX Format.w" ; return TRUE; } @@ -25220,291 +24946,12 @@ int TeX__preform_document(weave_format *self, text_stream *OUT, web *W, weave_or return FALSE; } -#line 712 "inweb/Chapter 5/TeX Format.w" -void TeX__post_process_report(weave_format *self, weave_order *wv) { - RunningTeX__report_on_post_processing(wv); -} - -#line 717 "inweb/Chapter 5/TeX Format.w" -int TeX__post_process_substitute(weave_format *self, text_stream *OUT, - weave_order *wv, text_stream *detail, weave_pattern *pattern) { - return RunningTeX__substitute_post_processing_data(OUT, wv, detail); -} - -#line 730 "inweb/Chapter 5/TeX Format.w" -void TeX__remove_math_mode(OUTPUT_STREAM, text_stream *text) { - TEMPORARY_TEXT(math_matter); - TeX__remove_math_mode_range(math_matter, text, 0, Str__len(text)-1); - WRITE("%S", math_matter); - DISCARD_TEXT(math_matter); -} - -void TeX__remove_math_mode_range(OUTPUT_STREAM, text_stream *text, int from, int to) { - for (int i=from; i <= to; i++) { - -{ -#line 761 "inweb/Chapter 5/TeX Format.w" - if ((Str__get_at(text, i) == '\\') && - (Str__get_at(text, i+1) == 'o') && (Str__get_at(text, i+2) == 'v') && - (Str__get_at(text, i+3) == 'e') && (Str__get_at(text, i+4) == 'r') && - (Str__get_at(text, i+5) == '{')) { - int bl = 1; - int j = i-1; - for (; j >= from; j--) { - wchar_t c = Str__get_at(text, j); - if (c == '{') { - bl--; - if (bl == 0) break; - } - if (c == '}') bl++; - } - TeX__remove_math_mode_range(OUT, text, from, j-1); - WRITE("(("); - TeX__remove_math_mode_range(OUT, text, j+2, i-2); - WRITE(") / ("); - j=i+6; bl = 1; - for (; j <= to; j++) { - wchar_t c = Str__get_at(text, j); - if (c == '}') { - bl--; - if (bl == 0) break; - } - if (c == '{') bl++; - } - TeX__remove_math_mode_range(OUT, text, i+6, j-1); - WRITE("))"); - TeX__remove_math_mode_range(OUT, text, j+2, to); - return; - } - -} -#line 739 "inweb/Chapter 5/TeX Format.w" -; - } - for (int i=from; i <= to; i++) { - -{ -#line 797 "inweb/Chapter 5/TeX Format.w" - if ((Str__get_at(text, i) == '{') && (Str__get_at(text, i+1) == '\\') && - (((Str__get_at(text, i+2) == 'r') && (Str__get_at(text, i+3) == 'm')) || - ((Str__get_at(text, i+2) == 'i') && (Str__get_at(text, i+3) == 't'))) && - (Str__get_at(text, i+4) == ' ')) { - TeX__remove_math_mode_range(OUT, text, from, i-1); - int j=i+5; - for (; j <= to; j++) - if (Str__get_at(text, j) == '}') - break; - TeX__remove_math_mode_range(OUT, text, i+5, j-1); - TeX__remove_math_mode_range(OUT, text, j+1, to); - return; - } - -} -#line 742 "inweb/Chapter 5/TeX Format.w" -; - -{ -#line 815 "inweb/Chapter 5/TeX Format.w" - if ((Str__get_at(text, i) == '\\') && - (Str__get_at(text, i+1) == 's') && (Str__get_at(text, i+2) == 'q') && - (Str__get_at(text, i+3) == 'r') && (Str__get_at(text, i+4) == 't') && - (Str__get_at(text, i+5) == '{')) { - if ((Str__get_at(text, i-4) == '{') && - (Str__get_at(text, i-3) == '}') && - (Str__get_at(text, i-2) == '^') && - (Str__get_at(text, i-1) == '3')) { - TeX__remove_math_mode_range(OUT, text, from, i-5); - WRITE(" curt("); - } else { - TeX__remove_math_mode_range(OUT, text, from, i-1); - WRITE(" sqrt("); - } - int j=i+6, bl = 1; - for (; j <= to; j++) { - wchar_t c = Str__get_at(text, j); - if (c == '}') { - bl--; - if (bl == 0) break; - } - if (c == '{') bl++; - } - TeX__remove_math_mode_range(OUT, text, i+6, j-1); - WRITE(")"); - TeX__remove_math_mode_range(OUT, text, j+1, to); - return; - } - -} -#line 743 "inweb/Chapter 5/TeX Format.w" -; - } - int math_mode = FALSE; - for (int i=from; i <= to; i++) { - switch (Str__get_at(text, i)) { - case '$': - if (Str__get_at(text, i+1) == '$') i++; - math_mode = (math_mode)?FALSE:TRUE; break; - case '~': if (math_mode) WRITE(" "); else WRITE("~"); break; - case '\\': -{ -#line 845 "inweb/Chapter 5/TeX Format.w" - TEMPORARY_TEXT(macro); - i++; - while ((i < Str__len(text)) && (Characters__isalpha(Str__get_at(text, i)))) - PUT_TO(macro, Str__get_at(text, i++)); - if (Str__eq(macro, TL_IS_418)) -{ -#line 968 "inweb/Chapter 5/TeX Format.w" - if (Str__get_at(text, i) == '\\') { - Str__clear(macro); - i++; - while ((i < Str__len(text)) && (Characters__isalpha(Str__get_at(text, i)))) - PUT_TO(macro, Str__get_at(text, i++)); - if (Str__eq(macro, TL_IS_514)) PUT((wchar_t) 0x2204); - else if (Str__eq(macro, TL_IS_515)) { PUT((wchar_t) 0x00AC); PUT((wchar_t) 0x2200); } - else { - PRINT("Don't know how to apply '\\not' to '\\%S'\n", macro); - } - } else { - PRINT("Don't know how to apply '\\not' here\n"); - } - -} -#line 849 "inweb/Chapter 5/TeX Format.w" - - else -{ -#line 855 "inweb/Chapter 5/TeX Format.w" - if (Str__eq(macro, TL_IS_419)) WRITE("<="); - else if (Str__eq(macro, TL_IS_420)) WRITE(">="); - else if (Str__eq(macro, TL_IS_421)) WRITE("~"); - else if (Str__eq(macro, TL_IS_422)) WRITE(""); - else if (Str__eq(macro, TL_IS_423)) WRITE(""); - else if (Str__eq(macro, TL_IS_424)) WRITE(""); - else if (Str__eq(macro, TL_IS_425)) WRITE("=>"); - else if (Str__eq(macro, TL_IS_426)) WRITE("<=>"); - else if (Str__eq(macro, TL_IS_427)) WRITE("-->"); - else if (Str__eq(macro, TL_IS_428)) WRITE("-->"); - else if (Str__eq(macro, TL_IS_429)) WRITE("-->"); - else if (Str__eq(macro, TL_IS_430)) WRITE("<--"); - else if (Str__eq(macro, TL_IS_431)) WRITE("<--"); - else if (Str__eq(macro, TL_IS_432)) WRITE("{"); - else if (Str__eq(macro, TL_IS_433)) WRITE("|"); - else if (Str__eq(macro, TL_IS_434)) WRITE("}"); - else if (Str__eq(macro, TL_IS_435)) WRITE("."); - else if (Str__eq(macro, TL_IS_436)) WRITE("..."); - else if (Str__eq(macro, TL_IS_437)) WRITE("..."); - else if (Str__eq(macro, TL_IS_438)) WRITE("*"); - else if (Str__eq(macro, TL_IS_439)) WRITE(" "); - else if (Str__eq(macro, TL_IS_440)) WRITE(" "); - else if (Str__eq(macro, TL_IS_441)) WRITE("TeX"); - else if (Str__eq(macro, TL_IS_442)) WRITE("!="); - else if (Str__eq(macro, TL_IS_443)) WRITE("!="); - else if (Str__eq(macro, TL_IS_444)) WRITE("l"); - else if (Str__eq(macro, TL_IS_445)) WRITE("log"); - else if (Str__eq(macro, TL_IS_446)) WRITE("exp"); - else if (Str__eq(macro, TL_IS_447)) WRITE("sin"); - else if (Str__eq(macro, TL_IS_448)) WRITE("cos"); - else if (Str__eq(macro, TL_IS_449)) WRITE("tan"); - else if (Str__eq(macro, TL_IS_450)) WRITE("T"); - else if (Str__eq(macro, TL_IS_451)) PUT((wchar_t) 0x0391); - else if (Str__eq(macro, TL_IS_452)) PUT((wchar_t) 0x0392); - else if (Str__eq(macro, TL_IS_453)) PUT((wchar_t) 0x0393); - else if (Str__eq(macro, TL_IS_454)) PUT((wchar_t) 0x0394); - else if (Str__eq(macro, TL_IS_455)) PUT((wchar_t) 0x0395); - else if (Str__eq(macro, TL_IS_456)) PUT((wchar_t) 0x0396); - else if (Str__eq(macro, TL_IS_457)) PUT((wchar_t) 0x0397); - else if (Str__eq(macro, TL_IS_458)) PUT((wchar_t) 0x0398); - else if (Str__eq(macro, TL_IS_459)) PUT((wchar_t) 0x0399); - else if (Str__eq(macro, TL_IS_460)) PUT((wchar_t) 0x039A); - else if (Str__eq(macro, TL_IS_461)) PUT((wchar_t) 0x039B); - else if (Str__eq(macro, TL_IS_462)) PUT((wchar_t) 0x039C); - else if (Str__eq(macro, TL_IS_463)) PUT((wchar_t) 0x039D); - else if (Str__eq(macro, TL_IS_464)) PUT((wchar_t) 0x039E); - else if (Str__eq(macro, TL_IS_465)) PUT((wchar_t) 0x039F); - else if (Str__eq(macro, TL_IS_466)) PUT((wchar_t) 0x03A0); - else if (Str__eq(macro, TL_IS_467)) PUT((wchar_t) 0x03A1); - else if (Str__eq(macro, TL_IS_468)) PUT((wchar_t) 0x03A2); - else if (Str__eq(macro, TL_IS_469)) PUT((wchar_t) 0x03A3); - else if (Str__eq(macro, TL_IS_470)) PUT((wchar_t) 0x03A4); - else if (Str__eq(macro, TL_IS_471)) PUT((wchar_t) 0x03A5); - else if (Str__eq(macro, TL_IS_472)) PUT((wchar_t) 0x03A6); - else if (Str__eq(macro, TL_IS_473)) PUT((wchar_t) 0x03A7); - else if (Str__eq(macro, TL_IS_474)) PUT((wchar_t) 0x03A8); - else if (Str__eq(macro, TL_IS_475)) PUT((wchar_t) 0x03A9); - else if (Str__eq(macro, TL_IS_476)) PUT((wchar_t) 0x03B1); - else if (Str__eq(macro, TL_IS_477)) PUT((wchar_t) 0x03B2); - else if (Str__eq(macro, TL_IS_478)) PUT((wchar_t) 0x03B3); - else if (Str__eq(macro, TL_IS_479)) PUT((wchar_t) 0x03B4); - else if (Str__eq(macro, TL_IS_480)) PUT((wchar_t) 0x03B5); - else if (Str__eq(macro, TL_IS_481)) PUT((wchar_t) 0x03B6); - else if (Str__eq(macro, TL_IS_482)) PUT((wchar_t) 0x03B7); - else if (Str__eq(macro, TL_IS_483)) PUT((wchar_t) 0x03B8); - else if (Str__eq(macro, TL_IS_484)) PUT((wchar_t) 0x03B9); - else if (Str__eq(macro, TL_IS_485)) PUT((wchar_t) 0x03BA); - else if (Str__eq(macro, TL_IS_486)) PUT((wchar_t) 0x03BB); - else if (Str__eq(macro, TL_IS_487)) PUT((wchar_t) 0x03BC); - else if (Str__eq(macro, TL_IS_488)) PUT((wchar_t) 0x03BD); - else if (Str__eq(macro, TL_IS_489)) PUT((wchar_t) 0x03BE); - else if (Str__eq(macro, TL_IS_490)) PUT((wchar_t) 0x03BF); - else if (Str__eq(macro, TL_IS_491)) PUT((wchar_t) 0x03C0); - else if (Str__eq(macro, TL_IS_492)) PUT((wchar_t) 0x03C1); - else if (Str__eq(macro, TL_IS_493)) PUT((wchar_t) 0x03C2); - else if (Str__eq(macro, TL_IS_494)) PUT((wchar_t) 0x03C3); - else if (Str__eq(macro, TL_IS_495)) PUT((wchar_t) 0x03C4); - else if (Str__eq(macro, TL_IS_496)) PUT((wchar_t) 0x03C5); - else if (Str__eq(macro, TL_IS_497)) PUT((wchar_t) 0x03C6); - else if (Str__eq(macro, TL_IS_498)) PUT((wchar_t) 0x03C7); - else if (Str__eq(macro, TL_IS_499)) PUT((wchar_t) 0x03C8); - else if (Str__eq(macro, TL_IS_500)) PUT((wchar_t) 0x03C9); - else if (Str__eq(macro, TL_IS_501)) PUT((wchar_t) 0x2203); - else if (Str__eq(macro, TL_IS_502)) PUT((wchar_t) 0x2208); - else if (Str__eq(macro, TL_IS_503)) PUT((wchar_t) 0x2200); - else if (Str__eq(macro, TL_IS_504)) PUT((wchar_t) 0x2229); - else if (Str__eq(macro, TL_IS_505)) PUT((wchar_t) 0x2205); - else if (Str__eq(macro, TL_IS_506)) PUT((wchar_t) 0x2286); - else if (Str__eq(macro, TL_IS_507)) PUT((wchar_t) 0x2227); - else if (Str__eq(macro, TL_IS_508)) PUT((wchar_t) 0x2228); - else if (Str__eq(macro, TL_IS_509)) PUT((wchar_t) 0x00AC); - else if (Str__eq(macro, TL_IS_510)) PUT((wchar_t) 0x03A3); - else if (Str__eq(macro, TL_IS_511)) PUT((wchar_t) 0x03A0); - else { - if (Str__len(macro) > 0) { - int suspect = TRUE; - LOOP_THROUGH_TEXT(pos, macro) { - wchar_t c = Str__get(pos); - if ((c >= 'A') && (c <= 'Z')) continue; - if ((c >= 'a') && (c <= 'z')) continue; - suspect = FALSE; - } - if (Str__eq(macro, TL_IS_512)) suspect = FALSE; - if (Str__eq(macro, TL_IS_513)) suspect = FALSE; - if (suspect) - PRINT("[Passing through unknown TeX macro \\%S:\n %S\n", macro, text); - } - WRITE("\\%S", macro); - } - -} -#line 850 "inweb/Chapter 5/TeX Format.w" -; - DISCARD_TEXT(macro); - i--; - -} -#line 752 "inweb/Chapter 5/TeX Format.w" -; break; - default: PUT(Str__get_at(text, i)); break; - } - } -} - #line 9 "inweb/Chapter 5/HTML Formats.w" void HTMLFormat__create(void) { { #line 15 "inweb/Chapter 5/HTML Formats.w" - weave_format *wf = Formats__create_weave_format(TL_IS_516, TL_IS_517); + weave_format *wf = Formats__create_weave_format(TL_IS_415, TL_IS_416); METHOD_ADD(wf, RENDER_FOR_MTID, HTMLFormat__render); } @@ -25513,7 +24960,7 @@ void HTMLFormat__create(void) { { #line 19 "inweb/Chapter 5/HTML Formats.w" - weave_format *wf = Formats__create_weave_format(TL_IS_518, TL_IS_519); + weave_format *wf = Formats__create_weave_format(TL_IS_417, TL_IS_418); METHOD_ADD(wf, RENDER_FOR_MTID, HTMLFormat__render_EPUB); METHOD_ADD(wf, BEGIN_WEAVING_FOR_MTID, HTMLFormat__begin_weaving_EPUB); METHOD_ADD(wf, END_WEAVING_FOR_MTID, HTMLFormat__end_weaving_EPUB); @@ -25538,8 +24985,8 @@ HTML_render_state HTMLFormat__initial_state(text_stream *OUT, weave_order *wv, hrs.slide_number = -1; hrs.slide_of = -1; - Swarm__ensure_plugin(wv, TL_IS_520); - hrs.colours = Swarm__ensure_colour_scheme(wv, TL_IS_521, TL_IS_522); + Swarm__ensure_plugin(wv, TL_IS_419); + hrs.colours = Swarm__ensure_colour_scheme(wv, TL_IS_420, TL_IS_421); return hrs; } @@ -25556,7 +25003,7 @@ void HTMLFormat__render_EPUB(weave_format *self, text_stream *OUT, heterogeneous HTML__declare_as_HTML(OUT, TRUE); HTML_render_state hrs = HTMLFormat__initial_state(OUT, C->wv, TRUE, C->wv->weave_to); Trees__traverse_from(tree->root, &HTMLFormat__render_visit, (void *) &hrs, 0); - Epub__note_page(C->wv->weave_web->as_ebook, C->wv->weave_to, C->wv->booklet_title, TL_IS_523); + Epub__note_page(C->wv->weave_web->as_ebook, C->wv->weave_to, C->wv->booklet_title, TL_IS_422); HTML__completed(OUT); } @@ -25612,15 +25059,15 @@ int HTMLFormat__render_visit(tree_node *N, void *state, int L) { #line 141 "inweb/Chapter 5/HTML Formats.w" weave_section_header_node *C = RETRIEVE_POINTER_weave_section_header_node(N->content); - Swarm__ensure_plugin(hrs->wv, TL_IS_524); + Swarm__ensure_plugin(hrs->wv, TL_IS_423); HTML_OPEN_WITH("ul", "class=\"crumbs\""); Colonies__drop_initial_breadcrumbs(OUT, hrs->wv->weave_to, hrs->wv->breadcrumbs); - text_stream *bct = Bibliographic__get_datum(hrs->wv->weave_web->md, TL_IS_525); - if (Str__len(Bibliographic__get_datum(hrs->wv->weave_web->md, TL_IS_526)) > 0) - bct = Bibliographic__get_datum(hrs->wv->weave_web->md, TL_IS_527); + text_stream *bct = Bibliographic__get_datum(hrs->wv->weave_web->md, TL_IS_424); + if (Str__len(Bibliographic__get_datum(hrs->wv->weave_web->md, TL_IS_425)) > 0) + bct = Bibliographic__get_datum(hrs->wv->weave_web->md, TL_IS_426); if (hrs->wv->self_contained == FALSE) { - Colonies__write_breadcrumb(OUT, bct, TL_IS_528); + Colonies__write_breadcrumb(OUT, bct, TL_IS_427); if (hrs->wv->weave_web->md->chaptered) { TEMPORARY_TEXT(chapter_link); WRITE_TO(chapter_link, "index.html#%s%S", @@ -25765,7 +25212,7 @@ int HTMLFormat__render_visit(tree_node *N, void *state, int L) { #line 243 "inweb/Chapter 5/HTML Formats.w" weave_figure_node *C = RETRIEVE_POINTER_weave_figure_node(N->content); filename *F = Filenames__in( - Pathnames__down(hrs->wv->weave_web->md->path_to_web, TL_IS_529), + Pathnames__down(hrs->wv->weave_web->md->path_to_web, TL_IS_428), C->figname); filename *RF = Filenames__from_text(C->figname); HTML_OPEN("center"); @@ -25782,7 +25229,7 @@ int HTMLFormat__render_visit(tree_node *N, void *state, int L) { #line 255 "inweb/Chapter 5/HTML Formats.w" weave_audio_node *C = RETRIEVE_POINTER_weave_audio_node(N->content); filename *F = Filenames__in( - Pathnames__down(hrs->wv->weave_web->md->path_to_web, TL_IS_530), + Pathnames__down(hrs->wv->weave_web->md->path_to_web, TL_IS_429), C->audio_name); Patterns__copy_file_into_weave(hrs->wv->weave_web, F, NULL, NULL); HTML_OPEN("center"); @@ -26055,20 +25502,20 @@ int HTMLFormat__render_visit(tree_node *N, void *state, int L) { { #line 391 "inweb/Chapter 5/HTML Formats.w" weave_embed_node *C = RETRIEVE_POINTER_weave_embed_node(N->content); - text_stream *CH = TL_IS_531; - text_stream *CW = TL_IS_532; + text_stream *CH = TL_IS_430; + text_stream *CW = TL_IS_431; if (C->w > 0) { Str__clear(CW); WRITE_TO(CW, "%d", C->w); } if (C->h > 0) { Str__clear(CH); WRITE_TO(CH, "%d", C->h); } TEMPORARY_TEXT(embed_leaf); WRITE_TO(embed_leaf, "%S.html", C->service); - filename *F = Patterns__find_asset(hrs->wv->pattern, TL_IS_533, embed_leaf); + filename *F = Patterns__find_asset(hrs->wv->pattern, TL_IS_432, embed_leaf); DISCARD_TEXT(embed_leaf); if (F == NULL) { - Main__error_in_web(TL_IS_534, hrs->wv->current_weave_line); + Main__error_in_web(TL_IS_433, hrs->wv->current_weave_line); } else { - Bibliographic__set_datum(hrs->wv->weave_web->md, TL_IS_535, C->ID); - Bibliographic__set_datum(hrs->wv->weave_web->md, TL_IS_536, CW); - Bibliographic__set_datum(hrs->wv->weave_web->md, TL_IS_537, CH); + Bibliographic__set_datum(hrs->wv->weave_web->md, TL_IS_434, C->ID); + Bibliographic__set_datum(hrs->wv->weave_web->md, TL_IS_435, CW); + Bibliographic__set_datum(hrs->wv->weave_web->md, TL_IS_436, CH); HTML_OPEN("center"); Collater__for_web_and_pattern(OUT, hrs->wv->weave_web, hrs->wv->pattern, F, hrs->into_file); @@ -26088,7 +25535,7 @@ int HTMLFormat__render_visit(tree_node *N, void *state, int L) { if (C->defn == FALSE) { TEMPORARY_TEXT(url); Colonies__paragraph_URL(url, P, hrs->wv->weave_to); - HTML__begin_link_with_class(OUT, TL_IS_538, url); + HTML__begin_link_with_class(OUT, TL_IS_437, url); DISCARD_TEXT(url); } HTML_OPEN_WITH("span", "class=\"%s\"", @@ -26148,7 +25595,7 @@ int HTMLFormat__render_visit(tree_node *N, void *state, int L) { { #line 451 "inweb/Chapter 5/HTML Formats.w" weave_function_usage_node *C = RETRIEVE_POINTER_weave_function_usage_node(N->content); - HTML__begin_link_with_class(OUT, TL_IS_539, C->url); + HTML__begin_link_with_class(OUT, TL_IS_438, C->url); HTMLFormat__change_colour(OUT, FUNCTION_COLOUR, hrs->colours); WRITE("%S", C->fn->function_name); HTMLFormat__change_colour(OUT, -1, hrs->colours); @@ -26186,17 +25633,17 @@ int HTMLFormat__render_visit(tree_node *N, void *state, int L) { { #line 479 "inweb/Chapter 5/HTML Formats.w" weave_carousel_slide_node *C = RETRIEVE_POINTER_weave_carousel_slide_node(N->content); - Swarm__ensure_plugin(hrs->wv, TL_IS_540); + Swarm__ensure_plugin(hrs->wv, TL_IS_439); TEMPORARY_TEXT(carousel_id) TEMPORARY_TEXT(carousel_dots_id) text_stream *caption_class = NULL; - text_stream *slide_count_class = TL_IS_541; + text_stream *slide_count_class = TL_IS_440; switch (C->caption_command) { - case CAROUSEL_CMD: caption_class = TL_IS_542; break; - case CAROUSEL_ABOVE_CMD: caption_class = TL_IS_543; - slide_count_class = TL_IS_544; break; - case CAROUSEL_BELOW_CMD: caption_class = TL_IS_545; - slide_count_class = TL_IS_546; break; + case CAROUSEL_CMD: caption_class = TL_IS_441; break; + case CAROUSEL_ABOVE_CMD: caption_class = TL_IS_442; + slide_count_class = TL_IS_443; break; + case CAROUSEL_BELOW_CMD: caption_class = TL_IS_444; + slide_count_class = TL_IS_445; break; } WRITE_TO(carousel_id, "carousel-no-%d", hrs->carousel_number); WRITE_TO(carousel_dots_id, "carousel-dots-no-%d", hrs->carousel_number); @@ -26357,7 +25804,7 @@ int HTMLFormat__render_visit(tree_node *N, void *state, int L) { { #line 605 "inweb/Chapter 5/HTML Formats.w" weave_url_node *C = RETRIEVE_POINTER_weave_url_node(N->content); - HTML__begin_link_with_class(OUT, (C->external)?TL_IS_547:TL_IS_548, C->url); + HTML__begin_link_with_class(OUT, (C->external)?TL_IS_446:TL_IS_447, C->url); WRITE("%S", C->content); HTML__end_link(OUT); @@ -26423,7 +25870,7 @@ int HTMLFormat__render_visit(tree_node *N, void *state, int L) { weave_function_defn_node *C = RETRIEVE_POINTER_weave_function_defn_node(N->content); if (Functions__used_elsewhere(C->fn)) { - Swarm__ensure_plugin(hrs->wv, TL_IS_549); + Swarm__ensure_plugin(hrs->wv, TL_IS_448); HTMLFormat__change_colour(OUT, FUNCTION_COLOUR, hrs->colours); WRITE("%S", C->fn->function_name); WRITE(""); @@ -26514,7 +25961,7 @@ int HTMLFormat__render_visit(tree_node *N, void *state, int L) { text_stream *plugin_name = hrs->wv->pattern->mathematics_plugin; if (Str__len(plugin_name) == 0) { TEMPORARY_TEXT(R); - TeX__remove_math_mode(R, C->content); + TeXUtilities__remove_math_mode(R, C->content); HTMLFormat__escape_text(OUT, R); DISCARD_TEXT(R); } else { @@ -26619,9 +26066,9 @@ void HTMLFormat__escape_text(text_stream *OUT, text_stream *id) { #line 808 "inweb/Chapter 5/HTML Formats.w" int HTMLFormat__begin_weaving_EPUB(weave_format *wf, web *W, weave_pattern *pattern) { TEMPORARY_TEXT(T) - WRITE_TO(T, "%S", Bibliographic__get_datum(W->md, TL_IS_550)); + WRITE_TO(T, "%S", Bibliographic__get_datum(W->md, TL_IS_449)); W->as_ebook = Epub__new(T, "P"); - filename *CSS = Patterns__find_asset(pattern, TL_IS_551, TL_IS_552); + filename *CSS = Patterns__find_asset(pattern, TL_IS_450, TL_IS_451); Epub__use_CSS_throughout(W->as_ebook, CSS); Epub__attach_metadata(W->as_ebook, L"identifier", T); DISCARD_TEXT(T) @@ -26638,7 +26085,7 @@ void HTMLFormat__end_weaving_EPUB(weave_format *wf, web *W, weave_pattern *patte #line 9 "inweb/Chapter 5/Debugging Format.w" void Debugging__create(void) { - weave_format *wf = Formats__create_weave_format(TL_IS_553, TL_IS_554); + weave_format *wf = Formats__create_weave_format(TL_IS_452, TL_IS_453); METHOD_ADD(wf, RENDER_FOR_MTID, Debugging__render); } @@ -27110,8 +26557,8 @@ colour_scheme *WeavePlugins__find_colour_scheme(weave_pattern *pattern, return cs; TEMPORARY_TEXT(css); WRITE_TO(css, "%S.css", name); - filename *F = Patterns__find_asset(pattern, TL_IS_555, css); - if (F == NULL) F = Patterns__find_asset(pattern, TL_IS_556, css); + filename *F = Patterns__find_asset(pattern, TL_IS_454, css); + if (F == NULL) F = Patterns__find_asset(pattern, TL_IS_455, css); DISCARD_TEXT(css); if (F == NULL) return NULL; cs = CREATE(colour_scheme); @@ -27135,7 +26582,7 @@ void WeavePlugins__include_plugin(OUTPUT_STREAM, web *W, weave_plugin *wp, wp->last_included_in_round = current_inclusion_round; pathname *AP = Colonies__assets_path(); int html_mode = FALSE; - if (Str__eq(pattern->pattern_format->format_name, TL_IS_557)) html_mode = TRUE; + if (Str__eq(pattern->pattern_format->format_name, TL_IS_456)) html_mode = TRUE; int finds = 0; TEMPORARY_TEXT(required); WRITE_TO(required, "%S.html", wp->plugin_name); @@ -27173,9 +26620,9 @@ void WeavePlugins__include_plugin(OUTPUT_STREAM, web *W, weave_plugin *wp, if (html_mode) { TEMPORARY_TEXT(ext); Filenames__write_extension(ext, F); - if (Str__eq_insensitive(ext, TL_IS_558)) { + if (Str__eq_insensitive(ext, TL_IS_457)) { WeavePlugins__include_CSS_file(OUT, W, F, leafname, NULL, pattern, from); - } else if (Str__eq_insensitive(ext, TL_IS_559)) { + } else if (Str__eq_insensitive(ext, TL_IS_458)) { TEMPORARY_TEXT(url); if (AP) Pathnames__relative_URL(url, Filenames__up(from), AP); WRITE_TO(url, "%S", leafname); @@ -27211,7 +26658,7 @@ void WeavePlugins__include_plugin(OUTPUT_STREAM, web *W, weave_plugin *wp, } else { TEMPORARY_TEXT(ext); Filenames__write_extension(ext, F); - if (Str__eq_insensitive(ext, TL_IS_560)) { + if (Str__eq_insensitive(ext, TL_IS_459)) { WeavePlugins__include_TeX_macros(OUT, W, F, leafname, NULL, pattern, from); } else { @@ -27251,11 +26698,11 @@ void WeavePlugins__include_colour_scheme(OUTPUT_STREAM, web *W, colour_scheme *c weave_pattern *pattern, filename *from) { if (cs->last_included_in_round == current_inclusion_round) return; cs->last_included_in_round = current_inclusion_round; - if (Str__eq(pattern->pattern_format->format_name, TL_IS_561)) { + if (Str__eq(pattern->pattern_format->format_name, TL_IS_460)) { TEMPORARY_TEXT(css); WRITE_TO(css, "%S.css", cs->scheme_name); - filename *F = Patterns__find_asset(pattern, TL_IS_562, css); - if (F == NULL) F = Patterns__find_asset(pattern, TL_IS_563, css); + filename *F = Patterns__find_asset(pattern, TL_IS_461, css); + if (F == NULL) F = Patterns__find_asset(pattern, TL_IS_462, css); if (F == NULL) { TEMPORARY_TEXT(err); WRITE_TO(err, "No CSS file for the colour scheme '%S' can be found", @@ -27303,38 +26750,29 @@ void WeavePlugins__include_TeX_macros(OUTPUT_STREAM, web *W, filename *F, text_s Patterns__transform_CSS, NULL, (void *) &cft); } -#line 22 "inweb/Chapter 5/Running Through TeX.w" -void RunningTeX__post_process_weave(weave_order *wv, filename *CF) { +#line 28 "inweb/Chapter 5/TeX Utilities.w" + +#line 30 "inweb/Chapter 5/TeX Utilities.w" +tex_results *TeXUtilities__new_results(weave_order *wv, filename *CF) { tex_results *res = CREATE(tex_results); - -{ -#line 43 "inweb/Chapter 5/Running Through TeX.w" res->overfull_hbox_count = 0; res->tex_error_count = 0; res->page_count = 0; res->pdf_size = 0; - res->PDF_filename = Filenames__set_extension(CF, TL_IS_564); - + res->PDF_filename = Filenames__set_extension(CF, TL_IS_463); + return res; } -#line 24 "inweb/Chapter 5/Running Through TeX.w" -; - wv->post_processing_results = res; - -{ -#line 54 "inweb/Chapter 5/Running Through TeX.w" + +#line 44 "inweb/Chapter 5/TeX Utilities.w" +void TeXUtilities__post_process_weave(weave_order *wv, filename *CF) { + wv->post_processing_results = TeXUtilities__new_results(wv, CF); TextFiles__read(CF, FALSE, - "can't open console file", TRUE, RunningTeX__scan_console_line, NULL, - (void *) res); - -} -#line 26 "inweb/Chapter 5/Running Through TeX.w" -; + "can't open console file", TRUE, TeXUtilities__scan_console_line, NULL, + (void *) wv->post_processing_results); } -#line 41 "inweb/Chapter 5/Running Through TeX.w" - -#line 59 "inweb/Chapter 5/Running Through TeX.w" -void RunningTeX__scan_console_line(text_stream *line, text_file_position *tfp, +#line 52 "inweb/Chapter 5/TeX Utilities.w" +void TeXUtilities__scan_console_line(text_stream *line, text_file_position *tfp, void *res_V) { tex_results *res = (tex_results *) res_V; match_results mr = Regexp__create_mr(); @@ -27351,8 +26789,8 @@ void RunningTeX__scan_console_line(text_stream *line, text_file_position *tfp, Regexp__dispose_of(&mr); } -#line 79 "inweb/Chapter 5/Running Through TeX.w" -void RunningTeX__report_on_post_processing(weave_order *wv) { +#line 72 "inweb/Chapter 5/TeX Utilities.w" +void TeXUtilities__report_on_post_processing(weave_order *wv) { tex_results *res = wv->post_processing_results; if (res) { PRINT(": %dpp %dK", res->page_count, res->pdf_size/1024); @@ -27363,8 +26801,8 @@ void RunningTeX__report_on_post_processing(weave_order *wv) { } } -#line 93 "inweb/Chapter 5/Running Through TeX.w" -int RunningTeX__substitute_post_processing_data(text_stream *to, weave_order *wv, +#line 86 "inweb/Chapter 5/TeX Utilities.w" +int TeXUtilities__substitute_post_processing_data(text_stream *to, weave_order *wv, text_stream *detail) { if (wv) { tex_results *res = wv->post_processing_results; @@ -27396,6 +26834,274 @@ int RunningTeX__substitute_post_processing_data(text_stream *to, weave_order *wv return FALSE; } +#line 126 "inweb/Chapter 5/TeX Utilities.w" +void TeXUtilities__remove_math_mode(OUTPUT_STREAM, text_stream *text) { + TEMPORARY_TEXT(math_matter); + TeXUtilities__remove_math_mode_range(math_matter, text, 0, Str__len(text)-1); + WRITE("%S", math_matter); + DISCARD_TEXT(math_matter); +} + +void TeXUtilities__remove_math_mode_range(OUTPUT_STREAM, text_stream *text, int from, int to) { + for (int i=from; i <= to; i++) { + +{ +#line 157 "inweb/Chapter 5/TeX Utilities.w" + if ((Str__get_at(text, i) == '\\') && + (Str__get_at(text, i+1) == 'o') && (Str__get_at(text, i+2) == 'v') && + (Str__get_at(text, i+3) == 'e') && (Str__get_at(text, i+4) == 'r') && + (Str__get_at(text, i+5) == '{')) { + int bl = 1; + int j = i-1; + for (; j >= from; j--) { + wchar_t c = Str__get_at(text, j); + if (c == '{') { + bl--; + if (bl == 0) break; + } + if (c == '}') bl++; + } + TeXUtilities__remove_math_mode_range(OUT, text, from, j-1); + WRITE("(("); + TeXUtilities__remove_math_mode_range(OUT, text, j+2, i-2); + WRITE(") / ("); + j=i+6; bl = 1; + for (; j <= to; j++) { + wchar_t c = Str__get_at(text, j); + if (c == '}') { + bl--; + if (bl == 0) break; + } + if (c == '{') bl++; + } + TeXUtilities__remove_math_mode_range(OUT, text, i+6, j-1); + WRITE("))"); + TeXUtilities__remove_math_mode_range(OUT, text, j+2, to); + return; + } + +} +#line 135 "inweb/Chapter 5/TeX Utilities.w" +; + } + for (int i=from; i <= to; i++) { + +{ +#line 193 "inweb/Chapter 5/TeX Utilities.w" + if ((Str__get_at(text, i) == '{') && (Str__get_at(text, i+1) == '\\') && + (((Str__get_at(text, i+2) == 'r') && (Str__get_at(text, i+3) == 'm')) || + ((Str__get_at(text, i+2) == 'i') && (Str__get_at(text, i+3) == 't'))) && + (Str__get_at(text, i+4) == ' ')) { + TeXUtilities__remove_math_mode_range(OUT, text, from, i-1); + int j=i+5; + for (; j <= to; j++) + if (Str__get_at(text, j) == '}') + break; + TeXUtilities__remove_math_mode_range(OUT, text, i+5, j-1); + TeXUtilities__remove_math_mode_range(OUT, text, j+1, to); + return; + } + +} +#line 138 "inweb/Chapter 5/TeX Utilities.w" +; + +{ +#line 211 "inweb/Chapter 5/TeX Utilities.w" + if ((Str__get_at(text, i) == '\\') && + (Str__get_at(text, i+1) == 's') && (Str__get_at(text, i+2) == 'q') && + (Str__get_at(text, i+3) == 'r') && (Str__get_at(text, i+4) == 't') && + (Str__get_at(text, i+5) == '{')) { + if ((Str__get_at(text, i-4) == '{') && + (Str__get_at(text, i-3) == '}') && + (Str__get_at(text, i-2) == '^') && + (Str__get_at(text, i-1) == '3')) { + TeXUtilities__remove_math_mode_range(OUT, text, from, i-5); + WRITE(" curt("); + } else { + TeXUtilities__remove_math_mode_range(OUT, text, from, i-1); + WRITE(" sqrt("); + } + int j=i+6, bl = 1; + for (; j <= to; j++) { + wchar_t c = Str__get_at(text, j); + if (c == '}') { + bl--; + if (bl == 0) break; + } + if (c == '{') bl++; + } + TeXUtilities__remove_math_mode_range(OUT, text, i+6, j-1); + WRITE(")"); + TeXUtilities__remove_math_mode_range(OUT, text, j+1, to); + return; + } + +} +#line 139 "inweb/Chapter 5/TeX Utilities.w" +; + } + int math_mode = FALSE; + for (int i=from; i <= to; i++) { + switch (Str__get_at(text, i)) { + case '$': + if (Str__get_at(text, i+1) == '$') i++; + math_mode = (math_mode)?FALSE:TRUE; break; + case '~': if (math_mode) WRITE(" "); else WRITE("~"); break; + case '\\': +{ +#line 241 "inweb/Chapter 5/TeX Utilities.w" + TEMPORARY_TEXT(macro); + i++; + while ((i < Str__len(text)) && (Characters__isalpha(Str__get_at(text, i)))) + PUT_TO(macro, Str__get_at(text, i++)); + if (Str__eq(macro, TL_IS_464)) +{ +#line 364 "inweb/Chapter 5/TeX Utilities.w" + if (Str__get_at(text, i) == '\\') { + Str__clear(macro); + i++; + while ((i < Str__len(text)) && (Characters__isalpha(Str__get_at(text, i)))) + PUT_TO(macro, Str__get_at(text, i++)); + if (Str__eq(macro, TL_IS_560)) PUT((wchar_t) 0x2204); + else if (Str__eq(macro, TL_IS_561)) { PUT((wchar_t) 0x00AC); PUT((wchar_t) 0x2200); } + else { + PRINT("Don't know how to apply '\\not' to '\\%S'\n", macro); + } + } else { + PRINT("Don't know how to apply '\\not' here\n"); + } + +} +#line 245 "inweb/Chapter 5/TeX Utilities.w" + + else +{ +#line 251 "inweb/Chapter 5/TeX Utilities.w" + if (Str__eq(macro, TL_IS_465)) WRITE("<="); + else if (Str__eq(macro, TL_IS_466)) WRITE(">="); + else if (Str__eq(macro, TL_IS_467)) WRITE("~"); + else if (Str__eq(macro, TL_IS_468)) WRITE(""); + else if (Str__eq(macro, TL_IS_469)) WRITE(""); + else if (Str__eq(macro, TL_IS_470)) WRITE(""); + else if (Str__eq(macro, TL_IS_471)) WRITE("=>"); + else if (Str__eq(macro, TL_IS_472)) WRITE("<=>"); + else if (Str__eq(macro, TL_IS_473)) WRITE("-->"); + else if (Str__eq(macro, TL_IS_474)) WRITE("-->"); + else if (Str__eq(macro, TL_IS_475)) WRITE("-->"); + else if (Str__eq(macro, TL_IS_476)) WRITE("<--"); + else if (Str__eq(macro, TL_IS_477)) WRITE("<--"); + else if (Str__eq(macro, TL_IS_478)) WRITE("{"); + else if (Str__eq(macro, TL_IS_479)) WRITE("|"); + else if (Str__eq(macro, TL_IS_480)) WRITE("}"); + else if (Str__eq(macro, TL_IS_481)) WRITE("."); + else if (Str__eq(macro, TL_IS_482)) WRITE("..."); + else if (Str__eq(macro, TL_IS_483)) WRITE("..."); + else if (Str__eq(macro, TL_IS_484)) WRITE("*"); + else if (Str__eq(macro, TL_IS_485)) WRITE(" "); + else if (Str__eq(macro, TL_IS_486)) WRITE(" "); + else if (Str__eq(macro, TL_IS_487)) WRITE("TeX"); + else if (Str__eq(macro, TL_IS_488)) WRITE("!="); + else if (Str__eq(macro, TL_IS_489)) WRITE("!="); + else if (Str__eq(macro, TL_IS_490)) WRITE("l"); + else if (Str__eq(macro, TL_IS_491)) WRITE("log"); + else if (Str__eq(macro, TL_IS_492)) WRITE("exp"); + else if (Str__eq(macro, TL_IS_493)) WRITE("sin"); + else if (Str__eq(macro, TL_IS_494)) WRITE("cos"); + else if (Str__eq(macro, TL_IS_495)) WRITE("tan"); + else if (Str__eq(macro, TL_IS_496)) WRITE("T"); + else if (Str__eq(macro, TL_IS_497)) PUT((wchar_t) 0x0391); + else if (Str__eq(macro, TL_IS_498)) PUT((wchar_t) 0x0392); + else if (Str__eq(macro, TL_IS_499)) PUT((wchar_t) 0x0393); + else if (Str__eq(macro, TL_IS_500)) PUT((wchar_t) 0x0394); + else if (Str__eq(macro, TL_IS_501)) PUT((wchar_t) 0x0395); + else if (Str__eq(macro, TL_IS_502)) PUT((wchar_t) 0x0396); + else if (Str__eq(macro, TL_IS_503)) PUT((wchar_t) 0x0397); + else if (Str__eq(macro, TL_IS_504)) PUT((wchar_t) 0x0398); + else if (Str__eq(macro, TL_IS_505)) PUT((wchar_t) 0x0399); + else if (Str__eq(macro, TL_IS_506)) PUT((wchar_t) 0x039A); + else if (Str__eq(macro, TL_IS_507)) PUT((wchar_t) 0x039B); + else if (Str__eq(macro, TL_IS_508)) PUT((wchar_t) 0x039C); + else if (Str__eq(macro, TL_IS_509)) PUT((wchar_t) 0x039D); + else if (Str__eq(macro, TL_IS_510)) PUT((wchar_t) 0x039E); + else if (Str__eq(macro, TL_IS_511)) PUT((wchar_t) 0x039F); + else if (Str__eq(macro, TL_IS_512)) PUT((wchar_t) 0x03A0); + else if (Str__eq(macro, TL_IS_513)) PUT((wchar_t) 0x03A1); + else if (Str__eq(macro, TL_IS_514)) PUT((wchar_t) 0x03A2); + else if (Str__eq(macro, TL_IS_515)) PUT((wchar_t) 0x03A3); + else if (Str__eq(macro, TL_IS_516)) PUT((wchar_t) 0x03A4); + else if (Str__eq(macro, TL_IS_517)) PUT((wchar_t) 0x03A5); + else if (Str__eq(macro, TL_IS_518)) PUT((wchar_t) 0x03A6); + else if (Str__eq(macro, TL_IS_519)) PUT((wchar_t) 0x03A7); + else if (Str__eq(macro, TL_IS_520)) PUT((wchar_t) 0x03A8); + else if (Str__eq(macro, TL_IS_521)) PUT((wchar_t) 0x03A9); + else if (Str__eq(macro, TL_IS_522)) PUT((wchar_t) 0x03B1); + else if (Str__eq(macro, TL_IS_523)) PUT((wchar_t) 0x03B2); + else if (Str__eq(macro, TL_IS_524)) PUT((wchar_t) 0x03B3); + else if (Str__eq(macro, TL_IS_525)) PUT((wchar_t) 0x03B4); + else if (Str__eq(macro, TL_IS_526)) PUT((wchar_t) 0x03B5); + else if (Str__eq(macro, TL_IS_527)) PUT((wchar_t) 0x03B6); + else if (Str__eq(macro, TL_IS_528)) PUT((wchar_t) 0x03B7); + else if (Str__eq(macro, TL_IS_529)) PUT((wchar_t) 0x03B8); + else if (Str__eq(macro, TL_IS_530)) PUT((wchar_t) 0x03B9); + else if (Str__eq(macro, TL_IS_531)) PUT((wchar_t) 0x03BA); + else if (Str__eq(macro, TL_IS_532)) PUT((wchar_t) 0x03BB); + else if (Str__eq(macro, TL_IS_533)) PUT((wchar_t) 0x03BC); + else if (Str__eq(macro, TL_IS_534)) PUT((wchar_t) 0x03BD); + else if (Str__eq(macro, TL_IS_535)) PUT((wchar_t) 0x03BE); + else if (Str__eq(macro, TL_IS_536)) PUT((wchar_t) 0x03BF); + else if (Str__eq(macro, TL_IS_537)) PUT((wchar_t) 0x03C0); + else if (Str__eq(macro, TL_IS_538)) PUT((wchar_t) 0x03C1); + else if (Str__eq(macro, TL_IS_539)) PUT((wchar_t) 0x03C2); + else if (Str__eq(macro, TL_IS_540)) PUT((wchar_t) 0x03C3); + else if (Str__eq(macro, TL_IS_541)) PUT((wchar_t) 0x03C4); + else if (Str__eq(macro, TL_IS_542)) PUT((wchar_t) 0x03C5); + else if (Str__eq(macro, TL_IS_543)) PUT((wchar_t) 0x03C6); + else if (Str__eq(macro, TL_IS_544)) PUT((wchar_t) 0x03C7); + else if (Str__eq(macro, TL_IS_545)) PUT((wchar_t) 0x03C8); + else if (Str__eq(macro, TL_IS_546)) PUT((wchar_t) 0x03C9); + else if (Str__eq(macro, TL_IS_547)) PUT((wchar_t) 0x2203); + else if (Str__eq(macro, TL_IS_548)) PUT((wchar_t) 0x2208); + else if (Str__eq(macro, TL_IS_549)) PUT((wchar_t) 0x2200); + else if (Str__eq(macro, TL_IS_550)) PUT((wchar_t) 0x2229); + else if (Str__eq(macro, TL_IS_551)) PUT((wchar_t) 0x2205); + else if (Str__eq(macro, TL_IS_552)) PUT((wchar_t) 0x2286); + else if (Str__eq(macro, TL_IS_553)) PUT((wchar_t) 0x2227); + else if (Str__eq(macro, TL_IS_554)) PUT((wchar_t) 0x2228); + else if (Str__eq(macro, TL_IS_555)) PUT((wchar_t) 0x00AC); + else if (Str__eq(macro, TL_IS_556)) PUT((wchar_t) 0x03A3); + else if (Str__eq(macro, TL_IS_557)) PUT((wchar_t) 0x03A0); + else { + if (Str__len(macro) > 0) { + int suspect = TRUE; + LOOP_THROUGH_TEXT(pos, macro) { + wchar_t c = Str__get(pos); + if ((c >= 'A') && (c <= 'Z')) continue; + if ((c >= 'a') && (c <= 'z')) continue; + suspect = FALSE; + } + if (Str__eq(macro, TL_IS_558)) suspect = FALSE; + if (Str__eq(macro, TL_IS_559)) suspect = FALSE; + if (suspect) + PRINT("[Passing through unknown TeX macro \\%S:\n %S\n", macro, text); + } + WRITE("\\%S", macro); + } + +} +#line 246 "inweb/Chapter 5/TeX Utilities.w" +; + DISCARD_TEXT(macro); + i--; + +} +#line 148 "inweb/Chapter 5/TeX Utilities.w" +; break; + default: PUT(Str__get_at(text, i)); break; + } + } +} + #line 23 "inweb/Chapter 6/Makefiles.w" void Makefiles__write(web *W, filename *prototype, filename *F, module_search *I) { @@ -27532,7 +27238,7 @@ void Makefiles__scan_makefile_line(text_stream *line, text_file_position *tfp, v { #line 139 "inweb/Chapter 6/Makefiles.w" WRITE("%S", mr.exp[0]); - Makefiles__repeat(OUT, TL_IS_565, FALSE, mr.exp[1], FALSE, NULL, tfp, MS, marker, TL_IS_566); + Makefiles__repeat(OUT, TL_IS_562, FALSE, mr.exp[1], FALSE, NULL, tfp, MS, marker, TL_IS_563); WRITE("%S\n", mr.exp[2]); MS->last_line_was_blank = FALSE; Regexp__dispose_of(&mr); @@ -27554,7 +27260,7 @@ void Makefiles__scan_makefile_line(text_stream *line, text_file_position *tfp, v { #line 139 "inweb/Chapter 6/Makefiles.w" WRITE("%S", mr.exp[0]); - Makefiles__repeat(OUT, TL_IS_565, FALSE, mr.exp[1], FALSE, NULL, tfp, MS, marker, TL_IS_566); + Makefiles__repeat(OUT, TL_IS_562, FALSE, mr.exp[1], FALSE, NULL, tfp, MS, marker, TL_IS_563); WRITE("%S\n", mr.exp[2]); MS->last_line_was_blank = FALSE; Regexp__dispose_of(&mr); @@ -27576,7 +27282,7 @@ void Makefiles__scan_makefile_line(text_stream *line, text_file_position *tfp, v { #line 139 "inweb/Chapter 6/Makefiles.w" WRITE("%S", mr.exp[0]); - Makefiles__repeat(OUT, TL_IS_565, FALSE, mr.exp[1], FALSE, NULL, tfp, MS, marker, TL_IS_566); + Makefiles__repeat(OUT, TL_IS_562, FALSE, mr.exp[1], FALSE, NULL, tfp, MS, marker, TL_IS_563); WRITE("%S\n", mr.exp[2]); MS->last_line_was_blank = FALSE; Regexp__dispose_of(&mr); @@ -27594,7 +27300,7 @@ void Makefiles__scan_makefile_line(text_stream *line, text_file_position *tfp, v { #line 156 "inweb/Chapter 6/Makefiles.w" WRITE("INWEB = "); Makefiles__pathname_slashed(OUT, path_to_inweb); WRITE("/Tangled/inweb\n"); - pathname *path_to_intest = Pathnames__down(Pathnames__up(path_to_inweb), TL_IS_568); + pathname *path_to_intest = Pathnames__down(Pathnames__up(path_to_inweb), TL_IS_565); WRITE("INTEST = "); Makefiles__pathname_slashed(OUT, path_to_intest); WRITE("/Tangled/intest\n"); if (MS->for_web) { WRITE("MYNAME = %S\n", Pathnames__directory_name(MS->for_web->md->path_to_web)); @@ -27611,7 +27317,7 @@ void Makefiles__scan_makefile_line(text_stream *line, text_file_position *tfp, v if (Regexp__match(&mr, line, L" *{platform-settings} *")) { #line 147 "inweb/Chapter 6/Makefiles.w" - filename *prototype = Filenames__in(path_to_inweb, TL_IS_567); + filename *prototype = Filenames__in(path_to_inweb, TL_IS_564); MS->allow_commands = FALSE; TextFiles__read(prototype, FALSE, "can't open make settings file", TRUE, Makefiles__scan_makefile_line, NULL, MS); @@ -27898,7 +27604,7 @@ void Makefiles__repeat(OUTPUT_STREAM, text_stream *prefix, int every_time, text_ int c = 0; LOOP_OVER(M, module) { if ((M->origin_marker == over) && - ((Str__eq(tag, TL_IS_569)) || (Str__eq(tag, M->module_tag)))) { + ((Str__eq(tag, TL_IS_566)) || (Str__eq(tag, M->module_tag)))) { if ((prefix) && ((c++ > 0) || (every_time))) WRITE("%S", prefix); if (matter) { TEMPORARY_TEXT(line); @@ -27952,7 +27658,7 @@ void Git__copy_gitignore_line(text_stream *line, text_file_position *tfp, void * { #line 44 "inweb/Chapter 6/Git Support.w" filename *prototype = - Filenames__in(path_to_inweb_materials, TL_IS_570); + Filenames__in(path_to_inweb_materials, TL_IS_567); TextFiles__read(prototype, FALSE, "can't open make settings file", TRUE, Git__copy_gitignore_line, NULL, MS); Regexp__dispose_of(&mr); @@ -27986,11 +27692,11 @@ void Readme__write(filename *from, filename *to) { write_state ws; ws.current_definition = NULL; ws.known_macros = NEW_LINKED_LIST(macro); - macro *V = Readme__new_macro(TL_IS_571, NULL, NULL); + macro *V = Readme__new_macro(TL_IS_568, NULL, NULL); ADD_TO_LINKED_LIST(V, macro, ws.known_macros); - macro *P = Readme__new_macro(TL_IS_572, NULL, NULL); + macro *P = Readme__new_macro(TL_IS_569, NULL, NULL); ADD_TO_LINKED_LIST(P, macro, ws.known_macros); - macro *A = Readme__new_macro(TL_IS_573, NULL, NULL); + macro *A = Readme__new_macro(TL_IS_570, NULL, NULL); ADD_TO_LINKED_LIST(A, macro, ws.known_macros); ws.stack_frame = NULL; text_stream file_to; @@ -28026,7 +27732,7 @@ void Readme__write_helper(text_stream *text, text_file_position *tfp, void *stat } } else { Readme__expand_material(ws, OUT, text, tfp); - Readme__expand_material(ws, OUT, TL_IS_574, tfp); + Readme__expand_material(ws, OUT, TL_IS_571, tfp); } Regexp__dispose_of(&mr); } @@ -28157,7 +27863,7 @@ void Readme__expand_at(write_state *ws, text_stream *OUT, text_stream *macro_nam #line 204 "inweb/Chapter 6/Readme Writeme.w" void Readme__expand_macro(write_state *ws, text_stream *OUT, macro *M, text_file_position *tfp) { - if (Str__eq(M->name, TL_IS_575)) + if (Str__eq(M->name, TL_IS_572)) { #line 215 "inweb/Chapter 6/Readme Writeme.w" if (ws->stack_frame->no_pars != 1) @@ -28165,14 +27871,14 @@ void Readme__expand_macro(write_state *ws, text_stream *OUT, macro *M, text_file else { TEMPORARY_TEXT(program); Readme__expand_material(ws, program, ws->stack_frame->pars[0], tfp); - Readme__write_var(OUT, program, TL_IS_578); + Readme__write_var(OUT, program, TL_IS_575); DISCARD_TEXT(program); } } #line 205 "inweb/Chapter 6/Readme Writeme.w" - else if (Str__eq(M->name, TL_IS_576)) + else if (Str__eq(M->name, TL_IS_573)) { #line 225 "inweb/Chapter 6/Readme Writeme.w" if (ws->stack_frame->no_pars != 1) @@ -28180,14 +27886,14 @@ void Readme__expand_macro(write_state *ws, text_stream *OUT, macro *M, text_file else { TEMPORARY_TEXT(program); Readme__expand_material(ws, program, ws->stack_frame->pars[0], tfp); - Readme__write_var(OUT, program, TL_IS_579); + Readme__write_var(OUT, program, TL_IS_576); DISCARD_TEXT(program); } } #line 206 "inweb/Chapter 6/Readme Writeme.w" - else if (Str__eq(M->name, TL_IS_577)) + else if (Str__eq(M->name, TL_IS_574)) { #line 235 "inweb/Chapter 6/Readme Writeme.w" if (ws->stack_frame->no_pars != 2) @@ -28216,8 +27922,8 @@ void Readme__expand_macro(write_state *ws, text_stream *OUT, macro *M, text_file void Readme__write_var(text_stream *OUT, text_stream *program, text_stream *datum) { writeme_asset *A = Readme__find_asset(program); if (A->if_web) WRITE("%S", Bibliographic__get_datum(A->if_web, datum)); - else if (Str__eq(datum, TL_IS_580)) WRITE("%S", A->date); - else if (Str__eq(datum, TL_IS_581)) WRITE("%S", A->version); + else if (Str__eq(datum, TL_IS_577)) WRITE("%S", A->date); + else if (Str__eq(datum, TL_IS_578)) WRITE("%S", A->version); } #line 273 "inweb/Chapter 6/Readme Writeme.w" @@ -28248,7 +27954,7 @@ writeme_asset *Readme__find_asset(text_stream *program) { A->if_web = WebMetadata__get_without_modules(Pathnames__from_text(program), NULL); } else { filename *I6_vn = Filenames__in( - Pathnames__down(Pathnames__from_text(program), TL_IS_582), TL_IS_583); + Pathnames__down(Pathnames__from_text(program), TL_IS_579), TL_IS_580); if (TextFiles__exists(I6_vn)) { #line 310 "inweb/Chapter 6/Readme Writeme.w" @@ -28258,7 +27964,7 @@ writeme_asset *Readme__find_asset(text_stream *program) { } #line 295 "inweb/Chapter 6/Readme Writeme.w" ; - filename *template_vn = Filenames__in(Pathnames__from_text(program), TL_IS_584); + filename *template_vn = Filenames__in(Pathnames__from_text(program), TL_IS_581); if (TextFiles__exists(template_vn)) { #line 314 "inweb/Chapter 6/Readme Writeme.w" @@ -28268,7 +27974,7 @@ writeme_asset *Readme__find_asset(text_stream *program) { } #line 297 "inweb/Chapter 6/Readme Writeme.w" ; - filename *rmt_vn = Filenames__in(Pathnames__from_text(program), TL_IS_585); + filename *rmt_vn = Filenames__in(Pathnames__from_text(program), TL_IS_582); if (TextFiles__exists(rmt_vn)) { #line 318 "inweb/Chapter 6/Readme Writeme.w" @@ -28278,7 +27984,7 @@ writeme_asset *Readme__find_asset(text_stream *program) { } #line 299 "inweb/Chapter 6/Readme Writeme.w" ; - rmt_vn = Filenames__in(Pathnames__from_text(program), TL_IS_586); + rmt_vn = Filenames__in(Pathnames__from_text(program), TL_IS_583); if (TextFiles__exists(rmt_vn)) { #line 318 "inweb/Chapter 6/Readme Writeme.w" @@ -28353,7 +28059,7 @@ void Readme__readme_harvester(text_stream *text, text_file_position *tfp, void * void Colonies__load(filename *F) { colony *C = CREATE(colony); C->members = NEW_LINKED_LIST(colony_member); - C->home = TL_IS_587; + C->home = TL_IS_584; C->assets_path = NULL; C->patterns_path = NULL; colony_reader_state crs; @@ -28377,8 +28083,8 @@ void Colonies__read_line(text_stream *line, text_file_position *tfp, void *v_crs match_results mr = Regexp__create_mr(); if (Regexp__match(&mr, line, L"(%c*?): \"*(%C+)\" at \"(%c*)\" in \"(%c*)\"")) { colony_member *CM = CREATE(colony_member); - if (Str__eq(mr.exp[0], TL_IS_588)) CM->web_rather_than_module = TRUE; - else if (Str__eq(mr.exp[0], TL_IS_589)) CM->web_rather_than_module = FALSE; + if (Str__eq(mr.exp[0], TL_IS_585)) CM->web_rather_than_module = TRUE; + else if (Str__eq(mr.exp[0], TL_IS_586)) CM->web_rather_than_module = FALSE; else { CM->web_rather_than_module = FALSE; Errors__in_text_file("text before ':' must be 'web' or 'module'", tfp); @@ -28386,7 +28092,7 @@ void Colonies__read_line(text_stream *line, text_file_position *tfp, void *v_crs CM->name = Str__duplicate(mr.exp[1]); CM->path = Str__duplicate(mr.exp[2]); CM->home_leaf = Str__new(); - if (Str__suffix_eq(CM->path, TL_IS_590, 6)) { + if (Str__suffix_eq(CM->path, TL_IS_587, 6)) { filename *F = Filenames__from_text(CM->path); Filenames__write_unextended_leafname(CM->home_leaf, F); WRITE_TO(CM->home_leaf, ".html"); @@ -28526,7 +28232,7 @@ module *Colonies__as_module(colony_member *CM, source_line *L, web_md *Wm) { #line 254 "inweb/Chapter 6/Colonies.w" filename *F = NULL; pathname *P = NULL; - if (Str__suffix_eq(CM->path, TL_IS_591, 6)) + if (Str__suffix_eq(CM->path, TL_IS_588, 6)) F = Filenames__from_text(CM->path); else P = Pathnames__from_text(CM->path); @@ -28553,7 +28259,7 @@ text_stream *Colonies__home(void) { colony *C; LOOP_OVER(C, colony) return C->home; - return TL_IS_592; + return TL_IS_589; } pathname *Colonies__assets_path(void) { @@ -28712,7 +28418,7 @@ int Colonies__resolve_reference_in_weave_inner(text_stream *url, text_stream *ti DISCARD_TEXT(err); return FALSE; } else if (N > 1) { - Main__error_in_web(TL_IS_593, L); + Main__error_in_web(TL_IS_590, L); WebModules__named_reference(&found_M, &found_Sm, &bare_module_name, title, search_M, text, TRUE); return FALSE; @@ -28795,7 +28501,7 @@ void Colonies__paragraph_URL(OUTPUT_STREAM, paragraph *P, filename *from) { if (P == NULL) internal_error("no para"); section *to_S = P->under_section; module *to_M = to_S->md->owning_module; - if (Str__ne(to_M->module_name, TL_IS_594)) { + if (Str__ne(to_M->module_name, TL_IS_591)) { colony_member *to_C = Colonies__find(to_M->module_name); if (to_C) { pathname *from_path = Filenames__up(from); @@ -29226,197 +28932,194 @@ void register_tangled_text_literals(void) { TL_IS_399 = Str__literal(L".txt"); TL_IS_400 = Str__literal(L"TeX"); TL_IS_401 = Str__literal(L".tex"); - TL_IS_402 = Str__literal(L"DVI"); - TL_IS_403 = Str__literal(L".tex"); - TL_IS_404 = Str__literal(L"PDF"); - TL_IS_405 = Str__literal(L".tex"); - TL_IS_406 = Str__literal(L"S"); - TL_IS_407 = Str__literal(L"Dunno"); - TL_IS_408 = Str__literal(L"weavesection"); - TL_IS_409 = Str__literal(L"weavesections"); - TL_IS_410 = Str__literal(L"weavesectionss"); - TL_IS_411 = Str__literal(L"weavesectionsss"); - TL_IS_412 = Str__literal(L"tweavesection"); - TL_IS_413 = Str__literal(L"tweavesections"); - TL_IS_414 = Str__literal(L"tweavesectionss"); - TL_IS_415 = Str__literal(L"tweavesectionsss"); - TL_IS_416 = Str__literal(L"nsweavesection"); - TL_IS_417 = Str__literal(L"nsweavesections"); - TL_IS_418 = Str__literal(L"not"); - TL_IS_419 = Str__literal(L"leq"); - TL_IS_420 = Str__literal(L"geq"); - TL_IS_421 = Str__literal(L"sim"); - TL_IS_422 = Str__literal(L"hbox"); - TL_IS_423 = Str__literal(L"left"); - TL_IS_424 = Str__literal(L"right"); - TL_IS_425 = Str__literal(L"Rightarrow"); - TL_IS_426 = Str__literal(L"Leftrightarrow"); - TL_IS_427 = Str__literal(L"to"); - TL_IS_428 = Str__literal(L"rightarrow"); - TL_IS_429 = Str__literal(L"longrightarrow"); - TL_IS_430 = Str__literal(L"leftarrow"); - TL_IS_431 = Str__literal(L"longleftarrow"); - TL_IS_432 = Str__literal(L"lbrace"); - TL_IS_433 = Str__literal(L"mid"); - TL_IS_434 = Str__literal(L"rbrace"); - TL_IS_435 = Str__literal(L"cdot"); - TL_IS_436 = Str__literal(L"cdots"); - TL_IS_437 = Str__literal(L"dots"); - TL_IS_438 = Str__literal(L"times"); - TL_IS_439 = Str__literal(L"quad"); - TL_IS_440 = Str__literal(L"qquad"); - TL_IS_441 = Str__literal(L"TeX"); - TL_IS_442 = Str__literal(L"neq"); - TL_IS_443 = Str__literal(L"noteq"); - TL_IS_444 = Str__literal(L"ell"); - TL_IS_445 = Str__literal(L"log"); - TL_IS_446 = Str__literal(L"exp"); - TL_IS_447 = Str__literal(L"sin"); - TL_IS_448 = Str__literal(L"cos"); - TL_IS_449 = Str__literal(L"tan"); - TL_IS_450 = Str__literal(L"top"); - TL_IS_451 = Str__literal(L"Alpha"); - TL_IS_452 = Str__literal(L"Beta"); - TL_IS_453 = Str__literal(L"Gamma"); - TL_IS_454 = Str__literal(L"Delta"); - TL_IS_455 = Str__literal(L"Epsilon"); - TL_IS_456 = Str__literal(L"Zeta"); - TL_IS_457 = Str__literal(L"Eta"); - TL_IS_458 = Str__literal(L"Theta"); - TL_IS_459 = Str__literal(L"Iota"); - TL_IS_460 = Str__literal(L"Kappa"); - TL_IS_461 = Str__literal(L"Lambda"); - TL_IS_462 = Str__literal(L"Mu"); - TL_IS_463 = Str__literal(L"Nu"); - TL_IS_464 = Str__literal(L"Xi"); - TL_IS_465 = Str__literal(L"Omicron"); - TL_IS_466 = Str__literal(L"Pi"); - TL_IS_467 = Str__literal(L"Rho"); - TL_IS_468 = Str__literal(L"Varsigma"); - TL_IS_469 = Str__literal(L"Sigma"); - TL_IS_470 = Str__literal(L"Tau"); - TL_IS_471 = Str__literal(L"Upsilon"); - TL_IS_472 = Str__literal(L"Phi"); - TL_IS_473 = Str__literal(L"Chi"); - TL_IS_474 = Str__literal(L"Psi"); - TL_IS_475 = Str__literal(L"Omega"); - TL_IS_476 = Str__literal(L"alpha"); - TL_IS_477 = Str__literal(L"beta"); - TL_IS_478 = Str__literal(L"gamma"); - TL_IS_479 = Str__literal(L"delta"); - TL_IS_480 = Str__literal(L"epsilon"); - TL_IS_481 = Str__literal(L"zeta"); - TL_IS_482 = Str__literal(L"eta"); - TL_IS_483 = Str__literal(L"theta"); - TL_IS_484 = Str__literal(L"iota"); - TL_IS_485 = Str__literal(L"kappa"); - TL_IS_486 = Str__literal(L"lambda"); - TL_IS_487 = Str__literal(L"mu"); - TL_IS_488 = Str__literal(L"nu"); - TL_IS_489 = Str__literal(L"xi"); - TL_IS_490 = Str__literal(L"omicron"); - TL_IS_491 = Str__literal(L"pi"); - TL_IS_492 = Str__literal(L"rho"); - TL_IS_493 = Str__literal(L"varsigma"); - TL_IS_494 = Str__literal(L"sigma"); - TL_IS_495 = Str__literal(L"tau"); - TL_IS_496 = Str__literal(L"upsilon"); - TL_IS_497 = Str__literal(L"phi"); - TL_IS_498 = Str__literal(L"chi"); - TL_IS_499 = Str__literal(L"psi"); - TL_IS_500 = Str__literal(L"omega"); - TL_IS_501 = Str__literal(L"exists"); - TL_IS_502 = Str__literal(L"in"); - TL_IS_503 = Str__literal(L"forall"); - TL_IS_504 = Str__literal(L"cap"); - TL_IS_505 = Str__literal(L"emptyset"); - TL_IS_506 = Str__literal(L"subseteq"); - TL_IS_507 = Str__literal(L"land"); - TL_IS_508 = Str__literal(L"lor"); - TL_IS_509 = Str__literal(L"lnot"); - TL_IS_510 = Str__literal(L"sum"); - TL_IS_511 = Str__literal(L"prod"); - TL_IS_512 = Str__literal(L"n"); - TL_IS_513 = Str__literal(L"t"); - TL_IS_514 = Str__literal(L"exists"); - TL_IS_515 = Str__literal(L"forall"); - TL_IS_516 = Str__literal(L"HTML"); - TL_IS_517 = Str__literal(L".html"); - TL_IS_518 = Str__literal(L"ePub"); - TL_IS_519 = Str__literal(L".html"); - TL_IS_520 = Str__literal(L"Base"); - TL_IS_521 = Str__literal(L"Colours"); - TL_IS_522 = Str__literal(L""); - TL_IS_523 = Str__literal(L""); - TL_IS_524 = Str__literal(L"Breadcrumbs"); - TL_IS_525 = Str__literal(L"Title"); - TL_IS_526 = Str__literal(L"Short Title"); - TL_IS_527 = Str__literal(L"Short Title"); - TL_IS_528 = Str__literal(L"index.html"); - TL_IS_529 = Str__literal(L"Figures"); - TL_IS_530 = Str__literal(L"Audio"); - TL_IS_531 = Str__literal(L"405"); - TL_IS_532 = Str__literal(L"720"); - TL_IS_533 = Str__literal(L"Embedding"); - TL_IS_534 = Str__literal(L"This is not a supported service"); - TL_IS_535 = Str__literal(L"Content ID"); - TL_IS_536 = Str__literal(L"Content Width"); - TL_IS_537 = Str__literal(L"Content Height"); - TL_IS_538 = Str__literal(L"named-paragraph-link"); - TL_IS_539 = Str__literal(L"function-link"); - TL_IS_540 = Str__literal(L"Carousel"); - TL_IS_541 = Str__literal(L"carousel-number"); - TL_IS_542 = Str__literal(L"carousel-caption"); - TL_IS_543 = Str__literal(L"carousel-caption-above"); - TL_IS_544 = Str__literal(L"carousel-number-above"); - TL_IS_545 = Str__literal(L"carousel-caption-below"); - TL_IS_546 = Str__literal(L"carousel-number-below"); - TL_IS_547 = Str__literal(L"external"); - TL_IS_548 = Str__literal(L"internal"); - TL_IS_549 = Str__literal(L"Popups"); - TL_IS_550 = Str__literal(L"Title"); - TL_IS_551 = Str__literal(L"Base"); - TL_IS_552 = Str__literal(L"Base.css"); - TL_IS_553 = Str__literal(L"debugging"); - TL_IS_554 = Str__literal(L".txt"); - TL_IS_555 = Str__literal(L"Colouring"); - TL_IS_556 = Str__literal(L"Coloring"); - TL_IS_557 = Str__literal(L"HTML"); - TL_IS_558 = Str__literal(L".css"); - TL_IS_559 = Str__literal(L".js"); - TL_IS_560 = Str__literal(L".tex"); - TL_IS_561 = Str__literal(L"HTML"); - TL_IS_562 = Str__literal(L"Colouring"); - TL_IS_563 = Str__literal(L"Coloring"); - TL_IS_564 = Str__literal(L".pdf"); - TL_IS_565 = Str__literal(L" "); + TL_IS_402 = Str__literal(L"S"); + TL_IS_403 = Str__literal(L"Dunno"); + TL_IS_404 = Str__literal(L"Figures"); + TL_IS_405 = Str__literal(L"weavesection"); + TL_IS_406 = Str__literal(L"weavesections"); + TL_IS_407 = Str__literal(L"weavesectionss"); + TL_IS_408 = Str__literal(L"weavesectionsss"); + TL_IS_409 = Str__literal(L"tweavesection"); + TL_IS_410 = Str__literal(L"tweavesections"); + TL_IS_411 = Str__literal(L"tweavesectionss"); + TL_IS_412 = Str__literal(L"tweavesectionsss"); + TL_IS_413 = Str__literal(L"nsweavesection"); + TL_IS_414 = Str__literal(L"nsweavesections"); + TL_IS_415 = Str__literal(L"HTML"); + TL_IS_416 = Str__literal(L".html"); + TL_IS_417 = Str__literal(L"ePub"); + TL_IS_418 = Str__literal(L".html"); + TL_IS_419 = Str__literal(L"Base"); + TL_IS_420 = Str__literal(L"Colours"); + TL_IS_421 = Str__literal(L""); + TL_IS_422 = Str__literal(L""); + TL_IS_423 = Str__literal(L"Breadcrumbs"); + TL_IS_424 = Str__literal(L"Title"); + TL_IS_425 = Str__literal(L"Short Title"); + TL_IS_426 = Str__literal(L"Short Title"); + TL_IS_427 = Str__literal(L"index.html"); + TL_IS_428 = Str__literal(L"Figures"); + TL_IS_429 = Str__literal(L"Audio"); + TL_IS_430 = Str__literal(L"405"); + TL_IS_431 = Str__literal(L"720"); + TL_IS_432 = Str__literal(L"Embedding"); + TL_IS_433 = Str__literal(L"This is not a supported service"); + TL_IS_434 = Str__literal(L"Content ID"); + TL_IS_435 = Str__literal(L"Content Width"); + TL_IS_436 = Str__literal(L"Content Height"); + TL_IS_437 = Str__literal(L"named-paragraph-link"); + TL_IS_438 = Str__literal(L"function-link"); + TL_IS_439 = Str__literal(L"Carousel"); + TL_IS_440 = Str__literal(L"carousel-number"); + TL_IS_441 = Str__literal(L"carousel-caption"); + TL_IS_442 = Str__literal(L"carousel-caption-above"); + TL_IS_443 = Str__literal(L"carousel-number-above"); + TL_IS_444 = Str__literal(L"carousel-caption-below"); + TL_IS_445 = Str__literal(L"carousel-number-below"); + TL_IS_446 = Str__literal(L"external"); + TL_IS_447 = Str__literal(L"internal"); + TL_IS_448 = Str__literal(L"Popups"); + TL_IS_449 = Str__literal(L"Title"); + TL_IS_450 = Str__literal(L"Base"); + TL_IS_451 = Str__literal(L"Base.css"); + TL_IS_452 = Str__literal(L"debugging"); + TL_IS_453 = Str__literal(L".txt"); + TL_IS_454 = Str__literal(L"Colouring"); + TL_IS_455 = Str__literal(L"Coloring"); + TL_IS_456 = Str__literal(L"HTML"); + TL_IS_457 = Str__literal(L".css"); + TL_IS_458 = Str__literal(L".js"); + TL_IS_459 = Str__literal(L".tex"); + TL_IS_460 = Str__literal(L"HTML"); + TL_IS_461 = Str__literal(L"Colouring"); + TL_IS_462 = Str__literal(L"Coloring"); + TL_IS_463 = Str__literal(L".pdf"); + TL_IS_464 = Str__literal(L"not"); + TL_IS_465 = Str__literal(L"leq"); + TL_IS_466 = Str__literal(L"geq"); + TL_IS_467 = Str__literal(L"sim"); + TL_IS_468 = Str__literal(L"hbox"); + TL_IS_469 = Str__literal(L"left"); + TL_IS_470 = Str__literal(L"right"); + TL_IS_471 = Str__literal(L"Rightarrow"); + TL_IS_472 = Str__literal(L"Leftrightarrow"); + TL_IS_473 = Str__literal(L"to"); + TL_IS_474 = Str__literal(L"rightarrow"); + TL_IS_475 = Str__literal(L"longrightarrow"); + TL_IS_476 = Str__literal(L"leftarrow"); + TL_IS_477 = Str__literal(L"longleftarrow"); + TL_IS_478 = Str__literal(L"lbrace"); + TL_IS_479 = Str__literal(L"mid"); + TL_IS_480 = Str__literal(L"rbrace"); + TL_IS_481 = Str__literal(L"cdot"); + TL_IS_482 = Str__literal(L"cdots"); + TL_IS_483 = Str__literal(L"dots"); + TL_IS_484 = Str__literal(L"times"); + TL_IS_485 = Str__literal(L"quad"); + TL_IS_486 = Str__literal(L"qquad"); + TL_IS_487 = Str__literal(L"TeX"); + TL_IS_488 = Str__literal(L"neq"); + TL_IS_489 = Str__literal(L"noteq"); + TL_IS_490 = Str__literal(L"ell"); + TL_IS_491 = Str__literal(L"log"); + TL_IS_492 = Str__literal(L"exp"); + TL_IS_493 = Str__literal(L"sin"); + TL_IS_494 = Str__literal(L"cos"); + TL_IS_495 = Str__literal(L"tan"); + TL_IS_496 = Str__literal(L"top"); + TL_IS_497 = Str__literal(L"Alpha"); + TL_IS_498 = Str__literal(L"Beta"); + TL_IS_499 = Str__literal(L"Gamma"); + TL_IS_500 = Str__literal(L"Delta"); + TL_IS_501 = Str__literal(L"Epsilon"); + TL_IS_502 = Str__literal(L"Zeta"); + TL_IS_503 = Str__literal(L"Eta"); + TL_IS_504 = Str__literal(L"Theta"); + TL_IS_505 = Str__literal(L"Iota"); + TL_IS_506 = Str__literal(L"Kappa"); + TL_IS_507 = Str__literal(L"Lambda"); + TL_IS_508 = Str__literal(L"Mu"); + TL_IS_509 = Str__literal(L"Nu"); + TL_IS_510 = Str__literal(L"Xi"); + TL_IS_511 = Str__literal(L"Omicron"); + TL_IS_512 = Str__literal(L"Pi"); + TL_IS_513 = Str__literal(L"Rho"); + TL_IS_514 = Str__literal(L"Varsigma"); + TL_IS_515 = Str__literal(L"Sigma"); + TL_IS_516 = Str__literal(L"Tau"); + TL_IS_517 = Str__literal(L"Upsilon"); + TL_IS_518 = Str__literal(L"Phi"); + TL_IS_519 = Str__literal(L"Chi"); + TL_IS_520 = Str__literal(L"Psi"); + TL_IS_521 = Str__literal(L"Omega"); + TL_IS_522 = Str__literal(L"alpha"); + TL_IS_523 = Str__literal(L"beta"); + TL_IS_524 = Str__literal(L"gamma"); + TL_IS_525 = Str__literal(L"delta"); + TL_IS_526 = Str__literal(L"epsilon"); + TL_IS_527 = Str__literal(L"zeta"); + TL_IS_528 = Str__literal(L"eta"); + TL_IS_529 = Str__literal(L"theta"); + TL_IS_530 = Str__literal(L"iota"); + TL_IS_531 = Str__literal(L"kappa"); + TL_IS_532 = Str__literal(L"lambda"); + TL_IS_533 = Str__literal(L"mu"); + TL_IS_534 = Str__literal(L"nu"); + TL_IS_535 = Str__literal(L"xi"); + TL_IS_536 = Str__literal(L"omicron"); + TL_IS_537 = Str__literal(L"pi"); + TL_IS_538 = Str__literal(L"rho"); + TL_IS_539 = Str__literal(L"varsigma"); + TL_IS_540 = Str__literal(L"sigma"); + TL_IS_541 = Str__literal(L"tau"); + TL_IS_542 = Str__literal(L"upsilon"); + TL_IS_543 = Str__literal(L"phi"); + TL_IS_544 = Str__literal(L"chi"); + TL_IS_545 = Str__literal(L"psi"); + TL_IS_546 = Str__literal(L"omega"); + TL_IS_547 = Str__literal(L"exists"); + TL_IS_548 = Str__literal(L"in"); + TL_IS_549 = Str__literal(L"forall"); + TL_IS_550 = Str__literal(L"cap"); + TL_IS_551 = Str__literal(L"emptyset"); + TL_IS_552 = Str__literal(L"subseteq"); + TL_IS_553 = Str__literal(L"land"); + TL_IS_554 = Str__literal(L"lor"); + TL_IS_555 = Str__literal(L"lnot"); + TL_IS_556 = Str__literal(L"sum"); + TL_IS_557 = Str__literal(L"prod"); + TL_IS_558 = Str__literal(L"n"); + TL_IS_559 = Str__literal(L"t"); + TL_IS_560 = Str__literal(L"exists"); + TL_IS_561 = Str__literal(L"forall"); + TL_IS_562 = Str__literal(L" "); + TL_IS_563 = Str__literal(L"all"); + TL_IS_564 = Str__literal(L"platform-settings.mk"); + TL_IS_565 = Str__literal(L"intest"); TL_IS_566 = Str__literal(L"all"); - TL_IS_567 = Str__literal(L"platform-settings.mk"); - TL_IS_568 = Str__literal(L"intest"); - TL_IS_569 = Str__literal(L"all"); - TL_IS_570 = Str__literal(L"gitignorescript.txt"); - TL_IS_571 = Str__literal(L"version"); - TL_IS_572 = Str__literal(L"purpose"); - TL_IS_573 = Str__literal(L"var"); - TL_IS_574 = Str__literal(L"\n"); - TL_IS_575 = Str__literal(L"version"); - TL_IS_576 = Str__literal(L"purpose"); - TL_IS_577 = Str__literal(L"var"); + TL_IS_567 = Str__literal(L"gitignorescript.txt"); + TL_IS_568 = Str__literal(L"version"); + TL_IS_569 = Str__literal(L"purpose"); + TL_IS_570 = Str__literal(L"var"); + TL_IS_571 = Str__literal(L"\n"); + TL_IS_572 = Str__literal(L"version"); + TL_IS_573 = Str__literal(L"purpose"); + TL_IS_574 = Str__literal(L"var"); + TL_IS_575 = Str__literal(L"Version Number"); + TL_IS_576 = Str__literal(L"Purpose"); + TL_IS_577 = Str__literal(L"Build Date"); TL_IS_578 = Str__literal(L"Version Number"); - TL_IS_579 = Str__literal(L"Purpose"); - TL_IS_580 = Str__literal(L"Build Date"); - TL_IS_581 = Str__literal(L"Version Number"); - TL_IS_582 = Str__literal(L"inform6"); - TL_IS_583 = Str__literal(L"header.h"); - TL_IS_584 = Str__literal(L"(manifest).txt"); - TL_IS_585 = Str__literal(L"README.txt"); - TL_IS_586 = Str__literal(L"README.md"); - TL_IS_587 = Str__literal(L"docs"); - TL_IS_588 = Str__literal(L"web"); - TL_IS_589 = Str__literal(L"module"); - TL_IS_590 = Str__literal(L".inweb"); - TL_IS_591 = Str__literal(L".inweb"); - TL_IS_592 = Str__literal(L"docs"); - TL_IS_593 = Str__literal(L"Multiple cross-references might be meant here"); - TL_IS_594 = Str__literal(L"(main)"); + TL_IS_579 = Str__literal(L"inform6"); + TL_IS_580 = Str__literal(L"header.h"); + TL_IS_581 = Str__literal(L"(manifest).txt"); + TL_IS_582 = Str__literal(L"README.txt"); + TL_IS_583 = Str__literal(L"README.md"); + TL_IS_584 = Str__literal(L"docs"); + TL_IS_585 = Str__literal(L"web"); + TL_IS_586 = Str__literal(L"module"); + TL_IS_587 = Str__literal(L".inweb"); + TL_IS_588 = Str__literal(L".inweb"); + TL_IS_589 = Str__literal(L"docs"); + TL_IS_590 = Str__literal(L"Multiple cross-references might be meant here"); + TL_IS_591 = Str__literal(L"(main)"); } diff --git a/docs/goldbach/goldbach.pdf b/docs/goldbach/goldbach.pdf index 4f9d09899d2f67c8dec8e8c8c5874c78679fa777..756b10d74e94104cd05dba5cad4677f243d8250e 100644 GIT binary patch delta 158507 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

I%Px9jxmgU`aY5bQxnDa0_qHSP0`?okjP_ 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 delta 46971 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 } else PUT_TO(cmd, Str::get_at(T, i)); } if ((Str::includes_at(cmd, 0, I"PROCESS ")) && (last_F)) { - RunningTeX::post_process_weave(wv, last_F); + TeXUtilities::post_process_weave(wv, last_F); } else { if (verbosely) PRINT("(%S)\n", cmd); int rv = Shell::run(cmd); diff --git a/docs/inweb/1-ts.html b/docs/inweb/1-ts.html index 5234e3f..cb1f0b1 100644 --- a/docs/inweb/1-ts.html +++ b/docs/inweb/1-ts.html @@ -105,7 +105,7 @@ the call comes from Program Control). if (Weaver::weave(wv) == 0) i.e., the number of lines woven was zero Errors::fatal("empty weave request"); Patterns::post_process(wv->pattern, wv, verbosely); - Formats::post_process_weave(wv, open_afterwards); + Formats::post_process_weave(wv, open_afterwards); Report on the outcome of the weave to the console2.3; } return wv; @@ -135,7 +135,7 @@ the call comes from Program Control). MEMORY_MANAGEMENT } weave_order; -

  • The structure weave_order is accessed in 1/cnf, 1/ptt, 3/tc, 3/tw, 3/twot, 4/is, 5/fm, 5/tf, 5/hf, 5/rtt, 6/cln and here.
+
  • The structure weave_order is accessed in 1/cnf, 1/ptt, 3/tc, 3/tw, 3/twot, 4/is, 5/fm, 5/tf, 5/hf, 5/tu, 6/cln and here.

§2.2. Compile a set of instructions for the weaver2.2 =

@@ -248,7 +248,7 @@ and details of any cover-sheet to use.
     PRINT("[%S: %S -> %f", wv->booklet_title, wv->format->format_name, wv->weave_to);
-    Formats::report_on_post_processing(wv);
+    Formats::report_on_post_processing(wv);
     PRINT("]\n");
 
  • This code is used in §2.
diff --git a/docs/inweb/3-tc.html b/docs/inweb/3-tc.html index 2d5c1e6..4cde370 100644 --- a/docs/inweb/3-tc.html +++ b/docs/inweb/3-tc.html @@ -565,7 +565,7 @@ use this.)
     if (swarm_leader)
-        if (Formats::substitute_post_processing_data(substituted,
+        if (Formats::substitute_post_processing_data(substituted,
             swarm_leader, detail, cls->nav_pattern) == FALSE)
             WRITE_TO(substituted, "%S for complete web", detail);
 
@@ -595,7 +595,7 @@ use this.) Str::copy(substituted, C->md->ch_range); } else if (Str::eq_wide_string(detail, L"Purpose")) { Str::copy(substituted, C->md->rubric); - } else if (Formats::substitute_post_processing_data(substituted, + } else if (Formats::substitute_post_processing_data(substituted, C->ch_weave, detail, cls->nav_pattern)) { ; } else { @@ -640,7 +640,7 @@ use this.) int denom = S->sect_paragraphs; if (denom == 0) denom = 1; WRITE_TO(substituted, "%d", S->sect_extent/denom); - } else if (Formats::substitute_post_processing_data(substituted, + } else if (Formats::substitute_post_processing_data(substituted, S->sect_weave, detail, cls->nav_pattern)) { ; } else { diff --git a/docs/inweb/4-is.html b/docs/inweb/4-is.html index d9910fc..2ba4a17 100644 --- a/docs/inweb/4-is.html +++ b/docs/inweb/4-is.html @@ -1065,7 +1065,7 @@ nonterminal definitions:

-void InCSupport::weave_grammar_index(OUTPUT_STREAM) {
+void InCSupport::weave_grammar_index(OUTPUT_STREAM) {
     WRITE("\\raggedright\\tolerance=10000");
     preform_nonterminal *pnt;
     for (pnt = alphabetical_list_of_nonterminals; pnt;
@@ -1171,7 +1171,7 @@ of C code which appear in int
     weave_order *wv, web *W, chapter *C, section *S, source_line *L,
     text_stream *matter, text_stream *concluding_comment) {
     if ((Preform_theme) && (wv->theme_match == Preform_theme))
-        return Formats::preform_document(OUT, wv, W, C, S, L,
+        return Formats::preform_document(OUT, wv, W, C, S, L,
             matter, concluding_comment);
     return FALSE;
 }
diff --git a/docs/inweb/5-fm.html b/docs/inweb/5-fm.html
index 82c34c8..e6b4ba5 100644
--- a/docs/inweb/5-fm.html
+++ b/docs/inweb/5-fm.html
@@ -46,7 +46,7 @@ function togglePopup(material_id) {
 		
 

To characterise the relevant differences in behaviour between the various weaving formats offered, such as HTML, ePub, or TeX.

-
+

§1. Formats. Exactly as in the previous chapter, each format expresses its behaviour through optional method calls. @@ -60,7 +60,7 @@ through optional method calls. MEMORY_MANAGEMENT } weave_format; -weave_format *Formats::create_weave_format(text_stream *name, text_stream *ext) { +weave_format *Formats::create_weave_format(text_stream *name, text_stream *ext) { weave_format *wf = CREATE(weave_format); wf->format_name = Str::duplicate(name); wf->woven_extension = Str::duplicate(ext); @@ -158,21 +158,7 @@ actual content. DISCARD_TEXT(template); }

-

§6. When whole chapters are wovem, or all-in-one weaves include multiple -chapters, the format can add a table of chapter contents, or some similar -interstitial material. This is how: -

- -
enum CHAPTER_TP_FOR_MTID
-
-
-VMETHOD_TYPE(CHAPTER_TP_FOR_MTID, weave_format *wf, text_stream *OUT, weave_order *wv, chapter *C)
-void Formats::chapter_title_page(OUTPUT_STREAM, weave_order *wv, chapter *C) {
-    weave_format *wf = wv->format;
-    VMETHOD_CALL(wf, CHAPTER_TP_FOR_MTID, OUT, wv, C);
-}
-
-

§7. The weaver has special typographical support for the stand-alone Inform +

§6. The weaver has special typographical support for the stand-alone Inform document of Preform grammar, and this is the hook for it. Most formats should ignore it.

@@ -193,7 +179,7 @@ should ignore it. return rv; } -

§8. Post-processing. Post-processing is now largely done by commands in the pattern file, rather +

§7. Post-processing. Post-processing is now largely done by commands in the pattern file, rather than here, but we retain method calls to enable formats to do some idiosyncratic post-processing.

@@ -206,7 +192,7 @@ post-processing. VMETHOD_CALL(wv->format, POST_PROCESS_POS_MTID, wv, open_afterwards); } -

§9. Optionally, a fancy report can be printed out, to describe what has been +

§8. Optionally, a fancy report can be printed out, to describe what has been done. Support for TeX console reporting is hard-wired here because it's handled by Patterns::post_process directly.

@@ -216,11 +202,11 @@ handled by Patterns::post_process
 VMETHOD_TYPE(POST_PROCESS_REPORT_POS_MTID, weave_format *wf, weave_order *wv)
 void Formats::report_on_post_processing(weave_order *wv) {
-    RunningTeX::report_on_post_processing(wv);
+    TeXUtilities::report_on_post_processing(wv);
     VMETHOD_CALL(wv->format, POST_PROCESS_REPORT_POS_MTID, wv);
 }
 
-

§10. For the sake of index files, we may want to substitute in values for +

§9. For the sake of index files, we may want to substitute in values for placeholder text in the template file.

@@ -231,7 +217,7 @@ placeholder text in the template file. weave_order *wv, text_stream *detail, weave_pattern *pattern) int Formats::substitute_post_processing_data(OUTPUT_STREAM, weave_order *wv, text_stream *detail, weave_pattern *pattern) { - int rv = RunningTeX::substitute_post_processing_data(OUT, wv, detail); + int rv = TeXUtilities::substitute_post_processing_data(OUT, wv, detail); IMETHOD_CALL(rv, wv->format, POST_PROCESS_SUBSTITUTE_POS_MTID, OUT, wv, detail, pattern); return rv; } diff --git a/docs/inweb/5-hf.html b/docs/inweb/5-hf.html index f917a68..9386034 100644 --- a/docs/inweb/5-hf.html +++ b/docs/inweb/5-hf.html @@ -930,7 +930,7 @@ that service uses to identify the video/audio in question. text_stream *plugin_name = hrs->wv->pattern->mathematics_plugin; if (Str::len(plugin_name) == 0) { TEMPORARY_TEXT(R); - TeX::remove_math_mode(R, C->content); + TeXUtilities::remove_math_mode(R, C->content); HTMLFormat::escape_text(OUT, R); DISCARD_TEXT(R); } else { diff --git a/docs/inweb/5-ptf.html b/docs/inweb/5-ptf.html index b7dcda5..50e5857 100644 --- a/docs/inweb/5-ptf.html +++ b/docs/inweb/5-ptf.html @@ -54,7 +54,6 @@ function togglePopup(material_id) { void PlainText::create(void) { weave_format *wf = Formats::create_weave_format(I"plain", I".txt"); METHOD_ADD(wf, RENDER_FOR_MTID, PlainText::render); - METHOD_ADD(wf, CHAPTER_TP_FOR_MTID, PlainText::chapter_title_page); }

§2. Methods. For documentation, see "Weave Fornats". @@ -77,13 +76,24 @@ function togglePopup(material_id) { int PlainText::render_visit(tree_node *N, void *state, int L) { PlainText_render_state *prs = (PlainText_render_state *) state; text_stream *OUT = prs->OUT; - if (N->type == weave_document_node_type) Render nothing2.12 - else if (N->type == weave_head_node_type) Render nothing2.12 - else if (N->type == weave_body_node_type) Render nothing2.12 - else if (N->type == weave_tail_node_type) Render nothing2.12 + if ((N->type == weave_document_node_type) || + (N->type == weave_head_node_type) || + (N->type == weave_body_node_type) || + (N->type == weave_tail_node_type) || + (N->type == weave_chapter_title_page_node_type) || + (N->type == weave_chapter_footer_node_type) || + (N->type == weave_figure_node_type) || + (N->type == weave_audio_node_type) || + (N->type == weave_material_node_type) || + (N->type == weave_chapter_node_type) || + (N->type == weave_carousel_slide_node_type) || + (N->type == weave_toc_node_type) || + (N->type == weave_toc_line_node_type) || + (N->type == weave_grammar_index_node_type) || + (N->type == weave_inline_node_type)) Render nothing2.12 + else if (N->type == weave_verbatim_node_type) Render verbatim2.11 else if (N->type == weave_chapter_header_node_type) Render chapter header2.1 - else if (N->type == weave_chapter_footer_node_type) Render nothing2.12 else if (N->type == weave_section_header_node_type) Render header2.2 else if (N->type == weave_section_footer_node_type) Render footer2.3 else if (N->type == weave_section_purpose_node_type) Render purpose2.4 @@ -93,33 +103,24 @@ function togglePopup(material_id) { else if (N->type == weave_linebreak_node_type) Render linebreak2.8 else if (N->type == weave_paragraph_heading_node_type) Render paragraph heading2.9 else if (N->type == weave_endnote_node_type) Render endnote2.10 - else if (N->type == weave_figure_node_type) Render nothing2.12 - else if (N->type == weave_audio_node_type) Render nothing2.12 - else if (N->type == weave_material_node_type) Render nothing2.12 else if (N->type == weave_embed_node_type) Render embed2.13 else if (N->type == weave_pmac_node_type) Render pmac2.14 else if (N->type == weave_vskip_node_type) Render vskip2.15 - else if (N->type == weave_chapter_node_type) Render nothing2.12 else if (N->type == weave_section_node_type) Render section2.16 else if (N->type == weave_code_line_node_type) Render code line2.17 else if (N->type == weave_function_usage_node_type) Render function usage2.18 else if (N->type == weave_commentary_node_type) Render commentary2.19 - else if (N->type == weave_carousel_slide_node_type) Render nothing2.12 - else if (N->type == weave_toc_node_type) Render nothing2.12 - else if (N->type == weave_toc_line_node_type) Render nothing2.12 - else if (N->type == weave_chapter_title_page_node_type) Render weave_chapter_title_page_node2.20 - else if (N->type == weave_defn_node_type) Render defn2.21 - else if (N->type == weave_source_code_node_type) Render source code2.22 - else if (N->type == weave_url_node_type) Render URL2.23 - else if (N->type == weave_footnote_cue_node_type) Render footnote cue2.24 - else if (N->type == weave_begin_footnote_text_node_type) Render footnote text2.25 - else if (N->type == weave_display_line_node_type) Render display line2.26 - else if (N->type == weave_function_defn_node_type) Render function defn2.27 - else if (N->type == weave_item_node_type) Render item2.28 - else if (N->type == weave_grammar_index_node_type) Render nothing2.12 - else if (N->type == weave_inline_node_type) Render nothing2.12 - else if (N->type == weave_locale_node_type) Render locale2.29 - else if (N->type == weave_maths_node_type) Render maths2.30 + else if (N->type == weave_defn_node_type) Render defn2.20 + else if (N->type == weave_source_code_node_type) Render source code2.21 + else if (N->type == weave_url_node_type) Render URL2.22 + else if (N->type == weave_footnote_cue_node_type) Render footnote cue2.23 + else if (N->type == weave_begin_footnote_text_node_type) Render footnote text2.24 + else if (N->type == weave_display_line_node_type) Render display line2.25 + else if (N->type == weave_function_defn_node_type) Render function defn2.26 + else if (N->type == weave_item_node_type) Render item2.27 + else if (N->type == weave_locale_node_type) Render locale2.28 + else if (N->type == weave_maths_node_type) Render maths2.29 + else internal_error("unable to render unknown node"); return TRUE; } @@ -224,7 +225,7 @@ function togglePopup(material_id) {

     ;
 
-
  • This code is used in §2 (14 times).
+
  • This code is used in §2.

§2.13. Render embed2.13 =

@@ -287,15 +288,7 @@ function togglePopup(material_id) { if (C->in_code) WRITE(" */ ");
  • This code is used in §2.
-

§2.20. Render weave_chapter_title_page_node2.20 = -

- -
-    weave_chapter_title_page_node *C = RETRIEVE_POINTER_weave_chapter_title_page_node(N->content);
-    LOG("It was %d\n", C->allocation_id);
-
-
  • This code is used in §2.
-

§2.21. Render defn2.21 = +

§2.20. Render defn2.20 =

@@ -303,7 +296,7 @@ function togglePopup(material_id) {
     WRITE("%S ", C->keyword);
 
  • This code is used in §2.
-

§2.22. Render source code2.22 = +

§2.21. Render source code2.21 =

@@ -311,7 +304,7 @@ function togglePopup(material_id) {
     WRITE("%S", C->matter);
 
  • This code is used in §2.
-

§2.23. Render URL2.23 = +

§2.22. Render URL2.22 =

@@ -319,7 +312,7 @@ function togglePopup(material_id) {
     WRITE("%S", C->url);
 
  • This code is used in §2.
-

§2.24. Render footnote cue2.24 = +

§2.23. Render footnote cue2.23 =

@@ -327,14 +320,14 @@ function togglePopup(material_id) {
     WRITE("[%S]", C->cue_text);
 
  • This code is used in §2.
-

§2.25. Render footnote text2.25 = +

§2.24. Render footnote text2.24 =

     WRITE("\n");
 
  • This code is used in §2.
-

§2.26. Render display line2.26 = +

§2.25. Render display line2.25 =

@@ -342,7 +335,7 @@ function togglePopup(material_id) {
     WRITE("    %S\n", C->text);
 
  • This code is used in §2.
-

§2.27. Render function defn2.27 = +

§2.26. Render function defn2.26 =

@@ -351,7 +344,7 @@ function togglePopup(material_id) {
     return TRUE;
 
  • This code is used in §2.
-

§2.28. Render item2.28 = +

§2.27. Render item2.27 =

@@ -360,7 +353,7 @@ function togglePopup(material_id) {
     WRITE("(%S) ", C->label);
 
  • This code is used in §2.
-

§2.29. Render locale2.29 = +

§2.28. Render locale2.28 =

@@ -369,7 +362,7 @@ function togglePopup(material_id) {
     if (C->par2) WRITE("-%S", C->par2->paragraph_number);
 
  • This code is used in §2.
-

§2.30. Render maths2.30 = +

§2.29. Render maths2.29 =

@@ -387,18 +380,6 @@ function togglePopup(material_id) {
         Trees::traverse_from(M, &PlainText::render_visit, (void *) prs, L+1);
 
-

§3.

- -
-void PlainText::chapter_title_page(weave_format *self, text_stream *OUT,
-    weave_order *wv, chapter *C) {
-    WRITE("%S\n\n", C->md->rubric);
-    section *S;
-    LOOP_OVER_LINKED_LIST(S, section, C->sections)
-        WRITE("    %S: %S\n        %S\n",
-            S->md->sect_range, S->md->sect_title, S->sect_purpose);
-}
-


diff --git a/docs/inweb/5-rtt.html b/docs/inweb/5-rtt.html deleted file mode 100644 index 97a37be..0000000 --- a/docs/inweb/5-rtt.html +++ /dev/null @@ -1,194 +0,0 @@ - - - - Running Through TeX - - - - - - - - - - - - - - - - -
- -

To post-process a weave by running it through TeX, or one of its variant typesetting programs.

- -
- -

§1. Running TeX. Although we are running pdftex, a modern variant of TeX, rather than the -original, they are very similar as command-line tools; the difference is -that the output is a PDF file rather than a DVI file, Knuth's original stab -at the same basic idea. -

- -

In particular, we call it in -interaction=scrollmode so that any errors -whizz by rather than interrupting or halting the session. Because of that, we -spool the output onto a console file which we can then read in and parse to -find the number of errors actually generated. Prime among errors is the -"overfull hbox error", a defect of TeX resulting from its inability to adjust -letter spacing, so that it requires us to adjust the copy to fit the margins -of the page properly. (In practice we get this here by having code lines which -are too wide to display.) -

- -

§2.

- -
-void RunningTeX::post_process_weave(weave_order *wv, filename *CF) {
-    tex_results *res = CREATE(tex_results);
-    Initialise the TeX results2.2;
-    wv->post_processing_results = res;
-    Read back the console file and parse it for error messages2.3;
-}
-
-

§2.1. We're going to have to read in a console file of TeX output to work out -what happened, and this structure will store what we find: -

- -
-typedef struct tex_results {
-    int overfull_hbox_count;
-    int tex_error_count;
-    int page_count;
-    int pdf_size;
-    struct filename *PDF_filename;
-    MEMORY_MANAGEMENT
-} tex_results;
-
-
  • The structure tex_results is private to this section.
-

§2.2. Initialise the TeX results2.2 = -

- -
-    res->overfull_hbox_count = 0;
-    res->tex_error_count = 0;
-    res->page_count = 0;
-    res->pdf_size = 0;
-    res->PDF_filename = Filenames::set_extension(CF, I".pdf");
-
-
  • This code is used in §2.
-

§2.3. TeX helpfully reports the size and page count of what it produces, and -we're not too proud to scrape that information out of the console file, besides -the error messages (which begin with an exclamation mark in column 1). -

- -

Read back the console file and parse it for error messages2.3 = -

- -
-    TextFiles::read(CF, FALSE,
-        "can't open console file", TRUE, RunningTeX::scan_console_line, NULL,
-        (void *) res);
-
-
  • This code is used in §2.
-

§3.

- -
-void RunningTeX::scan_console_line(text_stream *line, text_file_position *tfp,
-    void *res_V) {
-    tex_results *res = (tex_results *) res_V;
-    match_results mr = Regexp::create_mr();
-    if (Regexp::match(&mr, line,
-        L"Output written %c*? %((%d+) page%c*?(%d+) bytes%).")) {
-        res->page_count = Str::atoi(mr.exp[0], 0);
-        res->pdf_size = Str::atoi(mr.exp[1], 0);
-    }
-    if (Regexp::match(&mr, line, L"%c+verfull \\hbox%c+"))
-        res->overfull_hbox_count++;
-    else if (Str::get_first_char(line) == '!') {
-        res->tex_error_count++;
-    }
-    Regexp::dispose_of(&mr);
-}
-
-

§4. Reporting.

- -
-void RunningTeX::report_on_post_processing(weave_order *wv) {
-    tex_results *res = wv->post_processing_results;
-    if (res) {
-        PRINT(": %dpp %dK", res->page_count, res->pdf_size/1024);
-        if (res->overfull_hbox_count > 0)
-            PRINT(", %d overfull hbox(es)", res->overfull_hbox_count);
-        if (res->tex_error_count > 0)
-            PRINT(", %d error(s)", res->tex_error_count);
-    }
-}
-
-

§5. And here are some details to do with the results of post-processing. -

- -
-int RunningTeX::substitute_post_processing_data(text_stream *to, weave_order *wv,
-    text_stream *detail) {
-    if (wv) {
-        tex_results *res = wv->post_processing_results;
-        if (res) {
-            if (Str::eq_wide_string(detail, L"PDF Size")) {
-                WRITE_TO(to, "%dKB", res->pdf_size/1024);
-            } else if (Str::eq_wide_string(detail, L"Extent")) {
-                WRITE_TO(to, "%dpp", res->page_count);
-            } else if (Str::eq_wide_string(detail, L"Leafname")) {
-                Str::copy(to, Filenames::get_leafname(res->PDF_filename));
-            } else if (Str::eq_wide_string(detail, L"Errors")) {
-                Str::clear(to);
-                if ((res->overfull_hbox_count > 0) || (res->tex_error_count > 0))
-                    WRITE_TO(to, ": ");
-                if (res->overfull_hbox_count > 0)
-                    WRITE_TO(to, "%d overfull line%s",
-                        res->overfull_hbox_count,
-                        (res->overfull_hbox_count>1)?"s":"");
-                if ((res->overfull_hbox_count > 0) && (res->tex_error_count > 0))
-                    WRITE_TO(to, ", ");
-                if (res->tex_error_count > 0)
-                    WRITE_TO(to, "%d TeX error%s",
-                        res->tex_error_count,
-                        (res->tex_error_count>1)?"s":"");
-            } else return FALSE;
-            return TRUE;
-        }
-    }
-    return FALSE;
-}
-
-
-
- - -
- - - diff --git a/docs/inweb/5-tf.html b/docs/inweb/5-tf.html index b73449c..616610a 100644 --- a/docs/inweb/5-tf.html +++ b/docs/inweb/5-tf.html @@ -46,138 +46,117 @@ function togglePopup(material_id) {

To provide for weaving in the standard maths and science typesetting software, TeX.

-
+

§1. Creation.

 void TeX::create(void) {
-    Create TeX format1.1;
-    Create DVI format1.2;
-    Create PDF format1.3;
-}
-
-

§1.1. Create TeX format1.1 = -

- -
     weave_format *wf = Formats::create_weave_format(I"TeX", I".tex");
     METHOD_ADD(wf, RENDER_FOR_MTID, TeX::render_TeX);
-    METHOD_ADD(wf, CHAPTER_TP_FOR_MTID, TeX::chapter_title_page);
-    METHOD_ADD(wf, PREFORM_DOCUMENT_FOR_MTID, TeX::preform_document);
+    METHOD_ADD(wf, PREFORM_DOCUMENT_FOR_MTID, TeX::preform_document);
+}
 
-
  • This code is used in §1.
-

§1.2. Create DVI format1.2 = +

§2. Rendering. At present, this renderer only makes the dialect of TeX needed for pdftex, +which involves various extension commands: the curse of modern TeX is the +combination of an outdated original, and a proliferation of non-canonical +extensions, but pdftex is pretty good. All the same, we should perhaps +consider adding LaTeX, or XeTeX.

-
-    weave_format *wf = Formats::create_weave_format(I"DVI", I".tex");
-    METHOD_ADD(wf, RENDER_FOR_MTID, TeX::render_DVI);
-    METHOD_ADD(wf, CHAPTER_TP_FOR_MTID, TeX::chapter_title_page);
-    METHOD_ADD(wf, PREFORM_DOCUMENT_FOR_MTID, TeX::preform_document);
+
enum PDFTEX_TEX_FORM from 1
 
-
  • This code is used in §1.
-

§1.3. Create PDF format1.3 = -

-
-    weave_format *wf = Formats::create_weave_format(I"PDF", I".tex");
-    METHOD_ADD(wf, RENDER_FOR_MTID, TeX::render_PDF);
-    METHOD_ADD(wf, CHAPTER_TP_FOR_MTID, TeX::chapter_title_page);
-    METHOD_ADD(wf, PREFORM_DOCUMENT_FOR_MTID, TeX::preform_document);
+void TeX::render_TeX(weave_format *self, text_stream *OUT, heterogeneous_tree *tree) {
+    TeX::render_inner(OUT, tree, PDFTEX_TEX_FORM);
+}
 
-
  • This code is used in §1.
-

§2. Methods. For documentation, see "Weave Fornats". +

§3. From here on, then, the renderer, which should generate TeX which is as +generic as possible, but with special features depending on trs->TeX_form.

 typedef struct TeX_render_state {
     struct text_stream *OUT;
     struct weave_order *wv;
-    int as_DVI;
-    int as_PDF;
+    int TeX_form;
 } TeX_render_state;
 
-void TeX::render_TeX(weave_format *self, text_stream *OUT, heterogeneous_tree *tree) {
-    TeX::render_inner(self, OUT, tree, FALSE, FALSE);
-}
-void TeX::render_DVI(weave_format *self, text_stream *OUT, heterogeneous_tree *tree) {
-    TeX::render_inner(self, OUT, tree, TRUE, FALSE);
-}
-void TeX::render_PDF(weave_format *self, text_stream *OUT, heterogeneous_tree *tree) {
-    TeX::render_inner(self, OUT, tree, FALSE, TRUE);
-}
-
-void TeX::render_inner(weave_format *self, text_stream *OUT, heterogeneous_tree *tree, int as_dvi, int as_pdf) {
+void TeX::render_inner(text_stream *OUT, heterogeneous_tree *tree, int form) {
     weave_document_node *C = RETRIEVE_POINTER_weave_document_node(tree->root->content);
     TeX_render_state trs;
     trs.OUT = OUT;
     trs.wv = C->wv;
-    trs.as_DVI = as_dvi;
-    trs.as_PDF = as_pdf;
-    Trees::traverse_from(tree->root, &TeX::render_visit, (void *) &trs, 0);
+    trs.TeX_form = form;
+    Trees::traverse_from(tree->root, &TeX::render_visit, (void *) &trs, 0);
 }
+
+
  • The structure TeX_render_state is accessed in 1/ptt, 3/tc, 3/twot, 5/wt, 5/fm, 5/ptf, 5/hf, 5/df, 5/wp, 6/rw and here.
+

§4. For the reason why footnotes are omitted, see below: they aren't really. +

-int TeX::render_visit(tree_node *N, void *state, int L) { +
+int TeX::render_visit(tree_node *N, void *state, int L) {
     TeX_render_state *trs = (TeX_render_state *) state;
     text_stream *OUT = trs->OUT;
-    if (N->type == weave_document_node_type) Render nothing2.15
-    else if (N->type == weave_head_node_type) Render head2.1
-    else if (N->type == weave_body_node_type) Render nothing2.15
-    else if (N->type == weave_tail_node_type) Render tail2.2
-    else if (N->type == weave_verbatim_node_type) Render verbatim2.14
-    else if (N->type == weave_chapter_header_node_type) Render chapter header2.3
-    else if (N->type == weave_chapter_footer_node_type) Render nothing2.15
-    else if (N->type == weave_section_header_node_type) Render header2.4
-    else if (N->type == weave_section_footer_node_type) Render nothing2.15
-    else if (N->type == weave_section_purpose_node_type) Render purpose2.5
-    else if (N->type == weave_subheading_node_type) Render subheading2.6
-    else if (N->type == weave_bar_node_type) Render bar2.7
-    else if (N->type == weave_pagebreak_node_type) Render pagebreak2.8
-    else if (N->type == weave_linebreak_node_type) Render linebreak2.9
-    else if (N->type == weave_paragraph_heading_node_type) Render paragraph heading2.10
-    else if (N->type == weave_endnote_node_type) Render endnote2.11
-    else if (N->type == weave_figure_node_type) Render figure2.12
-    else if (N->type == weave_audio_node_type) Render nothing2.15
-    else if (N->type == weave_material_node_type) Render material2.13
-    else if (N->type == weave_embed_node_type) Render embed2.16
-    else if (N->type == weave_pmac_node_type) Render pmac2.17
-    else if (N->type == weave_vskip_node_type) Render vskip2.18
-    else if (N->type == weave_chapter_node_type) Render nothing2.15
-    else if (N->type == weave_section_node_type) Render section2.19
-    else if (N->type == weave_code_line_node_type) Render code line2.20
-    else if (N->type == weave_function_usage_node_type) Render function usage2.21
-    else if (N->type == weave_commentary_node_type) Render commentary2.22
-    else if (N->type == weave_carousel_slide_node_type) Render nothing2.15
-    else if (N->type == weave_toc_node_type) Render toc2.23
-    else if (N->type == weave_toc_line_node_type) Render toc line2.24
-    else if (N->type == weave_chapter_title_page_node_type) Render weave_chapter_title_page_node2.25
-    else if (N->type == weave_defn_node_type) Render defn2.26
-    else if (N->type == weave_source_code_node_type) Render source code2.27
-    else if (N->type == weave_url_node_type) Render URL2.28
-    else if (N->type == weave_footnote_cue_node_type) Render footnote cue2.29
-    else if (N->type == weave_begin_footnote_text_node_type) Render footnote text2.30
-    else if (N->type == weave_display_line_node_type) Render display line2.31
-    else if (N->type == weave_function_defn_node_type) Render function defn2.32
-    else if (N->type == weave_item_node_type) Render item2.33
-    else if (N->type == weave_grammar_index_node_type) Render grammar index2.34
-    else if (N->type == weave_inline_node_type) Render inline2.35
-    else if (N->type == weave_locale_node_type) Render locale2.36
-    else if (N->type == weave_maths_node_type) Render maths2.37
+    if ((N->type == weave_document_node_type) ||
+        (N->type == weave_body_node_type) ||
+        (N->type == weave_chapter_title_page_node_type) ||
+        (N->type == weave_chapter_footer_node_type) ||
+        (N->type == weave_section_footer_node_type) ||
+        (N->type == weave_audio_node_type) ||
+        (N->type == weave_chapter_node_type) ||
+        (N->type == weave_carousel_slide_node_type) ||
+        (N->type == weave_begin_footnote_text_node_type)) Render nothing4.15
+
+    else if (N->type == weave_head_node_type) Render head4.1
+    else if (N->type == weave_tail_node_type) Render tail4.2
+    else if (N->type == weave_verbatim_node_type) Render verbatim4.14
+    else if (N->type == weave_chapter_header_node_type) Render chapter header4.3
+    else if (N->type == weave_section_header_node_type) Render header4.4
+    else if (N->type == weave_section_purpose_node_type) Render purpose4.5
+    else if (N->type == weave_subheading_node_type) Render subheading4.6
+    else if (N->type == weave_bar_node_type) Render bar4.7
+    else if (N->type == weave_pagebreak_node_type) Render pagebreak4.8
+    else if (N->type == weave_linebreak_node_type) Render linebreak4.9
+    else if (N->type == weave_paragraph_heading_node_type) Render paragraph heading4.10
+    else if (N->type == weave_endnote_node_type) Render endnote4.11
+    else if (N->type == weave_figure_node_type) Render figure4.12
+    else if (N->type == weave_material_node_type) Render material4.13
+    else if (N->type == weave_embed_node_type) Render embed4.16
+    else if (N->type == weave_pmac_node_type) Render pmac4.17
+    else if (N->type == weave_vskip_node_type) Render vskip4.18
+    else if (N->type == weave_section_node_type) Render section4.19
+    else if (N->type == weave_code_line_node_type) Render code line4.20
+    else if (N->type == weave_function_usage_node_type) Render function usage4.21
+    else if (N->type == weave_commentary_node_type) Render commentary4.22
+    else if (N->type == weave_toc_node_type) Render toc4.23
+    else if (N->type == weave_toc_line_node_type) Render toc line4.24
+    else if (N->type == weave_defn_node_type) Render defn4.25
+    else if (N->type == weave_source_code_node_type) Render source code4.26
+    else if (N->type == weave_url_node_type) Render URL4.27
+    else if (N->type == weave_footnote_cue_node_type) Render footnote cue4.28
+    else if (N->type == weave_display_line_node_type) Render display line4.29
+    else if (N->type == weave_function_defn_node_type) Render function defn4.30
+    else if (N->type == weave_item_node_type) Render item4.31
+    else if (N->type == weave_grammar_index_node_type) Render grammar index4.32
+    else if (N->type == weave_inline_node_type) Render inline4.33
+    else if (N->type == weave_locale_node_type) Render locale4.34
+    else if (N->type == weave_maths_node_type) Render maths4.35
+
     else internal_error("unable to render unknown node");
     return TRUE;
 }
 
-
  • The structure TeX_render_state is accessed in 1/ptt, 3/tc, 3/twot, 5/wt, 5/fm, 5/ptf, 5/hf, 5/df, 5/wp, 6/rw and here.
-

§2.1. Render head2.1 = +

§4.1. Render head4.1 =

     weave_head_node *C = RETRIEVE_POINTER_weave_head_node(N->content);
     WRITE("%% %S\n", C->banner);
 
-
  • This code is used in §2.
-

§2.2. Render tail2.2 = +

  • This code is used in §4.
+

§4.2. Render tail4.2 =

@@ -185,81 +164,94 @@ function togglePopup(material_id) {
     WRITE("%% %S\n", C->rennab);
     WRITE("\\end\n");
 
-
  • This code is used in §2.
-

§2.3. Render chapter header2.3 = +

  • This code is used in §4.
+

§4.3. Render chapter header4.3 =

     weave_chapter_header_node *C = RETRIEVE_POINTER_weave_chapter_header_node(N->content);
-    if (Str::ne(C->chap->md->ch_range, I"S"))
-        TeX::paragraph_heading(trs->wv->format, OUT, trs->wv, FIRST_IN_LINKED_LIST(section, C->chap->sections), NULL, C->chap->md->ch_title, 3, FALSE);
+    if (Str::ne(C->chap->md->ch_range, I"S")) {
+        TeX::general_heading(OUT, trs->wv,
+            FIRST_IN_LINKED_LIST(section, C->chap->sections), NULL, C->chap->md->ch_title,
+            3, FALSE);
+        WRITE("%S\\medskip\n", C->chap->md->rubric);
+        section *S;
+        LOOP_OVER_LINKED_LIST(S, section, C->chap->sections) {
+            WRITE("\\smallskip\\noindent ");
+            if (trs->wv->pattern->number_sections) WRITE("%d. ", S->printed_number);
+            WRITE("{\\it %S}\\qquad\n%S", S->md->sect_title, S->sect_purpose);
+        }
+    }
 
-
  • This code is used in §2.
-

§2.4. Render header2.4 = +

  • This code is used in §4.
+

§4.4. Render header4.4 =

     weave_section_header_node *C = RETRIEVE_POINTER_weave_section_header_node(N->content);
-    TeX::paragraph_heading(trs->wv->format, OUT, trs->wv, C->sect, NULL, C->sect->md->sect_title, 2, FALSE);
+    TeX::general_heading(OUT, trs->wv, C->sect, NULL,
+        C->sect->md->sect_title, 2, FALSE);
 
-
  • This code is used in §2.
-

§2.5. Render purpose2.5 = +

  • This code is used in §4.
+

§4.5. Render purpose4.5 =

     weave_section_purpose_node *C = RETRIEVE_POINTER_weave_section_purpose_node(N->content);
-    TeX::subheading(trs->wv->format, OUT, trs->wv, 2, C->purpose, NULL);
+    WRITE("\\smallskip\\par\\noindent{\\it %S}\\smallskip\\noindent\n", C->purpose);
 
-
  • This code is used in §2.
-

§2.6. Render subheading2.6 = +

  • This code is used in §4.
+

§4.6. Render subheading4.6 =

     weave_subheading_node *C = RETRIEVE_POINTER_weave_subheading_node(N->content);
-    TeX::subheading(trs->wv->format, OUT, trs->wv, 1, C->text, NULL);
+    WRITE("\\par\\noindent{\\bf %S}\\mark{%S}\\medskip\n", C->text, NULL);
 
-
  • This code is used in §2.
-

§2.7. Render bar2.7 = +

  • This code is used in §4.
+

§4.7. Render bar4.7 =

     WRITE("\\par\\medskip\\noindent\\hrule\\medskip\\noindent\n");
 
-
  • This code is used in §2.
-

§2.8. Render pagebreak2.8 = +

  • This code is used in §4.
+

§4.8. Render pagebreak4.8 =

     WRITE("\\vfill\\eject\n");
 
-
  • This code is used in §2.
-

§2.9. Render linebreak2.9 = +

  • This code is used in §4.
+

§4.9. Render linebreak4.9 =

     WRITE("\n");
 
-
  • This code is used in §2.
-

§2.10. Render paragraph heading2.10 = +

  • This code is used in §4.
+

§4.10. Render paragraph heading4.10 =

-    weave_paragraph_heading_node *C = RETRIEVE_POINTER_weave_paragraph_heading_node(N->content);
-    TeX::paragraph_heading(trs->wv->format, OUT, trs->wv, C->para->under_section, C->para, I"Dunno", 0, FALSE);
+    weave_paragraph_heading_node *C =
+        RETRIEVE_POINTER_weave_paragraph_heading_node(N->content);
+    TeX::general_heading(OUT, trs->wv, C->para->under_section,
+        C->para, I"", 0, FALSE);
 
-
  • This code is used in §2.
-

§2.11. Render endnote2.11 = +

  • This code is used in §4.
+

§4.11. Render endnote4.11 =

     WRITE("\\par\\noindent\\penalty10000\n");
     WRITE("{\\usagefont ");
-    Recurse tne renderer through children nodes2.11.1;
+    Recurse tne renderer through children nodes4.11.1;
     WRITE("}\\smallskip\n");
     return FALSE;
 
-
  • This code is used in §2.
-

§2.12. TeX itself has an almost defiant lack of support for anything pictorial, +

  • This code is used in §4.
+

§4.12. 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 pdftex features, @@ -267,26 +259,24 @@ 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.

-

Render figure2.12 = +

Render figure4.12 =

-    if (trs->as_PDF) {
-        weave_figure_node *C = RETRIEVE_POINTER_weave_figure_node(N->content);
-        WRITE("\\pdfximage");
-        if (C->w >= 0)
-            WRITE(" width %d cm{../Figures/%S}\n", C->w, C->figname);
-        else if (C->h >= 0)
-            WRITE(" height %d cm{../Figures/%S}\n", C->h, C->figname);
-        else
-            WRITE("{../Figures/%S}\n", C->figname);
-        WRITE("\\smallskip\\noindent"
-            "\\hbox to\\hsize{\\hfill\\pdfrefximage \\pdflastximage\\hfill}"
-            "\\smallskip\n");
-    }
+    weave_figure_node *C = RETRIEVE_POINTER_weave_figure_node(N->content);
+    filename *F = Filenames::in(
+        Pathnames::down(trs->wv->weave_web->md->path_to_web, I"Figures"),
+        C->figname);
+    WRITE("\\pdfximage");
+    if (C->w >= 0) WRITE(" width %d cm{%f}\n", C->w/POINTS_PER_CM, F);
+    else if (C->h >= 0) WRITE(" height %d cm{%f}\n", C->h/POINTS_PER_CM, F);
+    else WRITE("{%f}\n", F);
+    WRITE("\\smallskip\\noindent"
+        "\\hbox to\\hsize{\\hfill\\pdfrefximage \\pdflastximage\\hfill}"
+        "\\smallskip\n");
 
-
  • This code is used in §2.
-

§2.13. Render material2.13 = +

  • This code is used in §4.
+

§4.13. Render material4.13 =

@@ -299,104 +289,100 @@ to a given width, into the text at the current position.
         first_in_para = PC->para;
     }
     if (C->material_type == COMMENTARY_MATERIAL)
-        Deal with a commentary material node2.13.1
+        Deal with a commentary material node4.13.1
     else if (C->material_type == CODE_MATERIAL)
-        Deal with a code material node2.13.2
+        Deal with a code material node4.13.2
     else if (C->material_type == FOOTNOTES_MATERIAL)
-        Deal with a footnotes material node2.13.3
+        Deal with a footnotes material node4.13.3
     else if (C->material_type == ENDNOTES_MATERIAL)
-        Deal with a endnotes material node2.13.4
+        Deal with a endnotes material node4.13.4
     else if (C->material_type == MACRO_MATERIAL)
-        Deal with a macro material node2.13.5
+        Deal with a macro material node4.13.5
     else if (C->material_type == DEFINITION_MATERIAL)
-        Deal with a definition material node2.13.6;
+        Deal with a definition material node4.13.6;
     return FALSE;
 
-
  • This code is used in §2.
-

§2.13.1. Deal with a commentary material node2.13.1 = +

  • This code is used in §4.
+

§4.13.1. Deal with a commentary material node4.13.1 =

-    Recurse tne renderer through children nodes2.11.1;
+    Recurse tne renderer through children nodes4.11.1;
     WRITE("\n");
 
- -

§2.13.2. Deal with a code material node2.13.2 = +

+

§4.13.2. Deal with a code material node4.13.2 =

     WRITE("\\beginlines\n");
-    Recurse tne renderer through children nodes2.11.1;
+    Recurse tne renderer through children nodes4.11.1;
     WRITE("\\endlines\n");
 
- -

§2.13.3. Deal with a footnotes material node2.13.3 = +

+

§4.13.3. Deal with a footnotes material node4.13.3 =

-    Recurse tne renderer through children nodes2.11.1;
+    return FALSE;
 
- -

§2.13.4. Deal with a endnotes material node2.13.4 = +

+

§4.13.4. Deal with a endnotes material node4.13.4 =

-    Recurse tne renderer through children nodes2.11.1;
+    Recurse tne renderer through children nodes4.11.1;
 
- -

§2.13.5. Deal with a macro material node2.13.5 = +

+

§4.13.5. Deal with a macro material node4.13.5 =

-    Recurse tne renderer through children nodes2.11.1;
+    Recurse tne renderer through children nodes4.11.1;
     WRITE("\n");
 
- -

§2.13.6. Deal with a definition material node2.13.6 = +

+

§4.13.6. Deal with a definition material node4.13.6 =

     WRITE("\\beginlines\n");
-    Recurse tne renderer through children nodes2.11.1;
+    Recurse tne renderer through children nodes4.11.1;
     WRITE("\\endlines\n");
 
- -

§2.14. Render verbatim2.14 = +

+

§4.14. Render verbatim4.14 =

     weave_verbatim_node *C = RETRIEVE_POINTER_weave_verbatim_node(N->content);
     WRITE("%S", C->content);
 
-
  • This code is used in §2.
-

§2.15. Render nothing2.15 = +

  • This code is used in §4.
+

§4.15. Render nothing4.15 =

     ;
 
-
  • This code is used in §2 (7 times).
-

§2.16. Render embed2.16 = +

  • This code is used in §4.
+

§4.16. Render embed4.16 =

     weave_embed_node *C = RETRIEVE_POINTER_weave_embed_node(N->content);
     LOG("It was %d\n", C->allocation_id);
 
-
  • This code is used in §2.
-

§2.17. Render pmac2.17 = +

  • This code is used in §4.
+

§4.17. Render pmac4.17 =

     weave_pmac_node *C = RETRIEVE_POINTER_weave_pmac_node(N->content);
-    if (trs->as_PDF)
-        TeX::para_macro_PDF_1(trs->wv->format, OUT, trs->wv, C->pmac, C->defn);
-    TeX::para_macro(trs->wv->format, OUT, trs->wv, C->pmac, C->defn);
-    if (trs->as_PDF)
-        TeX::para_macro_PDF_2(trs->wv->format, OUT, trs->wv, C->pmac, C->defn);
+    TeX::para_macro(OUT, trs->wv, C->pmac, C->defn);
 
-
  • This code is used in §2.
-

§2.18. Render vskip2.18 = +

  • This code is used in §4.
+

§4.18. Render vskip4.18 =

@@ -404,137 +390,175 @@ to a given width, into the text at the current position.
     if (C->in_comment) WRITE("\\smallskip\\par\\noindent%%\n");
     else WRITE("\\smallskip\n");
 
-
  • This code is used in §2.
-

§2.19. Render section2.19 = +

  • This code is used in §4.
+

§4.19. Render section4.19 =

     weave_section_node *C = RETRIEVE_POINTER_weave_section_node(N->content);
     LOG("It was %d\n", C->allocation_id);
 
-
  • This code is used in §2.
-

§2.20. Render code line2.20 = +

  • This code is used in §4.
+

§4.20. Render code line4.20 =

     WRITE("\\smallskip\\par\\noindent ");
     WRITE("|");
-    Recurse tne renderer through children nodes2.11.1;
+    Recurse tne renderer through children nodes4.11.1;
     WRITE("|");
     WRITE("\n");
     return FALSE;
 
-
  • This code is used in §2.
-

§2.21. Render function usage2.21 = +

  • This code is used in §4.
+

§4.21. Render function usage4.21 =

-    weave_function_usage_node *C = RETRIEVE_POINTER_weave_function_usage_node(N->content);
+    weave_function_usage_node *C =
+        RETRIEVE_POINTER_weave_function_usage_node(N->content);
     WRITE("%S", C->fn->function_name);
     return FALSE;
 
-
  • This code is used in §2.
-

§2.22. Render commentary2.22 = +

  • This code is used in §4.
+

§4.22. Render commentary4.22 =

-    weave_commentary_node *C = RETRIEVE_POINTER_weave_commentary_node(N->content);
+    weave_commentary_node *C =
+        RETRIEVE_POINTER_weave_commentary_node(N->content);
     if (C->in_code) WRITE(" |\\hfill{\\ttninepoint\\it ");
-    TeX::commentary_text(NULL, OUT, trs->wv, C->text);
+    TeX::commentary_text(OUT, trs->wv, C->text);
     if (C->in_code) WRITE("}|");
 
-
  • This code is used in §2.
-

§2.23. Render toc2.23 = +

  • This code is used in §4.
+

§4.23. Render toc4.23 =

     WRITE("\\medskip\\hrule\\smallskip\\par\\noindent{\\usagefont ");
     for (tree_node *M = N->child; M; M = M->next) {
-        Trees::traverse_from(M, &TeX::render_visit, (void *) trs, L+1);
+        Trees::traverse_from(M, &TeX::render_visit, (void *) trs, L+1);
         if (M->next) WRITE("; ");
     }
     WRITE("}\\par\\medskip\\hrule\\bigskip\n");
     return FALSE;
 
-
  • This code is used in §2.
-

§2.24. Render toc line2.24 = +

  • This code is used in §4.
+

§4.24. Render toc line4.24 =

     weave_toc_line_node *C = RETRIEVE_POINTER_weave_toc_line_node(N->content);
     WRITE("%S~%S", C->text1, C->text2);
 
-
  • This code is used in §2.
-

§2.25. Render weave_chapter_title_page_node2.25 = -

- -
-    weave_chapter_title_page_node *C = RETRIEVE_POINTER_weave_chapter_title_page_node(N->content);
-    LOG("It was %d\n", C->allocation_id);
-
-
  • This code is used in §2.
-

§2.26. Render defn2.26 = +

  • This code is used in §4.
+

§4.25. Render defn4.25 =

     weave_defn_node *C = RETRIEVE_POINTER_weave_defn_node(N->content);
     WRITE("|{\\ninebf %S} |", C->keyword);
 
-
  • This code is used in §2.
-

§2.27. Render source code2.27 = +

  • This code is used in §4.
+

§4.26. Render source code4.26 =

-    weave_source_code_node *C = RETRIEVE_POINTER_weave_source_code_node(N->content);
+    weave_source_code_node *C =
+        RETRIEVE_POINTER_weave_source_code_node(N->content);
     int starts = FALSE;
     if (N == N->parent->child) starts = TRUE;
-    TeX::source_code(trs->wv->format, OUT, trs->wv,
+    TeX::source_code(OUT, trs->wv,
         C->matter, C->colouring, starts);
 
-
  • This code is used in §2.
-

§2.28. Render URL2.28 = +

  • This code is used in §4.
+

§4.27. Render URL4.27 =

     weave_url_node *C = RETRIEVE_POINTER_weave_url_node(N->content);
     WRITE("%S", C->url);
 
-
  • This code is used in §2.
-

§2.29. Render footnote cue2.29 = +

  • This code is used in §4.
+

§4.28. The TeX macro for footnotes means that the text has to accompany the cue, +which is tricky for us now because the footnote text is somewhere else in +the weave tree — so, we go for a little walk: +

+ +

Render footnote cue4.28 =

     weave_footnote_cue_node *C = RETRIEVE_POINTER_weave_footnote_cue_node(N->content);
-    WRITE("[%S]", C->cue_text);
+    WRITE("\\footnote{${}^{%S}$}{", C->cue_text);
+    tree_node *M = N;
+    while ((M) && (M->type != weave_paragraph_heading_node_type)) M = M->parent;
+    if (M == NULL) internal_error("tree without section nodes");
+    M = M->child;
+    int found = FALSE;
+    while (M) {
+        if (M->type == weave_material_node_type) {
+            weave_material_node *MC = RETRIEVE_POINTER_weave_material_node(M->content);
+            if (MC->material_type == FOOTNOTES_MATERIAL) {
+                tree_node *F = M->child;
+                while (F) {
+                    if (F->type == weave_begin_footnote_text_node_type) {
+                        weave_begin_footnote_text_node *FC =
+                            RETRIEVE_POINTER_weave_begin_footnote_text_node(F->content);
+                        if (Str::eq(FC->cue_text, C->cue_text))
+                            Found the right footnote text at last4.28.1;
+                    }
+                    F = F->next;
+                }
+            }
+        }
+        M = M->next;
+    }
+    WRITE("}");
+    if (found == FALSE) internal_error("cue without text");
 
-
  • This code is used in §2.
-

§2.30. Render footnote text2.30 = +

  • This code is used in §4.
+

§4.28.1. And so here's the text. Note that we render only its second and subsequent +child nodes: that's because the first child is a copy of the footnote cue, +and TeX renders that automatically. +

+ +

(The TeX renderer otherwise ignores footnote texts, so if these nodes +are not rendered here, they never will be.) +

+ +

Found the right footnote text at last4.28.1 =

-    WRITE("\n");
+    for (tree_node *X = F->child->next; X; X = X->next)
+        Trees::traverse_from(X, &TeX::render_visit, (void *) trs, L+1);
+    found = TRUE;
 
-
  • This code is used in §2.
-

§2.31. Render display line2.31 = +

+

§4.29. Render display line4.29 =

-    weave_display_line_node *C = RETRIEVE_POINTER_weave_display_line_node(N->content);
+    weave_display_line_node *C =
+        RETRIEVE_POINTER_weave_display_line_node(N->content);
     WRITE("\\quotesource{%S}\n", C->text);
 
-
  • This code is used in §2.
-

§2.32. Render function defn2.32 = +

  • This code is used in §4.
+

§4.30. Render function defn4.30 =

-    weave_function_defn_node *C = RETRIEVE_POINTER_weave_function_defn_node(N->content);
-    TeX::change_colour_PDF(OUT, FUNCTION_COLOUR, TRUE);
+    weave_function_defn_node *C =
+        RETRIEVE_POINTER_weave_function_defn_node(N->content);
+    TeX::change_colour_PDF(OUT, FUNCTION_COLOUR, TRUE);
     WRITE("%S", C->fn->function_name);
-    TeX::change_colour_PDF(OUT, PLAIN_COLOUR, TRUE);
+    TeX::change_colour_PDF(OUT, PLAIN_COLOUR, TRUE);
     return FALSE;
 
-
  • This code is used in §2.
-

§2.33. Render item2.33 = +

  • This code is used in §4.
+

§4.31. Render item4.31 =

@@ -547,25 +571,25 @@ to a given width, into the text at the current position.
         else WRITE("\\itemitem{}");
     }
 
-
  • This code is used in §2.
-

§2.34. Render grammar index2.34 = +

  • This code is used in §4.
+

§4.32. Render grammar index4.32 =

     InCSupport::weave_grammar_index(OUT);
 
-
  • This code is used in §2.
-

§2.35. Render inline2.35 = +

  • This code is used in §4.
+

§4.33. Render inline4.33 =

     WRITE("|");
-    Recurse tne renderer through children nodes2.11.1;
+    Recurse tne renderer through children nodes4.11.1;
     WRITE("|");
     return FALSE;
 
-
  • This code is used in §2.
-

§2.36. Render locale2.36 = +

  • This code is used in §4.
+

§4.34. Render locale4.34 =

@@ -573,8 +597,8 @@ to a given width, into the text at the current position.
     WRITE("$\\%S$%S", C->par1->ornament, C->par1->paragraph_number);
     if (C->par2) WRITE("-%S", C->par2->paragraph_number);
 
-
  • This code is used in §2.
-

§2.37. Render maths2.37 = +

  • This code is used in §4.
+

§4.35. Render maths4.35 =

@@ -583,89 +607,29 @@ to a given width, into the text at the current position.
     WRITE("%S", C->content);
     if (C->displayed) WRITE("$$"); else WRITE("$");
 
-
  • This code is used in §2.
-

§2.11.1. Recurse tne renderer through children nodes2.11.1 = +

  • This code is used in §4.
+

§4.11.1. Recurse tne renderer through children nodes4.11.1 =

     for (tree_node *M = N->child; M; M = M->next)
-        Trees::traverse_from(M, &TeX::render_visit, (void *) trs, L+1);
-
- -

§3.

- -
-int TeX::yes(weave_format *self, weave_order *wv) {
-    return TRUE;
-}
-
-

§4.

- -
-void TeX::subheading(weave_format *self, text_stream *OUT, weave_order *wv,
-    int level, text_stream *comment, text_stream *head) {
-    switch (level) {
-        case 1:
-            WRITE("\\par\\noindent{\\bf %S}\\mark{%S}\\medskip\n",
-                comment, head);
-            break;
-        case 2:
-            WRITE("\\smallskip\\par\\noindent{\\it %S}\\smallskip\\noindent\n",
-                comment);
-            if (head) TeX::commentary_text(self, OUT, wv, head);
-            break;
-    }
-}
+        Trees::traverse_from(M, &TeX::render_visit, (void *) trs, L+1);
 
+

§5.

-
-void TeX::toc(weave_format *self, text_stream *OUT, weave_order *wv, int stage,
-    text_stream *text1, text_stream *text2, paragraph *P) {
-    switch (stage) {
-        case 1:
-            WRITE("\\medskip\\hrule\\smallskip\\par\\noindent{\\usagefont ");
-            break;
-        case 2:
-            WRITE("; ");
-            break;
-        case 3:
-            WRITE("%S~%S", text1, text2);
-            break;
-        case 4:
-            WRITE("}\\par\\medskip\\hrule\\bigskip\n");
-            break;
-    }
-}
-
-

§6.

- -
-void TeX::chapter_title_page(weave_format *self, text_stream *OUT, weave_order *wv,
-    chapter *C) {
-    WRITE("%S\\medskip\n", C->md->rubric);
-    section *S;
-    LOOP_OVER_LINKED_LIST(S, section, C->sections) {
-        WRITE("\\smallskip\\noindent ");
-        if (wv->pattern->number_sections) WRITE("%d. ", S->printed_number);
-        WRITE("{\\it %S}\\qquad\n%S", S->md->sect_title, S->sect_purpose);
-    }
-}
-
-

§7.

-
 text_stream *P_literal = NULL;
-void TeX::paragraph_heading(weave_format *self, text_stream *OUT, weave_order *wv,
+void TeX::general_heading(text_stream *OUT, weave_order *wv,
     section *S, paragraph *P, text_stream *heading_text, int weight, int no_skip) {
     text_stream *TeX_macro = NULL;
-    Choose which TeX macro to use in order to typeset the new paragraph heading7.1;
+    Choose which TeX macro to use in order to typeset the new paragraph heading5.1;
 
     if (P_literal == NULL) P_literal = Str::new_from_wide_string(L"P");
     text_stream *orn = (P)?(P->ornament):P_literal;
     text_stream *N = (P)?(P->paragraph_number):NULL;
     TEMPORARY_TEXT(mark);
-    Work out the next mark to place into the TeX vertical list7.2;
+    Work out the next mark to place into the TeX vertical list5.2;
     TEMPORARY_TEXT(modified);
     Str::copy(modified, heading_text);
     match_results mr = Regexp::create_mr();
@@ -684,7 +648,7 @@ to a given width, into the text at the current position.
     Regexp::dispose_of(&mr);
 }
 
-

§7.1. We want to have different heading styles for different weights, and TeX is +

§5.1. We want to have different heading styles for different weights, and TeX is horrible at using macro parameters as function arguments, so we don't want to pass the weight that way. Instead we use

@@ -702,7 +666,7 @@ the same, but with the initial vertical spacing removed; these allow us to prevent unsightly excess white space in certain configurations of a section.

-

Choose which TeX macro to use in order to typeset the new paragraph heading7.1 = +

Choose which TeX macro to use in order to typeset the new paragraph heading5.1 =

@@ -727,8 +691,8 @@ prevent unsightly excess white space in certain configurations of a section.
         }
     }
 
-
  • This code is used in §7.
-

§7.2. "Marks" are the contrivance by which TeX produces running heads on pages +

  • This code is used in §5.
+

§5.2. "Marks" are the contrivance by which TeX produces running heads on pages which follow the material on those pages: so that the running head for a page can show the paragraph range for the material which tops it, for instance.

@@ -739,7 +703,7 @@ because they abbreviate characters found in math fonts but not regular ones, in TeX's deeply peculiar font encoding system.

-

Work out the next mark to place into the TeX vertical list7.2 = +

Work out the next mark to place into the TeX vertical list5.2 =

@@ -759,23 +723,24 @@ in TeX's deeply peculiar font encoding system.
     }
     WRITE_TO(mark, "%S%S\\quad$\\%S$%S", chaptermark, sectionmark, orn, N);
 
-
  • This code is used in §7.
-

§8. Code is typeset by TeX within vertical strokes; these switch a sort of +

  • This code is used in §5.
+

§6. 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:

-void TeX::source_code(weave_format *self, text_stream *OUT, weave_order *wv,
+void TeX::source_code(text_stream *OUT, weave_order *wv,
     text_stream *matter, text_stream *colouring, int starts) {
     int current_colour = PLAIN_COLOUR, colour_wanted = PLAIN_COLOUR;
     for (int i=0; i < Str::len(matter); i++) {
-        colour_wanted = Str::get_at(colouring, i); Adjust code colour as necessary8.1;
+        colour_wanted = Str::get_at(colouring, i);
+        Adjust code colour as necessary6.1;
         if (Str::get_at(matter, i) == '|') WRITE("|\\||");
         else WRITE("%c", Str::get_at(matter, i));
     }
-    colour_wanted = PLAIN_COLOUR; Adjust code colour as necessary8.1;
+    colour_wanted = PLAIN_COLOUR; Adjust code colour as necessary6.1;
 }
 

§.1. We actually use \qquad horizontal spaces rather than risk using TeX's @@ -790,20 +755,20 @@ messy alignment system: for (int i=0; i<tab_stops_of_indentation; i++) WRITE("\\qquad");

  • This code is never used.
-

§8.1. Adjust code colour as necessary8.1 = +

§6.1. Adjust code colour as necessary6.1 =

     if (colour_wanted != current_colour) {
-        TeX::change_colour_PDF(OUT, colour_wanted, TRUE);
+        TeX::change_colour_PDF(OUT, colour_wanted, TRUE);
         current_colour = colour_wanted;
     }
 
-
  • This code is used in §8 (twice).
-

§9.

+
  • This code is used in §6 (twice).
+

§7.

-void TeX::change_colour_PDF(text_stream *OUT, int col, int in_code) {
+void TeX::change_colour_PDF(text_stream *OUT, int col, int in_code) {
     char *inout = "";
     if (in_code) inout = "|";
     switch (col) {
@@ -818,7 +783,7 @@ messy alignment system:
     }
 }
 
-

§10. Any usage of angle-macros is highlighted in several cute ways: first, +

§8. 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.

@@ -828,11 +793,7 @@ or DVI, only the middle one is.

-void TeX::para_macro_PDF_1(weave_format *self, text_stream *OUT, weave_order *wv,
-    para_macro *pmac, int defn) {
-}
-void TeX::para_macro(weave_format *self, text_stream *OUT, weave_order *wv,
-    para_macro *pmac, int defn) {
+void TeX::para_macro(text_stream *OUT, weave_order *wv, para_macro *pmac, int defn) {
     if (defn)
         WRITE("|\\pdfdest num %d fit ",
             pmac->allocation_id + 100);
@@ -840,32 +801,21 @@ or DVI, only the middle one is.
         WRITE("|\\pdfstartlink attr{/C [0.9 0 0] /Border [0 0 0]} goto num %d ",
             pmac->allocation_id + 100);
     WRITE("$\\langle${\\xreffont");
-    TeX::change_colour_PDF(OUT, DEFINITION_COLOUR, FALSE);
+    TeX::change_colour_PDF(OUT, DEFINITION_COLOUR, FALSE);
     WRITE("%S ", pmac->macro_name);
     WRITE("{\\sevenss %S}}", pmac->defining_paragraph->paragraph_number);
-    TeX::change_colour_PDF(OUT, PLAIN_COLOUR, FALSE);
+    TeX::change_colour_PDF(OUT, PLAIN_COLOUR, FALSE);
     WRITE("$\\rangle$ ");
     if (defn)
         WRITE("$\\equiv$|");
     else
         WRITE("\\pdfendlink|");
 }
-void TeX::para_macro_PDF_2(weave_format *self, text_stream *OUT, weave_order *wv,
-    para_macro *pmac, int defn) {
-}
 
-

§11.

+

§9.

-void TeX::after_definitions(weave_format *self, text_stream *OUT, weave_order *wv) {
-    WRITE("\\smallskip\n");
-}
-
-

§12.

- -
-void TeX::commentary_text(weave_format *self, text_stream *OUT, weave_order *wv,
-    text_stream *id) {
+void TeX::commentary_text(text_stream *OUT, weave_order *wv, text_stream *id) {
     int math_mode = FALSE;
     for (int i=0; i < Str::len(id); i++) {
         switch (Str::get_at(id, i)) {
@@ -886,46 +836,28 @@ or DVI, only the middle one is.
     }
 }
 
-

§13.

- -
-void TeX::locale(weave_format *self, text_stream *OUT, weave_order *wv,
-    paragraph *par1, paragraph *par2) {
-    WRITE("$\\%S$%S", par1->ornament, par1->paragraph_number);
-    if (par2) WRITE("-%S", par2->paragraph_number);
-}
-
-

§14.

- -
-void TeX::tail(weave_format *self, text_stream *OUT, weave_order *wv,
-    text_stream *comment, section *S) {
-    WRITE("%% %S\n", comment);
-    WRITE("\\end\n");
-}
-
-

§15. The following is called only when the language is InC, and the weave is of +

§10. The following is called only when the language is InC, and the weave is of the special Preform grammar document.

-int TeX::preform_document(weave_format *self, text_stream *OUT, web *W, weave_order *wv,
-    chapter *C, section *S, source_line *L, text_stream *matter,
+int TeX::preform_document(weave_format *self, text_stream *OUT, web *W,
+    weave_order *wv, chapter *C, section *S, source_line *L, text_stream *matter,
     text_stream *concluding_comment) {
     if (L->preform_nonterminal_defined) {
         preform_production_count = 0;
-        Weave the opening line of the nonterminal definition15.1;
+        Weave the opening line of the nonterminal definition10.1;
         return TRUE;
     } else {
         if (L->category == PREFORM_GRAMMAR_LCAT) {
-            Weave a line from the body of the nonterminal definition15.2;
+            Weave a line from the body of the nonterminal definition10.2;
             return TRUE;
         }
     }
     return FALSE;
 }
 
-

§15.1. Weave the opening line of the nonterminal definition15.1 = +

§10.1. Weave the opening line of the nonterminal definition10.1 =

@@ -944,16 +876,19 @@ the special Preform grammar document.
     }
     WRITE("\n");
 
-
  • This code is used in §15.
-

§15.2. Weave a line from the body of the nonterminal definition15.2 = +

  • This code is used in §10.
+

§10.2. Weave a line from the body of the nonterminal definition10.2 =

     TEMPORARY_TEXT(problem);
     match_results mr = Regexp::create_mr();
-    if (Regexp::match(&mr, matter, L"Issue (%c*?) problem")) Str::copy(problem, mr.exp[0]);
-    else if (Regexp::match(&mr, matter, L"FAIL_NONTERMINAL %+")) WRITE_TO(problem, "fail and skip");
-    else if (Regexp::match(&mr, matter, L"FAIL_NONTERMINAL")) WRITE_TO(problem, "fail");
+    if (Regexp::match(&mr, matter, L"Issue (%c*?) problem"))
+        Str::copy(problem, mr.exp[0]);
+    else if (Regexp::match(&mr, matter, L"FAIL_NONTERMINAL %+"))
+        WRITE_TO(problem, "fail and skip");
+    else if (Regexp::match(&mr, matter, L"FAIL_NONTERMINAL"))
+        WRITE_TO(problem, "fail");
     preform_production_count++;
     WRITE_TO(matter, "|%S|", L->text_operand);
     while (Regexp::match(&mr, matter, L"(%c+?)|(%c+)")) {
@@ -985,8 +920,7 @@ the special Preform grammar document.
     else if (Str::len(concluding_comment) > 0) {
         WRITE(" \\hfill{\\ttninepoint\\it ");
         if (Str::len(concluding_comment) > 0)
-            TeX::commentary_text(NULL, OUT, wv, concluding_comment);
-			Formats::text_comment(OUT, wv, concluding_comment);
+            TeX::commentary_text(OUT, wv, concluding_comment);
         WRITE("}");
     }
     WRITE("\n");
@@ -994,310 +928,7 @@ the special Preform grammar document.
     DISCARD_TEXT(problem);
     Regexp::dispose_of(&mr);
 
-
  • This code is used in §15.
-

§16. Post-processing.

- -
-void TeX::post_process_report(weave_format *self, weave_order *wv) {
-    RunningTeX::report_on_post_processing(wv);
-}
-
-

§17.

- -
-int TeX::post_process_substitute(weave_format *self, text_stream *OUT,
-    weave_order *wv, text_stream *detail, weave_pattern *pattern) {
-    return RunningTeX::substitute_post_processing_data(OUT, wv, detail);
-}
-
-

§18. Removing math mode. "Math mode", in TeX jargon, is what happens when a mathematical formula -is written inside dollar signs: in Answer is $x+y^2$, the math mode -content is x+y^2. 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. -

- -
-void TeX::remove_math_mode(OUTPUT_STREAM, text_stream *text) {
-    TEMPORARY_TEXT(math_matter);
-    TeX::remove_math_mode_range(math_matter, text, 0, Str::len(text)-1);
-    WRITE("%S", math_matter);
-    DISCARD_TEXT(math_matter);
-}
-
-void TeX::remove_math_mode_range(OUTPUT_STREAM, text_stream *text, int from, int to) {
-    for (int i=from; i <= to; i++) {
-        Remove the over construction18.1;
-    }
-    for (int i=from; i <= to; i++) {
-        Remove the rm and it constructions18.2;
-        Remove the sqrt constructions18.3;
-    }
-    int math_mode = FALSE;
-    for (int i=from; i <= to; i++) {
-        switch (Str::get_at(text, i)) {
-            case '$':
-                if (Str::get_at(text, i+1) == '$') i++;
-                math_mode = (math_mode)?FALSE:TRUE; break;
-            case '~': if (math_mode) WRITE(" "); else WRITE("~"); break;
-            case '\\': Do something to strip out a TeX macro18.4; break;
-            default: PUT(Str::get_at(text, i)); break;
-        }
-    }
-}
-
-

§18.1. Here we remove {{top}\over{bottom}}, converting it to ((top) / (bottom)). -

- -

Remove the over construction18.1 = -

- -
-    if ((Str::get_at(text, i) == '\\') &&
-        (Str::get_at(text, i+1) == 'o') && (Str::get_at(text, i+2) == 'v') &&
-        (Str::get_at(text, i+3) == 'e') && (Str::get_at(text, i+4) == 'r') &&
-        (Str::get_at(text, i+5) == '{')) {
-        int bl = 1;
-        int j = i-1;
-        for (; j >= from; j--) {
-            wchar_t c = Str::get_at(text, j);
-            if (c == '{') {
-                bl--;
-                if (bl == 0) break;
-            }
-            if (c == '}') bl++;
-        }
-        TeX::remove_math_mode_range(OUT, text, from, j-1);
-        WRITE("((");
-        TeX::remove_math_mode_range(OUT, text, j+2, i-2);
-        WRITE(") / (");
-        j=i+6; bl = 1;
-        for (; j <= to; j++) {
-            wchar_t c = Str::get_at(text, j);
-            if (c == '}') {
-                bl--;
-                if (bl == 0) break;
-            }
-            if (c == '{') bl++;
-        }
-        TeX::remove_math_mode_range(OUT, text, i+6, j-1);
-        WRITE("))");
-        TeX::remove_math_mode_range(OUT, text, j+2, to);
-        return;
-    }
-
-
  • This code is used in §18.
-

§18.2. Here we remove {\rm text}, converting it to text, and similarly \it. -

- -

Remove the rm and it constructions18.2 = -

- -
-    if ((Str::get_at(text, i) == '{') && (Str::get_at(text, i+1) == '\\') &&
-        (((Str::get_at(text, i+2) == 'r') && (Str::get_at(text, i+3) == 'm')) ||
-            ((Str::get_at(text, i+2) == 'i') && (Str::get_at(text, i+3) == 't'))) &&
-        (Str::get_at(text, i+4) == ' ')) {
-        TeX::remove_math_mode_range(OUT, text, from, i-1);
-        int j=i+5;
-        for (; j <= to; j++)
-            if (Str::get_at(text, j) == '}')
-                break;
-        TeX::remove_math_mode_range(OUT, text, i+5, j-1);
-        TeX::remove_math_mode_range(OUT, text, j+1, to);
-        return;
-    }
-
-
  • This code is used in §18.
-

§18.3. Here we remove \sqrt{N}, converting it to sqrt(N). As a special case, -we also look out for {}^3\sqrt{N} for cube root. -

- -

Remove the sqrt constructions18.3 = -

- -
-    if ((Str::get_at(text, i) == '\\') &&
-        (Str::get_at(text, i+1) == 's') && (Str::get_at(text, i+2) == 'q') &&
-        (Str::get_at(text, i+3) == 'r') && (Str::get_at(text, i+4) == 't') &&
-        (Str::get_at(text, i+5) == '{')) {
-        if ((Str::get_at(text, i-4) == '{') &&
-            (Str::get_at(text, i-3) == '}') &&
-            (Str::get_at(text, i-2) == '^') &&
-            (Str::get_at(text, i-1) == '3')) {
-            TeX::remove_math_mode_range(OUT, text, from, i-5);
-            WRITE(" curt(");
-        } else {
-            TeX::remove_math_mode_range(OUT, text, from, i-1);
-            WRITE(" sqrt(");
-        }
-        int j=i+6, bl = 1;
-        for (; j <= to; j++) {
-            wchar_t c = Str::get_at(text, j);
-            if (c == '}') {
-                bl--;
-                if (bl == 0) break;
-            }
-            if (c == '{') bl++;
-        }
-        TeX::remove_math_mode_range(OUT, text, i+6, j-1);
-        WRITE(")");
-        TeX::remove_math_mode_range(OUT, text, j+1, to);
-        return;
-    }
-
-
  • This code is used in §18.
-

§18.4. Do something to strip out a TeX macro18.4 = -

- -
-    TEMPORARY_TEXT(macro);
-    i++;
-    while ((i < Str::len(text)) && (Characters::isalpha(Str::get_at(text, i))))
-        PUT_TO(macro, Str::get_at(text, i++));
-    if (Str::eq(macro, I"not")) Remove the not prefix18.4.2
-    else Remove a general macro18.4.1;
-    DISCARD_TEXT(macro);
-    i--;
-
-
  • This code is used in §18.
-

§18.4.1. Remove a general macro18.4.1 = -

- -
-    if (Str::eq(macro, I"leq")) WRITE("<=");
-    else if (Str::eq(macro, I"geq")) WRITE(">=");
-    else if (Str::eq(macro, I"sim")) WRITE("~");
-    else if (Str::eq(macro, I"hbox")) WRITE("");
-    else if (Str::eq(macro, I"left")) WRITE("");
-    else if (Str::eq(macro, I"right")) WRITE("");
-    else if (Str::eq(macro, I"Rightarrow")) WRITE("=>");
-    else if (Str::eq(macro, I"Leftrightarrow")) WRITE("<=>");
-    else if (Str::eq(macro, I"to")) WRITE("-->");
-    else if (Str::eq(macro, I"rightarrow")) WRITE("-->");
-    else if (Str::eq(macro, I"longrightarrow")) WRITE("-->");
-    else if (Str::eq(macro, I"leftarrow")) WRITE("<--");
-    else if (Str::eq(macro, I"longleftarrow")) WRITE("<--");
-    else if (Str::eq(macro, I"lbrace")) WRITE("{");
-    else if (Str::eq(macro, I"mid")) WRITE("|");
-    else if (Str::eq(macro, I"rbrace")) WRITE("}");
-    else if (Str::eq(macro, I"cdot")) WRITE(".");
-    else if (Str::eq(macro, I"cdots")) WRITE("...");
-    else if (Str::eq(macro, I"dots")) WRITE("...");
-    else if (Str::eq(macro, I"times")) WRITE("*");
-    else if (Str::eq(macro, I"quad")) WRITE("  ");
-    else if (Str::eq(macro, I"qquad")) WRITE("    ");
-    else if (Str::eq(macro, I"TeX")) WRITE("TeX");
-    else if (Str::eq(macro, I"neq")) WRITE("!=");
-    else if (Str::eq(macro, I"noteq")) WRITE("!=");
-    else if (Str::eq(macro, I"ell")) WRITE("l");
-    else if (Str::eq(macro, I"log")) WRITE("log");
-    else if (Str::eq(macro, I"exp")) WRITE("exp");
-    else if (Str::eq(macro, I"sin")) WRITE("sin");
-    else if (Str::eq(macro, I"cos")) WRITE("cos");
-    else if (Str::eq(macro, I"tan")) WRITE("tan");
-    else if (Str::eq(macro, I"top")) WRITE("T");
-    else if (Str::eq(macro, I"Alpha")) PUT((wchar_t) 0x0391);
-    else if (Str::eq(macro, I"Beta")) PUT((wchar_t) 0x0392);
-    else if (Str::eq(macro, I"Gamma")) PUT((wchar_t) 0x0393);
-    else if (Str::eq(macro, I"Delta")) PUT((wchar_t) 0x0394);
-    else if (Str::eq(macro, I"Epsilon")) PUT((wchar_t) 0x0395);
-    else if (Str::eq(macro, I"Zeta")) PUT((wchar_t) 0x0396);
-    else if (Str::eq(macro, I"Eta")) PUT((wchar_t) 0x0397);
-    else if (Str::eq(macro, I"Theta")) PUT((wchar_t) 0x0398);
-    else if (Str::eq(macro, I"Iota")) PUT((wchar_t) 0x0399);
-    else if (Str::eq(macro, I"Kappa")) PUT((wchar_t) 0x039A);
-    else if (Str::eq(macro, I"Lambda")) PUT((wchar_t) 0x039B);
-    else if (Str::eq(macro, I"Mu")) PUT((wchar_t) 0x039C);
-    else if (Str::eq(macro, I"Nu")) PUT((wchar_t) 0x039D);
-    else if (Str::eq(macro, I"Xi")) PUT((wchar_t) 0x039E);
-    else if (Str::eq(macro, I"Omicron")) PUT((wchar_t) 0x039F);
-    else if (Str::eq(macro, I"Pi")) PUT((wchar_t) 0x03A0);
-    else if (Str::eq(macro, I"Rho")) PUT((wchar_t) 0x03A1);
-    else if (Str::eq(macro, I"Varsigma")) PUT((wchar_t) 0x03A2);
-    else if (Str::eq(macro, I"Sigma")) PUT((wchar_t) 0x03A3);
-    else if (Str::eq(macro, I"Tau")) PUT((wchar_t) 0x03A4);
-    else if (Str::eq(macro, I"Upsilon")) PUT((wchar_t) 0x03A5);
-    else if (Str::eq(macro, I"Phi")) PUT((wchar_t) 0x03A6);
-    else if (Str::eq(macro, I"Chi")) PUT((wchar_t) 0x03A7);
-    else if (Str::eq(macro, I"Psi")) PUT((wchar_t) 0x03A8);
-    else if (Str::eq(macro, I"Omega")) PUT((wchar_t) 0x03A9);
-    else if (Str::eq(macro, I"alpha")) PUT((wchar_t) 0x03B1);
-    else if (Str::eq(macro, I"beta")) PUT((wchar_t) 0x03B2);
-    else if (Str::eq(macro, I"gamma")) PUT((wchar_t) 0x03B3);
-    else if (Str::eq(macro, I"delta")) PUT((wchar_t) 0x03B4);
-    else if (Str::eq(macro, I"epsilon")) PUT((wchar_t) 0x03B5);
-    else if (Str::eq(macro, I"zeta")) PUT((wchar_t) 0x03B6);
-    else if (Str::eq(macro, I"eta")) PUT((wchar_t) 0x03B7);
-    else if (Str::eq(macro, I"theta")) PUT((wchar_t) 0x03B8);
-    else if (Str::eq(macro, I"iota")) PUT((wchar_t) 0x03B9);
-    else if (Str::eq(macro, I"kappa")) PUT((wchar_t) 0x03BA);
-    else if (Str::eq(macro, I"lambda")) PUT((wchar_t) 0x03BB);
-    else if (Str::eq(macro, I"mu")) PUT((wchar_t) 0x03BC);
-    else if (Str::eq(macro, I"nu")) PUT((wchar_t) 0x03BD);
-    else if (Str::eq(macro, I"xi")) PUT((wchar_t) 0x03BE);
-    else if (Str::eq(macro, I"omicron")) PUT((wchar_t) 0x03BF);
-    else if (Str::eq(macro, I"pi")) PUT((wchar_t) 0x03C0);
-    else if (Str::eq(macro, I"rho")) PUT((wchar_t) 0x03C1);
-    else if (Str::eq(macro, I"varsigma")) PUT((wchar_t) 0x03C2);
-    else if (Str::eq(macro, I"sigma")) PUT((wchar_t) 0x03C3);
-    else if (Str::eq(macro, I"tau")) PUT((wchar_t) 0x03C4);
-    else if (Str::eq(macro, I"upsilon")) PUT((wchar_t) 0x03C5);
-    else if (Str::eq(macro, I"phi")) PUT((wchar_t) 0x03C6);
-    else if (Str::eq(macro, I"chi")) PUT((wchar_t) 0x03C7);
-    else if (Str::eq(macro, I"psi")) PUT((wchar_t) 0x03C8);
-    else if (Str::eq(macro, I"omega")) PUT((wchar_t) 0x03C9);
-    else if (Str::eq(macro, I"exists")) PUT((wchar_t) 0x2203);
-    else if (Str::eq(macro, I"in")) PUT((wchar_t) 0x2208);
-    else if (Str::eq(macro, I"forall")) PUT((wchar_t) 0x2200);
-    else if (Str::eq(macro, I"cap")) PUT((wchar_t) 0x2229);
-    else if (Str::eq(macro, I"emptyset")) PUT((wchar_t) 0x2205);
-    else if (Str::eq(macro, I"subseteq")) PUT((wchar_t) 0x2286);
-    else if (Str::eq(macro, I"land")) PUT((wchar_t) 0x2227);
-    else if (Str::eq(macro, I"lor")) PUT((wchar_t) 0x2228);
-    else if (Str::eq(macro, I"lnot")) PUT((wchar_t) 0x00AC);
-    else if (Str::eq(macro, I"sum")) PUT((wchar_t) 0x03A3);
-    else if (Str::eq(macro, I"prod")) PUT((wchar_t) 0x03A0);
-    else {
-        if (Str::len(macro) > 0) {
-            int suspect = TRUE;
-            LOOP_THROUGH_TEXT(pos, macro) {
-                wchar_t c = Str::get(pos);
-                if ((c >= 'A') && (c <= 'Z')) continue;
-                if ((c >= 'a') && (c <= 'z')) continue;
-                suspect = FALSE;
-            }
-            if (Str::eq(macro, I"n")) suspect = FALSE;
-            if (Str::eq(macro, I"t")) suspect = FALSE;
-            if (suspect)
-                PRINT("[Passing through unknown TeX macro \\%S:\n  %S\n", macro, text);
-        }
-        WRITE("\\%S", macro);
-    }
-
- -

§18.4.2. For Inform's purposes, we need to deal with just \not\exists and \not\forall. -

- -

Remove the not prefix18.4.2 = -

- -
-    if (Str::get_at(text, i) == '\\') {
-        Str::clear(macro);
-        i++;
-        while ((i < Str::len(text)) && (Characters::isalpha(Str::get_at(text, i))))
-            PUT_TO(macro, Str::get_at(text, i++));
-        if (Str::eq(macro, I"exists")) PUT((wchar_t) 0x2204);
-        else if (Str::eq(macro, I"forall")) { PUT((wchar_t) 0x00AC); PUT((wchar_t) 0x2200); }
-        else {
-            PRINT("Don't know how to apply '\\not' to '\\%S'\n", macro);
-        }
-    } else {
-        PRINT("Don't know how to apply '\\not' here\n");
-    }
-
- +
  • This code is used in §10.


diff --git a/docs/inweb/5-tu.html b/docs/inweb/5-tu.html new file mode 100644 index 0000000..6e465e3 --- /dev/null +++ b/docs/inweb/5-tu.html @@ -0,0 +1,468 @@ + + + + TeX Utilities + + + + + + + + + + + + + + + + +
+ +

A few conveniences for using Inweb with TeX.

+ +
+ +

§1. Post-processing TeX console output. Pattern commands post-processing TeX tend to run TeX-like tools in +"scrollmode", so that any errors whizz by rather than interrupting or halting +the session. Prime among errors is the "overfull hbox error", a defect of TeX +resulting from its inability to adjust letter spacing, so that it requires us +to adjust the copy to fit the margins of the page properly. (In practice we +get this here by having code lines which are too wide to display.) +

+ +

Also, TeX helpfully reports the size and page count of what it produces, and +we're not too proud to scrape that information out of the console file, besides +the error messages (which begin with an exclamation mark in column 1). +

+ +

This structure will store what we find: +

+ +
+typedef struct tex_results {
+    int overfull_hbox_count;
+    int tex_error_count;
+    int page_count;
+    int pdf_size;
+    struct filename *PDF_filename;
+    MEMORY_MANAGEMENT
+} tex_results;
+
+
  • The structure tex_results is private to this section.
+

§2.

+ +
+tex_results *TeXUtilities::new_results(weave_order *wv, filename *CF) {
+    tex_results *res = CREATE(tex_results);
+    res->overfull_hbox_count = 0;
+    res->tex_error_count = 0;
+    res->page_count = 0;
+    res->pdf_size = 0;
+    res->PDF_filename = Filenames::set_extension(CF, I".pdf");
+    return res;
+}
+
+

§3. So, then, here's the function called from Patterns in response to +the special PROCESS command: +

+ +
+void TeXUtilities::post_process_weave(weave_order *wv, filename *CF) {
+    wv->post_processing_results = TeXUtilities::new_results(wv, CF);
+    TextFiles::read(CF, FALSE,
+        "can't open console file", TRUE, TeXUtilities::scan_console_line, NULL,
+        (void *) wv->post_processing_results);
+}
+
+

§4.

+ +
+void TeXUtilities::scan_console_line(text_stream *line, text_file_position *tfp,
+    void *res_V) {
+    tex_results *res = (tex_results *) res_V;
+    match_results mr = Regexp::create_mr();
+    if (Regexp::match(&mr, line,
+        L"Output written %c*? %((%d+) page%c*?(%d+) bytes%).")) {
+        res->page_count = Str::atoi(mr.exp[0], 0);
+        res->pdf_size = Str::atoi(mr.exp[1], 0);
+    }
+    if (Regexp::match(&mr, line, L"%c+verfull \\hbox%c+"))
+        res->overfull_hbox_count++;
+    else if (Str::get_first_char(line) == '!') {
+        res->tex_error_count++;
+    }
+    Regexp::dispose_of(&mr);
+}
+
+

§5. Reporting.

+ +
+void TeXUtilities::report_on_post_processing(weave_order *wv) {
+    tex_results *res = wv->post_processing_results;
+    if (res) {
+        PRINT(": %dpp %dK", res->page_count, res->pdf_size/1024);
+        if (res->overfull_hbox_count > 0)
+            PRINT(", %d overfull hbox(es)", res->overfull_hbox_count);
+        if (res->tex_error_count > 0)
+            PRINT(", %d error(s)", res->tex_error_count);
+    }
+}
+
+

§6. And here are some details to do with the results of post-processing. +

+ +
+int TeXUtilities::substitute_post_processing_data(text_stream *to, weave_order *wv,
+    text_stream *detail) {
+    if (wv) {
+        tex_results *res = wv->post_processing_results;
+        if (res) {
+            if (Str::eq_wide_string(detail, L"PDF Size")) {
+                WRITE_TO(to, "%dKB", res->pdf_size/1024);
+            } else if (Str::eq_wide_string(detail, L"Extent")) {
+                WRITE_TO(to, "%dpp", res->page_count);
+            } else if (Str::eq_wide_string(detail, L"Leafname")) {
+                Str::copy(to, Filenames::get_leafname(res->PDF_filename));
+            } else if (Str::eq_wide_string(detail, L"Errors")) {
+                Str::clear(to);
+                if ((res->overfull_hbox_count > 0) || (res->tex_error_count > 0))
+                    WRITE_TO(to, ": ");
+                if (res->overfull_hbox_count > 0)
+                    WRITE_TO(to, "%d overfull line%s",
+                        res->overfull_hbox_count,
+                        (res->overfull_hbox_count>1)?"s":"");
+                if ((res->overfull_hbox_count > 0) && (res->tex_error_count > 0))
+                    WRITE_TO(to, ", ");
+                if (res->tex_error_count > 0)
+                    WRITE_TO(to, "%d TeX error%s",
+                        res->tex_error_count,
+                        (res->tex_error_count>1)?"s":"");
+            } else return FALSE;
+            return TRUE;
+        }
+    }
+    return FALSE;
+}
+
+

§7. Removing math mode. "Math mode", in TeX jargon, is what happens when a mathematical formula +is written inside dollar signs: in Answer is $x+y^2$, the math mode +content is x+y^2. 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. +

+ +
+void TeXUtilities::remove_math_mode(OUTPUT_STREAM, text_stream *text) {
+    TEMPORARY_TEXT(math_matter);
+    TeXUtilities::remove_math_mode_range(math_matter, text, 0, Str::len(text)-1);
+    WRITE("%S", math_matter);
+    DISCARD_TEXT(math_matter);
+}
+
+void TeXUtilities::remove_math_mode_range(OUTPUT_STREAM, text_stream *text, int from, int to) {
+    for (int i=from; i <= to; i++) {
+        Remove the over construction7.1;
+    }
+    for (int i=from; i <= to; i++) {
+        Remove the rm and it constructions7.2;
+        Remove the sqrt constructions7.3;
+    }
+    int math_mode = FALSE;
+    for (int i=from; i <= to; i++) {
+        switch (Str::get_at(text, i)) {
+            case '$':
+                if (Str::get_at(text, i+1) == '$') i++;
+                math_mode = (math_mode)?FALSE:TRUE; break;
+            case '~': if (math_mode) WRITE(" "); else WRITE("~"); break;
+            case '\\': Do something to strip out a TeX macro7.4; break;
+            default: PUT(Str::get_at(text, i)); break;
+        }
+    }
+}
+
+

§7.1. Here we remove {{top}\over{bottom}}, converting it to ((top) / (bottom)). +

+ +

Remove the over construction7.1 = +

+ +
+    if ((Str::get_at(text, i) == '\\') &&
+        (Str::get_at(text, i+1) == 'o') && (Str::get_at(text, i+2) == 'v') &&
+        (Str::get_at(text, i+3) == 'e') && (Str::get_at(text, i+4) == 'r') &&
+        (Str::get_at(text, i+5) == '{')) {
+        int bl = 1;
+        int j = i-1;
+        for (; j >= from; j--) {
+            wchar_t c = Str::get_at(text, j);
+            if (c == '{') {
+                bl--;
+                if (bl == 0) break;
+            }
+            if (c == '}') bl++;
+        }
+        TeXUtilities::remove_math_mode_range(OUT, text, from, j-1);
+        WRITE("((");
+        TeXUtilities::remove_math_mode_range(OUT, text, j+2, i-2);
+        WRITE(") / (");
+        j=i+6; bl = 1;
+        for (; j <= to; j++) {
+            wchar_t c = Str::get_at(text, j);
+            if (c == '}') {
+                bl--;
+                if (bl == 0) break;
+            }
+            if (c == '{') bl++;
+        }
+        TeXUtilities::remove_math_mode_range(OUT, text, i+6, j-1);
+        WRITE("))");
+        TeXUtilities::remove_math_mode_range(OUT, text, j+2, to);
+        return;
+    }
+
+
  • This code is used in §7.
+

§7.2. Here we remove {\rm text}, converting it to text, and similarly \it. +

+ +

Remove the rm and it constructions7.2 = +

+ +
+    if ((Str::get_at(text, i) == '{') && (Str::get_at(text, i+1) == '\\') &&
+        (((Str::get_at(text, i+2) == 'r') && (Str::get_at(text, i+3) == 'm')) ||
+            ((Str::get_at(text, i+2) == 'i') && (Str::get_at(text, i+3) == 't'))) &&
+        (Str::get_at(text, i+4) == ' ')) {
+        TeXUtilities::remove_math_mode_range(OUT, text, from, i-1);
+        int j=i+5;
+        for (; j <= to; j++)
+            if (Str::get_at(text, j) == '}')
+                break;
+        TeXUtilities::remove_math_mode_range(OUT, text, i+5, j-1);
+        TeXUtilities::remove_math_mode_range(OUT, text, j+1, to);
+        return;
+    }
+
+
  • This code is used in §7.
+

§7.3. Here we remove \sqrt{N}, converting it to sqrt(N). As a special case, +we also look out for {}^3\sqrt{N} for cube root. +

+ +

Remove the sqrt constructions7.3 = +

+ +
+    if ((Str::get_at(text, i) == '\\') &&
+        (Str::get_at(text, i+1) == 's') && (Str::get_at(text, i+2) == 'q') &&
+        (Str::get_at(text, i+3) == 'r') && (Str::get_at(text, i+4) == 't') &&
+        (Str::get_at(text, i+5) == '{')) {
+        if ((Str::get_at(text, i-4) == '{') &&
+            (Str::get_at(text, i-3) == '}') &&
+            (Str::get_at(text, i-2) == '^') &&
+            (Str::get_at(text, i-1) == '3')) {
+            TeXUtilities::remove_math_mode_range(OUT, text, from, i-5);
+            WRITE(" curt(");
+        } else {
+            TeXUtilities::remove_math_mode_range(OUT, text, from, i-1);
+            WRITE(" sqrt(");
+        }
+        int j=i+6, bl = 1;
+        for (; j <= to; j++) {
+            wchar_t c = Str::get_at(text, j);
+            if (c == '}') {
+                bl--;
+                if (bl == 0) break;
+            }
+            if (c == '{') bl++;
+        }
+        TeXUtilities::remove_math_mode_range(OUT, text, i+6, j-1);
+        WRITE(")");
+        TeXUtilities::remove_math_mode_range(OUT, text, j+1, to);
+        return;
+    }
+
+
  • This code is used in §7.
+

§7.4. Do something to strip out a TeX macro7.4 = +

+ +
+    TEMPORARY_TEXT(macro);
+    i++;
+    while ((i < Str::len(text)) && (Characters::isalpha(Str::get_at(text, i))))
+        PUT_TO(macro, Str::get_at(text, i++));
+    if (Str::eq(macro, I"not")) Remove the not prefix7.4.2
+    else Remove a general macro7.4.1;
+    DISCARD_TEXT(macro);
+    i--;
+
+
  • This code is used in §7.
+

§7.4.1. Remove a general macro7.4.1 = +

+ +
+    if (Str::eq(macro, I"leq")) WRITE("<=");
+    else if (Str::eq(macro, I"geq")) WRITE(">=");
+    else if (Str::eq(macro, I"sim")) WRITE("~");
+    else if (Str::eq(macro, I"hbox")) WRITE("");
+    else if (Str::eq(macro, I"left")) WRITE("");
+    else if (Str::eq(macro, I"right")) WRITE("");
+    else if (Str::eq(macro, I"Rightarrow")) WRITE("=>");
+    else if (Str::eq(macro, I"Leftrightarrow")) WRITE("<=>");
+    else if (Str::eq(macro, I"to")) WRITE("-->");
+    else if (Str::eq(macro, I"rightarrow")) WRITE("-->");
+    else if (Str::eq(macro, I"longrightarrow")) WRITE("-->");
+    else if (Str::eq(macro, I"leftarrow")) WRITE("<--");
+    else if (Str::eq(macro, I"longleftarrow")) WRITE("<--");
+    else if (Str::eq(macro, I"lbrace")) WRITE("{");
+    else if (Str::eq(macro, I"mid")) WRITE("|");
+    else if (Str::eq(macro, I"rbrace")) WRITE("}");
+    else if (Str::eq(macro, I"cdot")) WRITE(".");
+    else if (Str::eq(macro, I"cdots")) WRITE("...");
+    else if (Str::eq(macro, I"dots")) WRITE("...");
+    else if (Str::eq(macro, I"times")) WRITE("*");
+    else if (Str::eq(macro, I"quad")) WRITE("  ");
+    else if (Str::eq(macro, I"qquad")) WRITE("    ");
+    else if (Str::eq(macro, I"TeX")) WRITE("TeX");
+    else if (Str::eq(macro, I"neq")) WRITE("!=");
+    else if (Str::eq(macro, I"noteq")) WRITE("!=");
+    else if (Str::eq(macro, I"ell")) WRITE("l");
+    else if (Str::eq(macro, I"log")) WRITE("log");
+    else if (Str::eq(macro, I"exp")) WRITE("exp");
+    else if (Str::eq(macro, I"sin")) WRITE("sin");
+    else if (Str::eq(macro, I"cos")) WRITE("cos");
+    else if (Str::eq(macro, I"tan")) WRITE("tan");
+    else if (Str::eq(macro, I"top")) WRITE("T");
+    else if (Str::eq(macro, I"Alpha")) PUT((wchar_t) 0x0391);
+    else if (Str::eq(macro, I"Beta")) PUT((wchar_t) 0x0392);
+    else if (Str::eq(macro, I"Gamma")) PUT((wchar_t) 0x0393);
+    else if (Str::eq(macro, I"Delta")) PUT((wchar_t) 0x0394);
+    else if (Str::eq(macro, I"Epsilon")) PUT((wchar_t) 0x0395);
+    else if (Str::eq(macro, I"Zeta")) PUT((wchar_t) 0x0396);
+    else if (Str::eq(macro, I"Eta")) PUT((wchar_t) 0x0397);
+    else if (Str::eq(macro, I"Theta")) PUT((wchar_t) 0x0398);
+    else if (Str::eq(macro, I"Iota")) PUT((wchar_t) 0x0399);
+    else if (Str::eq(macro, I"Kappa")) PUT((wchar_t) 0x039A);
+    else if (Str::eq(macro, I"Lambda")) PUT((wchar_t) 0x039B);
+    else if (Str::eq(macro, I"Mu")) PUT((wchar_t) 0x039C);
+    else if (Str::eq(macro, I"Nu")) PUT((wchar_t) 0x039D);
+    else if (Str::eq(macro, I"Xi")) PUT((wchar_t) 0x039E);
+    else if (Str::eq(macro, I"Omicron")) PUT((wchar_t) 0x039F);
+    else if (Str::eq(macro, I"Pi")) PUT((wchar_t) 0x03A0);
+    else if (Str::eq(macro, I"Rho")) PUT((wchar_t) 0x03A1);
+    else if (Str::eq(macro, I"Varsigma")) PUT((wchar_t) 0x03A2);
+    else if (Str::eq(macro, I"Sigma")) PUT((wchar_t) 0x03A3);
+    else if (Str::eq(macro, I"Tau")) PUT((wchar_t) 0x03A4);
+    else if (Str::eq(macro, I"Upsilon")) PUT((wchar_t) 0x03A5);
+    else if (Str::eq(macro, I"Phi")) PUT((wchar_t) 0x03A6);
+    else if (Str::eq(macro, I"Chi")) PUT((wchar_t) 0x03A7);
+    else if (Str::eq(macro, I"Psi")) PUT((wchar_t) 0x03A8);
+    else if (Str::eq(macro, I"Omega")) PUT((wchar_t) 0x03A9);
+    else if (Str::eq(macro, I"alpha")) PUT((wchar_t) 0x03B1);
+    else if (Str::eq(macro, I"beta")) PUT((wchar_t) 0x03B2);
+    else if (Str::eq(macro, I"gamma")) PUT((wchar_t) 0x03B3);
+    else if (Str::eq(macro, I"delta")) PUT((wchar_t) 0x03B4);
+    else if (Str::eq(macro, I"epsilon")) PUT((wchar_t) 0x03B5);
+    else if (Str::eq(macro, I"zeta")) PUT((wchar_t) 0x03B6);
+    else if (Str::eq(macro, I"eta")) PUT((wchar_t) 0x03B7);
+    else if (Str::eq(macro, I"theta")) PUT((wchar_t) 0x03B8);
+    else if (Str::eq(macro, I"iota")) PUT((wchar_t) 0x03B9);
+    else if (Str::eq(macro, I"kappa")) PUT((wchar_t) 0x03BA);
+    else if (Str::eq(macro, I"lambda")) PUT((wchar_t) 0x03BB);
+    else if (Str::eq(macro, I"mu")) PUT((wchar_t) 0x03BC);
+    else if (Str::eq(macro, I"nu")) PUT((wchar_t) 0x03BD);
+    else if (Str::eq(macro, I"xi")) PUT((wchar_t) 0x03BE);
+    else if (Str::eq(macro, I"omicron")) PUT((wchar_t) 0x03BF);
+    else if (Str::eq(macro, I"pi")) PUT((wchar_t) 0x03C0);
+    else if (Str::eq(macro, I"rho")) PUT((wchar_t) 0x03C1);
+    else if (Str::eq(macro, I"varsigma")) PUT((wchar_t) 0x03C2);
+    else if (Str::eq(macro, I"sigma")) PUT((wchar_t) 0x03C3);
+    else if (Str::eq(macro, I"tau")) PUT((wchar_t) 0x03C4);
+    else if (Str::eq(macro, I"upsilon")) PUT((wchar_t) 0x03C5);
+    else if (Str::eq(macro, I"phi")) PUT((wchar_t) 0x03C6);
+    else if (Str::eq(macro, I"chi")) PUT((wchar_t) 0x03C7);
+    else if (Str::eq(macro, I"psi")) PUT((wchar_t) 0x03C8);
+    else if (Str::eq(macro, I"omega")) PUT((wchar_t) 0x03C9);
+    else if (Str::eq(macro, I"exists")) PUT((wchar_t) 0x2203);
+    else if (Str::eq(macro, I"in")) PUT((wchar_t) 0x2208);
+    else if (Str::eq(macro, I"forall")) PUT((wchar_t) 0x2200);
+    else if (Str::eq(macro, I"cap")) PUT((wchar_t) 0x2229);
+    else if (Str::eq(macro, I"emptyset")) PUT((wchar_t) 0x2205);
+    else if (Str::eq(macro, I"subseteq")) PUT((wchar_t) 0x2286);
+    else if (Str::eq(macro, I"land")) PUT((wchar_t) 0x2227);
+    else if (Str::eq(macro, I"lor")) PUT((wchar_t) 0x2228);
+    else if (Str::eq(macro, I"lnot")) PUT((wchar_t) 0x00AC);
+    else if (Str::eq(macro, I"sum")) PUT((wchar_t) 0x03A3);
+    else if (Str::eq(macro, I"prod")) PUT((wchar_t) 0x03A0);
+    else {
+        if (Str::len(macro) > 0) {
+            int suspect = TRUE;
+            LOOP_THROUGH_TEXT(pos, macro) {
+                wchar_t c = Str::get(pos);
+                if ((c >= 'A') && (c <= 'Z')) continue;
+                if ((c >= 'a') && (c <= 'z')) continue;
+                suspect = FALSE;
+            }
+            if (Str::eq(macro, I"n")) suspect = FALSE;
+            if (Str::eq(macro, I"t")) suspect = FALSE;
+            if (suspect)
+                PRINT("[Passing through unknown TeX macro \\%S:\n  %S\n", macro, text);
+        }
+        WRITE("\\%S", macro);
+    }
+
+
  • This code is used in §7.4.
+

§7.4.2. For Inform's purposes, we need to deal with just \not\exists and \not\forall. +

+ +

Remove the not prefix7.4.2 = +

+ +
+    if (Str::get_at(text, i) == '\\') {
+        Str::clear(macro);
+        i++;
+        while ((i < Str::len(text)) && (Characters::isalpha(Str::get_at(text, i))))
+            PUT_TO(macro, Str::get_at(text, i++));
+        if (Str::eq(macro, I"exists")) PUT((wchar_t) 0x2204);
+        else if (Str::eq(macro, I"forall")) { PUT((wchar_t) 0x00AC); PUT((wchar_t) 0x2200); }
+        else {
+            PRINT("Don't know how to apply '\\not' to '\\%S'\n", macro);
+        }
+    } else {
+        PRINT("Don't know how to apply '\\not' here\n");
+    }
+
+
  • This code is used in §7.4.
+
+
+ + +
+ + + diff --git a/docs/inweb/5-wp.html b/docs/inweb/5-wp.html index 7c7c42a..39f2134 100644 --- a/docs/inweb/5-wp.html +++ b/docs/inweb/5-wp.html @@ -273,7 +273,7 @@ inclusion of that, and also copy the file into the weave destination. }
-
+
diff --git a/docs/inweb/index.html b/docs/inweb/index.html index 70817fd..84f72af 100644 --- a/docs/inweb/index.html +++ b/docs/inweb/index.html @@ -238,8 +238,8 @@ Mainly for HTML, to add the necessary JavaScript for unusual requirements such as equations or footnotes.

  • -

    Running Through TeX - - To post-process a weave by running it through TeX, or one of its variant typesetting programs.

    +

    TeX Utilities - + A few conveniences for using Inweb with TeX.

  • diff --git a/inweb.mk b/inweb.mk index c41e6b9..ca518d8 100644 --- a/inweb.mk +++ b/inweb.mk @@ -115,6 +115,7 @@ pages: $(INWEB) -colony $(COLONY) -member goldbach -weave $(INWEB) -colony $(COLONY) inweb/Examples/goldbach all -weave-as Plain -weave-to inweb/docs/goldbach/goldbach.txt $(INWEB) -colony $(COLONY) inweb/Examples/goldbach all -weave-as TestingInweb -weave-to inweb/docs/goldbach/goldbach-test.txt + $(INWEB) -colony $(COLONY) inweb/Examples/goldbach all -weave-as PDFTeX -weave-to inweb/docs/goldbach/goldbach.pdf $(INWEB) -colony $(COLONY) inweb/Examples/goldbach all -weave-as TeX -weave-to inweb/docs/goldbach/goldbach.tex $(INWEB) -colony $(COLONY) -member twinprimes -weave $(INWEB) -colony $(COLONY) -member eastertide -weave diff --git a/scripts/makescript.txt b/scripts/makescript.txt index 73738d4..a287f17 100644 --- a/scripts/makescript.txt +++ b/scripts/makescript.txt @@ -144,6 +144,7 @@ pages: $(INWEB) -colony $(COLONY) -member goldbach -weave $(INWEB) -colony $(COLONY) inweb/Examples/goldbach all -weave-as Plain -weave-to inweb/docs/goldbach/goldbach.txt $(INWEB) -colony $(COLONY) inweb/Examples/goldbach all -weave-as TestingInweb -weave-to inweb/docs/goldbach/goldbach-test.txt + $(INWEB) -colony $(COLONY) inweb/Examples/goldbach all -weave-as PDFTeX -weave-to inweb/docs/goldbach/goldbach.pdf $(INWEB) -colony $(COLONY) inweb/Examples/goldbach all -weave-as TeX -weave-to inweb/docs/goldbach/goldbach.tex $(INWEB) -colony $(COLONY) -member twinprimes -weave $(INWEB) -colony $(COLONY) -member eastertide -weave