From 0c693b23c4ff8f98a151884a24f150a5ff746dd4 Mon Sep 17 00:00:00 2001
From: Ralph Amissah <ralph.amissah@gmail.com>
Date: Fri, 16 Oct 2020 19:16:18 -0400
Subject: org mode, unique code-block names & adjust headers

-  avoid org-mode undefined behavior, provide
   unique code-block names
---
 .gitignore                                     |    3 +-
 COPYRIGHT                                      |  104 +
 README                                         |  325 --
 README.md                                      |  326 ++
 makefile                                       |    6 +-
 org/compile_time_info.org                      |    8 +-
 org/default_misc.org                           |    1 +
 org/default_paths.org                          |   41 +-
 org/default_regex.org                          |  116 +-
 org/default_shared.org                         |    1 +
 org/imports.org                                |    1 +
 org/in_source_files.org                        |   11 +-
 org/meta_conf_make_meta.org                    |   33 +-
 org/meta_debugs.org                            |    1 +
 org/metaverse.org                              |  497 ++-
 org/out_cgi_search_sqlite.org                  |   53 +-
 org/out_harvest_metadata.org                   |   11 +-
 org/out_latex.org                              |  238 +-
 org/out_metadata.org                           |    8 +-
 org/out_odt.org                                |  177 +-
 org/out_sqlite.org                             |  141 +-
 org/out_src_pod.org                            |    8 +-
 org/out_xmls.org                               |  217 +-
 org/out_xmls_css.org                           |  141 +-
 org/out_zip.org                                |    1 +
 org/output_hub.org                             |   39 +-
 org/output_show.org                            |    1 +
 org/spine.org                                  |   83 +-
 org/spine_build_scaffold.org                   |  242 +-
 org/spine_doc.org                              | 4548 ------------------------
 org/spine_info.org                             |    5 +-
 org/util_cgi_d_sqlite_search.org               |   60 +-
 org/util_cgi_rb_fcgi_sqlite_search.org         |    1 +
 org/util_spine_markup_conversion_from_sisu.org |   11 +-
 org/util_spine_syntax_highlighting_emacs.org   |    1 +
 org/util_spine_syntax_highlighting_vim.org     |    1 +
 src/doc_reform/io_out/epub3.d                  |    4 +-
 src/doc_reform/io_out/html.d                   |    2 +-
 src/doc_reform/io_out/odt.d                    |    4 +-
 src/doc_reform/io_out/source_pod.d             |    2 +-
 src/doc_reform/meta/conf_make_meta_yaml.d      |    2 +-
 src/doc_reform/meta/metadoc_from_src.d         |    2 +-
 42 files changed, 1855 insertions(+), 5622 deletions(-)
 delete mode 100644 README
 create mode 100644 README.md
 delete mode 100644 org/spine_doc.org

diff --git a/.gitignore b/.gitignore
index f9f3687..2dec148 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,8 +2,9 @@
 #./.dub/**
 *
 !.gitignore
+!README.md
 !COPYRIGHT
-!README
+!CHANGELOG
 !makefile
 !version.txt
 !dub.json
diff --git a/COPYRIGHT b/COPYRIGHT
index 05e171f..b3ef5a8 100644
--- a/COPYRIGHT
+++ b/COPYRIGHT
@@ -43,6 +43,110 @@
   - Hompages:
     [http://www.sisudoc.org]
 
+- Dependencies [check dub.json or dub.sdl]
+
+  - Name: d2sqlite3
+    - Description:
+      This is a small wrapper around SQLite for the D programming language.
+
+    - Author:
+      [Nicolas Sicard]
+      [https://github.com/dlang-community/d2sqlite3/graphs/contributors]
+
+    - Copyright: (C) 2011-2018, Nicolas Sicard
+
+    - code:
+      - License: BSL-1.0
+        Boost Software License 1.0
+        [http://www.boost.org/LICENSE_1_0.txt]
+
+    - Hompages:
+      [https://github.com/dlang-community/d2sqlite3]
+      [https://code.dlang.org/packages/d2sqlite3]
+
+  - Name: dyaml
+    - Description:
+      D:YAML is an open source YAML parser and emitter library for the D programming language.
+
+    - Author:
+      [Ferdinand Majerech]
+
+    - Copyright: (C) 2011-2018, Ferdinand Majerech
+
+    - code:
+      - License: BSL-1.0
+        Boost Software License 1.0
+        [http://www.boost.org/LICENSE_1_0.txt]
+
+    - Hompages:
+      [https://github.com/dlang-community/D-YAML]
+      [https://code.dlang.org/packages/dyaml]
+
+  - Name: imageformats
+    - Description:
+
+    - Author:
+      [Tero Hänninen]
+
+    - Copyright: (C) Tero Hänninen
+
+    - code:
+      - License: BSL-1.0
+        Boost Software License 1.0
+        [http://www.boost.org/LICENSE_1_0.txt]
+
+    - Hompages:
+      [https://github.com/lgvz/imageformats]
+      [https://code.dlang.org/packages/imageformats]
+
+  - Name: tinyendian (dyaml dependency)
+    - Description:
+      TinyEndian is a minimal endianness library for the D programming language.
+
+    - Author:
+      [Ferdinand Majerech]
+
+    - Copyright: (C) 2014, Ferdinand Majerech
+
+    - code:
+      - License: BSL-1.0
+        Boost Software License 1.0
+        [http://www.boost.org/LICENSE_1_0.txt]
+
+    - Hompages:
+      [https://github.com/dlang-community/tinyendian]
+      [http://code.dlang.org/packages/tinyendian]
+
+- Name: cgi.d
+  - Description:
+
+  - Author:
+    [Adam D. Ruppe]
+
+  - Copyright: (C) Adam D. Ruppe 2008 - 2020
+
+  - code: cgi.d (copy in ./misc/ext_lib/src/arsd/)
+    aria2c https://raw.githubusercontent.com/adamdruppe/arsd/master/cgi.d
+
+    - License: BSL-1.0
+      Boost Software License 1.0
+      [http://www.boost.org/LICENSE_1_0.txt]
+      (Check the bottom of the file for details)
+
+  - Hompages:
+    [https://github.com/adamdruppe/arsd]
+
+
+- Name: dub2nix
+  - Description:
+
+  - Author:
+    []
+
+  - Copyright: (C)
+
+  - code: mkDub.nix (modified as needed)
+    - License:
 
 - Spine, Doc Reform (SiSU) markup samples
   Individual document content Copyright (Author) [as stated in document header]
diff --git a/README b/README
deleted file mode 100644
index 203ee70..0000000
--- a/README
+++ /dev/null
@@ -1,325 +0,0 @@
-project_name:  Spine, Doc Reform
-  description: [
-      "documents, structuring, processing, publishing",
-      search,
-      object numbering,
-      static content generator,
-      sisu markup
-    ]
-
-    author:
-      name:    Ralph Amissah
-      email:   ralph.amissah@gmail.com
-
-    copyright: "(C) 2015 - 2020 Ralph Amissah, All Rights Reserved."
-
-    license:   "AGPL 3 or later"
-
-    hompage: [
-        "http://www.doc_reform.org",
-        "http://www.sisudoc.org"
-      ]
-
-# Installation, Compilation
-
-SiSU spine is written in the programming language D for which there are 3 compilers:
-
-- dmd
-- ldc
-- gdc
-
-D projects tend to use dub as project manager
-https://code.dlang.org/packages/dub
-https://code.dlang.org/packages/dub
-https://github.com/dlang/dub/blob/master/source/dub/commandline.d
-
-  dub --compiler=ldc2 -color --config=ldc -b release
-
-  dub --compiler=dmd -color --config=dmd
-
-  dub --compiler=gdc-10 -color --config=gdc -b release
-
-  make ldc
-
-  make dmd
-
-there has been some coalescence around the Meson build system
-https://mesonbuild.com/
-
-  meson
-
-  ninja -C build
-
-  meson setup --wipe build && ninja -v -C build
-
-  make meson
-
-dub --force --compiler=ldc2 && sudo cp -v cgi-bin/spine-search /usr/lib/cgi-bin/.
-
-# Configuration
-
-Configuration files are yaml files
-
-The following paths are searched:
-
-  ~/.dr/config_local_site
-  ~/path_to_pod_root/.dr/config_local_site
-
-e.g. processing
-
-  ~spineMarkupSamples/pod/*
-
-will search:
-
-  ~spineMarkupSamples/pod/.dr/config_local_site
-
-  ~/.dr/config_local_site
-
-to specify an alternative configuration file to use on the command line (in this
-example named "my_config"):
-
-  spine -v --html --config=~spineMarkupSamples/pod/.dr/my_config
-
-here is a sample configuration file:
-
-flag:
-  act0:                        "--html"
-  act1:                        "--html --epub"
-output:
-  path:                        "/var/www/html"
-default:
-  language:                    "en"
-  papersize:                   "a4"
-  text_wrap:                   "80"
-  digest:                      "sha256"
-webserv:
-  http:                        "http"
-  domain:                      "localhost"
-  data_http:                   "http"
-  data_domain:                 "localhost"
-  data_root_url:               "http://localhost"
-  data_root_path:              "/var/www/html"
-  data_root_part:              ""
-  images_root_part:            "image"
-  cgi_title:                   "≅ SiSU Spine search"
-  cgi_http:                    "http"
-  cgi_domain:                  "localhost"
-  cgi_bin_url:                 "http://localhost/cgi-bin"
-  cgi_bin_part:                "cgi-bin"
-  cgi_bin_path:                "/usr/lib/cgi-bin"
-  cgi_search_script:           "spine-search"
-  cgi_search_script_raw_fn_d:  "spine_search.d"
-  cgi_port:                    ""
-  cgi_user:                    ""
-  cgi_action:                  "http://localhost/cgi-bin/spine-search"
-  db_sqlite:                   "spine.search.db"
-  db_pg_table:                 ""
-  db_pg_user:                  ""
-
-# Commands
-
-for a list of commands from the program type:
-
-  spine -h
-
-at the time of writing this provides the following output:
-
-                  --abstraction document abstraction
-                       --assert set optional assertions on
-      --cgi-search-form-codegen generates (pre-compiled) d code for search of specified db
-   --cgi-sqlite-search-filename =[filename]
-                  --concordance file for document
-                       --config =/path/to/config/file/including/filename
-                         --dark alternative dark theme
-                        --debug debug
-                       --digest hash digest for each object
-                         --epub process epub output
-                      --harvest extract info on authors & topics from document header metadata
-              --harvest-authors extract info on authors from document header metadata
-               --harvest-topics extract info on topics from document header metadata
-                     --hide-ocn object cite numbers
-                         --html process html output
-            --html-link-harvest place links back to harvest in segmented html
-             --html-link-search html embedded search submission
-                     --html-seg process html output
-                  --html-scroll process html output
-                         --lang =[lang code e.g. =en or =en,es]
-                        --latex output for pdfs
-            --latex-color-links mono or color links for pdfs
-                        --light default light theme
-                     --manifest process manifest output
-                      --ocn-off object cite numbers
-                          --odf open document format text (--odt)
-                          --odt open document format text
-                       --output =/path/to/output/dir specify where to place output
-                     --parallel parallelisation
-        --parallel-subprocesses nested parallelisation
-                          --pdf latex output for pdfs
-              --pdf-color-links mono or color links for pdfs
-                          --pod spine (doc reform) pod source content bundled
--q                      --quiet output to terminal
-           --section-backmatter document backmatter (default)
-               --section-biblio document biblio (default)
-                --section-blurb document blurb (default)
-                 --section-body document body (default)
-            --section-bookindex document bookindex (default)
-             --section-endnotes document endnotes (default)
-             --section-glossary document glossary (default)
-                  --section-toc table of contents (default)
-                       --serial serial processing
-                  --skip-output skip output
-                  --show-config show config
-                    --show-make show make
-                --show-metadata show metadata
-                 --show-summary show summary
-                       --source document markup source
-              --sqlite-discrete process discrete sqlite output
-             --sqlite-db-create create db, create tables
-               --sqlite-db-drop drop tables & db
-           --sqlite-db-recreate create db, create tables
-                --sqlite-delete sqlite output
-              --sqlite-db-filename =[filename].sql.db
-                --sqlite-insert sqlite output
-                --sqlite-update sqlite output
-                         --text text output
-                   --theme-dark alternative dark theme
-                  --theme-light default light theme
-                          --txt text output
--v                    --verbose output to terminal
-                 --very-verbose output to terminal
-                       --workon (reserved for some matters under development & testing)
-                        --xhtml xhtml output
--h                       --help This help information.
-
-# Examples
-
-if configuartion has been set specify just
-- the desired output and
-- the markup document/pod(s) to process
-
-  spine -v --html ~spineMarkupSamples/markup/pod/sisu-manual
-
-if configuartion has not been set or to overide the set configration specify
-- the output path as well as
-- the desired output and
-- the markup document/pod(s) to process
-
-note: ~webDocRoot should be the path to web doc root, provide a suitable output path.
-
-  spine -v --html --html-link-search --html-link-harvest  --output=`echo ~webDocRoot` ~spineMarkupSamples/pod/*
-
-  spine -v --html --html-link-search --html-link-harvest --epub --output=`echo ~webDocRoot` ~spineMarkupSamples/pod/*
-
-  spine -v --html --epub --latex --odt --harvest --output=`echo ~webDocRoot` ~spineMarkupSamples/pod/*
-
-## harvest
-
-if you have a document collection with documents that have metadata headers a
-summary of the collection can be made using the harvest command
-
-  spine -v --harvest --output=`echo ~webDocRoot` ~spineMarkupSamples/pod/*
-
-  spine -v --harvest ~spineMarkupSamples/pod/*
-
-  spine -v --html --html-link-search --html-link-harvest --harvest --output=`echo ~webDocRoot` ~spineMarkupSamples/pod/*
-
-  spine -v --html --html-link-search --html-link-harvest --harvest ~spineMarkupSamples/pod/*
-
-## sqlite
-
-### create db
-
-if there is no sqlite db you first need to create one, to do so
-- the name of the db and
-- the root path for document output
-must be specified:
-
-  spine -v \
-    --sqlite-db-create --sqlite-db-filename="spine.search.db" \
-    --output=/var/www/html \
-    ~spineMarkupSamples/pod/*
-
-  spine -v --sqlite-db-create --sqlite-db-filename="spine.search.db" --output=`echo ~webDocRoot`
-
-if you have a configration file providing this information that is to be used
-for a document collection you can point to the document collection:
-
-  spine -v --sqlite-db-create ~spineMarkupSamples/pod
-
-### populate db
-
-must specify:
-- the name of the db and
-- the root path for document output
-
-  spine -v --sqlite-update \
-    --sqlite-db-filename="spine.search.db" \
-    --output=/var/www/html \
-    ~spineMarkupSamples/pod/*
-
-  spine -v --sqlite-update --sqlite-db-filename="spine.search.db" --output=`echo ~webDocRoot` ~spineMarkupSamples/pod/*
-
-if you have a configration file providing this information that is to be used
-for a document collection you can point to the document collection:
-
-  spine -v --sqlite-update ~spineMarkupSamples/pod/*
-
-### generate a cgi search form in d
-
-  spine -v --cgi-search-form-codegen \
-    --output=/var/www/html \
-    ~spineMarkupSamples/pod
-
-  spine -v --cgi-search-form-codegen --config=~spineMarkupSamples/pod
-
-  spine -v --cgi-search-form-codegen --config=~spineMarkupSamples/pod/.dr/config_local_site
-
-  spine --cgi-search-form-codegen --output=`echo ~webDocRoot` ~spineMarkupSamples/pod
-
-  spine --cgi-search-form-codegen --cgi-sqlite-search-filename="spine_search" --output=`echo ~webDocRoot`
-
-  spine -v --cgi-search-form-codegen \
-    --sqlite-db-filename="spine.search.db" \
-    --cgi-sqlite-search-filename="spine-search" \
-    --output=/var/www/html \
-    ~spineMarkupSamples/pod
-
-#### compile the cgi search form
-
-  cd /var/www/html/cgi # /var/www/html (default document root)
-
-  cd ~webDocRoot/cgi
-
-the directory ~webDocRoot/cgi/src should contain two files
-- spine_search.d (or whatever you named it)
-- cgi.d (by Adam Rupee)
-
-  dub --force --compiler=ldc2 && sudo cp -v cgi-bin/spine-search /usr/lib/cgi-bin/.
-
-should compile spine-search in ~webDocRoot/cgi/cgi-bin and copy it to the
-cgi-bin directory
-
-  spine -v  --sqlite-db-create --sqlite-db-filename="spine.search.db" --cgi-sqlite-search-filename="spine-search" --output=`echo ~webDocRoot`
-
-  spine -v  --sqlite-db-create  ~spineMarkupSamples/pod
-
-  spine -v --html --html-link-search --cgi-sqlite-search-filename="spine-search" --output=`echo ~webDocRoot` ~spineMarkupSamples/pod/*
-
-  spine -v --html --html-link-search --output=`echo ~webDocRoot` ~spineMarkupSamples/pod/*
-
-  spine -v --html --html-link-search --cgi-sqlite-search-filename="spine-search" --html-link-harvest --harvest --output=`echo ~webDocRoot` ~spineMarkupSamples/pod/*
-
-### create db & search form
-
-  spine -v \
-    --sqlite-db-create --sqlite-db-filename="spine.search.db" \
-    --cgi-search-form-codegen --cgi-sqlite-search-filename="spine-search" \
-    --output=/var/www/html \
-    ~spineMarkupSamples/pod/*
-
-### html with links to search form
-
-  spine -v --html \
-    --html-link-search \
-    --output=`echo ~webDocRoot` \
-    ~spineMarkupSamples/pod/*
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..ac35e9f
--- /dev/null
+++ b/README.md
@@ -0,0 +1,326 @@
+project_name:  Spine, Doc Reform
+
+  description: [
+      "documents, structuring, processing, publishing",
+      search,
+      object numbering,
+      static content generator,
+      sisu markup
+    ]
+
+    author:
+      name:    Ralph Amissah
+      email:   ralph.amissah@gmail.com
+
+    copyright: "(C) 2015 - 2020 Ralph Amissah, All Rights Reserved."
+
+    license:   "AGPL 3 or later"
+
+    hompage: [
+        "http://www.doc_reform.org",
+        "http://www.sisudoc.org"
+      ]
+
+# Installation, Compilation
+
+SiSU spine is written in the programming language D for which there are 3 compilers:
+
+- dmd
+- ldc
+- gdc
+
+D projects tend to use dub as project manager
+https://code.dlang.org/packages/dub
+https://code.dlang.org/packages/dub
+https://github.com/dlang/dub/blob/master/source/dub/commandline.d
+
+  dub --compiler=ldc2 -color --config=ldc -b release
+
+  dub --compiler=dmd -color --config=dmd
+
+  dub --compiler=gdc-10 -color --config=gdc -b release
+
+  make ldc
+
+  make dmd
+
+there has been some coalescence around the Meson build system
+https://mesonbuild.com/
+
+  meson
+
+  ninja -C build
+
+  meson setup --wipe build && ninja -v -C build
+
+  make meson
+
+dub --force --compiler=ldc2 && sudo cp -v cgi-bin/spine-search /usr/lib/cgi-bin/.
+
+# Configuration
+
+Configuration files are yaml files
+
+The following paths are searched:
+
+  ~/.dr/config_local_site
+  ~/path_to_pod_root/.dr/config_local_site
+
+e.g. processing
+
+  ~spineMarkupSamples/pod/*
+
+will search:
+
+  ~spineMarkupSamples/pod/.dr/config_local_site
+
+  ~/.dr/config_local_site
+
+to specify an alternative configuration file to use on the command line (in this
+example named "my_config"):
+
+  spine -v --html --config=~spineMarkupSamples/pod/.dr/my_config
+
+here is a sample configuration file:
+
+flag:
+  act0:                        "--html"
+  act1:                        "--html --epub"
+output:
+  path:                        "/var/www/html"
+default:
+  language:                    "en"
+  papersize:                   "a4"
+  text_wrap:                   "80"
+  digest:                      "sha256"
+webserv:
+  http:                        "http"
+  domain:                      "localhost"
+  data_http:                   "http"
+  data_domain:                 "localhost"
+  data_root_url:               "http://localhost"
+  data_root_path:              "/var/www/html"
+  data_root_part:              ""
+  images_root_part:            "image"
+  cgi_title:                   "≅ SiSU Spine search"
+  cgi_http:                    "http"
+  cgi_domain:                  "localhost"
+  cgi_bin_url:                 "http://localhost/cgi-bin"
+  cgi_bin_part:                "cgi-bin"
+  cgi_bin_path:                "/usr/lib/cgi-bin"
+  cgi_search_script:           "spine-search"
+  cgi_search_script_raw_fn_d:  "spine_search.d"
+  cgi_port:                    ""
+  cgi_user:                    ""
+  cgi_action:                  "http://localhost/cgi-bin/spine-search"
+  db_sqlite:                   "spine.search.db"
+  db_pg_table:                 ""
+  db_pg_user:                  ""
+
+# Commands
+
+for a list of commands from the program type:
+
+  spine -h
+
+at the time of writing this provides the following output:
+
+                  --abstraction document abstraction
+                       --assert set optional assertions on
+      --cgi-search-form-codegen generates (pre-compiled) d code for search of specified db
+   --cgi-sqlite-search-filename =[filename]
+                  --concordance file for document
+                       --config =/path/to/config/file/including/filename
+                         --dark alternative dark theme
+                        --debug debug
+                       --digest hash digest for each object
+                         --epub process epub output
+                      --harvest extract info on authors & topics from document header metadata
+              --harvest-authors extract info on authors from document header metadata
+               --harvest-topics extract info on topics from document header metadata
+                     --hide-ocn object cite numbers
+                         --html process html output
+            --html-link-harvest place links back to harvest in segmented html
+             --html-link-search html embedded search submission
+                     --html-seg process html output
+                  --html-scroll process html output
+                         --lang =[lang code e.g. =en or =en,es]
+                        --latex output for pdfs
+            --latex-color-links mono or color links for pdfs
+                        --light default light theme
+                     --manifest process manifest output
+                      --ocn-off object cite numbers
+                          --odf open document format text (--odt)
+                          --odt open document format text
+                       --output =/path/to/output/dir specify where to place output
+                     --parallel parallelisation
+        --parallel-subprocesses nested parallelisation
+                          --pdf latex output for pdfs
+              --pdf-color-links mono or color links for pdfs
+                          --pod spine (doc reform) pod source content bundled
+-q                      --quiet output to terminal
+           --section-backmatter document backmatter (default)
+               --section-biblio document biblio (default)
+                --section-blurb document blurb (default)
+                 --section-body document body (default)
+            --section-bookindex document bookindex (default)
+             --section-endnotes document endnotes (default)
+             --section-glossary document glossary (default)
+                  --section-toc table of contents (default)
+                       --serial serial processing
+                  --skip-output skip output
+                  --show-config show config
+                    --show-make show make
+                --show-metadata show metadata
+                 --show-summary show summary
+                       --source document markup source
+              --sqlite-discrete process discrete sqlite output
+             --sqlite-db-create create db, create tables
+               --sqlite-db-drop drop tables & db
+           --sqlite-db-recreate create db, create tables
+                --sqlite-delete sqlite output
+              --sqlite-db-filename =[filename].sql.db
+                --sqlite-insert sqlite output
+                --sqlite-update sqlite output
+                         --text text output
+                   --theme-dark alternative dark theme
+                  --theme-light default light theme
+                          --txt text output
+-v                    --verbose output to terminal
+                 --very-verbose output to terminal
+                       --workon (reserved for some matters under development & testing)
+                        --xhtml xhtml output
+-h                       --help This help information.
+
+# Examples
+
+if configuartion has been set specify just
+- the desired output and
+- the markup document/pod(s) to process
+
+  spine -v --html ~spineMarkupSamples/markup/pod/sisu-manual
+
+if configuartion has not been set or to overide the set configration specify
+- the output path as well as
+- the desired output and
+- the markup document/pod(s) to process
+
+note: ~webDocRoot should be the path to web doc root, provide a suitable output path.
+
+  spine -v --html --html-link-search --html-link-harvest  --output=`echo ~webDocRoot` ~spineMarkupSamples/pod/*
+
+  spine -v --html --html-link-search --html-link-harvest --epub --output=`echo ~webDocRoot` ~spineMarkupSamples/pod/*
+
+  spine -v --html --epub --latex --odt --harvest --output=`echo ~webDocRoot` ~spineMarkupSamples/pod/*
+
+## harvest
+
+if you have a document collection with documents that have metadata headers a
+summary of the collection can be made using the harvest command
+
+  spine -v --harvest --output=`echo ~webDocRoot` ~spineMarkupSamples/pod/*
+
+  spine -v --harvest ~spineMarkupSamples/pod/*
+
+  spine -v --html --html-link-search --html-link-harvest --harvest --output=`echo ~webDocRoot` ~spineMarkupSamples/pod/*
+
+  spine -v --html --html-link-search --html-link-harvest --harvest ~spineMarkupSamples/pod/*
+
+## sqlite
+
+### create db
+
+if there is no sqlite db you first need to create one, to do so
+- the name of the db and
+- the root path for document output
+must be specified:
+
+  spine -v \
+    --sqlite-db-create --sqlite-db-filename="spine.search.db" \
+    --output=/var/www/html \
+    ~spineMarkupSamples/pod/*
+
+  spine -v --sqlite-db-create --sqlite-db-filename="spine.search.db" --output=`echo ~webDocRoot`
+
+if you have a configration file providing this information that is to be used
+for a document collection you can point to the document collection:
+
+  spine -v --sqlite-db-create ~spineMarkupSamples/pod
+
+### populate db
+
+must specify:
+- the name of the db and
+- the root path for document output
+
+  spine -v --sqlite-update \
+    --sqlite-db-filename="spine.search.db" \
+    --output=/var/www/html \
+    ~spineMarkupSamples/pod/*
+
+  spine -v --sqlite-update --sqlite-db-filename="spine.search.db" --output=`echo ~webDocRoot` ~spineMarkupSamples/pod/*
+
+if you have a configration file providing this information that is to be used
+for a document collection you can point to the document collection:
+
+  spine -v --sqlite-update ~spineMarkupSamples/pod/*
+
+### generate a cgi search form in d
+
+  spine -v --cgi-search-form-codegen \
+    --output=/var/www/html \
+    ~spineMarkupSamples/pod
+
+  spine -v --cgi-search-form-codegen --config=~spineMarkupSamples/pod
+
+  spine -v --cgi-search-form-codegen --config=~spineMarkupSamples/pod/.dr/config_local_site
+
+  spine --cgi-search-form-codegen --output=`echo ~webDocRoot` ~spineMarkupSamples/pod
+
+  spine --cgi-search-form-codegen --cgi-sqlite-search-filename="spine_search" --output=`echo ~webDocRoot`
+
+  spine -v --cgi-search-form-codegen \
+    --sqlite-db-filename="spine.search.db" \
+    --cgi-sqlite-search-filename="spine-search" \
+    --output=/var/www/html \
+    ~spineMarkupSamples/pod
+
+#### compile the cgi search form
+
+  cd /var/www/html/cgi # /var/www/html (default document root)
+
+  cd ~webDocRoot/cgi
+
+the directory ~webDocRoot/cgi/src should contain two files
+- spine_search.d (or whatever you named it)
+- cgi.d (by Adam Rupee)
+
+  dub --force --compiler=ldc2 && sudo cp -v cgi-bin/spine-search /usr/lib/cgi-bin/.
+
+should compile spine-search in ~webDocRoot/cgi/cgi-bin and copy it to the
+cgi-bin directory
+
+  spine -v  --sqlite-db-create --sqlite-db-filename="spine.search.db" --cgi-sqlite-search-filename="spine-search" --output=`echo ~webDocRoot`
+
+  spine -v  --sqlite-db-create  ~spineMarkupSamples/pod
+
+  spine -v --html --html-link-search --cgi-sqlite-search-filename="spine-search" --output=`echo ~webDocRoot` ~spineMarkupSamples/pod/*
+
+  spine -v --html --html-link-search --output=`echo ~webDocRoot` ~spineMarkupSamples/pod/*
+
+  spine -v --html --html-link-search --cgi-sqlite-search-filename="spine-search" --html-link-harvest --harvest --output=`echo ~webDocRoot` ~spineMarkupSamples/pod/*
+
+### create db & search form
+
+  spine -v \
+    --sqlite-db-create --sqlite-db-filename="spine.search.db" \
+    --cgi-search-form-codegen --cgi-sqlite-search-filename="spine-search" \
+    --output=/var/www/html \
+    ~spineMarkupSamples/pod/*
+
+### html with links to search form
+
+  spine -v --html \
+    --html-link-search \
+    --output=`echo ~webDocRoot` \
+    ~spineMarkupSamples/pod/*
diff --git a/makefile b/makefile
index 90cc29b..60cb557 100644
--- a/makefile
+++ b/makefile
@@ -78,9 +78,6 @@ data/sisudir/media/text/through_the_looking_glass.lewis_carroll.sst \
 data/sisudir/media/text/two_bits.christopher_kelty.sst \
 data/sisudir/media/text/un_contracts_international_sale_of_goods_convention_1980.sst \
 data/sisudir/media/text/viral_spiral.david_bollier.sst
-dub_upgrade:
-	$(DUB) upgrade
-default: ldc
 markup_samples:
 	find data/pod -name pod.manifest | cut -f 1-3 -d / | sort; \
 find data/sisudir/media/text -name *.ss[tm] | sort
@@ -88,6 +85,9 @@ markup_pod_samples:
 	find data/pod -name pod.manifest | cut -f 1-3 -d / | sort
 markup_dir_samples:
 	find data/sisudir/media/text -name *.ss[tm] | sort
+dub_upgrade:
+	$(DUB) upgrade
+default: ldc
 all: dmd ldc gdc
 all_ver: dmd_ver ldc_ver gdc_ver
 all_debug: dmd_debug gdc_debug ldc_debug
diff --git a/org/compile_time_info.org b/org/compile_time_info.org
index e09409e..59ea6a4 100644
--- a/org/compile_time_info.org
+++ b/org/compile_time_info.org
@@ -7,6 +7,7 @@
 #+COPYRIGHT:   Copyright (C) 2015 - 2020 Ralph Amissah
 #+LANGUAGE:    en
 #+STARTUP:     content hideblocks hidestars noindent entitiespretty
+#+OPTIONS:     H:3 num:nil toc:t \n:nil @:t ::t |:t ^:nil _:nil -:t f:t *:t <:t
 #+PROPERTY:    header-args  :exports code
 #+PROPERTY:    header-args+ :noweb yes
 #+PROPERTY:    header-args+ :eval no
@@ -30,7 +31,8 @@ version(Windows) {} else { ... }
 +/
 module doc_reform.conf.compile_time_info;
 template CompileTimeInfo() {
-  <<spine_compile_time_info>>
+  <<spine_compile_time_info_0>>
+  <<spine_compile_time_info_1>>
 }
 #+END_SRC
 
@@ -39,7 +41,7 @@ OS type shows during compilation
 
 *** set os flags
 
-#+NAME: spine_compile_time_info
+#+NAME: spine_compile_time_info_0
 #+BEGIN_SRC d
 version(Windows) {
   pragma(msg, "[ Windows compilation ]");
@@ -97,7 +99,7 @@ static if(sysWindows) {
 
 ** 64 bit compilation?
 
-#+NAME: spine_compile_time_info
+#+NAME: spine_compile_time_info_1
 #+BEGIN_SRC d
 version(D_LP64) {
   enum bits = "64 bit";
diff --git a/org/default_misc.org b/org/default_misc.org
index 615f480..eb58fb2 100644
--- a/org/default_misc.org
+++ b/org/default_misc.org
@@ -7,6 +7,7 @@
 #+COPYRIGHT:   Copyright (C) 2015 - 2020 Ralph Amissah
 #+LANGUAGE:    en
 #+STARTUP:     content hideblocks hidestars noindent entitiespretty
+#+OPTIONS:     H:3 num:nil toc:t \n:nil @:t ::t |:t ^:nil _:nil -:t f:t *:t <:t
 #+PROPERTY:    header-args  :exports code
 #+PROPERTY:    header-args+ :noweb yes
 #+PROPERTY:    header-args+ :eval no
diff --git a/org/default_paths.org b/org/default_paths.org
index f0881da..5c4e15e 100644
--- a/org/default_paths.org
+++ b/org/default_paths.org
@@ -7,6 +7,7 @@
 #+COPYRIGHT:   Copyright (C) 2015 - 2020 Ralph Amissah
 #+LANGUAGE:    en
 #+STARTUP:     content hideblocks hidestars noindent entitiespretty
+#+OPTIONS:     H:3 num:nil toc:t \n:nil @:t ::t |:t ^:nil _:nil -:t f:t *:t <:t
 #+PROPERTY:    header-args  :exports code
 #+PROPERTY:    header-args+ :noweb yes
 #+PROPERTY:    header-args+ :eval no
@@ -35,7 +36,10 @@ import
 import
   doc_reform.meta.defaults,
   doc_reform.meta.rgx;
-<<template_paths_src>>
+<<template_paths_src_0>>
+<<template_paths_src_1>>
+<<template_paths_src_2>>
+<<template_paths_src_3>>
 <<template_paths_pod>>
 <<template_paths_pod_shallow>>
 <<template_paths_pods>>
@@ -43,7 +47,7 @@ import
 
 ** _manifest_                                                        :manifest:
 
-#+NAME: template_paths_src
+#+NAME: template_paths_src_0
 #+BEGIN_SRC d
 template PodManifest() {
   mixin spineRgxIn;
@@ -118,7 +122,7 @@ pod
     │   └── video
     └── pod.manifest
 
-#+NAME: template_paths_src
+#+NAME: template_paths_src_1
 #+BEGIN_SRC d
 template PathMatters() {
   mixin spineRgxIn;
@@ -466,7 +470,7 @@ template PathMatters() {
 
 ** _config_ (dr_document_make & config_local_site)                         :config:
 
-#+NAME: template_paths_src
+#+NAME: template_paths_src_2
 #+BEGIN_SRC d
 template configFilePaths() {
   mixin spineRgxIn;
@@ -639,7 +643,7 @@ filelist for processing [things to ponder]
 
 *** manual source
 
-#+NAME: template_paths_src
+#+NAME: template_paths_src_3
 #+BEGIN_SRC d
 template spinePathsSRC() {
   mixin spineRgxIn;
@@ -971,13 +975,18 @@ import
   std.regex,
   std.stdio;
 import doc_reform.meta.rgx;
-<<template_paths_out>>
+<<template_paths_out_0>>
+<<template_paths_out_1>>
 <<template_paths_url>>
-<<template_paths_html>>
+<<template_paths_html_0>>
+<<template_paths_html_1>>
+<<template_paths_html_2>>
 <<template_paths_epub>>
 <<template_paths_odf>>
 <<template_paths_latex>>
-<<template_paths_sqlite>>
+<<template_paths_sqlite_0>>
+<<template_paths_sqlite_1>>
+<<template_paths_sqlite_2>>
 #+END_SRC
 
 ** shared out path, base directory                                      :out:
@@ -990,7 +999,7 @@ import doc_reform.meta.rgx;
   - if pod and file have same name, keep name (makes no sense to repeat pod
     name) NO dr_markup.sisu_markup should be sisu_markup
 
-#+NAME: template_paths_out
+#+NAME: template_paths_out_0
 #+BEGIN_SRC d
 template spineOutPaths() {
   auto spineOutPaths()(
@@ -1048,7 +1057,7 @@ template spineOutPathSQLiteCGI() {
 
 ** set
 
-#+NAME: template_paths_out
+#+NAME: template_paths_out_1
 #+BEGIN_SRC d
 template spineOutPathsFnPd() {
   /+ TODO stuff to work out here +/
@@ -1092,7 +1101,7 @@ template spineOutPathsFnPd() {
 ** _html_                                                                :html:
 *** relative
 
-#+NAME: template_paths_html
+#+NAME: template_paths_html_0
 #+BEGIN_SRC d
 template spineDocRootTreeHTML() {
   mixin spineRgxIn;
@@ -1158,7 +1167,7 @@ template spineDocRootTreeHTML() {
 
 *** absolute disk path
 
-#+NAME: template_paths_html
+#+NAME: template_paths_html_1
 #+BEGIN_SRC d
 template spinePathsHTML() {
   mixin spineRgxIn;
@@ -1224,7 +1233,7 @@ template spinePathsHTML() {
 
 *** urls
 
-#+NAME: template_paths_html
+#+NAME: template_paths_html_2
 #+BEGIN_SRC d
 template spineUrlsHTML() {
   import std.format;
@@ -1553,7 +1562,7 @@ template spinePathsLaTeX() {
 ** _sqlite_                                                            :sqlite:
 *** discrete
 
-#+NAME: template_paths_sqlite
+#+NAME: template_paths_sqlite_0
 #+BEGIN_SRC d
 template spinePathsSQLiteDiscrete() {
   mixin spineRgxIn;
@@ -1585,7 +1594,7 @@ template spinePathsSQLiteDiscrete() {
 
 *** TODO collection
 
-#+NAME: template_paths_sqlite
+#+NAME: template_paths_sqlite_1
 #+BEGIN_SRC d
 template spinePathsSQLite() {
   mixin spineRgxIn;
@@ -1614,7 +1623,7 @@ template spinePathsSQLite() {
 
 *** TODO cgi search form
 
-#+NAME: template_paths_sqlite
+#+NAME: template_paths_sqlite_2
 #+BEGIN_SRC d
 template spinePathsSQLiteCGI() {
   mixin spineRgxIn;
diff --git a/org/default_regex.org b/org/default_regex.org
index d9020d4..d78409e 100644
--- a/org/default_regex.org
+++ b/org/default_regex.org
@@ -7,6 +7,7 @@
 #+COPYRIGHT:   Copyright (C) 2015 - 2020 Ralph Amissah
 #+LANGUAGE:    en
 #+STARTUP:     content hideblocks hidestars noindent entitiespretty
+#+OPTIONS:     H:3 num:nil toc:t \n:nil @:t ::t |:t ^:nil _:nil -:t f:t *:t <:t
 #+PROPERTY:    header-args  :exports code
 #+PROPERTY:    header-args+ :noweb yes
 #+PROPERTY:    header-args+ :eval no
@@ -37,15 +38,45 @@ http://dlang.org/phobos/std_regex.html
 module doc_reform.meta.rgx;
 static template spineRgxIn() {
   static struct RgxI {
-    <<meta_rgx>>
-    <<prgmkup_rgx>>
+    <<meta_rgx_0>>
+    <<meta_rgx_1>>
+    <<meta_rgx_2>>
+    <<meta_rgx_3>>
+    <<meta_rgx_4>>
+    <<meta_rgx_5>>
+    <<meta_rgx_6>>
+    <<meta_rgx_7>>
+    <<meta_rgx_8>>
+    <<meta_rgx_9>>
+    <<meta_rgx_10>>
+    <<meta_rgx_11>>
+    <<meta_rgx_12>>
+    <<meta_rgx_13>>
+    <<meta_rgx_14>>
+    <<meta_rgx_15>>
+    <<meta_rgx_16>>
+    <<meta_rgx_17>>
+    <<meta_rgx_18>>
+    <<meta_rgx_19>>
+    <<meta_rgx_20>>
+    <<meta_rgx_21>>
+    <<meta_rgx_22>>
+    <<prgmkup_rgx_0>>
+    <<prgmkup_rgx_1>>
+    <<prgmkup_rgx_2>>
+    <<prgmkup_rgx_3>>
+    <<prgmkup_rgx_4>>
+    <<prgmkup_rgx_5>>
+    <<prgmkup_rgx_6>>
+    <<prgmkup_rgx_7>>
+    <<prgmkup_rgx_8>>
   }
 }
 #+END_SRC
 
 ** misc                                                                :misc:
 
-#+NAME: meta_rgx
+#+NAME: meta_rgx_0
 #+BEGIN_SRC d
 /+ misc +/
 // static true_dollar                                    = ctRegex!(`\$`, "gm");
@@ -84,7 +115,7 @@ static numeric_col                                    = ctRegex!(`^[ 0-9,.%$£
 
 ** comments                                                         :comment:
 
-#+NAME: meta_rgx
+#+NAME: meta_rgx_1
 #+BEGIN_SRC d
 /+ comments +/
 static comment                                        = ctRegex!(`^%+ `);
@@ -92,7 +123,7 @@ static comment                                        = ctRegex!(`^%+ `);
 
 ** config
 
-#+NAME: meta_rgx
+#+NAME: meta_rgx_2
 #+BEGIN_SRC d
 /+ header +/
 #+END_SRC
@@ -100,7 +131,7 @@ static comment                                        = ctRegex!(`^%+ `);
 ** native headers
 *** native header                                             :native:header:
 
-#+NAME: meta_rgx
+#+NAME: meta_rgx_3
 #+BEGIN_SRC d
 /+ header +/
 static variable_doc_title                             = ctRegex!(`@title`);
@@ -112,7 +143,7 @@ static yaml_config                                    = ctRegex!(`^[a-z]+\s*:\s*
 
 ** heading & paragraph operators                         :paragraph:operator:
 
-#+NAME: meta_rgx
+#+NAME: meta_rgx_4
 #+BEGIN_SRC d
 /+ heading & paragraph operators +/
 static heading_a                                      = ctRegex!(`^:?[A][~] `, "m");
@@ -141,7 +172,7 @@ static para_inline_link_anchor                        = ctRegex!(`\*[~](?P<ancho
 ** blocked markup
 *** blocked markup curly & tic                                        :block:
 
-#+NAME: meta_rgx
+#+NAME: meta_rgx_5
 #+BEGIN_SRC d
 /+ blocked markup +/
 static block_open                                     = ctRegex!("^((code(?:[.][a-z][0-9a-z#+_]+)?|(?:poem|group|block|quote)(?:[.][a-z][0-9a-z_]+)?|table)(?:[(][ a-zA-Z0-9;:,]*[)])?[{][ ]*$)|^`{3} (code(?:[.][a-z][0-9a-z#+_]+)?|(?:poem|group|block|quote)(?:[.][a-z][0-9a-z_]+)?|table)(?:[(][ a-zA-Z0-9;:,]*[)])?|^[{]table[(](?:h;)?(?P<columns>(?:[ ,]+[0-9]+)+)[)][}]");
@@ -150,7 +181,7 @@ static block_poem_open                                = ctRegex!("^((poem(?:[(][
 
 *** blocked markup tic                                            :block:tic:
 
-#+NAME: meta_rgx
+#+NAME: meta_rgx_6
 #+BEGIN_SRC d
 /+ blocked markup tics +/
 static block_tic_code_open                            = ctRegex!("^`{3} code(?:[.](?P<syntax>[a-z][0-9a-z#+_]+))?(?:[(](?P<attrib>[ a-zA-Z0-9;:,]*)[)])?");
@@ -164,7 +195,7 @@ static block_tic_close                                = ctRegex!("^(`{3})$","m")
 
 *** blocked markup curly                                        :block:curly:
 
-#+NAME: meta_rgx
+#+NAME: meta_rgx_7
 #+BEGIN_SRC d
 /+ blocked markup curly +/
 static block_curly_code_open                          = ctRegex!(`^(?:code(?:[.](?P<syntax>[a-z][0-9a-z_]+))?(?:[(](?P<attrib>[ a-zA-Z0-9;:,]*)[)])?[{][ ]*$)`);
@@ -185,14 +216,14 @@ static block_curly_table_special_markup               = ctRegex!(`^[{]table[(](?
 *** block sub-matches                                                 :block:
 **** code
 
-#+NAME: meta_rgx
+#+NAME: meta_rgx_8
 #+BEGIN_SRC d
 static code_numbering                                 = ctRegex!(`(?P<number>\blinenumber\b|\bnumber\b|\blnr\b)`);
 #+END_SRC
 
 **** table
 
-#+NAME: meta_rgx
+#+NAME: meta_rgx_9
 #+BEGIN_SRC d
 static table_head_instructions                        = ctRegex!(`(?:(?P<c_heading>h);)?(?:[ ]+c(?P<c_num>[0-9]):)?(?P<c_widths>(?:[, ]+[0-9]+[lr]?)+)`);
 static table_col_widths_and_alignment                 = ctRegex!(`(?P<width>[0-9]+)(?P<align>[lr]?)`);
@@ -206,7 +237,7 @@ static table_col_separator_nl                         = ctRegex!(`[┊]$`, "mg")
 ** inline markup                                            :inline:footnote:
 *** footnotes & endnotes
 
-#+NAME: meta_rgx
+#+NAME: meta_rgx_10
 #+BEGIN_SRC d
 /+ inline markup footnotes endnotes +/
 static inline_notes_curly_gen                         = ctRegex!(`~\{.+?\}~`, "m");
@@ -224,7 +255,7 @@ static note_ref                                       = ctRegex!(`^\S+?noteref_(
 
 *** links/ urls                                             :inline:footnote:
 
-#+NAME: meta_rgx
+#+NAME: meta_rgx_11
 #+BEGIN_SRC d
 static webserv_url_doc_root                           = ctRegex!(`(?P<url>(?P<domain>https?:\/\/[^ /]+)\/(?P<path>\S*))`, "mg");
 static smid_inline_url_generic                        = ctRegex!(`(?:^|[}(\[ ])(?:(?:https?|git):\/\/|¤?\.\.\/|¤?\.\/|¤|#)[a-zA-Z0-9_#]`, "mg");
@@ -237,7 +268,7 @@ static smid_inline_link_endnote_url_helper            = ctRegex!(`\{~\^\s+(?P<co
 
 *** images                                                           :images:
 
-#+NAME: meta_rgx
+#+NAME: meta_rgx_12
 #+BEGIN_SRC d
 static image                                           = ctRegex!(`([a-zA-Z0-9._-]+?\.(?:png|gif|jpg))`, "mg");
 static smid_image                                      = ctRegex!(`(?P<pre>(?:^|[ ]|[^\S]?)[{┥](?:~\^\s+|\s*))(?P<image>[a-zA-Z0-9._-]+?\.(?:png|gif|jpg))(?P<post>(?:.*?)\s*[}┝](?:image|┤.*?├|(?:(?:https?|git):\/\/|¤?\.\.\/|¤?\.\/|¤|#)\S+?)(?=[;:!,?.]?([ )\]]|$)))`, "mg");
@@ -250,7 +281,7 @@ static smid_image_delimit                              = ctRegex!(`(?P<pre>^|[ ]
 
 *** inline markup book index                               :inline:bookindex:
 
-#+NAME: meta_rgx
+#+NAME: meta_rgx_13
 #+BEGIN_SRC d
 /+ inline markup book index +/
 static book_index_item                                = ctRegex!(`^=\{\s*(?P<bookindex>.+?)\}$`, "m");
@@ -261,7 +292,7 @@ static book_index_item_close                          = ctRegex!(`^(.*?)\}$`, "m
 ** switch
 *** switch off auto-heading number
 
-#+NAME: meta_rgx
+#+NAME: meta_rgx_14
 #+BEGIN_SRC d
 static auto_heading_numbering_lv1                    = ctRegex!(`^1~`, "m");
 static auto_heading_numbering_lv2                    = ctRegex!(`^2~`, "m");
@@ -276,7 +307,7 @@ static auto_heading_numbering_off_lv4                = ctRegex!(`^4~\S*?-\s`, "m
 
 ** no object_number object                                    :ocn:off:object:
 
-#+NAME: meta_rgx
+#+NAME: meta_rgx_15
 #+BEGIN_SRC d
 /+ no object_number object +/
 static object_number_off                            = ctRegex!(`~#[ ]*$`, "m");
@@ -287,7 +318,7 @@ static repeated_character_line_separator            = ctRegex!(`^(?:[ ]*(?:(?:[.
 
 ** no object_number block                                      :ocn:off:block:
 
-#+NAME: meta_rgx
+#+NAME: meta_rgx_16
 #+BEGIN_SRC d
 /+ no object_number block +/
 static object_number_off_block                      = ctRegex!(`^--~#$`);
@@ -298,7 +329,7 @@ static object_number_block_marks                    = ctRegex!(`^--[+~-]#$`);
 
 ** ignore outside code blocks                                    :block:code:
 
-#+NAME: meta_rgx
+#+NAME: meta_rgx_17
 #+BEGIN_SRC d
 /+ ignore outside code blocks +/
 static skip_from_regular_parse    = ctRegex!(`^(--[+~-]#|-[\\]{2}-|=[.\\]{2}=)$`);
@@ -306,7 +337,7 @@ static skip_from_regular_parse    = ctRegex!(`^(--[+~-]#|-[\\]{2}-|=[.\\]{2}=)$`
 
 ** line & page breaks                                                 :break:
 
-#+NAME: meta_rgx
+#+NAME: meta_rgx_18
 #+BEGIN_SRC d
 /+ line & page breaks +/
 static break_string                                   = ctRegex!(`』`);
@@ -314,7 +345,7 @@ static break_string                                   = ctRegex!(`』`);
 
 ** biblio tags                                                  :biblio:tags:
 
-#+NAME: meta_rgx
+#+NAME: meta_rgx_19
 #+BEGIN_SRC d
 /+ biblio tags +/
 static biblio_tags                                    = ctRegex!(`^(is|au|author_raw|author|author_arr|editor_raw|ed|editor_arr|ti|title|subtitle|fulltitle|lng|language|trans|src|jo|journal|in|vol|volume|edn|edition|yr|year|pl|place|pb|pub|publisher|url|pg|pages|note|short_name|id):\s+(.+)`);
@@ -323,7 +354,7 @@ static biblio_abbreviations                           = ctRegex!(`^(au|ed|ti|lng
 
 ** bookindex split                                          :bookindex:split:
 
-#+NAME: meta_rgx
+#+NAME: meta_rgx_20
 #+BEGIN_SRC d
 /+ bookindex split +/
 static bi_main_terms_split                            = ctRegex!(`\s*;\s*`);
@@ -334,7 +365,7 @@ static bi_term_and_object_numbers_match               = ctRegex!(`^(.+?)\+(\d+)`
 
 ** topic register split (document classify)
 
-#+NAME: meta_rgx
+#+NAME: meta_rgx_21
 #+BEGIN_SRC d
 static topic_register_main_terms_split                = ctRegex!(`\s*;\s*`);
 static topic_register_main_term_plus_rest_split       = ctRegex!(`\s*:\s*`);
@@ -344,7 +375,7 @@ static topic_register_multiple_sub_terms_split        = ctRegex!(`␣([^|␣]+(?
 
 ** language codes                                            :language:codes:
 
-#+NAME: meta_rgx
+#+NAME: meta_rgx_22
 #+BEGIN_SRC d
 /+ language codes +/
 auto language_code_and_filename                                    =
@@ -367,8 +398,17 @@ http://dlang.org/phobos/std_regex.html
 module doc_reform.io_out.rgx;
 static template spineRgxOut() {
   static struct RgxO {
-    <<prgmkup_rgx>>
-    <<sp_ch_xhtml_rgx>>
+    <<prgmkup_rgx_0>>
+    <<prgmkup_rgx_1>>
+    <<prgmkup_rgx_2>>
+    <<prgmkup_rgx_3>>
+    <<prgmkup_rgx_4>>
+    <<prgmkup_rgx_5>>
+    <<prgmkup_rgx_6>>
+    <<prgmkup_rgx_7>>
+    <<prgmkup_rgx_8>>
+    <<sp_ch_xhtml_rgx_0>>
+    <<sp_ch_xhtml_rgx_1>>
   }
 }
 #+END_SRC
@@ -376,7 +416,7 @@ static template spineRgxOut() {
 ** special characters
 *** xhtml special characters
 
-#+NAME: sp_ch_xhtml_rgx
+#+NAME: sp_ch_xhtml_rgx_0
 #+BEGIN_SRC d
 static xhtml_ampersand                            = ctRegex!(`[&]`, "m");      // &amp;
 static xhtml_quotation                            = ctRegex!(`["]`, "m");      // &quot;
@@ -387,7 +427,7 @@ static xhtml_line_break                           = ctRegex!(` [\\]{2}`, "m"); /
 
 *** latex special characters
 
-#+NAME: sp_ch_xhtml_rgx
+#+NAME: sp_ch_xhtml_rgx_1
 #+BEGIN_SRC d
 static latex_special_char                         = ctRegex!(`([%${}_#&\\])`);
 static latex_special_char_for_escape              = ctRegex!(`([%${}_#\\])`);
@@ -404,7 +444,7 @@ static latex_clean_bookindex_linebreak            = ctRegex!(`\s*\\\\\\\\\s*`, "
 * 2. ctRegex defaults shared by meta & output (generic)
 ** misc generic
 
-#+NAME: prgmkup_rgx
+#+NAME: prgmkup_rgx_0
 #+BEGIN_SRC d
 static newline                                        = ctRegex!("\n", "mg");
 static space                                          = ctRegex!(`[ ]`, "mg");
@@ -415,7 +455,7 @@ static nbsp_char                                      = ctRegex!(`░`, "mg");
 
 ** filename (& path) (including insert file)      :insert:file:path:filename:
 
-#+NAME: prgmkup_rgx
+#+NAME: prgmkup_rgx_1
 #+BEGIN_SRC d
 static src_pth_sst_or_ssm                             = ctRegex!(`^(?P<path>[/]?(?:[a-zA-Z0-9._-]+/)*)(?P<filename>[a-zA-Z0-9._-]+[.](?P<extension>ss[tm]))$`);
 static src_pth_pod_sst_or_ssm                         = ctRegex!(`^(?P<podpath>[/]?(?:[a-zA-Z0-9._-]+/)*)media/text/[a-z]{2}/(?P<filename>[a-zA-Z0-9][a-zA-Z0-9._-]*?[.]ss[tm])$`);
@@ -436,7 +476,7 @@ static src_formalised_file_path_parts                 = ctRegex!(`(?P<pth>(?:[/a
 
 *** inline breaks
 
-#+NAME: prgmkup_rgx
+#+NAME: prgmkup_rgx_2
 #+BEGIN_SRC d
 /+ line breaks +/
 static br_empty_line                                  = ctRegex!(`\n[ ]*\n`, "mg");
@@ -447,7 +487,7 @@ static br_nl                                          = ctRegex!(`┙`, "mg");
 
 *** inline (internal program) markup footnotes endnotes     :inline:footnote:
 
-#+NAME: prgmkup_rgx
+#+NAME: prgmkup_rgx_3
 #+BEGIN_SRC d
 /+ inline markup footnotes endnotes +/
 static inline_notes_al                                = ctRegex!(`【(?:[*+]\s+|\s*)(.+?)】`, "mg");
@@ -467,7 +507,7 @@ static inline_text_and_note_al_                       = ctRegex!(`(.+?(?:【[*+]
 
 *** inline links
 
-#+NAME: prgmkup_rgx
+#+NAME: prgmkup_rgx_4
 #+BEGIN_SRC d
 /+ inline markup links +/
 static inline_image                                   = ctRegex!(`(?P<pre>┥)☼(?P<imginf>(?P<img>[a-zA-Z0-9._-]+?\.(?:jpg|gif|png)),w(?P<width>\d+)h(?P<height>\d+))\s*(?P<post>.*?┝┤.*?├)`, "mg");
@@ -495,7 +535,7 @@ static quotation_mark_sql_insert_delimiter            = ctRegex!("[']", "mg");
 
 *** inline markup font face mod                            :inline:font:face:
 
-#+NAME: prgmkup_rgx
+#+NAME: prgmkup_rgx_5
 #+BEGIN_SRC d
 /+ inline markup font face mod +/
 static inline_mark_emphasis                         = ctRegex!(`(?P<mark>[*])\{(?P<text>.+?)\}[*]`, "mg");
@@ -510,7 +550,7 @@ static inline_mark_mono                             = ctRegex!(`(?P<mark>[#])\{(
 static inline_mark_cite                             = ctRegex!(`(?P<mark>["])\{(?P<text>.+?)\}["]`, "mg");
 #+END_SRC
 
-#+NAME: prgmkup_rgx
+#+NAME: prgmkup_rgx_6
 #+BEGIN_SRC d
 static inline_faces_line                              = ctRegex!(`^[*!/_]_ (?P<text>.+?)((?: [\\]{2}|[~]#){0,2}$)`);
 static inline_emphasis_line                           = ctRegex!(`^\*_ (?P<text>.+?)(?P<tail>(?: [\\]{2}|[~]#){0,2}$)`);
@@ -519,7 +559,7 @@ static inline_italics_line                            = ctRegex!(`^/_ (?P<text>.
 static inline_underscore_line                         = ctRegex!(`^__ (?P<text>.+?)(?P<tail>(?: [\\]{2}|[~]#){0,2}$)`);
 #+END_SRC
 
-#+NAME: prgmkup_rgx
+#+NAME: prgmkup_rgx_7
 #+BEGIN_SRC d
 /+ inline markup font face mod +/
 static inline_emphasis                                = ctRegex!(`[*]┨(?P<text>.+?)┣[*]`, "mg");
@@ -538,7 +578,7 @@ static inline_fontface_clean                          = ctRegex!(`[*!_/^,+■‖
 
 *** table related
 
-#+NAME: prgmkup_rgx
+#+NAME: prgmkup_rgx_8
 #+BEGIN_SRC d
 /+ table delimiters +/
 static table_delimiter_col                           = ctRegex!("[ ]*[┊][ ]*", "mg");
diff --git a/org/default_shared.org b/org/default_shared.org
index c776725..5b81f84 100644
--- a/org/default_shared.org
+++ b/org/default_shared.org
@@ -7,6 +7,7 @@
 #+COPYRIGHT:   Copyright (C) 2015 - 2020 Ralph Amissah
 #+LANGUAGE:    en
 #+STARTUP:     content hideblocks hidestars noindent entitiespretty
+#+OPTIONS:     H:3 num:nil toc:t \n:nil @:t ::t |:t ^:nil _:nil -:t f:t *:t <:t
 #+PROPERTY:    header-args  :exports code
 #+PROPERTY:    header-args+ :noweb yes
 #+PROPERTY:    header-args+ :eval no
diff --git a/org/imports.org b/org/imports.org
index 0d8e20f..06ea0ff 100644
--- a/org/imports.org
+++ b/org/imports.org
@@ -7,6 +7,7 @@
 #+COPYRIGHT:   Copyright (C) 2015 - 2020 Ralph Amissah
 #+LANGUAGE:    en
 #+STARTUP:     content hideblocks hidestars noindent entitiespretty
+#+OPTIONS:     H:3 num:nil toc:t \n:nil @:t ::t |:t ^:nil _:nil -:t f:t *:t <:t
 #+PROPERTY:    header-args  :exports code
 #+PROPERTY:    header-args+ :noweb yes
 #+PROPERTY:    header-args+ :eval no
diff --git a/org/in_source_files.org b/org/in_source_files.org
index db433b0..86b0607 100644
--- a/org/in_source_files.org
+++ b/org/in_source_files.org
@@ -7,6 +7,7 @@
 #+COPYRIGHT:   Copyright (C) 2015 - 2020 Ralph Amissah
 #+LANGUAGE:    en
 #+STARTUP:     content hideblocks hidestars noindent entitiespretty
+#+OPTIONS:     H:3 num:nil toc:t \n:nil @:t ::t |:t ^:nil _:nil -:t f:t *:t <:t
 #+PROPERTY:    header-args  :exports code
 #+PROPERTY:    header-args+ :noweb yes
 #+PROPERTY:    header-args+ :eval no
@@ -47,13 +48,15 @@ import
   <<imports_spine>>,
   doc_reform.meta.rgx;
 <<meta_config_file_in>>
-<<meta_config_file_hub>>
+<<meta_config_file_hub_0>>
+<<meta_config_file_hub_1>>
+<<meta_config_file_hub_2>>
 #+END_SRC
 
 *** 0. read config files (config local site & dr document make) (yaml)
 **** 1. site configuration
 
-#+NAME: meta_config_file_hub
+#+NAME: meta_config_file_hub_0
 #+BEGIN_SRC d
 template readConfigSite() {
   @system final auto readConfigSite(C,O)(C _conf_file_details, O _opt_action) {
@@ -167,7 +170,7 @@ webserv:
 
 **** 2. document make/config
 
-#+NAME: meta_config_file_hub
+#+NAME: meta_config_file_hub_1
 #+BEGIN_SRC d
 static template readConfigDoc() {
   import
@@ -223,7 +226,7 @@ static template readConfigDoc() {
 
 *** YAML config (config local site & dr document make)      :file:config:hub:
 
-#+NAME: meta_config_file_hub
+#+NAME: meta_config_file_hub_2
 #+BEGIN_SRC d
 static template configReadSiteYAML() {
   import
diff --git a/org/meta_conf_make_meta.org b/org/meta_conf_make_meta.org
index dbe3cc9..d1e21bc 100644
--- a/org/meta_conf_make_meta.org
+++ b/org/meta_conf_make_meta.org
@@ -7,6 +7,7 @@
 #+COPYRIGHT:   Copyright (C) 2015 - 2020 Ralph Amissah
 #+LANGUAGE:    en
 #+STARTUP:     content hideblocks hidestars noindent entitiespretty
+#+OPTIONS:     H:3 num:nil toc:t \n:nil @:t ::t |:t ^:nil _:nil -:t f:t *:t <:t
 #+PROPERTY:    header-args  :exports code
 #+PROPERTY:    header-args+ :noweb yes
 #+PROPERTY:    header-args+ :eval no
@@ -84,12 +85,18 @@ import doc_reform.meta.conf_make_meta_structs;
 
 #+BEGIN_SRC d :tangle "../src/doc_reform/meta/conf_make_meta_structs.d"
 module doc_reform.meta.conf_make_meta_structs;
-<<meta_defaults_template_structs>>
+<<meta_defaults_template_structs_0>>
+<<meta_defaults_template_structs_1>>
+<<meta_defaults_template_structs_2>>
+<<meta_defaults_template_structs_3>>
+<<meta_defaults_template_structs_4>>
+<<meta_defaults_template_structs_5>>
+<<meta_defaults_template_structs_6>>
 #+END_SRC
 
 ** initialize, imports etc.
 
-#+NAME: meta_defaults_template_structs
+#+NAME: meta_defaults_template_structs_0
 #+BEGIN_SRC d
 import
   std.exception,
@@ -112,7 +119,7 @@ static auto mkup = InlineMarkup();
 
 ** struct Generic ConfComposite
 
-#+NAME: meta_defaults_template_structs
+#+NAME: meta_defaults_template_structs_1
 #+BEGIN_SRC d
 @safe string url_markup(string line) {
   string line_ = line
@@ -224,7 +231,7 @@ struct confCompositeMakeBuild {
 ** initialize make & meta
 *** composite make
 
-#+NAME: meta_defaults_template_structs
+#+NAME: meta_defaults_template_structs_2
 #+BEGIN_SRC d
 struct ConfCompositeMakeInit {
   string[]   bold;
@@ -249,7 +256,7 @@ struct ConfCompositeMakeInit {
 
 *** struct: conf site local
 
-#+NAME: meta_defaults_template_structs
+#+NAME: meta_defaults_template_structs_3
 #+BEGIN_SRC d
 struct ConfCompositeSiteLocal {
   string   w_srv_http;
@@ -308,7 +315,7 @@ struct ConfCompositeSiteLocal {
 
 *** struct: composite meta
 
-#+NAME: meta_defaults_template_structs
+#+NAME: meta_defaults_template_structs_4
 #+BEGIN_SRC d
 struct MetaComposite {
   string   classify_dewey;
@@ -368,7 +375,7 @@ struct MetaComposite {
 
 *** composite structs
 
-#+NAME: meta_defaults_template_structs
+#+NAME: meta_defaults_template_structs_5
 #+BEGIN_SRC d
 struct ConfComposite {
   MetaComposite               meta;
@@ -380,7 +387,7 @@ struct ConfComposite {
 
 *** JSONValue
 
-#+NAME: meta_defaults_template_structs
+#+NAME: meta_defaults_template_structs_6
 #+BEGIN_SRC d
 JSONValue config_jsonstr = `{
 }`;
@@ -1451,7 +1458,9 @@ static template contentJSONtoSpineStruct() {
       writeln("<< --------------------------- <<");
     }
     confCompositeMakeBuild _mk;
-    <<json_objects>>
+    <<json_objects_0>>
+    <<json_objects_1>>
+    <<json_objects_2>>
     return _struct_composite;
   }
 }
@@ -1459,7 +1468,7 @@ static template contentJSONtoSpineStruct() {
 
 **  make
 
-#+NAME: json_objects
+#+NAME: json_objects_0
 #+BEGIN_SRC d
 /+ make ------------------------------------------------------------------- +/
 if ("make" in _json.object) {
@@ -1624,7 +1633,7 @@ if ("make" in _json.object) {
 
 **  conf
 
-#+NAME: json_objects
+#+NAME: json_objects_1
 #+BEGIN_SRC d
 /+ conf ------------------------------------------------------------------- +/
 if ("webserv" in _json.object) {
@@ -1795,7 +1804,7 @@ if ("search" in _json.object) {
 
 **  meta
 
-#+NAME: json_objects
+#+NAME: json_objects_2
 #+BEGIN_SRC d
 /+ meta ------------------------------------------------------------------- +/
 if (_struct_composite.meta.creator_author.empty) {
diff --git a/org/meta_debugs.org b/org/meta_debugs.org
index 6dc2ecf..7a2247f 100644
--- a/org/meta_debugs.org
+++ b/org/meta_debugs.org
@@ -7,6 +7,7 @@
 #+COPYRIGHT:   Copyright (C) 2015 - 2020 Ralph Amissah
 #+LANGUAGE:    en
 #+STARTUP:     content hideblocks hidestars noindent entitiespretty
+#+OPTIONS:     H:3 num:nil toc:t \n:nil @:t ::t |:t ^:nil _:nil -:t f:t *:t <:t
 #+PROPERTY:    header-args  :exports code
 #+PROPERTY:    header-args+ :noweb yes
 #+PROPERTY:    header-args+ :eval no
diff --git a/org/metaverse.org b/org/metaverse.org
index 697dd5e..668ac15 100644
--- a/org/metaverse.org
+++ b/org/metaverse.org
@@ -7,6 +7,7 @@
 #+COPYRIGHT:   Copyright (C) 2015 - 2020 Ralph Amissah
 #+LANGUAGE:    en
 #+STARTUP:     content hideblocks hidestars noindent entitiespretty
+#+OPTIONS:     H:3 num:nil toc:t \n:nil @:t ::t |:t ^:nil _:nil -:t f:t *:t <:t
 #+PROPERTY:    header-args  :exports code
 #+PROPERTY:    header-args+ :noweb yes
 #+PROPERTY:    header-args+ :eval no
@@ -34,7 +35,12 @@ template docAbstraction() {
                                                                                 /+ ↓ abstraction mixins +/
   <<abs_top_mixins>>
                                                                                 /+ ↓ abstraction struct init +/
-  <<abs_top_init_struct>>
+  <<abs_top_init_struct_0>>
+  <<abs_top_init_struct_1>>
+  <<abs_top_init_struct_2>>
+  <<abs_top_init_struct_3>>
+  <<abs_top_init_struct_4>>
+  <<abs_top_init_struct_5>>
   <<abs_inline_para_tag_associations>>
                                                                                 /+ ↓ abstract marked up document +/
   @system auto docAbstraction(CMM,Opt,Mf) (
@@ -46,14 +52,16 @@ template docAbstraction() {
   ) {
     static auto rgx = RgxI();
                                                                                 /+ ↓ abstraction init +/
-    <<abs_init_rest>>
+    <<abs_init_rest_0>>
+    <<abs_init_rest_1>>
                                                                                 /+ abstraction init ↑ +/
     <<make_tests>>
                                                                                 /+ ↓ ↻ loop markup document/text line by line +/
     srcDocLoop:
     foreach (line; markup_sourcefile_content) {                                 /+ ↓ markup document/text line by line +/
                                                                                 // "line" variable can be empty but should never be null
-      <<abs_in_loop_body_00>>
+      <<abs_in_loop_body_00_0>>
+      <<abs_in_loop_body_00_1>>
       if ( pith["block_is"] == eN.blk_is.code
         && pith["block_state"] == eN.blk_state.on
       ) {
@@ -61,25 +69,76 @@ template docAbstraction() {
       } else if (!matchFirst(line, rgx.skip_from_regular_parse)) {              /+ object other than "code block" object +/
                                                                                 /+ (includes regular text paragraph, headings & blocks other than code) +/
                                                                                 /+ heading, glossary, blurb, poem, group, block, quote, table +/
-        <<abs_in_loop_body_non_code_obj>>
+        <<abs_in_loop_body_non_code_obj_0>>
+        <<abs_in_loop_body_non_code_obj_1>>
+        <<abs_in_loop_body_non_code_obj_2>>
+        <<abs_in_loop_body_non_code_obj_3>>
+        <<abs_in_loop_body_non_code_obj_4>>
+        <<abs_in_loop_body_non_code_obj_5>>
+        <<abs_in_loop_body_non_code_obj_6>>
+        <<abs_in_loop_body_non_code_obj_7>>
+        <<abs_in_loop_body_non_code_obj_8>>
+        <<abs_in_loop_body_non_code_obj_9>>
         } else {                                                                /+ not within a block group +/
           <<abs_in_loop_body_open_block_obj_assert>>
           if (line.matchFirst(rgx.block_open)) {
             <<abs_in_loop_body_open_block_obj>>
           } else if (!line.empty) {                                             /+ line not empty +/
                                                                                 /+ non blocks (headings, paragraphs) & closed blocks +/
-            <<abs_in_loop_body_not_block_obj>>
+            <<abs_in_loop_body_not_block_obj_0>>
+            <<abs_in_loop_body_not_block_obj_1>>
+            <<abs_in_loop_body_not_block_obj_2>>
+            <<abs_in_loop_body_not_block_obj_3>>
+            <<abs_in_loop_body_not_block_obj_4>>
+            <<abs_in_loop_body_not_block_obj_5>>
+            <<abs_in_loop_body_not_block_obj_6>>
           } else if (pith["block_state"] == eN.blk_state.closing) {             /+ line empty, with blocks flag +/
             <<abs_in_loop_body_not_block_obj_line_empty_blocks_flags>>
           } else {                                                              /+ line.empty, post contents, empty variables: +/
-            <<abs_in_loop_body_not_block_obj_line_empty>>
+            <<abs_in_loop_body_not_block_obj_line_empty_0>>
+            <<abs_in_loop_body_not_block_obj_line_empty_1>>
+            <<abs_in_loop_body_not_block_obj_line_empty_2>>
           }                                                                     // close else for line empty
         }                                                                       // close else for not the above
       }                                                                         // close after non code, other blocks or regular text
       <<abs_in_loop_body_01>>
     }                                                                           /+ ← srcDocLoop closed: loop markup document/text line by line +/
                                                                                 /+ ↓ post loop markup document/text +/
-    <<abs_post>>
+    <<abs_post_0>>
+    <<abs_post_1>>
+    <<abs_post_2>>
+    <<abs_post_3>>
+    <<abs_post_4>>
+    <<abs_post_5>>
+    <<abs_post_6>>
+    <<abs_post_7>>
+    <<abs_post_8>>
+    <<abs_post_9>>
+    <<abs_post_10>>
+    <<abs_post_11>>
+    <<abs_post_12>>
+    <<abs_post_13>>
+    <<abs_post_14>>
+    <<abs_post_15>>
+    <<abs_post_16>>
+    <<abs_post_17>>
+    <<abs_post_18>>
+    <<abs_post_19>>
+    <<abs_post_20>>
+    <<abs_post_21>>
+    <<abs_post_22>>
+    <<abs_post_23>>
+    <<abs_post_24>>
+    <<abs_post_25>>
+    <<abs_post_26>>
+    <<abs_post_27>>
+    <<abs_post_28>>
+    <<abs_post_29>>
+    <<abs_post_30>>
+    <<abs_post_31>>
+    <<abs_post_32>>
+    <<abs_post_33>>
+    <<abs_post_34>>
     <<abs_post_doc_reloop_processing>>
     <<abs_struct_doc_has>>
     <<abs_return_tuple>>
@@ -89,48 +148,117 @@ template docAbstraction() {
   <<abs_functions_object_reset>>
   <<abs_functions_header_set_common>>
   <<abs_functions_ocn_status>>
-  <<abs_functions_substitutions>>
-  <<abs_functions_block>>
+  <<abs_functions_substitutions_0>>
+  <<abs_functions_substitutions_1>>
+  <<abs_functions_block_0>>
+  <<abs_functions_block_1>>
+  <<abs_functions_block_2>>
+  <<abs_functions_block_3>>
+  <<abs_functions_block_4>>
+  <<abs_functions_block_5>>
+  <<abs_functions_block_6>>
+  <<abs_functions_block_7>>
+  <<abs_functions_block_8>>
+  <<abs_functions_block_9>>
+  <<abs_functions_block_10>>
+  <<abs_functions_block_11>>
+  <<abs_functions_block_12>>
+  <<abs_functions_block_13>>
+  <<abs_functions_block_14>>
+  <<abs_functions_block_15>>
   <<abs_functions_block_quote>>
   <<abs_functions_block_group>>
   <<abs_functions_block_block>>
   <<abs_functions_block_poem>>
   <<abs_functions_block_code>>
   <<abs_functions_block_table>>
-  <<abs_functions_block_biblio>>
-  <<abs_functions_block_line_status_empty>>
+  <<abs_functions_block_biblio_0>>
+  <<abs_functions_block_biblio_1>>
+  <<abs_functions_block_line_status_empty_0>>
+  <<abs_functions_block_line_status_empty_1>>
+  <<abs_functions_block_line_status_empty_2>>
+  <<abs_functions_block_line_status_empty_3>>
+  <<abs_functions_block_line_status_empty_4>>
+  <<abs_functions_block_line_status_empty_5>>
+  <<abs_functions_block_line_status_empty_6>>
+  <<abs_functions_block_line_status_empty_7>>
+  <<abs_functions_block_line_status_empty_8>>
   <<abs_functions_book_index>>
-  <<abs_functions_heading>>
-  <<abs_functions_para>>
-  <<abs_functions_table>>
+  <<abs_functions_heading_0>>
+  <<abs_functions_heading_1>>
+  <<abs_functions_heading_2>>
+  <<abs_functions_para_0>>
+  <<abs_functions_para_1>>
+  <<abs_functions_table_0>>
+  <<abs_functions_table_1>>
+  <<abs_functions_table_2>>
+  <<abs_functions_table_3>>
                                                                                 /+ abstraction functions ↑ +/
                                                                                 /+ ↓ abstraction function emitters +/
   <<meta_emitters_ocn>>
                                                                                 /+ +/
-  <<meta_emitters_obj_inline_markup_munge>>
+  <<meta_emitters_obj_inline_markup_munge_0>>
+  <<meta_emitters_obj_inline_markup_munge_1>>
+  <<meta_emitters_obj_inline_markup_munge_2>>
+  <<meta_emitters_obj_inline_markup_munge_3>>
+  <<meta_emitters_obj_inline_markup_munge_4>>
+  <<meta_emitters_obj_inline_markup_munge_5>>
+  <<meta_emitters_obj_inline_markup_munge_6>>
+  <<meta_emitters_obj_inline_markup_munge_7>>
+  <<meta_emitters_obj_inline_markup_munge_8>>
+  <<meta_emitters_obj_inline_markup_munge_9>>
+  <<meta_emitters_obj_inline_markup_munge_10>>
+  <<meta_emitters_obj_inline_markup_munge_11>>
+  <<meta_emitters_obj_inline_markup_munge_12>>
+  <<meta_emitters_obj_inline_markup_munge_13>>
   <<meta_emitters_obj_inline_markup>>
   <<meta_emitters_obj_inline_markup_and_anchor_tags_and_misc>>
   <<meta_emitters_obj_inline_markup_table_of_contents>>
   <<meta_emitters_obj_inline_markup_private>>
-  <<meta_emitters_obj_inline_markup_heading_numbering_segment_anchor_tags>>
+  <<meta_emitters_obj_inline_markup_heading_numbering_segment_anchor_tags_0>>
+  <<meta_emitters_obj_inline_markup_heading_numbering_segment_anchor_tags_1>>
   <<meta_emitters_obj_inline_markup_close>>
                                                                                 /+ +/
   <<meta_emitters_obj_attributes>>
   <<meta_emitters_obj_attributes_public>>
   <<meta_emitters_obj_attributes_private>>
-  <<meta_emitters_obj_attributes_private_an_attribute>>
+  <<meta_emitters_obj_attributes_private_an_attribute_0>>
+  <<meta_emitters_obj_attributes_private_an_attribute_1>>
+  <<meta_emitters_obj_attributes_private_an_attribute_2>>
+  <<meta_emitters_obj_attributes_private_an_attribute_3>>
+  <<meta_emitters_obj_attributes_private_an_attribute_4>>
+  <<meta_emitters_obj_attributes_private_an_attribute_5>>
+  <<meta_emitters_obj_attributes_private_an_attribute_6>>
+  <<meta_emitters_obj_attributes_private_an_attribute_7>>
+  <<meta_emitters_obj_attributes_private_an_attribute_8>>
+  <<meta_emitters_obj_attributes_private_an_attribute_9>>
   <<meta_emitters_obj_attributes_private_json>>
   <<meta_emitters_obj_attributes_private_close>>
                                                                                 /+ +/
   <<meta_emitters_book_index_nugget>>
   <<meta_emitters_book_index_report_indented>>
-  <<meta_emitters_book_index_report_section>>
+  <<meta_emitters_book_index_report_section_0>>
+  <<meta_emitters_book_index_report_section_1>>
+  <<meta_emitters_book_index_report_section_2>>
+  <<meta_emitters_book_index_report_section_3>>
                                                                                 /+ +/
-  <<meta_emitters_endnotes>>
+  <<meta_emitters_endnotes_0>>
+  <<meta_emitters_endnotes_1>>
+  <<meta_emitters_endnotes_2>>
+  <<meta_emitters_endnotes_3>>
+  <<meta_emitters_endnotes_4>>
                                                                                 /+ +/
-  <<meta_emitters_bibliography>>
+  <<meta_emitters_bibliography_0>>
+  <<meta_emitters_bibliography_1>>
+  <<meta_emitters_bibliography_2>>
+  <<meta_emitters_bibliography_3>>
+  <<meta_emitters_bibliography_4>>
+  <<meta_emitters_bibliography_5>>
                                                                                 /+ +/
-  <<meta_emitters_metadata>>
+  <<meta_emitters_metadata_0>>
+  <<meta_emitters_metadata_1>>
+  <<meta_emitters_metadata_2>>
+  <<meta_emitters_metadata_3>>
                                                                                 /+ abstraction functions emitters ↑ +/
                                                                                 /+ ↓ abstraction functions assertions +/
   <<abs_functions_assertions>>
@@ -170,7 +298,7 @@ mixin spineRgxIn;
 *** initialize                                                   :initialize:
 **** declare enum
 
-#+NAME: abs_top_init_struct
+#+NAME: abs_top_init_struct_0
 #+BEGIN_SRC d
 @safe static auto eN() {
   struct _e {
@@ -228,7 +356,7 @@ mixin spineRgxIn;
 
 **** initialize general
 
-#+NAME: abs_top_init_struct
+#+NAME: abs_top_init_struct_1
 #+BEGIN_SRC d
 /+ initialize +/
 ObjGenericComposite[] the_table_of_contents_section;
@@ -320,7 +448,7 @@ enum DomTags { none, open, close, close_and_open, open_still, }
 
 **** method heading ancestors
 
-#+NAME: abs_top_init_struct
+#+NAME: abs_top_init_struct_2
 #+BEGIN_SRC d
 @safe pure ObjGenericComposite obj_heading_ancestors()(
   ObjGenericComposite  obj,
@@ -379,7 +507,7 @@ enum DomTags { none, open, close, close_and_open, open_still, }
 
 **** method dom markup tags
 
-#+NAME: abs_top_init_struct
+#+NAME: abs_top_init_struct_3
 #+BEGIN_SRC d
 @safe pure ObjGenericComposite obj_dom_structure_set_markup_tags()(
   ObjGenericComposite  obj,
@@ -429,7 +557,7 @@ enum DomTags { none, open, close, close_and_open, open_still, }
 
 **** method dom collapsed tags
 
-#+NAME: abs_top_init_struct
+#+NAME: abs_top_init_struct_4
 #+BEGIN_SRC d
 @safe pure ObjGenericComposite obj_dom_set_collapsed_tags()(
   ObjGenericComposite  obj,
@@ -479,7 +607,7 @@ enum DomTags { none, open, close, close_and_open, open_still, }
 
 **** method ocn emit
 
-#+NAME: abs_top_init_struct
+#+NAME: abs_top_init_struct_5
 #+BEGIN_SRC d
 @safe static auto ocn_emit(int ocn_status_flag) {
   return object_citation_number.ocn_emitter(ocn_status_flag);
@@ -568,7 +696,7 @@ enum sObj { content, anchor_tag, notes_reg, notes_star, links, image_no_dimensio
 
 *** scope
 
-#+NAME: abs_init_rest
+#+NAME: abs_init_rest_0
 #+BEGIN_SRC d
 scope(success) {
 }
@@ -589,7 +717,7 @@ scope(exit) {
 
 *** init rest
 
-#+NAME: abs_init_rest
+#+NAME: abs_init_rest_1
 #+BEGIN_SRC d
 mixin spineNode;
 auto node_para_int_    = node_metadata_para_int;
@@ -747,7 +875,7 @@ debug (substitutions) {
 ** 2. ↻ *LOOP* _loop: process document body_ [+6]                          :loop:
 *** Loop scope                                                        :scope:
 
-#+NAME: abs_in_loop_body_00
+#+NAME: abs_in_loop_body_00_0
 #+BEGIN_SRC d
 /+ scope +/
 scope(exit) {
@@ -775,7 +903,7 @@ debug(srclines) {
 
 *** check whether object number is on or turned off                     :ocn:
 
-#+NAME: abs_in_loop_body_00
+#+NAME: abs_in_loop_body_00_1
 #+BEGIN_SRC d
 if (!line.empty) {
   pith = line._check_ocn_status_(pith);
@@ -795,7 +923,7 @@ continue;
 **** _non code objects_ (non-code blocks & regular text: by line) [+4] :non_code:
 ***** inline fontface markup
 
-#+NAME: abs_in_loop_body_non_code_obj
+#+NAME: abs_in_loop_body_non_code_obj_0
 #+BEGIN_SRC d
 line = line.inline_markup_faces; // by text line (rather than by text object), linebreaks in para problematic
 #+END_SRC
@@ -803,7 +931,7 @@ line = line.inline_markup_faces; // by text line (rather than by text object), l
 ***** in section (biblio, glossary, blurb) +(block group)+ [+1]  :block:active:
 ****** in section: biblio                                            :biblio:
 
-#+NAME: abs_in_loop_body_non_code_obj
+#+NAME: abs_in_loop_body_non_code_obj_1
 #+BEGIN_SRC d
 if (line.matchFirst(rgx.heading_biblio)
 || (pith["section"] == eN.sect.bibliography
@@ -832,7 +960,7 @@ if there is a glossary section you need to:
   - need indentation and regular paragraph inline markup
 - reconstitute the document with the glossary section following the endnotes
 
-#+NAME: abs_in_loop_body_non_code_obj
+#+NAME: abs_in_loop_body_non_code_obj_2
 #+BEGIN_SRC d
 } else if (line.matchFirst(rgx.heading_glossary)
 || (pith["section"] == eN.sect.glossary
@@ -940,7 +1068,7 @@ if there is a blurb section you need to:
   - need regular paragraph inline markup
 - reconstitute the document with the blurb section at the very end of the doucment
 
-#+NAME: abs_in_loop_body_non_code_obj
+#+NAME: abs_in_loop_body_non_code_obj_3
 #+BEGIN_SRC d
 } else if (line.matchFirst(rgx.heading_blurb)
 || (pith["section"] == eN.sect.blurb
@@ -1093,14 +1221,14 @@ if there is a blurb section you need to:
 
 ***** in blocks [+1]                                           :block:active:
 
-#+NAME: abs_in_loop_body_non_code_obj
+#+NAME: abs_in_loop_body_non_code_obj_4
 #+BEGIN_SRC d
 } else if (pith["block_state"] == eN.blk_state.on) {
 #+END_SRC
 
 ****** in block: quote                                                :quote:
 
-#+NAME: abs_in_loop_body_non_code_obj
+#+NAME: abs_in_loop_body_non_code_obj_5
 #+BEGIN_SRC d
   if (pith["block_is"]    == eN.blk_is.quote) {
     line = line
@@ -1112,7 +1240,7 @@ if there is a blurb section you need to:
 
 ****** in block: group                                                :group:
 
-#+NAME: abs_in_loop_body_non_code_obj
+#+NAME: abs_in_loop_body_non_code_obj_6
 #+BEGIN_SRC d
   } else if (pith["block_is"]    == eN.blk_is.group) {
     line = line
@@ -1125,7 +1253,7 @@ if there is a blurb section you need to:
 
 ****** in block: block                                                :block:
 
-#+NAME: abs_in_loop_body_non_code_obj
+#+NAME: abs_in_loop_body_non_code_obj_7
 #+BEGIN_SRC d
   } else if (pith["block_is"]    == eN.blk_is.block) {
     line = line
@@ -1141,7 +1269,7 @@ if there is a blurb section you need to:
 
 ****** in block: poem                                                  :poem:
 
-#+NAME: abs_in_loop_body_non_code_obj
+#+NAME: abs_in_loop_body_non_code_obj_8
 #+BEGIN_SRC d
   } else if (pith["block_is"]    == eN.blk_is.poem) {
     an_object = line.flow_txt_block_poem(an_object, pith, cntr, object_number_poem, conf_make_meta, tag_in_seg);
@@ -1150,7 +1278,7 @@ if there is a blurb section you need to:
 
 ****** in block: table                                                :table:
 
-#+NAME: abs_in_loop_body_non_code_obj
+#+NAME: abs_in_loop_body_non_code_obj_9
 #+BEGIN_SRC d
   } else if (pith["block_is"]    == eN.blk_is.table) {
     an_object = line.flow_txt_block_table(an_object, pith, conf_make_meta);
@@ -1186,7 +1314,7 @@ continue;
 ****** line not empty [+2]
 ******* asserts                                                      :assert:
 
-#+NAME: abs_in_loop_body_not_block_obj
+#+NAME: abs_in_loop_body_not_block_obj_0
 #+BEGIN_SRC d
 assert(
   !line.empty,
@@ -1214,7 +1342,7 @@ if (pith["block_state"] == eN.blk_state.closing) {
 
 ******* book index                                                :bookindex:
 
-#+NAME: abs_in_loop_body_not_block_obj
+#+NAME: abs_in_loop_body_not_block_obj_1
 #+BEGIN_SRC d
 if (line.matchFirst(rgx.book_index_item)
 || line.matchFirst(rgx.book_index_item_open)
@@ -1224,14 +1352,14 @@ if (line.matchFirst(rgx.book_index_item)
 
 ******* not book index [+1]
 
-#+NAME: abs_in_loop_body_not_block_obj
+#+NAME: abs_in_loop_body_not_block_obj_2
 #+BEGIN_SRC d
 } else {                                                                       /+ not book_index +/
 #+END_SRC
 
 ******** matched: comment                                     :comment:match:
 
-#+NAME: abs_in_loop_body_not_block_obj
+#+NAME: abs_in_loop_body_not_block_obj_3
 #+BEGIN_SRC d
   an_object_key = "body_nugget";
   if (auto m = line.matchFirst(rgx.comment)) {                                 /+ matched comment +/
@@ -1253,7 +1381,7 @@ if (line.matchFirst(rgx.book_index_item)
 
 ******** flag !set & line !exist: heading or para         :heading:paragraph:
 
-#+NAME: abs_in_loop_body_not_block_obj
+#+NAME: abs_in_loop_body_not_block_obj_4
 #+BEGIN_SRC d
   } else if ((line_occur["para"] == eN.bi.off
     && line_occur["heading"] == eN.bi.off)
@@ -1298,7 +1426,7 @@ if (line.matchFirst(rgx.book_index_item)
 
 ******** line exist: heading                                        :heading:
 
-#+NAME: abs_in_loop_body_not_block_obj
+#+NAME: abs_in_loop_body_not_block_obj_5
 #+BEGIN_SRC d
   } else if (line_occur["heading"] > eN.bi.off) {                              /+ heading +/
     debug(heading) {
@@ -1310,7 +1438,7 @@ if (line.matchFirst(rgx.book_index_item)
 
 ******** line exist: para                                              :para:
 
-#+NAME: abs_in_loop_body_not_block_obj
+#+NAME: abs_in_loop_body_not_block_obj_6
 #+BEGIN_SRC d
   } else if (line_occur["para"] > eN.bi.off) {                                 /+ paragraph +/
     debug(para) {
@@ -1347,7 +1475,7 @@ an_object = line.flow_block_flag_line_empty_(
 ****** line empty [+1]
 ******* assert line empty                                            :assert:
 
-#+NAME: abs_in_loop_body_not_block_obj_line_empty
+#+NAME: abs_in_loop_body_not_block_obj_line_empty_0
 #+BEGIN_SRC d
 assert(
   line.empty,
@@ -1362,7 +1490,7 @@ assert(
 
 ******* heading object                                       :heading:object:
 
-#+NAME: abs_in_loop_body_not_block_obj_line_empty
+#+NAME: abs_in_loop_body_not_block_obj_line_empty_1
 #+BEGIN_SRC d
 if (_new_doc) {
   tag_assoc = tag_assoc.init;
@@ -1496,7 +1624,7 @@ if (pith["txt_is"] == eN.txt_is.heading
 
 ******* paragraph object                                   :paragraph:object:
 
-#+NAME: abs_in_loop_body_not_block_obj_line_empty
+#+NAME: abs_in_loop_body_not_block_obj_line_empty_2
 #+BEGIN_SRC d
 } else if (pith["txt_is"] == eN.txt_is.para
   && line_occur["para"] > eN.bi.off
@@ -1627,7 +1755,7 @@ if (the_document_body_section.length > 0) {
 *** tie up preparation of document sections
 **** endnotes section (scroll & seg)                               :endnotes:
 
-#+NAME: abs_post
+#+NAME: abs_post_0
 #+BEGIN_SRC d
 auto en_tuple
   = note_section.endnote_objects(obj_cite_digits, opt_action);
@@ -1647,7 +1775,7 @@ debug(endnotes) {
 
 **** no glossary section?                                          :glossary:
 
-#+NAME: abs_post
+#+NAME: abs_post_1
 #+BEGIN_SRC d
 if (an_object["glossary_nugget"].length == 0) {
   comp_obj_heading_                                   = comp_obj_heading_.init;
@@ -1676,7 +1804,7 @@ debug(glossary) {
 
 **** bibliography section (objects)                            :bibliography:
 
-#+NAME: abs_post
+#+NAME: abs_post_2
 #+BEGIN_SRC d
 auto biblio_unsorted_incomplete = biblio_arr_json.dup;
 auto biblio = Bibliography();
@@ -1684,7 +1812,7 @@ auto biblio_ordered
   = biblio.flow_bibliography_(biblio_unsorted_incomplete, bib_arr_json);
 #+END_SRC
 
-#+NAME: abs_post
+#+NAME: abs_post_3
 #+BEGIN_SRC d
 if (biblio_ordered.length > 0) {
   {
@@ -1792,7 +1920,7 @@ if (biblio_ordered.length > 0) {
 }
 #+END_SRC
 
-#+NAME: abs_post
+#+NAME: abs_post_4
 #+BEGIN_SRC d
 debug(bibliosection) {
   foreach (o; the_bibliography_section) {
@@ -1837,7 +1965,7 @@ JSONValue biblio_entry_tags_jsonstr =  `{
 
 **** bookindex section (scroll & seg)                            :book:index:
 
-#+NAME: abs_post
+#+NAME: abs_post_5
 #+BEGIN_SRC d
 auto bi = BookIndexReportSection();
 auto bi_tuple
@@ -1858,7 +1986,7 @@ debug(bookindex) {
 
 **** no blurb section?                                                :blurb:
 
-#+NAME: abs_post
+#+NAME: abs_post_6
 #+BEGIN_SRC d
 if (an_object["blurb_nugget"].length == 0) {
   comp_obj_heading_                                   = comp_obj_heading_.init;
@@ -1889,7 +2017,7 @@ debug(blurb) {
 
 **** toc backmatter, table of contents backmatter (scroll & seg)   :contents:
 
-#+NAME: abs_post
+#+NAME: abs_post_7
 #+BEGIN_SRC d
 indent = [
   "hang_position" : 1,
@@ -1990,7 +2118,7 @@ debug(toc) {
 
 **** doc head (separate document head from body, make space for toc)
 
-#+NAME: abs_post
+#+NAME: abs_post_8
 #+BEGIN_SRC d
 the_document_head_section ~= the_document_body_section[0];
 the_document_body_section = the_document_body_section[1..$];
@@ -2014,7 +2142,7 @@ NOTE there are issues attempting to do this on first pass as:
 ***** Methods
 ****** get ancestors markup
 
-#+NAME: abs_post
+#+NAME: abs_post_9
 #+BEGIN_SRC d
 @safe int[] _get_ancestors_markup(O)(O obj, ref int[] _ancestors_markup) {
   if (obj.metainfo.is_a == "heading") {
@@ -2107,7 +2235,7 @@ NOTE there are issues attempting to do this on first pass as:
 
 ****** get ancestors collapsed
 
-#+NAME: abs_post
+#+NAME: abs_post_10
 #+BEGIN_SRC d
 @safe int[] _get_ancestors_collapsed(O)(O obj, ref int[] _ancestors_collapsed) {
   if (obj.metainfo.is_a == "heading") {
@@ -2200,7 +2328,7 @@ NOTE there are issues attempting to do this on first pass as:
 - substantive object numbers already exist
 - number un-numbered non-substantive text
 
-#+NAME: abs_post
+#+NAME: abs_post_11
 #+BEGIN_SRC d
 /+ multiple 1~ levels, loop through document body +/
 if (the_document_body_section.length > 1) {
@@ -2228,7 +2356,7 @@ if (the_document_body_section.length > 1) {
 
 ***** ↻ Loop section: endnotes [en]
 
-#+NAME: abs_post
+#+NAME: abs_post_12
 #+BEGIN_SRC d
 if (the_endnotes_section.length > 1) {
   segnames["html"] ~= "endnotes";
@@ -2249,7 +2377,7 @@ if (the_endnotes_section.length > 1) {
 
 ***** ↻ Loop section: glossary [gl]
 
-#+NAME: abs_post
+#+NAME: abs_post_13
 #+BEGIN_SRC d
 if (the_glossary_section.length > 1) {
   segnames["html"] ~= "glossary";
@@ -2270,7 +2398,7 @@ if (the_glossary_section.length > 1) {
 
 ***** ↻ Loop section: bibliography [bb]
 
-#+NAME: abs_post
+#+NAME: abs_post_14
 #+BEGIN_SRC d
 if (the_bibliography_section.length > 1) {
   segnames["html"] ~= "bibliography";
@@ -2291,7 +2419,7 @@ if (the_bibliography_section.length > 1) {
 
 ***** ↻ Loop section: book index [bi]
 
-#+NAME: abs_post
+#+NAME: abs_post_15
 #+BEGIN_SRC d
 if (the_bookindex_section.length > 1) {
   segnames["html"] ~= "bookindex";
@@ -2312,7 +2440,7 @@ if (the_bookindex_section.length > 1) {
 
 ***** ↻ Loop section: blurb [bl]
 
-#+NAME: abs_post
+#+NAME: abs_post_16
 #+BEGIN_SRC d
 if (the_blurb_section.length > 1) {
   segnames["html"] ~= "blurb";
@@ -2372,7 +2500,7 @@ Build here:
 ***** Methods
 ****** decendants
 
-#+NAME: abs_post
+#+NAME: abs_post_17
 #+BEGIN_SRC d
 @safe auto get_decendants()(ObjGenericComposite[] document_sections) {
   int[string] _heading_ocn_decendants;
@@ -2425,7 +2553,7 @@ Build here:
 
 ****** images: extract
 
-#+NAME: abs_post
+#+NAME: abs_post_18
 #+BEGIN_SRC d
 string[] _images;
 @safe string[] extract_images()(string content_block) {
@@ -2440,7 +2568,7 @@ string[] segnames_0_to_4;
 
 ****** images: dimensions
 
-#+NAME: abs_post
+#+NAME: abs_post_19
 #+BEGIN_SRC d
 @system auto _image_dimensions(O,M)(O obj, M manifested) {
   if (obj.has.image_without_dimensions) {
@@ -2493,7 +2621,7 @@ string[] segnames_0_to_4;
       - book index
     - footnotes and footnote numbers
 
-#+NAME: abs_post
+#+NAME: abs_post_20
 #+BEGIN_SRC d
 @safe auto _links(O)(O obj) {
   if (auto m = obj.text.match(rgx.inline_link_stow_uri)) {
@@ -2518,7 +2646,7 @@ string[] segnames_0_to_4;
 
 ***** ↻ Loop section: head
 
-#+NAME: abs_post
+#+NAME: abs_post_21
 #+BEGIN_SRC d
 foreach (ref obj; the_document_head_section) {
   if (obj.metainfo.is_a == "heading") {
@@ -2550,7 +2678,7 @@ foreach (ref obj; the_document_head_section) {
 
 ***** ↻ Loop section: toc [to]
 
-#+NAME: abs_post
+#+NAME: abs_post_22
 #+BEGIN_SRC d
 if (the_table_of_contents_section.length > 1) {
   /+ scroll +/
@@ -2580,7 +2708,7 @@ if (the_table_of_contents_section.length > 1) {
 
 ***** ↻ Loop section: document body [bd]
 
-#+NAME: abs_post
+#+NAME: abs_post_23
 #+BEGIN_SRC d
 /+ multiple 1~ levels, loop through document body +/
 if (the_document_body_section.length > 1) {
@@ -2631,7 +2759,7 @@ auto image_list = (_images.sort()).uniq;
 
 - endnotes have their own number, (also use in node) and they belong to calling object
 
-#+NAME: abs_post
+#+NAME: abs_post_24
 #+BEGIN_SRC d
 /+ optional only one 1~ level +/
 if (the_endnotes_section.length > 1) {
@@ -2676,7 +2804,7 @@ if (the_endnotes_section.length > 1) {
 
 - add glossary numbering, (also use in node) no need to show in text
 
-#+NAME: abs_post
+#+NAME: abs_post_25
 #+BEGIN_SRC d
 /+ optional only one 1~ level +/
 if (the_glossary_section.length > 1) {
@@ -2721,7 +2849,7 @@ if (the_glossary_section.length > 1) {
 
 - add bibliography numbering, (also use in node) no need to show in text
 
-#+NAME: abs_post
+#+NAME: abs_post_26
 #+BEGIN_SRC d
 /+ optional only one 1~ level +/
 if (the_bibliography_section.length > 1) {
@@ -2766,7 +2894,7 @@ if (the_bibliography_section.length > 1) {
 
 - add book index numbering?, (also use in node) no need to show in text
 
-#+NAME: abs_post
+#+NAME: abs_post_27
 #+BEGIN_SRC d
 /+ optional only one 1~ level +/
 int ocn_       = obj_cite_digits.object_number;
@@ -2821,7 +2949,7 @@ if (the_bookindex_section.length > 1) {                                        /
 
 ***** ↻ Loop section: blurb [bl]
 
-#+NAME: abs_post
+#+NAME: abs_post_28
 #+BEGIN_SRC d
 /+ optional only one 1~ level +/
 if (the_blurb_section.length > 1) {
@@ -2864,7 +2992,7 @@ if (the_blurb_section.length > 1) {
 
 ***** ↻ Loop sections: get decendants
 
-#+NAME: abs_post
+#+NAME: abs_post_29
 #+BEGIN_SRC d
 if (the_document_body_section.length > 1) {
   auto pairs = get_decendants(
@@ -2962,7 +3090,7 @@ if (the_document_body_section.length > 1) {
 
 **** TODO update BUG?
 
-#+NAME: abs_post
+#+NAME: abs_post_30
 #+BEGIN_SRC d
   /+ TODO
     - note create/insert heading object sole purpose eof close all open tags
@@ -3000,7 +3128,7 @@ comp_obj_heading_ = comp_obj_heading_.obj_heading_ancestors(lv_ancestors_txt);
 ** 4. _return document tuple_                                            :post:
 *** _the document_                                                   :document:
 
-#+NAME: abs_post
+#+NAME: abs_post_31
 #+BEGIN_SRC d
 ObjGenericComposite[][string] document_the = [
   "head":             the_document_head_section,
@@ -3020,7 +3148,7 @@ ObjGenericComposite[][string] document_the = [
 
 *** document _section keys_ sequence
 
-#+NAME: abs_post
+#+NAME: abs_post_32
 #+BEGIN_SRC d
 string[][string] document_section_keys_sequenced = [
   "scroll": ["head", "toc", "body",],
@@ -3068,7 +3196,7 @@ if ((opt_action.html)
 
 *** dup
 
-#+NAME: abs_post
+#+NAME: abs_post_33
 #+BEGIN_SRC d
 string[] segnames_4                 = segnames["html"].dup;
 string[] segnames_lv1_to_4          = segnames["epub"].dup;
@@ -3080,7 +3208,7 @@ debug(segnames) {
 
 *** clean out structure
 
-#+NAME: abs_post
+#+NAME: abs_post_34
 #+BEGIN_SRC d
 destroy(the_document_head_section);
 destroy(the_table_of_contents_section);
@@ -3270,7 +3398,7 @@ functions used in document abstraction
 *** make substitutions
 **** project
 
-#+NAME: abs_functions_substitutions
+#+NAME: abs_functions_substitutions_0
 #+BEGIN_SRC d
 @safe char[] _doc_header_and_make_substitutions_(CMM)(
   char[]  line,
@@ -3291,7 +3419,7 @@ functions used in document abstraction
 
 **** fontface
 
-#+NAME: abs_functions_substitutions
+#+NAME: abs_functions_substitutions_1
 #+BEGIN_SRC d
 @safe char[] _doc_header_and_make_substitutions_fontface_(CMM)(
   char[]  line,
@@ -3324,7 +3452,7 @@ functions used in document abstraction
 **** block start (open) block                                         :start:
 ***** { block starts function
 
-#+NAME: abs_functions_block
+#+NAME: abs_functions_block_0
 #+BEGIN_SRC d
 @safe void flow_txt_block_start()(
              char[]         line,
@@ -3336,14 +3464,14 @@ functions used in document abstraction
 
 ****** block (various) curly open                                     :curly:
 
-#+NAME: abs_functions_block
+#+NAME: abs_functions_block_1
 #+BEGIN_SRC d
   static auto rgx = RgxI();
 #+END_SRC
 
 ******* code
 
-#+NAME: abs_functions_block
+#+NAME: abs_functions_block_2
 #+BEGIN_SRC d
   if (auto m = line.matchFirst(rgx.block_curly_code_open)) {
     dochas["codeblock"]++;
@@ -3363,7 +3491,7 @@ functions used in document abstraction
 
 ******* poem
 
-#+NAME: abs_functions_block
+#+NAME: abs_functions_block_3
 #+BEGIN_SRC d
   } else if (auto m = line.matchFirst(rgx.block_curly_poem_open)) {
     dochas["poem"]++;
@@ -3385,7 +3513,7 @@ functions used in document abstraction
 
 ******* group
 
-#+NAME: abs_functions_block
+#+NAME: abs_functions_block_4
 #+BEGIN_SRC d
   } else if (auto m = line.matchFirst(rgx.block_curly_group_open)) {
     dochas["group"]++;
@@ -3405,7 +3533,7 @@ functions used in document abstraction
 
 ******* block
 
-#+NAME: abs_functions_block
+#+NAME: abs_functions_block_5
 #+BEGIN_SRC d
   } else if (auto m = line.matchFirst(rgx.block_curly_block_open)) {
     dochas["block"]++;
@@ -3425,7 +3553,7 @@ functions used in document abstraction
 
 ******* quote
 
-#+NAME: abs_functions_block
+#+NAME: abs_functions_block_6
 #+BEGIN_SRC d
   } else if (auto m = line.matchFirst(rgx.block_curly_quote_open)) {
     dochas["quote"]++;
@@ -3445,7 +3573,7 @@ functions used in document abstraction
 
 ******* table
 
-#+NAME: abs_functions_block
+#+NAME: abs_functions_block_7
 #+BEGIN_SRC d
   } else if (auto m = line.matchFirst(rgx.block_curly_table_open)) {           /+ curly table open +/
     debug(table) {                             // table (curly) open
@@ -3464,7 +3592,7 @@ functions used in document abstraction
 
 ******* table special
 
-#+NAME: abs_functions_block
+#+NAME: abs_functions_block_8
 #+BEGIN_SRC d
   } else if (auto m = line.matchFirst(rgx.block_curly_table_special_markup)) { /+ table: special table block markup syntax! +/
     dochas["table"]++;
@@ -3478,7 +3606,7 @@ functions used in document abstraction
 ****** block (various) tic open                                         :tic:
 ******* code
 
-#+NAME: abs_functions_block
+#+NAME: abs_functions_block_9
 #+BEGIN_SRC d
   } else if (auto m = line.matchFirst(rgx.block_tic_code_open)) {
     dochas["codeblock"]++;
@@ -3498,7 +3626,7 @@ functions used in document abstraction
 
 ******* poem
 
-#+NAME: abs_functions_block
+#+NAME: abs_functions_block_10
 #+BEGIN_SRC d
   } else if (auto m = line.matchFirst(rgx.block_tic_poem_open)) {
     dochas["poem"]++;
@@ -3520,7 +3648,7 @@ functions used in document abstraction
 
 ******* group
 
-#+NAME: abs_functions_block
+#+NAME: abs_functions_block_11
 #+BEGIN_SRC d
   } else if (auto m = line.matchFirst(rgx.block_tic_group_open)) {
     dochas["group"]++;
@@ -3540,7 +3668,7 @@ functions used in document abstraction
 
 ******* block
 
-#+NAME: abs_functions_block
+#+NAME: abs_functions_block_12
 #+BEGIN_SRC d
   } else if (auto m = line.matchFirst(rgx.block_tic_block_open)) {
     dochas["block"]++;
@@ -3560,7 +3688,7 @@ functions used in document abstraction
 
 ******* quote
 
-#+NAME: abs_functions_block
+#+NAME: abs_functions_block_13
 #+BEGIN_SRC d
   } else if (auto m = line.matchFirst(rgx.block_tic_quote_open)) {
     dochas["quote"]++;
@@ -3580,7 +3708,7 @@ functions used in document abstraction
 
 ******* table
 
-#+NAME: abs_functions_block
+#+NAME: abs_functions_block_14
 #+BEGIN_SRC d
   } else if (auto m = line.matchFirst(rgx.block_tic_table_open)) {             /+ tic table open +/
     debug(table) {                             // table (tic) open
@@ -3600,7 +3728,7 @@ functions used in document abstraction
 
 ***** }
 
-#+NAME: abs_functions_block
+#+NAME: abs_functions_block_15
 #+BEGIN_SRC d
 }
 #+END_SRC
@@ -3659,7 +3787,7 @@ functions used in document abstraction
 ***** biblio block                                                   :biblio:
 ****** biblio tag map
 
-#+NAME: abs_functions_block_biblio
+#+NAME: abs_functions_block_biblio_0
 #+BEGIN_SRC d
 @safe final string biblio_tag_map()(string abr) {
   auto btm = [
@@ -3711,7 +3839,7 @@ final string biblio_tag_map_()(string abr) {
 
 ****** biblio block
 
-#+NAME: abs_functions_block_biblio
+#+NAME: abs_functions_block_biblio_1
 #+BEGIN_SRC d
 @system void flow_txt_block_biblio(
   char[]                  line,
@@ -4325,7 +4453,7 @@ process and use an_object["table_head"] (then empty it)
   - table_column_widths, int[] column widths (as given or calculate average)
   - show table walls, bool
 
-#+NAME: abs_functions_block_line_status_empty
+#+NAME: abs_functions_block_line_status_empty_0
 #+BEGIN_SRC d
 @system void flow_table_closed_make_special_notation_table_(N,CMM)(
              char[]                line,
@@ -4374,7 +4502,7 @@ process and use an_object["table_head"] (then empty it)
 
 ***** { line empty, _make block_
 
-#+NAME: abs_functions_block_line_status_empty
+#+NAME: abs_functions_block_line_status_empty_1
 #+BEGIN_SRC d
 @system string[string] flow_block_flag_line_empty_(B,N,CMM,Ts)(
              char[]                   line,
@@ -4404,7 +4532,7 @@ process and use an_object["table_head"] (then empty it)
 
 ****** make: quote block
 
-#+NAME: abs_functions_block_line_status_empty
+#+NAME: abs_functions_block_line_status_empty_2
 #+BEGIN_SRC d
   if (pith["block_state"] == eN.blk_state.closing) {
     if (pith["block_is"] == eN.blk_is.quote) {
@@ -4463,7 +4591,7 @@ process and use an_object["table_head"] (then empty it)
 
 ****** make: group block
 
-#+NAME: abs_functions_block_line_status_empty
+#+NAME: abs_functions_block_line_status_empty_3
 #+BEGIN_SRC d
     } else if (pith["block_is"] == eN.blk_is.group) {
       obj_cite_digits = ocn_emit(pith["ocn"]);
@@ -4521,7 +4649,7 @@ process and use an_object["table_head"] (then empty it)
 
 ****** make: block
 
-#+NAME: abs_functions_block_line_status_empty
+#+NAME: abs_functions_block_line_status_empty_4
 #+BEGIN_SRC d
     } else if (pith["block_is"] == eN.blk_is.block) {
       obj_cite_digits = ocn_emit(pith["ocn"]);
@@ -4578,7 +4706,7 @@ process and use an_object["table_head"] (then empty it)
 
 ****** make: poem
 
-#+NAME: abs_functions_block_line_status_empty
+#+NAME: abs_functions_block_line_status_empty_5
 #+BEGIN_SRC d
     } else if (pith["block_is"] == eN.blk_is.poem) {
       an_object["bookindex_nugget"]
@@ -4622,7 +4750,7 @@ process and use an_object["table_head"] (then empty it)
 
 ****** make: code block
 
-#+NAME: abs_functions_block_line_status_empty
+#+NAME: abs_functions_block_line_status_empty_6
 #+BEGIN_SRC d
     } else if (pith["block_is"] == eN.blk_is.code) {
       obj_cite_digits = ocn_emit(pith["ocn"]);
@@ -4680,7 +4808,7 @@ process and use an_object["table_head"] (then empty it)
 
 ****** make: table
 
-#+NAME: abs_functions_block_line_status_empty
+#+NAME: abs_functions_block_line_status_empty_7
 #+BEGIN_SRC d
     } else if (pith["block_is"]    == eN.blk_is.table) {
       comp_obj_block = comp_obj_block.init;
@@ -4730,7 +4858,7 @@ process and use an_object["table_head"] (then empty it)
 
 ***** }
 
-#+NAME: abs_functions_block_line_status_empty
+#+NAME: abs_functions_block_line_status_empty_8
 #+BEGIN_SRC d
   }
   return an_object;
@@ -4796,7 +4924,7 @@ process and use an_object["table_head"] (then empty it)
 *** heading or paragraph                                  :heading:paragraph:
 **** heading found                                                  :heading:
 
-#+NAME: abs_functions_heading
+#+NAME: abs_functions_heading_0
 #+BEGIN_SRC d
 @safe string[string] flow_heading_found_()(
              char[]                line,
@@ -4883,7 +5011,7 @@ process and use an_object["table_head"] (then empty it)
 
 **** heading make set                                               :heading:
 
-#+NAME: abs_functions_heading
+#+NAME: abs_functions_heading_1
 #+BEGIN_SRC d
 @safe char[] flow_heading_make_set_()(
              char[]                line,
@@ -4945,7 +5073,7 @@ process and use an_object["table_head"] (then empty it)
 
 **** heading match                                                  :heading:
 
-#+NAME: abs_functions_heading
+#+NAME: abs_functions_heading_2
 #+BEGIN_SRC d
 @safe string[string] flow_heading_matched_(CMM)(
              char[]          line,
@@ -5101,7 +5229,7 @@ process and use an_object["table_head"] (then empty it)
 
 **** para match                                                        :para:
 
-#+NAME: abs_functions_para
+#+NAME: abs_functions_para_0
 #+BEGIN_SRC d
 @safe string[string] flow_para_match_()(
              char[]         line,
@@ -5160,7 +5288,7 @@ process and use an_object["table_head"] (then empty it)
 
 **** text font face
 
-#+NAME: abs_functions_para
+#+NAME: abs_functions_para_1
 #+BEGIN_SRC d
 @safe char[] font_faces_line()(
   char[]  textline,
@@ -5197,7 +5325,7 @@ process and use an_object["table_head"] (then empty it)
 
 ***** table instructions
 
-#+NAME: abs_functions_table
+#+NAME: abs_functions_table_0
 #+BEGIN_SRC d
 @safe ObjGenericComposite flow_table_instructions(H)(
   return ref ObjGenericComposite  table_object,
@@ -5228,7 +5356,7 @@ process and use an_object["table_head"] (then empty it)
 
 ***** table array munge
 
-#+NAME: abs_functions_table
+#+NAME: abs_functions_table_1
 #+BEGIN_SRC d
 @safe ObjGenericComposite flow_table_array_munge(T)(
   return ref ObjGenericComposite  table_object,
@@ -5358,7 +5486,7 @@ process and use an_object["table_head"] (then empty it)
 
 ***** table substantive munge
 
-#+NAME: abs_functions_table
+#+NAME: abs_functions_table_2
 #+BEGIN_SRC d
 @system ObjGenericComposite flow_table_substantive_munge(T)(
   return ref ObjGenericComposite  table_object,
@@ -5380,7 +5508,7 @@ process and use an_object["table_head"] (then empty it)
 
 ***** table substantive munge special
 
-#+NAME: abs_functions_table
+#+NAME: abs_functions_table_3
 #+BEGIN_SRC d
 @system ObjGenericComposite flow_table_substantive_munge_special(T)(
   return ref ObjGenericComposite  table_object,
@@ -5460,7 +5588,7 @@ process and use an_object["table_head"] (then empty it)
 
 ****** { struct, inline markup munge
 
-#+NAME: meta_emitters_obj_inline_markup_munge
+#+NAME: meta_emitters_obj_inline_markup_munge_0
 #+BEGIN_SRC d
 @safe static struct ObjInlineMarkupMunge {
   string[string] obj_txt;
@@ -5478,7 +5606,7 @@ process and use an_object["table_head"] (then empty it)
   }
 #+END_SRC
 
-#+NAME: meta_emitters_obj_inline_markup_munge
+#+NAME: meta_emitters_obj_inline_markup_munge_1
 #+BEGIN_SRC d
   @safe static auto images()(string obj_txt_in) {
     static auto mng = InlineMarkup();
@@ -5514,7 +5642,7 @@ process and use an_object["table_head"] (then empty it)
 
 ******* footnotes endnotes markup
 
-#+NAME: meta_emitters_obj_inline_markup_munge
+#+NAME: meta_emitters_obj_inline_markup_munge_2
 #+BEGIN_SRC d
   @safe TxtPlusHasFootnotes footnotes_endnotes_markup_and_number_or_stars()(string obj_txt_in, bool reset_note_numbers) {
     /+ endnotes (regular) +/
@@ -5591,7 +5719,7 @@ process and use an_object["table_head"] (then empty it)
 
 ******* object notes and links
 
-#+NAME: meta_emitters_obj_inline_markup_munge
+#+NAME: meta_emitters_obj_inline_markup_munge_3
 #+BEGIN_SRC d
   @safe private TxtPlusHasFootnotesUrlsImages object_notes_and_links_()(
     string obj_txt_in,
@@ -5662,7 +5790,7 @@ process and use an_object["table_head"] (then empty it)
 - identified text by heading level marker followed by text until two new lines
 - general markup
 
-#+NAME: meta_emitters_obj_inline_markup_munge
+#+NAME: meta_emitters_obj_inline_markup_munge_4
 #+BEGIN_SRC d
   @safe auto munge_heading()(
     string obj_txt_in,
@@ -5693,7 +5821,7 @@ process and use an_object["table_head"] (then empty it)
   - footnotes/endnotes
   - links
 
-#+NAME: meta_emitters_obj_inline_markup_munge
+#+NAME: meta_emitters_obj_inline_markup_munge_5
 #+BEGIN_SRC d
   @safe auto munge_para()(string obj_txt_in) {
     obj_txt["munge"] = (obj_txt_in)
@@ -5712,7 +5840,7 @@ process and use an_object["table_head"] (then empty it)
 
 ******* quote
 
-#+NAME: meta_emitters_obj_inline_markup_munge
+#+NAME: meta_emitters_obj_inline_markup_munge_6
 #+BEGIN_SRC d
   @safe string munge_quote()(string obj_txt_in) {
     obj_txt["munge"] = obj_txt_in;
@@ -5732,7 +5860,7 @@ process and use an_object["table_head"] (then empty it)
 - drop spaces
 - keep newlines?
 
-#+NAME: meta_emitters_obj_inline_markup_munge
+#+NAME: meta_emitters_obj_inline_markup_munge_7
 #+BEGIN_SRC d
   @safe auto munge_group(string obj_txt_in) {
     TxtPlusHasFootnotesUrlsImages t = object_notes_and_links_(obj_txt_in.split("\n\n").join(" \\\\\n \\\\\n"));
@@ -5753,7 +5881,7 @@ process and use an_object["table_head"] (then empty it)
 - keep newlines
 - newlines detected and kept?
 
-#+NAME: meta_emitters_obj_inline_markup_munge
+#+NAME: meta_emitters_obj_inline_markup_munge_8
 #+BEGIN_SRC d
   @safe auto munge_block()(string obj_txt_in) {
     TxtPlusHasFootnotesUrlsImages t = object_notes_and_links_(obj_txt_in);
@@ -5772,7 +5900,7 @@ process and use an_object["table_head"] (then empty it)
   - footnotes/endnotes
   - links?
 
-#+NAME: meta_emitters_obj_inline_markup_munge
+#+NAME: meta_emitters_obj_inline_markup_munge_9
 #+BEGIN_SRC d
   @safe auto munge_verse()(string obj_txt_in) {
     TxtPlusHasFootnotesUrlsImages t = object_notes_and_links_(obj_txt_in);
@@ -5790,7 +5918,7 @@ process and use an_object["table_head"] (then empty it)
 - no general markup
 - one special character represented by mkup.nbsp ░
 
-#+NAME: meta_emitters_obj_inline_markup_munge
+#+NAME: meta_emitters_obj_inline_markup_munge_10
 #+BEGIN_SRC d
   @safe string munge_code()(string obj_txt_in) {
     obj_txt_in = obj_txt_in.replaceAll(rgx.space, mkup.nbsp);
@@ -5805,7 +5933,7 @@ process and use an_object["table_head"] (then empty it)
 - table block identified by open an close tags
 - table markup
 
-#+NAME: meta_emitters_obj_inline_markup_munge
+#+NAME: meta_emitters_obj_inline_markup_munge_11
 #+BEGIN_SRC d
   @safe string munge_table()(string obj_txt_in) {
     obj_txt["munge"] = obj_txt_in;
@@ -5817,7 +5945,7 @@ process and use an_object["table_head"] (then empty it)
 
 ******* comment
 
-#+NAME: meta_emitters_obj_inline_markup_munge
+#+NAME: meta_emitters_obj_inline_markup_munge_12
 #+BEGIN_SRC d
   @safe string munge_comment()(string obj_txt_in) {
     obj_txt["munge"] = obj_txt_in;
@@ -5829,7 +5957,7 @@ process and use an_object["table_head"] (then empty it)
 
 ****** }
 
-#+NAME: meta_emitters_obj_inline_markup_munge
+#+NAME: meta_emitters_obj_inline_markup_munge_13
 #+BEGIN_SRC d
 }
 #+END_SRC
@@ -6054,7 +6182,7 @@ private:
 
 ******** make heading number & segment anchor tags if instructed :markup:inline:segment:anchor:tags:
 
-#+NAME: meta_emitters_obj_inline_markup_heading_numbering_segment_anchor_tags
+#+NAME: meta_emitters_obj_inline_markup_heading_numbering_segment_anchor_tags_0
 #+BEGIN_SRC d
   static int[] heading_num = [ 0, 0, 0, 0 ];
   static string heading_number_auto_composite = "";
@@ -6207,7 +6335,7 @@ private:
 
 ******** make segment anchor tags if not provided :markup:inline:segment:anchor:tags:
 
-#+NAME: meta_emitters_obj_inline_markup_heading_numbering_segment_anchor_tags
+#+NAME: meta_emitters_obj_inline_markup_heading_numbering_segment_anchor_tags_1
 #+BEGIN_SRC d
   static int heading_num_lev1 = 0;
   @safe static string _make_segment_anchor_tags_if_none_provided()(
@@ -6338,7 +6466,7 @@ struct ObjAttributes {
 
 ******** para & blocks
 
-#+NAME: meta_emitters_obj_attributes_private_an_attribute
+#+NAME: meta_emitters_obj_attributes_private_an_attribute_0
 #+BEGIN_SRC d
   @safe string txt_para_and_blocks()(string obj_txt_in) {
     if (obj_txt_in.matchFirst(rgx.para_bullet)) {
@@ -6368,7 +6496,7 @@ struct ObjAttributes {
 
 ******** heading
 
-#+NAME: meta_emitters_obj_attributes_private_an_attribute
+#+NAME: meta_emitters_obj_attributes_private_an_attribute_1
 #+BEGIN_SRC d
   @safe string txt_heading()(string obj_txt_in) {
     _obj_attributes = " \"use\": \"content\","
@@ -6382,7 +6510,7 @@ struct ObjAttributes {
 
 ******** para
 
-#+NAME: meta_emitters_obj_attributes_private_an_attribute
+#+NAME: meta_emitters_obj_attributes_private_an_attribute_2
 #+BEGIN_SRC d
   @safe string txt_para()(string obj_txt_in) {
     _obj_attributes = " \"use\": \"content\","
@@ -6396,7 +6524,7 @@ struct ObjAttributes {
 
 ******** quote
 
-#+NAME: meta_emitters_obj_attributes_private_an_attribute
+#+NAME: meta_emitters_obj_attributes_private_an_attribute_3
 #+BEGIN_SRC d
   @safe string txt_quote()(string obj_txt_in) {
     _obj_attributes = " \"use\": \"content\","
@@ -6410,7 +6538,7 @@ struct ObjAttributes {
 
 ******** group
 
-#+NAME: meta_emitters_obj_attributes_private_an_attribute
+#+NAME: meta_emitters_obj_attributes_private_an_attribute_4
 #+BEGIN_SRC d
   @safe string txt_group()(string obj_txt_in) {
     _obj_attributes = " \"use\": \"content\","
@@ -6424,7 +6552,7 @@ struct ObjAttributes {
 
 ******** block
 
-#+NAME: meta_emitters_obj_attributes_private_an_attribute
+#+NAME: meta_emitters_obj_attributes_private_an_attribute_5
 #+BEGIN_SRC d
   @safe string txt_block()(string obj_txt_in) {
     _obj_attributes = " \"use\": \"content\","
@@ -6438,7 +6566,7 @@ struct ObjAttributes {
 
 ******** verse
 
-#+NAME: meta_emitters_obj_attributes_private_an_attribute
+#+NAME: meta_emitters_obj_attributes_private_an_attribute_6
 #+BEGIN_SRC d
   @safe string txt_verse()(string obj_txt_in) {
     _obj_attributes = " \"use\": \"content\","
@@ -6452,7 +6580,7 @@ struct ObjAttributes {
 
 ******** code
 
-#+NAME: meta_emitters_obj_attributes_private_an_attribute
+#+NAME: meta_emitters_obj_attributes_private_an_attribute_7
 #+BEGIN_SRC d
   @safe string txt_code()(string obj_txt_in) {
     _obj_attributes = " \"use\": \"content\","
@@ -6466,7 +6594,7 @@ struct ObjAttributes {
 
 ******** table
 
-#+NAME: meta_emitters_obj_attributes_private_an_attribute
+#+NAME: meta_emitters_obj_attributes_private_an_attribute_8
 #+BEGIN_SRC d
   @safe string txt_table()(string obj_txt_in) {
     _obj_attributes = " \"use\": \"content\","
@@ -6480,7 +6608,7 @@ struct ObjAttributes {
 
 ******** comment
 
-#+NAME: meta_emitters_obj_attributes_private_an_attribute
+#+NAME: meta_emitters_obj_attributes_private_an_attribute_9
 #+BEGIN_SRC d
   @safe string txt_comment()(string obj_txt_in) {
     _obj_attributes = " \"use\": \"comment\","
@@ -6642,7 +6770,7 @@ struct BookIndexReportIndent {
 ***** book index (sort &) report section                     :report:section:
 ****** { book index struct open
 
-#+NAME: meta_emitters_book_index_report_section
+#+NAME: meta_emitters_book_index_report_section_0
 #+BEGIN_SRC d
 struct BookIndexReportSection {
   int  mkn, skn;
@@ -6652,7 +6780,7 @@ struct BookIndexReportSection {
 
 ******* bookindex write section
 
-#+NAME: meta_emitters_book_index_report_section
+#+NAME: meta_emitters_book_index_report_section_1
 #+BEGIN_SRC d
   @safe void bookindex_write_section()(
     string[][string][string] bookindex_unordered_hashes
@@ -6687,7 +6815,7 @@ struct BookIndexReportSection {
 
 ******* book index (sort &) build section                    :report:section:
 
-#+NAME: meta_emitters_book_index_report_section
+#+NAME: meta_emitters_book_index_report_section_2
 #+BEGIN_SRC d
   @system auto bookindex_build_abstraction_section(N,B)(
     string[][string][string] bookindex_unordered_hashes,
@@ -6850,14 +6978,14 @@ struct BookIndexReportSection {
 
 ****** }
 
-#+NAME: meta_emitters_book_index_report_section
+#+NAME: meta_emitters_book_index_report_section_3
 #+BEGIN_SRC d
 }
 #+END_SRC
 
 **** (end)notes section                                    :endnotes:section:
 
-#+NAME: meta_emitters_endnotes
+#+NAME: meta_emitters_endnotes_0
 #+BEGIN_SRC d
 struct NotesSection {
   string[string] object_notes;
@@ -6868,7 +6996,7 @@ struct NotesSection {
 
 ***** { gather notes for endnote section struct open
 
-#+NAME: meta_emitters_endnotes
+#+NAME: meta_emitters_endnotes_1
 #+BEGIN_SRC d
   @safe private auto gather_notes_for_endnote_section(
     ObjGenericComposite[] contents_am,
@@ -6954,7 +7082,7 @@ struct NotesSection {
 
 ****** gathered notes
 
-#+NAME: meta_emitters_endnotes
+#+NAME: meta_emitters_endnotes_2
 #+BEGIN_SRC d
   @safe private auto gathered_notes() {
     string[][string] endnotes_;
@@ -6971,7 +7099,7 @@ struct NotesSection {
 
 ****** endnote objects
 
-#+NAME: meta_emitters_endnotes
+#+NAME: meta_emitters_endnotes_3
 #+BEGIN_SRC d
   @safe private auto endnote_objects(N,O)(
     N              obj_cite_digits,
@@ -7087,7 +7215,7 @@ struct NotesSection {
 
 ***** }
 
-#+NAME: meta_emitters_endnotes
+#+NAME: meta_emitters_endnotes_4
 #+BEGIN_SRC d
 }
 #+END_SRC
@@ -7095,14 +7223,14 @@ struct NotesSection {
 **** bibliography                                              :bibliography:
 ***** { biblio struct
 
-#+NAME: meta_emitters_bibliography
+#+NAME: meta_emitters_bibliography_0
 #+BEGIN_SRC d
 struct Bibliography {
 #+END_SRC
 
 ****** biblio
 
-#+NAME: meta_emitters_bibliography
+#+NAME: meta_emitters_bibliography_1
 #+BEGIN_SRC d
 @system public JSONValue[] flow_bibliography_()(
     return ref string[]    biblio_unsorted_incomplete,
@@ -7133,7 +7261,7 @@ struct Bibliography {
 
 ****** biblio unsorted complete
 
-#+NAME: meta_emitters_bibliography
+#+NAME: meta_emitters_bibliography_2
 #+BEGIN_SRC d
   @system final private JSONValue[] biblio_make_unsorted_array_of_json_objects()(
     string[]      biblio_unordered,
@@ -7167,7 +7295,7 @@ struct Bibliography {
 
 ****** biblio sort
 
-#+NAME: meta_emitters_bibliography
+#+NAME: meta_emitters_bibliography_3
 #+BEGIN_SRC d
   @system final private JSONValue[] biblio_sort()(JSONValue[] biblio_unordered) {
     JSONValue[] biblio_sorted_;
@@ -7188,7 +7316,7 @@ struct Bibliography {
 
 ****** biblio debug
 
-#+NAME: meta_emitters_bibliography
+#+NAME: meta_emitters_bibliography_4
 #+BEGIN_SRC d
   @system void biblio_debug()(JSONValue[] biblio_sorted) {
     debug(biblio0) {
@@ -7203,7 +7331,7 @@ struct Bibliography {
 
 ***** }
 
-#+NAME: meta_emitters_bibliography
+#+NAME: meta_emitters_bibliography_5
 #+BEGIN_SRC d
 }
 #+END_SRC
@@ -7211,7 +7339,7 @@ struct Bibliography {
 **** node structure metadata                        :structure:metadata:node:
 ***** { metadata node struct
 
-#+NAME: meta_emitters_metadata
+#+NAME: meta_emitters_metadata_0
 #+BEGIN_SRC d
 struct NodeStructureMetadata {
   int lv, lv0, lv1, lv2, lv3, lv4, lv5, lv6, lv7;
@@ -7222,7 +7350,7 @@ struct NodeStructureMetadata {
 
 ****** node metadata emitter
 
-#+NAME: meta_emitters_metadata
+#+NAME: meta_emitters_metadata_1
 #+BEGIN_SRC d
   @safe ObjGenericComposite node_location_emitter(La,Ta,N)(
     string         lev_markup_number,
@@ -7282,7 +7410,7 @@ struct NodeStructureMetadata {
 
 ****** node metadata emitter heading, (including most segnames & their pointers)
 
-#+NAME: meta_emitters_metadata
+#+NAME: meta_emitters_metadata_2
 #+BEGIN_SRC d
   @safe ObjGenericComposite node_emitter_heading(Hd,TaL,TA,N,fNr,fNs,fL)(
     string         _text,
@@ -7484,7 +7612,7 @@ struct NodeStructureMetadata {
 
 ***** }
 
-#+NAME: meta_emitters_metadata
+#+NAME: meta_emitters_metadata_3
 #+BEGIN_SRC d
 }
 #+END_SRC
@@ -7711,7 +7839,16 @@ set abstracted objects for downstream processing
 module doc_reform.meta.metadoc_object_setter;
 template ObjectSetter() {
   /+ structs +/
-  <<meta_structs_init>>
+  <<meta_structs_init_0>>
+  <<meta_structs_init_1>>
+  <<meta_structs_init_2>>
+  <<meta_structs_init_3>>
+  <<meta_structs_init_4>>
+  <<meta_structs_init_5>>
+  <<meta_structs_init_6>>
+  <<meta_structs_init_7>>
+  <<meta_structs_init_8>>
+  <<meta_structs_init_9>>
 }
 #+END_SRC
 
@@ -7732,7 +7869,7 @@ struct HeadingAttrib {
 
 *** _composite object_ [#A]
 
-#+NAME: meta_structs_init
+#+NAME: meta_structs_init_0
 #+BEGIN_SRC d
 struct DocObj_MetaInfo_ {
   string                 is_of_part                           = ""; // frontmatter, body, backmatter
@@ -7811,7 +7948,7 @@ struct DocObj_MetaInfo_ {
 
 **** object text attributes
 
-#+NAME: meta_structs_init
+#+NAME: meta_structs_init_1
 #+BEGIN_SRC d
 struct DocObj_TxtAttrib_ {
   int                    indent_base                         = 0;
@@ -7823,7 +7960,7 @@ struct DocObj_TxtAttrib_ {
 
 **** object has within it
 
-#+NAME: meta_structs_init
+#+NAME: meta_structs_init_2
 #+BEGIN_SRC d
 struct DocObj_Has_ {
   bool                   inline_links                        = false;
@@ -7836,7 +7973,7 @@ struct DocObj_Has_ {
 
 **** table attributes
 
-#+NAME: meta_structs_init
+#+NAME: meta_structs_init_3
 #+BEGIN_SRC d
 struct DocObj_Table_ {
   int                    number_of_columns                   = 0;
@@ -7849,7 +7986,7 @@ struct DocObj_Table_ {
 
 **** code attributes
 
-#+NAME: meta_structs_init
+#+NAME: meta_structs_init_4
 #+BEGIN_SRC d
 struct DocObj_CodeBlock_ {
   string                 syntax                              = "";
@@ -7859,7 +7996,7 @@ struct DocObj_CodeBlock_ {
 
 **** stow (things to be protected from regular text transformations, so far links)
 
-#+NAME: meta_structs_init
+#+NAME: meta_structs_init_5
 #+BEGIN_SRC d
 struct DocObj_Stow_ {
   string[]               link                               = [];
@@ -7868,7 +8005,7 @@ struct DocObj_Stow_ {
 
 **** pointers
 
-#+NAME: meta_structs_init
+#+NAME: meta_structs_init_6
 #+BEGIN_SRC d
 struct DocObj_Pointer_ {
   int                    doc_object                          = 0;
@@ -7879,7 +8016,7 @@ struct DocObj_Pointer_ {
 
 **** tags
 
-#+NAME: meta_structs_init
+#+NAME: meta_structs_init_7
 #+BEGIN_SRC d
 struct DocObj_Tags_ {
   string[]               heading_ancestors_text              = [ "", "", "", "", "", "", "", "", ];
@@ -7898,7 +8035,7 @@ struct DocObj_Tags_ {
 
 **** composite object the parts
 
-#+NAME: meta_structs_init
+#+NAME: meta_structs_init_8
 #+BEGIN_SRC d
 struct ObjGenericComposite {
   string                 text                                = "";
@@ -7915,7 +8052,7 @@ struct ObjGenericComposite {
 
 *** The Objects: generic composite object array
 
-#+NAME: meta_structs_init
+#+NAME: meta_structs_init_9
 #+BEGIN_SRC d
 struct TheObjects {
   ObjGenericComposite[] oca;
diff --git a/org/out_cgi_search_sqlite.org b/org/out_cgi_search_sqlite.org
index f9b90d0..df98ed9 100644
--- a/org/out_cgi_search_sqlite.org
+++ b/org/out_cgi_search_sqlite.org
@@ -7,6 +7,7 @@
 #+COPYRIGHT:   Copyright (C) 2015 - 2020 Ralph Amissah
 #+LANGUAGE:    en
 #+STARTUP:     content hideblocks hidestars noindent entitiespretty
+#+OPTIONS:     H:3 num:nil toc:t \n:nil @:t ::t |:t ^:nil _:nil -:t f:t *:t <:t
 #+PROPERTY:    header-args  :exports code
 #+PROPERTY:    header-args+ :noweb yes
 #+PROPERTY:    header-args+ :eval no
@@ -99,21 +100,33 @@ void cgi_function_intro(Cgi cgi) {
   <<cgi_sqlite_initialize_text>>
   <<cgi_sqlite_initialize_rgx>>
   <<cgi_sqlite_initialize_fields>>
-  <<cgi_sqlite_initialize_env>>
+  <<cgi_sqlite_initialize_env_0>>
+  <<cgi_sqlite_initialize_env_1>>
   <<cgi_sqlite_initialize_tail>>
   <<cgi_sqlite_initialize_sql_select>>
   <<cgi_sqlite_initialize_canned_url>>
   <<cgi_sqlite_initialize_regex_for_canned_search>>
   <<cgi_sqlite_initialize_show_matched_objects>>
   <<cgi_sqlite_initialize_previous_next>>
-<<cgi_sqlite_header>>
+<<cgi_sqlite_header_0>>
+<<cgi_sqlite_header_1>>
+<<cgi_sqlite_header_2>>
 <<cgi_sqlite_table>>
-<<cgi_sqlite_form>>
+<<cgi_sqlite_form_0>>
+<<cgi_sqlite_form_1>>
+<<cgi_sqlite_form_2>>
+<<cgi_sqlite_form_3>>
       "%s",
-<<cgi_sqlite_form_post>>
+<<cgi_sqlite_form_post_0>>
+<<cgi_sqlite_form_post_1>>
   <<cgi_sqlite_write>>
   <<cgi_sqlite_set_db>>
 <<cgi_sqlite_select_statement_0>>
+<<cgi_sqlite_select_statement_1>>
+<<cgi_sqlite_select_statement_2>>
+<<cgi_sqlite_select_statement_3>>
+<<cgi_sqlite_select_statement_4>>
+<<cgi_sqlite_select_statement_5>>
   <<cgi_sqlite_db_close>>
 <<cgi_sqlite_db_tail>>
 }
@@ -409,7 +422,7 @@ auto text_fields() {
 ***** env
 ****** POST
 
-#+NAME: cgi_sqlite_initialize_env
+#+NAME: cgi_sqlite_initialize_env_0
 #+BEGIN_SRC d
   if (environment.get("REQUEST_METHOD", "POST") == "POST") {
     if ("sf" in cgi.post) {
@@ -559,7 +572,7 @@ auto text_fields() {
 
 ****** GET
 
-#+NAME: cgi_sqlite_initialize_env
+#+NAME: cgi_sqlite_initialize_env_1
 #+BEGIN_SRC d
   } else if (environment.get("REQUEST_METHOD", "POST") == "GET") {
     got.canned_query = environment.get("QUERY_STRING", "");
@@ -814,7 +827,7 @@ string show_matched_objects (string fn) {
 
 **** format
 
-#+NAME: cgi_sqlite_header
+#+NAME: cgi_sqlite_header_0
 #+BEGIN_SRC d
   {
     header = format(q"┃
@@ -822,7 +835,7 @@ string show_matched_objects (string fn) {
 
 **** html
 
-#+NAME: cgi_sqlite_header
+#+NAME: cgi_sqlite_header_1
 #+BEGIN_SRC html
 <!DOCTYPE html>
 <html>
@@ -839,7 +852,7 @@ string show_matched_objects (string fn) {
 
 **** css
 
-#+NAME: cgi_sqlite_header
+#+NAME: cgi_sqlite_header_2
 #+BEGIN_SRC css
    *{
     padding                  : 0px;
@@ -1667,7 +1680,7 @@ string show_matched_objects (string fn) {
 
 *** cgi html form
 
-#+NAME: cgi_sqlite_form
+#+NAME: cgi_sqlite_form_0
 #+BEGIN_SRC d
   {
     string post_value(string field_name, string type="box", string set="on") {
@@ -1710,7 +1723,7 @@ string show_matched_objects (string fn) {
 
 **** canned search
 
-#+NAME: cgi_sqlite_form
+#+NAME: cgi_sqlite_form_1
 #+BEGIN_SRC d
     string the_can(string fv) {
       string show_the_can = post_value("url");
@@ -1748,7 +1761,7 @@ string show_matched_objects (string fn) {
 
 **** provide tip
 
-#+NAME: cgi_sqlite_form
+#+NAME: cgi_sqlite_form_2
 #+BEGIN_SRC d
     string provide_tip() {
       string searched_tip = post_value("se");
@@ -1785,7 +1798,7 @@ string show_matched_objects (string fn) {
 **** the form
 ***** form html
 
-#+NAME: cgi_sqlite_form
+#+NAME: cgi_sqlite_form_3
 #+BEGIN_SRC html
     form = format(q"┃
 <form action="%%s" id="SubmitForm" method="post" accept-charset="UTF-8">
@@ -1823,7 +1836,7 @@ string show_matched_objects (string fn) {
 
 ***** form values
 
-#+NAME: cgi_sqlite_form_post
+#+NAME: cgi_sqlite_form_post_0
 #+BEGIN_SRC d
       (post_value("ec") == "checked") ? post_value("sf", "field") : "",
       provide_tip,
@@ -1843,7 +1856,7 @@ string show_matched_objects (string fn) {
 
 **** set value (debug)
 
-#+NAME: cgi_sqlite_form_post
+#+NAME: cgi_sqlite_form_post_1
 #+BEGIN_SRC d
     {
       string set_value(string field_name, string default_val) {
@@ -2008,7 +2021,7 @@ auto db = Database(conf.db_path ~ cv.db_selected);
 
 **** db SELECT statement, the body
 
-#+NAME: cgi_sqlite_select_statement_0
+#+NAME: cgi_sqlite_select_statement_1
 #+BEGIN_SRC sql
       sql_select.the_body ~= format(q"┃
 SELECT
@@ -2051,7 +2064,7 @@ LIMIT %%s OFFSET %%s
 **** html write selected
 ***** head
 
-#+NAME: cgi_sqlite_select_statement_0
+#+NAME: cgi_sqlite_select_statement_2
 #+BEGIN_SRC d
       (cv.checked_sql)
       ? cgi.write(previous_next
@@ -2100,7 +2113,7 @@ LIMIT %%s OFFSET %%s
 
 ***** text found
 
-#+NAME: cgi_sqlite_select_statement_0
+#+NAME: cgi_sqlite_select_statement_3
 #+BEGIN_SRC d
           if (cv.results_type == "txt") {
             if (row["ocn"].as!string != "0") {
@@ -2143,7 +2156,7 @@ LIMIT %%s OFFSET %%s
 
 ***** ocn index
 
-#+NAME: cgi_sqlite_select_statement_0
+#+NAME: cgi_sqlite_select_statement_4
 #+BEGIN_SRC d
           } else {
             if (row["ocn"].as!string != "0") {
@@ -2176,7 +2189,7 @@ LIMIT %%s OFFSET %%s
 
 ***** tail
 
-#+NAME: cgi_sqlite_select_statement_0
+#+NAME: cgi_sqlite_select_statement_5
 #+BEGIN_SRC d
         }
         cgi.write( previous_next);
diff --git a/org/out_harvest_metadata.org b/org/out_harvest_metadata.org
index 424803f..4c32e37 100644
--- a/org/out_harvest_metadata.org
+++ b/org/out_harvest_metadata.org
@@ -7,6 +7,7 @@
 #+COPYRIGHT:   Copyright (C) 2015 - 2020 Ralph Amissah
 #+LANGUAGE:    en
 #+STARTUP:     content hideblocks hidestars noindent entitiespretty
+#+OPTIONS:     H:3 num:nil toc:t \n:nil @:t ::t |:t ^:nil _:nil -:t f:t *:t <:t
 #+PROPERTY:    header-args  :exports code
 #+PROPERTY:    header-args+ :noweb yes
 #+PROPERTY:    header-args+ :eval no
@@ -138,7 +139,8 @@ template spineMetaDocHarvestsTopics() {
   ) {
       <<harvested_html_search>>
       <<harvested_topics>>
-<<harvested_html_themes>>
+<<harvested_html_themes_0>>
+<<harvested_html_themes_1>>
 <<harvested_topics_html_head_1>>
 <<harvested_html_head>>
 <<harvested_topics_html_head_2>>
@@ -477,7 +479,8 @@ template spineMetaDocHarvestsAuthors() {
     O  _opt_action,
   ) {
       <<harvested_html_search>>
-<<harvested_html_themes>>
+<<harvested_html_themes_0>>
+<<harvested_html_themes_1>>
 <<harvested_authors_html_head_1>>
 <<harvested_html_head>>
 <<harvested_authors_html_head_2>>
@@ -621,7 +624,7 @@ if (_opt_action.verbose
 *** themes
 **** head
 
-#+NAME: harvested_html_themes
+#+NAME: harvested_html_themes_0
 #+BEGIN_SRC d
 string theme_dark_0 = format(q"┃
   body {
@@ -717,7 +720,7 @@ string theme_light_0 = format(q"┃
 
 **** levels
 
-#+NAME: harvested_html_themes
+#+NAME: harvested_html_themes_1
 #+BEGIN_SRC d
 string theme_dark_1 = format(q"┃
   h1 {
diff --git a/org/out_latex.org b/org/out_latex.org
index c9610c3..ff56f47 100644
--- a/org/out_latex.org
+++ b/org/out_latex.org
@@ -7,6 +7,7 @@
 #+COPYRIGHT:   Copyright (C) 2015 - 2020 Ralph Amissah
 #+LANGUAGE:    en
 #+STARTUP:     content hideblocks hidestars noindent entitiespretty
+#+OPTIONS:     H:3 num:nil toc:t \n:nil @:t ::t |:t ^:nil _:nil -:t f:t *:t <:t
 #+PROPERTY:    header-args  :exports code
 #+PROPERTY:    header-args+ :noweb yes
 #+PROPERTY:    header-args+ :eval no
@@ -29,26 +30,89 @@ template outputLaTeX() {
   static auto rgx = RgxO();
   mixin spineLanguageCodes;
   auto lang = Lang();
-  <<output_latex_shared>>
-<<output_latex_shared_0>>
-  <<output_latex_head>>
-<<output_latex_head_1_tex>>
-  <<output_latex_head_1_format_string_variables>>
-  <<output_latex_head_0_format_string>>
-<<output_latex_head_0_tex>>
-  <<output_latex_head_0_format_string_variables>>
+  <<output_latex_shared_a_0>>
+  <<output_latex_shared_a_1>>
+  <<output_latex_shared_a_2>>
+  <<output_latex_shared_a_3>>
+  <<output_latex_shared_a_4>>
+  <<output_latex_shared_a_5>>
+  <<output_latex_shared_a_6>>
+  <<output_latex_shared_a_7>>
+  <<output_latex_shared_a_8>>
+  <<output_latex_shared_a_9>>
+  <<output_latex_shared_a_10>>
+  <<output_latex_shared_a_11>>
+<<output_latex_shared_b_0>>
+<<output_latex_shared_b_1>>
+<<output_latex_shared_b_2>>
+<<output_latex_shared_b_3>>
+<<output_latex_shared_b_4>>
+<<output_latex_shared_b_5>>
+<<output_latex_shared_b_6>>
+  <<output_latex_head_0>>
+  <<output_latex_head_1>>
+  <<output_latex_head_2>>
+  <<output_latex_head_3>>
+<<output_latex_head_b_tex_0>>
+<<output_latex_head_b_tex_1>>
+<<output_latex_head_b_tex_2>>
+<<output_latex_head_b_tex_3>>
+<<output_latex_head_b_tex_4>>
+<<output_latex_head_b_tex_5>>
+<<output_latex_head_b_tex_6>>
+<<output_latex_head_b_tex_7>>
+<<output_latex_head_b_tex_8>>
+<<output_latex_head_b_tex_9>>
+<<output_latex_head_b_tex_10>>
+<<output_latex_head_b_tex_11>>
+<<output_latex_head_b_tex_12>>
+<<output_latex_head_b_tex_13>>
+<<output_latex_head_b_tex_14>>
+<<output_latex_head_b_tex_15>>
+<<output_latex_head_b_tex_16>>
+<<output_latex_head_b_tex_17>>
+  <<output_latex_head_b_format_string_variables>>
+  <<output_latex_head_format_string_0>>
+  <<output_latex_head_format_string_1>>
+  <<output_latex_head_format_string_2>>
+  <<output_latex_head_format_string_3>>
+<<output_latex_head_tex_0>>
+<<output_latex_head_tex_1>>
+<<output_latex_head_tex_2>>
+<<output_latex_head_tex_3>>
+<<output_latex_head_tex_4>>
+<<output_latex_head_tex_5>>
+<<output_latex_head_tex_6>>
+<<output_latex_head_tex_7>>
+<<output_latex_head_tex_8>>
+<<output_latex_head_tex_9>>
+<<output_latex_head_tex_10>>
+<<output_latex_head_tex_11>>
+<<output_latex_head_tex_12>>
+<<output_latex_head_tex_13>>
+<<output_latex_head_tex_14>>
+  <<output_latex_head_a_format_string_variables>>
   <<output_latex_head_close>>
-  <<output_latex_body>>
-  <<output_latex_tail>>
+  <<output_latex_body_0>>
+  <<output_latex_body_1>>
+  <<output_latex_body_2>>
+  <<output_latex_body_3>>
+  <<output_latex_body_4>>
+  <<output_latex_body_5>>
+  <<output_latex_body_6>>
+  <<output_latex_tail_0>>
+  <<output_latex_tail_1>>
 <<output_latex_tail_tex>>
-  <<output_latex_tail_close>>
-  <<output_latex>>
+  <<output_latex_tail_close_0>>
+  <<output_latex_tail_close_1>>
+  <<output_latex_0>>
+  <<output_latex_1>>
 }
 #+END_SRC
 
 ** write latex output                                             :latex:out:
 
-#+NAME: output_latex
+#+NAME: output_latex_0
 #+BEGIN_SRC d
 void writeOutputLaTeX(T,M)(
   const T      latex_content,
@@ -90,7 +154,7 @@ void writeOutputLaTeX(T,M)(
 
 ** latex output hub [#A]                                      :latex:pdf:out:
 
-#+NAME: output_latex
+#+NAME: output_latex_1
 #+BEGIN_SRC d
 void outputLaTeX(D,M)(
   const    D   doc_abstraction,
@@ -128,7 +192,7 @@ import doc_reform.io_out;
 ** shared
 *** paper dimensions (struct)
 
-#+NAME: output_latex_shared
+#+NAME: output_latex_shared_a_0
 #+BEGIN_SRC d
     auto paper() {
       struct PaperType {
@@ -295,7 +359,7 @@ import doc_reform.io_out;
 *** latex \escape special characters
 **** general
 
-#+NAME: output_latex_shared
+#+NAME: output_latex_shared_a_1
 #+BEGIN_SRC d
 @safe string sp_char_esc(O)(
   string      _txt,
@@ -324,7 +388,7 @@ import doc_reform.io_out;
 }
 #+END_SRC
 
-#+NAME: output_latex_shared
+#+NAME: output_latex_shared_a_2
 #+BEGIN_SRC d
 @safe string sp_char_esc_txt()(
   string      _txt,
@@ -366,7 +430,7 @@ import doc_reform.io_out;
 
 - bold, italics, underscore, strikethrough
 
-#+NAME: output_latex_shared
+#+NAME: output_latex_shared_a_3
 #+BEGIN_SRC d
 @safe string fontface()(
   string      _txt,
@@ -389,7 +453,7 @@ _txt = _txt
 **** spaces
 ***** leading hardspace
 
-#+NAME: output_latex_shared
+#+NAME: output_latex_shared_a_4
 #+BEGIN_SRC d
 @safe string leading_hardspaces()(
   string      _txt,
@@ -406,7 +470,7 @@ _txt = _txt
 
 ***** nbsp character
 
-#+NAME: output_latex_shared
+#+NAME: output_latex_shared_a_5
 #+BEGIN_SRC d
 @safe string nbsp_char()(string _txt) {
   if (_txt.match(rgx.nbsp_char)) {
@@ -418,7 +482,7 @@ _txt = _txt
 
 ***** remove nbsp character
 
-#+NAME: output_latex_shared
+#+NAME: output_latex_shared_a_6
 #+BEGIN_SRC d
 @safe string nbsp_char_to_space()(string _txt) {
   if (_txt.match(rgx.nbsp_char)) {
@@ -431,7 +495,7 @@ _txt = _txt
 **** links and images
 ***** links / urls
 
-#+NAME: output_latex_shared
+#+NAME: output_latex_shared_a_7
 #+BEGIN_SRC d
 @safe string links_and_images(O,M)(
   string      _txt,
@@ -483,7 +547,7 @@ _txt = _txt
 *** footnotes
 **** footnotes
 
-#+NAME: output_latex_shared
+#+NAME: output_latex_shared_a_8
 #+BEGIN_SRC d
 @safe string footnotes()(
   string      _txt,
@@ -504,7 +568,7 @@ _txt = _txt
 
 **** footnote remove
 
-#+NAME: output_latex_shared
+#+NAME: output_latex_shared_a_9
 #+BEGIN_SRC d
 @safe string remove_footnotes()(
   string      _txt,
@@ -519,7 +583,7 @@ _txt = _txt
 *** para
 **** para
 
-#+NAME: output_latex_shared
+#+NAME: output_latex_shared_a_10
 #+BEGIN_SRC d
 @safe string para(O)(
   string      _txt,
@@ -540,7 +604,7 @@ _txt = _txt
 
 **** bookindex para
 
-#+NAME: output_latex_shared
+#+NAME: output_latex_shared_a_11
 #+BEGIN_SRC d
 @safe string bookindex(O)(
   string      _txt,
@@ -561,7 +625,7 @@ _txt = _txt
 
 *** bullets & indentation
 
-#+NAME: output_latex_head
+#+NAME: output_latex_head_0
 #+BEGIN_SRC d
 @safe string bullets_and_indentation(O)(
   string      _txt,
@@ -606,7 +670,7 @@ _txt = _txt
 
 *** heading
 
-#+NAME: output_latex_shared_0
+#+NAME: output_latex_shared_b_0
 #+BEGIN_SRC d
   @safe string heading(O,M)(
     string      _txt,
@@ -780,7 +844,7 @@ _txt = _txt
 
 - (hardspace not honored) clear hardspace marker
 
-#+NAME: output_latex_shared_0
+#+NAME: output_latex_shared_b_1
 #+BEGIN_SRC d
 string group(O,M)(
   string      _txt,
@@ -808,7 +872,7 @@ string group(O,M)(
 
 - (hardspace honored) \hardspace
 
-#+NAME: output_latex_shared_0
+#+NAME: output_latex_shared_b_2
 #+BEGIN_SRC d
 string block(O,M)(
   string      _txt,
@@ -840,7 +904,7 @@ string block(O,M)(
 
 - (hardspace honored) \hardspace
 
-#+NAME: output_latex_shared_0
+#+NAME: output_latex_shared_b_3
 #+BEGIN_SRC d
 string verse(O,M)(
   string      _txt,
@@ -872,7 +936,7 @@ string verse(O,M)(
 
 - (hardspace honored) \begin{lstlisting} clear hardspace marker
 
-#+NAME: output_latex_shared_0
+#+NAME: output_latex_shared_b_4
 #+BEGIN_SRC d
 string codeblock(O,M)(
   string      _txt,
@@ -904,7 +968,7 @@ string codeblock(O,M)(
 
 ***** tablarize
 
-#+NAME: output_latex_shared_0
+#+NAME: output_latex_shared_b_5
 #+BEGIN_SRC d
 auto tablarize(O)(
   string            _txt,
@@ -943,7 +1007,7 @@ auto tablarize(O)(
 
 ***** table
 
-#+NAME: output_latex_shared_0
+#+NAME: output_latex_shared_b_6
 #+BEGIN_SRC d
 string table(O,M)(
   string      _txt,
@@ -1003,7 +1067,7 @@ string table(O,M)(
 *** latex head                                                         :head:
 **** latex head function
 
-#+NAME: output_latex_head
+#+NAME: output_latex_head_1
 #+BEGIN_SRC d
 string latex_head(M)(
   M      doc_matters,
@@ -1015,7 +1079,7 @@ string latex_head(M)(
 ***** paper type dimensions
 ****** struct
 
-#+NAME: output_latex_head
+#+NAME: output_latex_head_2
 #+BEGIN_SRC d
   struct paperTypeLatex {
     string a4_portrait;
@@ -1034,7 +1098,7 @@ string latex_head(M)(
 
 ****** footer
 
-#+NAME: output_latex_head
+#+NAME: output_latex_head_3
 #+BEGIN_SRC d
   string _footer(M)(M doc_matters) {
     string _ft = "\\lfoot[\\textrm{\\thepage}]";
@@ -1069,7 +1133,7 @@ string latex_head(M)(
 ***** paper margins
 ****** struct
 
-#+NAME: output_latex_head_1_tex
+#+NAME: output_latex_head_b_tex_0
 #+BEGIN_SRC d
   struct paperMargins {
     string portrait;
@@ -1080,19 +1144,19 @@ string latex_head(M)(
 
 ****** portrait
 
-#+NAME: output_latex_head_1_tex
+#+NAME: output_latex_head_b_tex_1
 #+BEGIN_SRC d
   margins.portrait    = format(q"┃
 #+END_SRC
 
-#+NAME: output_latex_head_1_tex
+#+NAME: output_latex_head_b_tex_2
 #+BEGIN_SRC latex
 \setlength{\oddsidemargin}{0mm} \setlength{\evensidemargin}{0mm}
 \setlength{\topmargin}{-12pt} \setlength{\headheight}{12pt}
 \setlength{\headsep}{35pt}
 #+END_SRC
 
-#+NAME: output_latex_head_1_tex
+#+NAME: output_latex_head_b_tex_3
 #+BEGIN_SRC d
 ┃",
   );
@@ -1100,19 +1164,19 @@ string latex_head(M)(
 
 ****** landscape
 
-#+NAME: output_latex_head_1_tex
+#+NAME: output_latex_head_b_tex_4
 #+BEGIN_SRC d
   margins.landscape    = format(q"┃
 #+END_SRC
 
-#+NAME: output_latex_head_1_tex
+#+NAME: output_latex_head_b_tex_5
 #+BEGIN_SRC latex
 \setlength{\oddsidemargin}{6mm} \setlength{\evensidemargin}{6mm}
 \setlength{\topmargin}{-12mm} \setlength{\headheight}{12pt}
 \setlength{\headsep}{20pt}
 #+END_SRC
 
-#+NAME: output_latex_head_1_tex
+#+NAME: output_latex_head_b_tex_6
 #+BEGIN_SRC d
 ┃",
   );
@@ -1121,7 +1185,7 @@ string latex_head(M)(
 ***** multicol
 ****** struct
 
-#+NAME: output_latex_head_1_tex
+#+NAME: output_latex_head_b_tex_7
 #+BEGIN_SRC d
   struct columnsMulti {
     string portrait;
@@ -1132,17 +1196,17 @@ string latex_head(M)(
 
 ****** portrait
 
-#+NAME: output_latex_head_1_tex
+#+NAME: output_latex_head_b_tex_8
 #+BEGIN_SRC d
   multicol.portrait    = format(q"┃
 #+END_SRC
 
-#+NAME: output_latex_head_1_tex
+#+NAME: output_latex_head_b_tex_9
 #+BEGIN_SRC latex
 \usepackage{multicol}
 #+END_SRC
 
-#+NAME: output_latex_head_1_tex
+#+NAME: output_latex_head_b_tex_10
 #+BEGIN_SRC d
 ┃",
   );
@@ -1150,7 +1214,7 @@ string latex_head(M)(
 
 ****** landscape
 
-#+NAME: output_latex_head_1_tex
+#+NAME: output_latex_head_b_tex_11
 #+BEGIN_SRC d
   multicol.landscape    = "";
 #+END_SRC
@@ -1158,7 +1222,7 @@ string latex_head(M)(
 ***** color links
 ****** struct
 
-#+NAME: output_latex_head_1_tex
+#+NAME: output_latex_head_b_tex_12
 #+BEGIN_SRC d
   struct colorLinks {
     string mono;
@@ -1169,12 +1233,12 @@ string latex_head(M)(
 
 ****** mono
 
-#+NAME: output_latex_head_1_tex
+#+NAME: output_latex_head_b_tex_13
 #+BEGIN_SRC d
   links.mono    = format(q"┃
 #+END_SRC
 
-#+NAME: output_latex_head_1_tex
+#+NAME: output_latex_head_b_tex_14
 #+BEGIN_SRC latex
 \usepackage[xetex,
   colorlinks=true,
@@ -1183,7 +1247,7 @@ string latex_head(M)(
   linkcolor=myblack,
 #+END_SRC
 
-#+NAME: output_latex_head_1_tex
+#+NAME: output_latex_head_b_tex_15
 #+BEGIN_SRC d
 ┃",
   );
@@ -1191,12 +1255,12 @@ string latex_head(M)(
 
 ****** color
 
-#+NAME: output_latex_head_1_tex
+#+NAME: output_latex_head_b_tex_16
 #+BEGIN_SRC d
   links.color    = format(q"┃
 #+END_SRC
 
-#+NAME: output_latex_head_1_tex
+#+NAME: output_latex_head_b_tex_17
 #+BEGIN_SRC latex
 \usepackage[xetex,
   colorlinks=true,
@@ -1205,7 +1269,7 @@ string latex_head(M)(
   linkcolor=myred,    %% \href{...} and \pageref{...}
 #+END_SRC
 
-#+NAME: output_latex_head_1_format_string_variables
+#+NAME: output_latex_head_b_format_string_variables
 #+BEGIN_SRC d
 ┃",
   );
@@ -1215,7 +1279,7 @@ string latex_head(M)(
 ***** dimensions & orientation
 ****** set
 
-#+NAME: output_latex_head_0_format_string
+#+NAME: output_latex_head_format_string_0
 #+BEGIN_SRC d
     string set_paper(P)(P paper_set,) {
       string paper_type_description;
@@ -1246,7 +1310,7 @@ string latex_head(M)(
 
 ***** (a4, a5, b4, letter, legal) * (portrait & landscape)
 
-#+NAME: output_latex_head_0_format_string
+#+NAME: output_latex_head_format_string_1
 #+BEGIN_SRC d
   string paper_size_orientation_latex;
   switch (paper_size_orientation) {
@@ -1266,7 +1330,7 @@ string latex_head(M)(
 
 ***** set color links
 
-#+NAME: output_latex_head_0_format_string
+#+NAME: output_latex_head_format_string_2
 #+BEGIN_SRC d
   string links_mono_or_color_set = links.mono.strip;
   if (
@@ -1284,14 +1348,14 @@ string latex_head(M)(
 
 ***** format latex head, open
 
-#+NAME: output_latex_head_0_format_string
+#+NAME: output_latex_head_format_string_3
 #+BEGIN_SRC d
   string _latex_head = format(q"┃%%%% spine LaTeX output
 #+END_SRC
 
 ***** description comment
 
-#+NAME: output_latex_head_0_tex
+#+NAME: output_latex_head_tex_0
 #+BEGIN_SRC latex
 %%%% Generated by: %s
 %%%% D version: %s
@@ -1308,7 +1372,7 @@ string latex_head(M)(
 - paper_type_latex.us_letter_portrait
 - paper_type_latex.us_letter_landscape
 
-#+NAME: output_latex_head_0_tex
+#+NAME: output_latex_head_tex_1
 #+BEGIN_SRC latex
 %s
 #+END_SRC
@@ -1318,14 +1382,14 @@ string latex_head(M)(
 - margins.portrait
 - margins.landscape
 
-#+NAME: output_latex_head_0_tex
+#+NAME: output_latex_head_tex_2
 #+BEGIN_SRC latex
 %s
 #+END_SRC
 
 ***** margin shared
 
-#+NAME: output_latex_head_0_tex
+#+NAME: output_latex_head_tex_3
 #+BEGIN_SRC latex
 \setlength{\marginparsep}{4mm}
 \setlength{\marginparwidth}{8mm}
@@ -1333,14 +1397,14 @@ string latex_head(M)(
 
 ***** multicol (portrait | landscape)
 
-#+NAME: output_latex_head_0_tex
+#+NAME: output_latex_head_tex_4
 #+BEGIN_SRC latex
 %s
 #+END_SRC
 
 ***** language & font
 
-#+NAME: output_latex_head_0_tex
+#+NAME: output_latex_head_tex_5
 #+BEGIN_SRC latex
 \usepackage{polyglossia, ucs, fontspec, xltxtra, xunicode}
 \setmainlanguage{%s}
@@ -1354,7 +1418,7 @@ string latex_head(M)(
 
 ***** latex head
 
-#+NAME: output_latex_head_0_tex
+#+NAME: output_latex_head_tex_6
 #+BEGIN_SRC latex
 \usepackage{alltt}
 \usepackage{thumbpdf}
@@ -1362,14 +1426,14 @@ string latex_head(M)(
 
 ***** color links: no = mono | yes = color
 
-#+NAME: output_latex_head_0_tex
+#+NAME: output_latex_head_tex_7
 #+BEGIN_SRC latex
 %s
 #+END_SRC
 
 ***** metadata
 
-#+NAME: output_latex_head_0_tex
+#+NAME: output_latex_head_tex_8
 #+BEGIN_SRC latex
   pdftitle={%s},
   pdfauthor={%s},
@@ -1403,7 +1467,7 @@ string latex_head(M)(
 
 ***** define colors
 
-#+NAME: output_latex_head_0_tex
+#+NAME: output_latex_head_tex_9
 #+BEGIN_SRC latex
 \usepackage[usenames]{color}
 \definecolor{myblack}{rgb}{0,0,0}
@@ -1415,7 +1479,7 @@ string latex_head(M)(
 
 ***** latex head
 
-#+NAME: output_latex_head_0_tex
+#+NAME: output_latex_head_tex_10
 #+BEGIN_SRC latex
 \usepackage{url}
 \urlstyle{sf}
@@ -1425,7 +1489,7 @@ string latex_head(M)(
 
 ***** latex head
 
-#+NAME: output_latex_head_0_tex
+#+NAME: output_latex_head_tex_11
 #+BEGIN_SRC latex
 \usepackage{textcomp}
 \usepackage[parfill]{parskip}
@@ -1447,7 +1511,7 @@ string latex_head(M)(
 
 ***** indent, bullet, list
 
-#+NAME: output_latex_head_0_tex
+#+NAME: output_latex_head_tex_12
 #+BEGIN_SRC latex
 \usepackage[multiple,ragged]{footmisc}
 \setlength\footnotemargin{12pt}
@@ -1491,7 +1555,7 @@ string latex_head(M)(
 
 ***** part, section, subsection, paragraph, subparagraph
 
-#+NAME: output_latex_head_0_tex
+#+NAME: output_latex_head_tex_13
 #+BEGIN_SRC latex
 \usepackage{fancyhdr}
 \lhead{}
@@ -1525,7 +1589,7 @@ string latex_head(M)(
 
 ***** latex head misc. including defined commands
 
-#+NAME: output_latex_head_0_tex
+#+NAME: output_latex_head_tex_14
 #+BEGIN_SRC latex
 \selectlanguage{%s}
 \lhead[ ]{ }
@@ -1586,7 +1650,7 @@ string latex_head(M)(
 
 **** latex head format inclusions
 
-#+NAME: output_latex_head_0_format_string_variables
+#+NAME: output_latex_head_a_format_string_variables
 #+BEGIN_SRC d
 ┃",
   doc_matters.opt.action.debug_do ? "" : doc_matters.generator_program.name_and_version.strip,
@@ -1619,7 +1683,7 @@ string latex_head(M)(
 *** ↻ latex body                                               :content:body:
 **** latex body function
 
-#+NAME: output_latex_body
+#+NAME: output_latex_body_0
 #+BEGIN_SRC d
 string latex_body(D,M)(
   const  D      doc_abstraction,
@@ -1633,7 +1697,7 @@ string latex_body(D,M)(
 
 **** ↻ loop open
 
-#+NAME: output_latex_body
+#+NAME: output_latex_body_1
 #+BEGIN_SRC d
   foreach (part; doc_matters.has.keys_seq.latex) {
     foreach (obj; doc_abstraction[part]) {
@@ -1643,7 +1707,7 @@ string latex_body(D,M)(
 **** ↻ within loop
 ***** frontmatter
 
-#+NAME: output_latex_body
+#+NAME: output_latex_body_2
 #+BEGIN_SRC d
       case "frontmatter":              assert(part == "head" || "toc");
         _txt = obj.text
@@ -1670,7 +1734,7 @@ string latex_body(D,M)(
 
 ***** body
 
-#+NAME: output_latex_body
+#+NAME: output_latex_body_3
 #+BEGIN_SRC d
       case "body":                     assert(part == "body" || "head"); // surprise
         _txt = obj.text
@@ -1732,7 +1796,7 @@ string latex_body(D,M)(
 
 ***** backmatter
 
-#+NAME: output_latex_body
+#+NAME: output_latex_body_4
 #+BEGIN_SRC d
       case "backmatter":
         assert(part == "endnotes" || "glossary" || "bibliography" || "bookindex" || "blurb" || "tail");
@@ -1792,7 +1856,7 @@ string latex_body(D,M)(
 
 ***** after
 
-#+NAME: output_latex_body
+#+NAME: output_latex_body_5
 #+BEGIN_SRC d
       case "comment":
         break;
@@ -1817,7 +1881,7 @@ string latex_body(D,M)(
 
 **** latex body return
 
-#+NAME: output_latex_body
+#+NAME: output_latex_body_6
 #+BEGIN_SRC d
   return _latex_body;
 }
@@ -1826,7 +1890,7 @@ string latex_body(D,M)(
 *** latex tail                                                         :tail:
 **** latex tail function
 
-#+NAME: output_latex_tail
+#+NAME: output_latex_tail_0
 #+BEGIN_SRC d
 string latex_tail(M)(
   M      doc_matters,
@@ -1836,7 +1900,7 @@ string latex_tail(M)(
 
 **** latex tail starts
 
-#+NAME: output_latex_tail
+#+NAME: output_latex_tail_1
 #+BEGIN_SRC d
   string _latex_tail = format(q"┃
 #+END_SRC
@@ -1854,7 +1918,7 @@ string latex_tail(M)(
 
 **** latex tail format inclusions
 
-#+NAME: output_latex_tail_close
+#+NAME: output_latex_tail_close_0
 #+BEGIN_SRC d
 ┃",
   // doc_matters.conf_make_meta.meta.title_full,
@@ -1864,7 +1928,7 @@ string latex_tail(M)(
 
 **** latex tail return
 
-#+NAME: output_latex_tail_close
+#+NAME: output_latex_tail_close_1
 #+BEGIN_SRC d
   return _latex_tail;
 }
diff --git a/org/out_metadata.org b/org/out_metadata.org
index 3b5bbc5..594eb72 100644
--- a/org/out_metadata.org
+++ b/org/out_metadata.org
@@ -7,6 +7,7 @@
 #+COPYRIGHT:   Copyright (C) 2015 - 2020 Ralph Amissah
 #+LANGUAGE:    en
 #+STARTUP:     content hideblocks hidestars noindent entitiespretty
+#+OPTIONS:     H:3 num:nil toc:t \n:nil @:t ::t |:t ^:nil _:nil -:t f:t *:t <:t
 #+PROPERTY:    header-args  :exports code
 #+PROPERTY:    header-args+ :noweb yes
 #+PROPERTY:    header-args+ :eval no
@@ -24,7 +25,8 @@ template outputMetadata() {
   @safe void outputMetadata(T)( T  doc_matters) {
     <<harvested_html_search>>
     <<output_imports>>
-<<harvested_html_themes>>
+<<harvested_html_themes_0>>
+<<harvested_html_themes_1>>
 <<harvested_topics_html_head_1>>
 <<harvested_html_head>>
 <<harvested_topics_html_head_2>>
@@ -258,7 +260,7 @@ metadata_write_output(doc_matters, metadata_);
 *** themes
 **** head
 
-#+NAME: harvested_html_themes
+#+NAME: harvested_html_themes_0
 #+BEGIN_SRC css
 string theme_dark_0 = format(q"┃
   body {
@@ -324,7 +326,7 @@ string theme_light_0 = format(q"┃
 
 **** levels
 
-#+NAME: harvested_html_themes
+#+NAME: harvested_html_themes_1
 #+BEGIN_SRC css
 string theme_dark_1 = format(q"┃
   h1 {
diff --git a/org/out_odt.org b/org/out_odt.org
index 027816d..fe83c68 100644
--- a/org/out_odt.org
+++ b/org/out_odt.org
@@ -7,6 +7,7 @@
 #+COPYRIGHT:   Copyright (C) 2015 - 2020 Ralph Amissah
 #+LANGUAGE:    en
 #+STARTUP:     content hideblocks hidestars noindent entitiespretty
+#+OPTIONS:     H:3 num:nil toc:t \n:nil @:t ::t |:t ^:nil _:nil -:t f:t *:t <:t
 #+PROPERTY:    header-args  :exports code
 #+PROPERTY:    header-args+ :noweb yes
 #+PROPERTY:    header-args+ :eval no
@@ -52,7 +53,31 @@ template formatODT() {
   mixin spineRgxOut;
   struct formatODT {
     static auto rgx = RgxO();
-    <<odt_format_objects>>
+    <<odt_format_objects_0>>
+    <<odt_format_objects_1>>
+    <<odt_format_objects_2>>
+    <<odt_format_objects_3>>
+    <<odt_format_objects_4>>
+    <<odt_format_objects_5>>
+    <<odt_format_objects_6>>
+    <<odt_format_objects_7>>
+    <<odt_format_objects_8>>
+    <<odt_format_objects_9>>
+    <<odt_format_objects_10>>
+    <<odt_format_objects_11>>
+    <<odt_format_objects_12>>
+    <<odt_format_objects_13>>
+    <<odt_format_objects_14>>
+    <<odt_format_objects_15>>
+    <<odt_format_objects_16>>
+    <<odt_format_objects_17>>
+    <<odt_format_objects_18>>
+    <<odt_format_objects_19>>
+    <<odt_format_objects_20>>
+    <<odt_format_objects_21>>
+    <<odt_format_objects_22>>
+    <<odt_format_objects_23>>
+    <<odt_format_objects_24>>
   }
 }
 template outputODT() {
@@ -61,16 +86,40 @@ template outputODT() {
   mixin spineRgxOut;
   static auto rgx = RgxO();
   // mixin outputXmlODT;
-  <<output_odt_variable_content_xml>>
-  <<output_odt_variable_manifest_xml>>
+  <<output_odt_variable_content_xml_0>>
+  <<output_odt_variable_content_xml_1>>
+  <<output_odt_variable_content_xml_2>>
+  <<output_odt_variable_content_xml_3>>
+  <<output_odt_variable_content_xml_4>>
+  <<output_odt_variable_content_xml_5>>
+  <<output_odt_variable_content_xml_6>>
+  <<output_odt_variable_content_xml_7>>
+  <<output_odt_variable_content_xml_8>>
+  <<output_odt_variable_content_xml_9>>
+  <<output_odt_variable_content_xml_10>>
+  <<output_odt_variable_content_xml_11>>
+  <<output_odt_variable_content_xml_12>>
+  <<output_odt_variable_content_xml_13>>
+  <<output_odt_variable_manifest_xml_0>>
+  <<output_odt_variable_manifest_xml_1>>
+  <<output_odt_variable_manifest_xml_2>>
   <<output_odt_variable_copy_odt_images>>
-  <<output_odt_variable_meta_xml>>
+  <<output_odt_variable_meta_xml_0>>
+  <<output_odt_variable_meta_xml_1>>
+  <<output_odt_variable_meta_xml_2>>
   <<output_odt_fixed_dirtree>>
   <<output_odt_fixed_mimetype>>
-  <<output_odt_fixed_manifest_rdf>>
-  <<output_odt_fixed_settings_xml>>
-  <<output_odt_fixed_styles_xml>>
-  <<output_odt>>
+  <<output_odt_fixed_manifest_rdf_0>>
+  <<output_odt_fixed_manifest_rdf_1>>
+  <<output_odt_fixed_manifest_rdf_2>>
+  <<output_odt_fixed_settings_xml_0>>
+  <<output_odt_fixed_settings_xml_1>>
+  <<output_odt_fixed_settings_xml_2>>
+  <<output_odt_fixed_styles_xml_0>>
+  <<output_odt_fixed_styles_xml_1>>
+  <<output_odt_fixed_styles_xml_2>>
+  <<output_odt_0>>
+  <<output_odt_1>>
 }
 #+END_SRC
 
@@ -87,7 +136,7 @@ template outputODT() {
 **** object attrib
 ***** tags
 
-#+NAME: odt_format_objects
+#+NAME: odt_format_objects_0
 #+BEGIN_SRC d
 @safe string _tags(O)(const O obj) {
   string _tags = "";
@@ -111,7 +160,7 @@ template outputODT() {
 
 ****** anchor tags
 
-#+NAME: odt_format_objects
+#+NAME: odt_format_objects_1
 #+BEGIN_SRC d
 @safe string _xhtml_anchor_tags(O)(O obj) {
   const(string[]) anchor_tags = obj.tags.anchor_tags;
@@ -129,7 +178,7 @@ template outputODT() {
 
 ***** ocn object number display
 
-#+NAME: odt_format_objects
+#+NAME: odt_format_objects_2
 #+BEGIN_SRC d
 @safe string obj_num(O)(const O obj) { // TODO
   string _on;
@@ -145,7 +194,7 @@ template outputODT() {
 
 ***** footnotes
 
-#+NAME: odt_format_objects
+#+NAME: odt_format_objects_3
 #+BEGIN_SRC d
 @safe string _footnotes()(string _txt) {
   static auto rgx = RgxO();
@@ -170,7 +219,7 @@ template outputODT() {
 
 ***** bullet
 
-#+NAME: odt_format_objects
+#+NAME: odt_format_objects_4
 #+BEGIN_SRC d
 @safe string _bullet(O)(const O obj) {
   string _b = "";
@@ -183,7 +232,7 @@ template outputODT() {
 
 ***** para (with bullet, indent levels, footnotes extracted)
 
-#+NAME: odt_format_objects
+#+NAME: odt_format_objects_5
 #+BEGIN_SRC d
 @safe string _indent(O)(string _txt, const O obj) { // TODO
   // if (obj.attrib.indent_base > 0 ||
@@ -297,7 +346,7 @@ template outputODT() {
 
 ***** block type
 
-#+NAME: odt_format_objects
+#+NAME: odt_format_objects_6
 #+BEGIN_SRC d
 @safe string _block_type_delimiters(O)(string[] _block_lines, const O obj) { // TODO
   string _block = "";
@@ -338,7 +387,7 @@ template outputODT() {
 
 ***** special characters
 
-#+NAME: odt_format_objects
+#+NAME: odt_format_objects_7
 #+BEGIN_SRC d
 @safe string _special_characters(O)(string _txt, const O obj) {
   _txt = _txt
@@ -353,7 +402,7 @@ template outputODT() {
 
 ***** preserve white space
 
-#+NAME: odt_format_objects
+#+NAME: odt_format_objects_8
 #+BEGIN_SRC d
 @safe string _preserve_white_spaces(O)(string _txt, const O obj) {
   if (obj.metainfo.is_a == "code" || obj.metainfo.is_a == "verse" || obj.metainfo.is_a == "block") {
@@ -366,7 +415,7 @@ template outputODT() {
 
 ***** font_face
 
-#+NAME: odt_format_objects
+#+NAME: odt_format_objects_9
 #+BEGIN_SRC d
 string _font_face(string _txt){
   _txt = _txt
@@ -386,7 +435,7 @@ string _font_face(string _txt){
 
 ***** object number
 
-#+NAME: odt_format_objects
+#+NAME: odt_format_objects_10
 #+BEGIN_SRC d
 @safe auto _obj_num(O)(O obj) { // NOT USED YET
   struct objNum {
@@ -415,7 +464,7 @@ string _font_face(string _txt){
 
 ***** break page
 
-#+NAME: odt_format_objects
+#+NAME: odt_format_objects_11
 #+BEGIN_SRC d
 @safe string _break_page()() {
   return format(q"┃
@@ -436,7 +485,7 @@ string _font_face(string _txt){
 
 ***** empty lines break
 
-#+NAME: odt_format_objects
+#+NAME: odt_format_objects_12
 #+BEGIN_SRC d
 @safe string _empty_line_break(O)(string _txt, const O obj) {
   if (obj.metainfo.is_a == "code" || obj.metainfo.is_a == "verse" || obj.metainfo.is_a == "block") {
@@ -449,7 +498,7 @@ string _font_face(string _txt){
 
 ***** links: url, mail
 
-#+NAME: odt_format_objects
+#+NAME: odt_format_objects_13
 #+BEGIN_SRC d
 @safe string _links(O)(string _txt, const O obj) {
   if (obj.metainfo.is_a != "code") {
@@ -495,7 +544,7 @@ string _font_face(string _txt){
 
 ***** image
 
-#+NAME: odt_format_objects
+#+NAME: odt_format_objects_14
 #+BEGIN_SRC d
 @safe string _images(O)(string _txt, const O obj) {
   if (_txt.match(rgx.inline_image)) {
@@ -512,7 +561,7 @@ string _font_face(string _txt){
 
 **** markup hub (including font face)
 
-#+NAME: odt_format_objects
+#+NAME: odt_format_objects_15
 #+BEGIN_SRC d
 @safe string markup(O)(const O obj) {
   /+ markup TODO +/
@@ -534,7 +583,7 @@ string _font_face(string _txt){
 **** para type
 ***** heading
 
-#+NAME: odt_format_objects
+#+NAME: odt_format_objects_16
 #+BEGIN_SRC d
 @safe string heading(O,M)(
   const        O  obj,
@@ -584,7 +633,7 @@ string _font_face(string _txt){
 
 ***** para
 
-#+NAME: odt_format_objects
+#+NAME: odt_format_objects_17
 #+BEGIN_SRC d
 @safe string para(O,M)(
   const        O  obj,
@@ -610,7 +659,7 @@ string _font_face(string _txt){
 **** block type
 ***** quote
 
-#+NAME: odt_format_objects
+#+NAME: odt_format_objects_18
 #+BEGIN_SRC d
 @safe string quote(O,M)(
   const        O  obj,
@@ -631,7 +680,7 @@ string _font_face(string _txt){
   - preserves double newlines (paragraph delimiter)
 - the "group" delimiter is different from the "block" delimiter in that groups do not preserve whitespace, the "block" mark does
 
-#+NAME: odt_format_objects
+#+NAME: odt_format_objects_19
 #+BEGIN_SRC d
 @safe string group(O,M)(
   const        O  obj,
@@ -666,7 +715,7 @@ string _font_face(string _txt){
     - "^[ ]" &#160;
     - count number only at beginning of line and replace each
 
-#+NAME: odt_format_objects
+#+NAME: odt_format_objects_20
 #+BEGIN_SRC d
 @safe string block(O,M)(
   const        O  obj,
@@ -689,7 +738,7 @@ string _font_face(string _txt){
   - preserves spaces
   - preserves newlines
 
-#+NAME: odt_format_objects
+#+NAME: odt_format_objects_21
 #+BEGIN_SRC d
 @safe string verse(O,M)(
   const        O  obj,
@@ -708,7 +757,7 @@ string _font_face(string _txt){
 
 ***** code
 
-#+NAME: odt_format_objects
+#+NAME: odt_format_objects_22
 #+BEGIN_SRC d
 @safe string code(O,M)(
   const        O  obj,
@@ -762,7 +811,7 @@ string _font_face(string _txt){
 ***** table
 ****** tablarize
 
-#+NAME: odt_format_objects
+#+NAME: odt_format_objects_23
 #+BEGIN_SRC d
 @safe Tuple!(string, string) tablarize(O)(
   const        O    obj,
@@ -802,7 +851,7 @@ string _font_face(string _txt){
 
 ****** table
 
-#+NAME: odt_format_objects
+#+NAME: odt_format_objects_24
 #+BEGIN_SRC d
 int _table_number = 0;
 @safe string table(O,M)(
@@ -842,7 +891,7 @@ int _table_number = 0;
 
 ** write odt output                                             :odf:odt:out:
 
-#+NAME: output_odt
+#+NAME: output_odt_0
 #+BEGIN_SRC d
 void writeOutputODT(W,I)(
   const W    odt_content,
@@ -931,7 +980,7 @@ void writeOutputODT(W,I)(
 
 ** odt output hub [#A]                                          :odf:odt:out:
 
-#+NAME: output_odt
+#+NAME: output_odt_1
 #+BEGIN_SRC d
 void outputODT(D,I)(
   const    D   doc_abstraction,
@@ -1019,13 +1068,13 @@ void dirtree(I)(
 
 *** manifest.rdf                                               :manifest_rdf:
 
-#+NAME: output_odt_fixed_manifest_rdf
+#+NAME: output_odt_fixed_manifest_rdf_0
 #+BEGIN_SRC d
 @safe string manifest_rdf() {
   string _manifest_rdf = format(q"┃<?xml version="1.0" encoding="utf-8"?>
 #+END_SRC
 
-#+NAME: output_odt_fixed_manifest_rdf
+#+NAME: output_odt_fixed_manifest_rdf_1
 #+BEGIN_SRC xml
 <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
   <rdf:Description rdf:about="styles.xml">
@@ -1046,7 +1095,7 @@ void dirtree(I)(
 </rdf:RDF>
 #+END_SRC
 
-#+NAME: output_odt_fixed_manifest_rdf
+#+NAME: output_odt_fixed_manifest_rdf_2
 #+BEGIN_SRC d
 ┃");
   return _manifest_rdf;
@@ -1055,13 +1104,13 @@ void dirtree(I)(
 
 *** settings.xml                                                   :settings:
 
-#+NAME: output_odt_fixed_settings_xml
+#+NAME: output_odt_fixed_settings_xml_0
 #+BEGIN_SRC d
 @safe string settings_xml() {
   string _settings_xml = format(q"┃<?xml version="1.0" encoding="UTF-8"?>
 #+END_SRC
 
-#+NAME: output_odt_fixed_settings_xml
+#+NAME: output_odt_fixed_settings_xml_1
 #+BEGIN_SRC xml
 <office:document-settings xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:xl="http://www.w3.org/1999/xlink" xmlns:config="urn:oasis:names:tc:opendocument:xmlns:config:1.0" xmlns:ooo="http://openoffice.org/2004/office" office:version="1.2">
   <office:settings>
@@ -1160,7 +1209,7 @@ void dirtree(I)(
 </office:document-settings>
 #+END_SRC
 
-#+NAME: output_odt_fixed_settings_xml
+#+NAME: output_odt_fixed_settings_xml_2
 #+BEGIN_SRC d
 ┃");
   return _settings_xml;
@@ -1169,13 +1218,13 @@ void dirtree(I)(
 
 *** styles.xml                                                   :styles_xml:
 
-#+NAME: output_odt_fixed_styles_xml
+#+NAME: output_odt_fixed_styles_xml_0
 #+BEGIN_SRC d
 @safe string styles_xml() {
   string _styles_xml = format(q"┃<?xml version="1.0" encoding="UTF-8"?>
 #+END_SRC
 
-#+NAME: output_odt_fixed_styles_xml
+#+NAME: output_odt_fixed_styles_xml_1
 #+BEGIN_SRC xml
 <office:document-styles xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" xmlns:xl="http://www.w3.org/1999/xlink" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" xmlns:math="http://www.w3.org/1998/Math/MathML" xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" xmlns:ooo="http://openoffice.org/2004/office" xmlns:ooow="http://openoffice.org/2004/writer" xmlns:oooc="http://openoffice.org/2004/calc" xmlns:dom="http://www.w3.org/2001/xml-events" xmlns:rpt="http://openoffice.org/2005/report" xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:grddl="http://www.w3.org/2003/g/data-view#" xmlns:tableooo="http://openoffice.org/2009/table" xmlns:css3t="http://www.w3.org/TR/css3-text/" office:version="1.2">
   <office:font-face-decls>
@@ -2070,7 +2119,7 @@ void dirtree(I)(
 </office:document-styles>
 #+END_SRC
 
-#+NAME: output_odt_fixed_styles_xml
+#+NAME: output_odt_fixed_styles_xml_2
 #+BEGIN_SRC d
 ┃");
   return _styles_xml;
@@ -2082,7 +2131,7 @@ void dirtree(I)(
 **** content head
 ***** head open
 
-#+NAME: output_odt_variable_content_xml
+#+NAME: output_odt_variable_content_xml_0
 #+BEGIN_SRC d
 @safe string odt_head(I)(I doc_matters) {
   string _has_tables = format(q"┃
@@ -2090,7 +2139,7 @@ void dirtree(I)(
 
 ***** if table include within head
 
-#+NAME: output_odt_variable_content_xml
+#+NAME: output_odt_variable_content_xml_1
 #+BEGIN_SRC xml
   <style:style style:name="Table1" style:family="table">
     <style:table-properties style:width="16.999cm" table:align="margins"/>
@@ -2168,7 +2217,7 @@ void dirtree(I)(
 
 ***** head
 
-#+NAME: output_odt_variable_content_xml
+#+NAME: output_odt_variable_content_xml_2
 #+BEGIN_SRC d
 ┃",);
   string _odt_head = format(q"┃<?xml version="1.0" encoding="UTF-8"?>
@@ -2176,7 +2225,7 @@ void dirtree(I)(
 
 ***** head xml
 
-#+NAME: output_odt_variable_content_xml
+#+NAME: output_odt_variable_content_xml_3
 #+BEGIN_SRC xml
 <office:document-content xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" xmlns:xl="http://www.w3.org/1999/xlink" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" xmlns:math="http://www.w3.org/1998/Math/MathML" xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" xmlns:ooo="http://openoffice.org/2004/office" xmlns:ooow="http://openoffice.org/2004/writer" xmlns:oooc="http://openoffice.org/2004/calc" xmlns:dom="http://www.w3.org/2001/xml-events" xmlns:xforms="http://www.w3.org/2002/xforms" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:rpt="http://openoffice.org/2005/report" xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:grddl="http://www.w3.org/2003/g/data-view#" xmlns:tableooo="http://openoffice.org/2009/table" xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0" xmlns:css3t="http://www.w3.org/TR/css3-text/" office:version="1.2">
 <office:scripts/>
@@ -2209,7 +2258,7 @@ void dirtree(I)(
 
 ***** head close
 
-#+NAME: output_odt_variable_content_xml
+#+NAME: output_odt_variable_content_xml_4
 #+BEGIN_SRC d
 ┃",
   (doc_matters.has.tables > 0) ? _has_tables : "",
@@ -2221,7 +2270,7 @@ void dirtree(I)(
 **** ↻ content body
 ***** body open
 
-#+NAME: output_odt_variable_content_xml
+#+NAME: output_odt_variable_content_xml_5
 #+BEGIN_SRC d
 @safe string odt_body(D,I)(
   const D    doc_abstraction,
@@ -2236,7 +2285,7 @@ void dirtree(I)(
 
 ***** ↻ the loop & outer switch (sections & objects) format output
 
-#+NAME: output_odt_variable_content_xml
+#+NAME: output_odt_variable_content_xml_6
 #+BEGIN_SRC d
   foreach (part; doc_matters.has.keys_seq.scroll) {
     foreach (obj; doc_abstraction[part]) {
@@ -2245,7 +2294,7 @@ void dirtree(I)(
 
 ****** frontmatter
 
-#+NAME: output_odt_variable_content_xml
+#+NAME: output_odt_variable_content_xml_7
 #+BEGIN_SRC d
       case "frontmatter":              assert(part == "head" || "toc");
         switch (obj.metainfo.is_of_type) {
@@ -2270,7 +2319,7 @@ void dirtree(I)(
 
 ****** body
 
-#+NAME: output_odt_variable_content_xml
+#+NAME: output_odt_variable_content_xml_8
 #+BEGIN_SRC d
       case "body":                     assert(part == "body" || "head"); // surprise
         switch (obj.metainfo.is_of_type) {
@@ -2321,7 +2370,7 @@ void dirtree(I)(
 
 ****** backmatter
 
-#+NAME: output_odt_variable_content_xml
+#+NAME: output_odt_variable_content_xml_9
 #+BEGIN_SRC d
       case "backmatter":
         assert(part == "endnotes" || "glossary" || "bibliography" || "bookindex" || "blurb" || "tail");
@@ -2371,7 +2420,7 @@ void dirtree(I)(
 
 ***** closings & post loop
 
-#+NAME: output_odt_variable_content_xml
+#+NAME: output_odt_variable_content_xml_10
 #+BEGIN_SRC d
       }
     }
@@ -2382,13 +2431,13 @@ void dirtree(I)(
 
 **** content book index?
 
-#+NAME: output_odt_variable_content_xml
+#+NAME: output_odt_variable_content_xml_11
 #+BEGIN_SRC d
 #+END_SRC
 
 **** content tail
 
-#+NAME: output_odt_variable_content_xml
+#+NAME: output_odt_variable_content_xml_12
 #+BEGIN_SRC d
 @safe string odt_tail() {
   string _odt_tail = format(q"┃<text:p text:style-name="P_normal">spine: &lt;<text:a xl:type="simple" xl:href="http://www.doc_reform.org">www.doc_reform.org</text:a>&gt; and &lt;<text:a xl:type="simple" xl:href="http://www.sisudoc.org">www.sisudoc.org</text:a>&gt;</text:p>
@@ -2399,7 +2448,7 @@ void dirtree(I)(
 
 **** hub
 
-#+NAME: output_odt_variable_content_xml
+#+NAME: output_odt_variable_content_xml_13
 #+BEGIN_SRC d
 @safe string content_xml(D,I)(
   const D    doc_abstraction,
@@ -2420,7 +2469,7 @@ void dirtree(I)(
     - META-INF/manifest.xml
       - image list changes
 
-#+NAME: output_odt_variable_manifest_xml
+#+NAME: output_odt_variable_manifest_xml_0
 #+BEGIN_SRC d
 @safe string manifest_xml(M)(
   auto ref              M    doc_matters,
@@ -2433,7 +2482,7 @@ void dirtree(I)(
   string _manifest_xml = format(q"┃<?xml version="1.0" encoding="UTF-8"?>
 #+END_SRC
 
-#+NAME: output_odt_variable_manifest_xml
+#+NAME: output_odt_variable_manifest_xml_1
 #+BEGIN_SRC xml
 <manifest:manifest xmlns:manifest="urn:oasis:names:tc:opendocument:xmlns:manifest:1.0" manifest:version="1.2">
   <manifest:file-entry manifest:media-type="application/vnd.oasis.opendocument.text" manifest:version="1.2" manifest:full-path="/"/>
@@ -2447,7 +2496,7 @@ void dirtree(I)(
 </manifest:manifest>
 #+END_SRC
 
-#+NAME: output_odt_variable_manifest_xml
+#+NAME: output_odt_variable_manifest_xml_2
 #+BEGIN_SRC d
 ┃",
 _images.join("\n"),
@@ -2458,7 +2507,7 @@ _images.join("\n"),
 
 *** meta.xml (time stamp)                                          :meta_xml:
 
-#+NAME: output_odt_variable_meta_xml
+#+NAME: output_odt_variable_meta_xml_0
 #+BEGIN_SRC d
 @safe string meta_xml(M)(
   auto ref              M    doc_matters,
@@ -2467,7 +2516,7 @@ _images.join("\n"),
   string _meta_xml = format(q"┃<?xml version="1.0" encoding="UTF-8"?>
 #+END_SRC
 
-#+NAME: output_odt_variable_meta_xml
+#+NAME: output_odt_variable_meta_xml_1
 #+BEGIN_SRC xml
 <office:document-meta xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:xl="http://www.w3.org/1999/xlink" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" xmlns:ooo="http://openoffice.org/2004/office" xmlns:grddl="http://www.w3.org/2003/g/data-view#" office:version="1.2">
   <office:meta>
@@ -2479,7 +2528,7 @@ _images.join("\n"),
 </office:document-meta>
 #+END_SRC
 
-#+NAME: output_odt_variable_meta_xml
+#+NAME: output_odt_variable_meta_xml_2
 #+BEGIN_SRC d
 ┃",
 doc_matters.generator_program.name_and_version,
diff --git a/org/out_sqlite.org b/org/out_sqlite.org
index a35bcf1..a71a4ec 100644
--- a/org/out_sqlite.org
+++ b/org/out_sqlite.org
@@ -7,6 +7,7 @@
 #+COPYRIGHT:   Copyright (C) 2015 - 2020 Ralph Amissah
 #+LANGUAGE:    en
 #+STARTUP:     content hideblocks hidestars noindent entitiespretty
+#+OPTIONS:     H:3 num:nil toc:t \n:nil @:t ::t |:t ^:nil _:nil -:t f:t *:t <:t
 #+PROPERTY:    header-args  :exports code
 #+PROPERTY:    header-args+ :noweb yes
 #+PROPERTY:    header-args+ :eval no
@@ -183,10 +184,33 @@ template SQLiteFormatAndLoadObject() {
     mixin spineRgxOut;
     struct sqlite_format_and_load_objects {
       <<sanitize_text_for_search>>
-      <<sanitize_and_munge_inline_html>>
-      <<html_objects>>
-      <<sqlite_load_object>>
-      <<hub_format_and_sqlite_load_objects>>
+      <<sanitize_and_munge_inline_html_0>>
+      <<sanitize_and_munge_inline_html_1>>
+      <<sanitize_and_munge_inline_html_2>>
+      <<sanitize_and_munge_inline_html_3>>
+      <<sanitize_and_munge_inline_html_4>>
+      <<sanitize_and_munge_inline_html_5>>
+      <<sanitize_and_munge_inline_html_6>>
+      <<sanitize_and_munge_inline_html_7>>
+      <<html_objects_0>>
+      <<html_objects_1>>
+      <<html_objects_2>>
+      <<html_objects_3>>
+      <<html_objects_4>>
+      <<html_objects_5>>
+      <<html_objects_6>>
+      <<html_objects_7>>
+      <<sqlite_load_object_0>>
+      <<sqlite_load_object_1>>
+      <<sqlite_load_object_2>>
+      <<hub_format_and_sqlite_load_objects_0>>
+      <<hub_format_and_sqlite_load_objects_1>>
+      <<hub_format_and_sqlite_load_objects_2>>
+      <<hub_format_and_sqlite_load_objects_3>>
+      <<hub_format_and_sqlite_load_objects_4>>
+      <<hub_format_and_sqlite_load_objects_5>>
+      <<hub_format_and_sqlite_load_objects_6>>
+      <<hub_format_and_sqlite_load_objects_7>>
     }
     return sqlite_format_and_load_objects();
   }
@@ -222,7 +246,9 @@ template SQLiteDeleteDocument() {
   string SQLiteDeleteDocument(M)(
     M doc_matters,
   ) {
-    <<sqlite_formatted_delete>>
+    <<sqlite_formatted_delete_0>>
+    <<sqlite_formatted_delete_1>>
+    <<sqlite_formatted_delete_2>>
     return _delete_uid;
   }
 }
@@ -236,8 +262,16 @@ template SQLiteInsertMetadata() {
   string SQLiteInsertMetadata(M)(
     M doc_matters,
   ) {
-    <<sqlite_formatted_insertions_doc_matters_metadata>>
-    <<sqlite_formatted_insertions_topic_register>>
+    <<sqlite_formatted_insertions_doc_matters_metadata_0>>
+    <<sqlite_formatted_insertions_doc_matters_metadata_1>>
+    <<sqlite_formatted_insertions_doc_matters_metadata_2>>
+    <<sqlite_formatted_insertions_doc_matters_metadata_3>>
+    <<sqlite_formatted_insertions_topic_register_0>>
+    <<sqlite_formatted_insertions_topic_register_1>>
+    <<sqlite_formatted_insertions_topic_register_2>>
+    <<sqlite_formatted_insertions_topic_register_3>>
+    <<sqlite_formatted_insertions_topic_register_4>>
+    <<sqlite_formatted_insertions_topic_register_5>>
     return _insert_metadata;
   }
 }
@@ -255,7 +289,10 @@ template SQLiteInsertDocObjectsLoop() {
     string _uid = SQLinsertDelimiter!()(doc_matters.src.doc_uid);
     auto url_html = spineUrlsHTML!()(doc_matters.conf_make_meta.conf.w_srv_data_root_url_html, doc_matters.src.language);
     string insertDocObjectsRow(O)(O obj) {
-      <<sqlite_formatted_insertions_doc_objects>>
+      <<sqlite_formatted_insertions_doc_objects_0>>
+      <<sqlite_formatted_insertions_doc_objects_1>>
+      <<sqlite_formatted_insertions_doc_objects_2>>
+      <<sqlite_formatted_insertions_doc_objects_3>>
       return _insert_doc_objects_row;
     }
     <<sqlite_objects_loop>>
@@ -477,7 +514,7 @@ light html objects
 ***** munge
 ****** general munge (special characters, inline markup, move notes)
 
-#+NAME: sanitize_and_munge_inline_html
+#+NAME: sanitize_and_munge_inline_html_0
 #+BEGIN_SRC d
 string munge_html(M,O)(
         M    doc_matters,
@@ -522,7 +559,7 @@ string munge_html(M,O)(
 
 ****** special characters
 
-#+NAME: sanitize_and_munge_inline_html
+#+NAME: sanitize_and_munge_inline_html_1
 #+BEGIN_SRC d
 string html_special_characters(string _txt){
   _txt = _txt
@@ -538,7 +575,7 @@ string html_special_characters(string _txt){
 
 ****** special characters for code
 
-#+NAME: sanitize_and_munge_inline_html
+#+NAME: sanitize_and_munge_inline_html_2
 #+BEGIN_SRC d
 string html_special_characters_code(string _txt){
   _txt = _txt
@@ -553,7 +590,7 @@ string html_special_characters_code(string _txt){
 
 ****** font_face
 
-#+NAME: sanitize_and_munge_inline_html
+#+NAME: sanitize_and_munge_inline_html_3
 #+BEGIN_SRC d
 string html_font_face(string _txt){
   _txt = _txt
@@ -574,7 +611,7 @@ string html_font_face(string _txt){
 ****** inline markup
 ******* images
 
-#+NAME: sanitize_and_munge_inline_html
+#+NAME: sanitize_and_munge_inline_html_4
 #+BEGIN_SRC d
 string inline_images(M,O)(
                M  doc_matters,
@@ -605,7 +642,7 @@ string inline_images(M,O)(
 ******* links
 ******** scroll, seg, epub
 
-#+NAME: sanitize_and_munge_inline_html
+#+NAME: sanitize_and_munge_inline_html_5
 #+BEGIN_SRC d
 string inline_links(M,O)(
                M doc_matters,
@@ -715,7 +752,7 @@ string inline_links(M,O)(
 ******* notes
 ******** scroll
 
-#+NAME: sanitize_and_munge_inline_html
+#+NAME: sanitize_and_munge_inline_html_6
 #+BEGIN_SRC d
 string inline_notes_scroll(M,O)(
                M   doc_matters,
@@ -751,7 +788,7 @@ string inline_notes_scroll(M,O)(
 
 ******* inline markup
 
-#+NAME: sanitize_and_munge_inline_html
+#+NAME: sanitize_and_munge_inline_html_7
 #+BEGIN_SRC d
 string xml_type="seg"; /+ set html document type to be linked to here (seg|scroll) +/
 string inline_markup(M,O)(
@@ -769,7 +806,7 @@ string inline_markup(M,O)(
 ***** objects
 ****** heading
 
-#+NAME: html_objects
+#+NAME: html_objects_0
 #+BEGIN_SRC d
 string html_heading(M,O)(
         M   doc_matters,
@@ -815,7 +852,7 @@ string html_heading(M,O)(
 
 ****** para
 
-#+NAME: html_objects
+#+NAME: html_objects_1
 #+BEGIN_SRC d
 string html_para(M,O)(
         M   doc_matters,
@@ -842,7 +879,7 @@ string html_para(M,O)(
 
 ****** quote
 
-#+NAME: html_objects
+#+NAME: html_objects_2
 #+BEGIN_SRC d
 string html_quote(M,O)(
         M   doc_matters,
@@ -865,7 +902,7 @@ string html_quote(M,O)(
 
 ****** group
 
-#+NAME: html_objects
+#+NAME: html_objects_3
 #+BEGIN_SRC d
 string html_group(M,O)(
         M   doc_matters,
@@ -888,7 +925,7 @@ string html_group(M,O)(
 
 ****** block
 
-#+NAME: html_objects
+#+NAME: html_objects_4
 #+BEGIN_SRC d
 string html_block(M,O)(
         M   doc_matters,
@@ -910,7 +947,7 @@ string html_block(M,O)(
 
 ****** verse
 
-#+NAME: html_objects
+#+NAME: html_objects_5
 #+BEGIN_SRC d
 string html_verse(M,O)(
         M   doc_matters,
@@ -931,7 +968,7 @@ string html_verse(M,O)(
 
 ****** code
 
-#+NAME: html_objects
+#+NAME: html_objects_6
 #+BEGIN_SRC d
 string html_code(O)(
   const O   obj,
@@ -951,7 +988,7 @@ string html_code(O)(
 
 ****** table
 
-#+NAME: html_objects
+#+NAME: html_objects_7
 #+BEGIN_SRC d
 string html_table(M,O)(
         M   doc_matters,
@@ -1023,7 +1060,7 @@ string html_table(M,O)(
 *** 2. hub (sqlite_format_and_load_objects)
 **** sql related
 
-#+NAME: sqlite_load_object
+#+NAME: sqlite_load_object_0
 #+BEGIN_SRC d
 string sqlite_load_string(M,O)(
         M   doc_matters,
@@ -1034,7 +1071,7 @@ string sqlite_load_string(M,O)(
 }
 #+END_SRC
 
-#+NAME: sqlite_load_object
+#+NAME: sqlite_load_object_1
 #+BEGIN_SRC d
 string postgresql_load_string(M,O)(
         M   doc_matters,
@@ -1045,7 +1082,7 @@ string postgresql_load_string(M,O)(
 }
 #+END_SRC
 
-#+NAME: sqlite_load_object
+#+NAME: sqlite_load_object_2
 #+BEGIN_SRC d
 string sqlite_statement(O)(
   const O          obj,
@@ -1065,7 +1102,7 @@ string sqlite_statement(O)(
 
 **** heading
 
-#+NAME: hub_format_and_sqlite_load_objects
+#+NAME: hub_format_and_sqlite_load_objects_0
 #+BEGIN_SRC d
 string[string] heading(M,O)(
         M   doc_matters,
@@ -1094,7 +1131,7 @@ string[string] heading(M,O)(
 
 **** para
 
-#+NAME: hub_format_and_sqlite_load_objects
+#+NAME: hub_format_and_sqlite_load_objects_1
 #+BEGIN_SRC d
 string[string] para(M,O)(
         M   doc_matters,
@@ -1123,7 +1160,7 @@ string[string] para(M,O)(
 
 **** quote
 
-#+NAME: hub_format_and_sqlite_load_objects
+#+NAME: hub_format_and_sqlite_load_objects_2
 #+BEGIN_SRC d
 string[string] quote(M,O)(
         M   doc_matters,
@@ -1151,7 +1188,7 @@ string[string] quote(M,O)(
 #+END_SRC
 **** group
 
-#+NAME: hub_format_and_sqlite_load_objects
+#+NAME: hub_format_and_sqlite_load_objects_3
 #+BEGIN_SRC d
 string[string] group(M,O)(
         M   doc_matters,
@@ -1180,7 +1217,7 @@ string[string] group(M,O)(
 
 **** block
 
-#+NAME: hub_format_and_sqlite_load_objects
+#+NAME: hub_format_and_sqlite_load_objects_4
 #+BEGIN_SRC d
 string[string] block(M,O)(
         M   doc_matters,
@@ -1209,7 +1246,7 @@ string[string] block(M,O)(
 
 **** verse
 
-#+NAME: hub_format_and_sqlite_load_objects
+#+NAME: hub_format_and_sqlite_load_objects_5
 #+BEGIN_SRC d
 string[string] verse(M,O)(
         M   doc_matters,
@@ -1238,7 +1275,7 @@ string[string] verse(M,O)(
 
 **** code
 
-#+NAME: hub_format_and_sqlite_load_objects
+#+NAME: hub_format_and_sqlite_load_objects_6
 #+BEGIN_SRC d
 string[string] code(M,O)(
         M   doc_matters,
@@ -1267,7 +1304,7 @@ string[string] code(M,O)(
 
 **** table
 
-#+NAME: hub_format_and_sqlite_load_objects
+#+NAME: hub_format_and_sqlite_load_objects_7
 #+BEGIN_SRC d
 string[string] table(M,O)(
         M   doc_matters,
@@ -1682,7 +1719,7 @@ CREATE INDEX idx_topics       ON metadata_and_text(classify_topic_register);
 **** DELETE uid rows doc matters & metadata
 ***** sql statement: dlang format
 
-#+NAME: sqlite_formatted_delete
+#+NAME: sqlite_formatted_delete_0
 #+BEGIN_SRC d
 string _uid = doc_matters.src.doc_uid;
 string _delete_uid = format(q"┃
@@ -1690,7 +1727,7 @@ string _delete_uid = format(q"┃
 
 ***** DELETE FROM ... WHERE
 
-#+NAME: sqlite_formatted_delete
+#+NAME: sqlite_formatted_delete_1
 #+BEGIN_SRC sql
 DELETE FROM metadata_and_text
 WHERE uid = '%s';
@@ -1700,7 +1737,7 @@ WHERE uid_metadata_and_text = '%s';
 
 ***** VALUES
 
-#+NAME: sqlite_formatted_delete
+#+NAME: sqlite_formatted_delete_2
 #+BEGIN_SRC d
 ┃",
   _uid,
@@ -1712,7 +1749,7 @@ WHERE uid_metadata_and_text = '%s';
 **** INSERT doc matters & metadata
 ***** sql statement: dlang format
 
-#+NAME: sqlite_formatted_insertions_doc_matters_metadata
+#+NAME: sqlite_formatted_insertions_doc_matters_metadata_0
 #+BEGIN_SRC d
 string _uid = SQLinsertDelimiter!()(doc_matters.src.doc_uid);
 string _insert_metadata = format(q"┃
@@ -1720,7 +1757,7 @@ string _insert_metadata = format(q"┃
 
 ***** INSERT INTO
 
-#+NAME: sqlite_formatted_insertions_doc_matters_metadata
+#+NAME: sqlite_formatted_insertions_doc_matters_metadata_1
 #+BEGIN_SRC sql
   INSERT INTO metadata_and_text (
     uid,
@@ -1778,7 +1815,7 @@ string _insert_metadata = format(q"┃
 
 ***** VALUES
 
-#+NAME: sqlite_formatted_insertions_doc_matters_metadata
+#+NAME: sqlite_formatted_insertions_doc_matters_metadata_2
 #+BEGIN_SRC sql
   VALUES (
     '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s'
@@ -1787,7 +1824,7 @@ string _insert_metadata = format(q"┃
 
 ***** dlang values for formatting
 
-#+NAME: sqlite_formatted_insertions_doc_matters_metadata
+#+NAME: sqlite_formatted_insertions_doc_matters_metadata_3
 #+BEGIN_SRC d
 ┃",
   _uid,
@@ -1849,7 +1886,7 @@ writeln(doc_matters.conf_make_meta.meta.classify_topic_register_arr);
 
 ***** { if topic register then loop topic register array
 
-#+NAME: sqlite_formatted_insertions_topic_register
+#+NAME: sqlite_formatted_insertions_topic_register_0
 #+BEGIN_SRC d
 if (doc_matters.conf_make_meta.meta.classify_topic_register_arr.length > 0) {
   string _insert_topics;
@@ -1859,14 +1896,14 @@ if (doc_matters.conf_make_meta.meta.classify_topic_register_arr.length > 0) {
 
 ***** sql statement: dlang format
 
-#+NAME: sqlite_formatted_insertions_topic_register
+#+NAME: sqlite_formatted_insertions_topic_register_1
 #+BEGIN_SRC d
 _insert_topics ~= format(q"┃
 #+END_SRC
 
 ***** INSERT INTO
 
-#+NAME: sqlite_formatted_insertions_topic_register
+#+NAME: sqlite_formatted_insertions_topic_register_2
 #+BEGIN_SRC sql
   INSERT INTO topic_register (
     uid_metadata_and_text,
@@ -1880,7 +1917,7 @@ _insert_topics ~= format(q"┃
 
 ***** VALUES
 
-#+NAME: sqlite_formatted_insertions_topic_register
+#+NAME: sqlite_formatted_insertions_topic_register_3
 #+BEGIN_SRC sql
   VALUES (
     '%s', '%s', '%s', '%s', '%s', '%s'
@@ -1889,7 +1926,7 @@ _insert_topics ~= format(q"┃
 
 ***** dlang values for formatting
 
-#+NAME: sqlite_formatted_insertions_topic_register
+#+NAME: sqlite_formatted_insertions_topic_register_4
 #+BEGIN_SRC d
 ┃",
   _uid,
@@ -1903,7 +1940,7 @@ _insert_topics ~= format(q"┃
 
 ***** } close topic register & loop topic register array
 
-#+NAME: sqlite_formatted_insertions_topic_register
+#+NAME: sqlite_formatted_insertions_topic_register_5
 #+BEGIN_SRC d
   }
 }
@@ -1920,14 +1957,14 @@ either:
 
 ***** sql statement: dlang format
 
-#+NAME: sqlite_formatted_insertions_doc_objects
+#+NAME: sqlite_formatted_insertions_doc_objects_0
 #+BEGIN_SRC d
 string _insert_doc_objects_row = format(q"┃
 #+END_SRC
 
 ***** INSERT INTO
 
-#+NAME: sqlite_formatted_insertions_doc_objects
+#+NAME: sqlite_formatted_insertions_doc_objects_1
 #+BEGIN_SRC sql
   INSERT INTO doc_objects (
     uid_metadata_and_text,
@@ -1944,7 +1981,7 @@ string _insert_doc_objects_row = format(q"┃
 
 ***** VALUES
 
-#+NAME: sqlite_formatted_insertions_doc_objects
+#+NAME: sqlite_formatted_insertions_doc_objects_2
 #+BEGIN_SRC sql
   VALUES (
     '%s', %s, '%s', '%s', '%s', %s, '%s', '%s', '%s'
@@ -1953,7 +1990,7 @@ string _insert_doc_objects_row = format(q"┃
 
 ***** dlang values for formatting
 
-#+NAME: sqlite_formatted_insertions_doc_objects
+#+NAME: sqlite_formatted_insertions_doc_objects_3
 #+BEGIN_SRC d
 ┃",
   _uid,
diff --git a/org/out_src_pod.org b/org/out_src_pod.org
index 3fc6d82..e7d761b 100644
--- a/org/out_src_pod.org
+++ b/org/out_src_pod.org
@@ -7,6 +7,7 @@
 #+COPYRIGHT:   Copyright (C) 2015 - 2020 Ralph Amissah
 #+LANGUAGE:    en
 #+STARTUP:     content hideblocks hidestars noindent entitiespretty
+#+OPTIONS:     H:3 num:nil toc:t \n:nil @:t ::t |:t ^:nil _:nil -:t f:t *:t <:t
 #+PROPERTY:    header-args  :exports code
 #+PROPERTY:    header-args+ :noweb yes
 #+PROPERTY:    header-args+ :eval no
@@ -29,7 +30,8 @@ template spinePod() {
     <<source_pod_archive>>
     try {
       <<source_pod_mkdirs>>
-      <<source_pod_copy>>
+      <<source_pod_copy_0>>
+      <<source_pod_copy_1>>
       <<source_pod_zip>>
     } catch (ErrnoException ex) {
       // Handle error
@@ -140,7 +142,7 @@ if (doc_matters.opt.action.source) {
 
 ** copy                                                                :copy:
 
-#+NAME: source_pod_copy
+#+NAME: source_pod_copy_0
 #+BEGIN_SRC d
 debug(pod) {
   writeln(__LINE__, ": ",
@@ -393,7 +395,7 @@ auto fn_pod = pths_pod.pod_filename(doc_matters.src.filename).zpod;
 
 ** sha256 of pod.zip, zip debug, read zip archive
 
-#+NAME: source_pod_copy
+#+NAME: source_pod_copy_1
 #+BEGIN_SRC d
 if (exists(fn_pod)) {
   try {
diff --git a/org/out_xmls.org b/org/out_xmls.org
index c76e44b..eb83196 100644
--- a/org/out_xmls.org
+++ b/org/out_xmls.org
@@ -7,6 +7,7 @@
 #+COPYRIGHT:   Copyright (C) 2015 - 2020 Ralph Amissah
 #+LANGUAGE:    en
 #+STARTUP:     content hideblocks hidestars noindent entitiespretty
+#+OPTIONS:     H:3 num:nil toc:t \n:nil @:t ::t |:t ^:nil _:nil -:t f:t *:t <:t
 #+PROPERTY:    header-args  :exports code
 #+PROPERTY:    header-args+ :noweb yes
 #+PROPERTY:    header-args+ :eval no
@@ -28,7 +29,45 @@ template outputXHTMLs() {
   mixin spineRgxOut;
   struct outputXHTMLs {
     static auto rgx = RgxO();
-    <<xhtml_format_objects>>
+    <<xhtml_format_objects_0>>
+    <<xhtml_format_objects_1>>
+    <<xhtml_format_objects_2>>
+    <<xhtml_format_objects_3>>
+    <<xhtml_format_objects_4>>
+    <<xhtml_format_objects_5>>
+    <<xhtml_format_objects_6>>
+    <<xhtml_format_objects_7>>
+    <<xhtml_format_objects_8>>
+    <<xhtml_format_objects_9>>
+    <<xhtml_format_objects_10>>
+    <<xhtml_format_objects_11>>
+    <<xhtml_format_objects_12>>
+    <<xhtml_format_objects_13>>
+    <<xhtml_format_objects_14>>
+    <<xhtml_format_objects_15>>
+    <<xhtml_format_objects_16>>
+    <<xhtml_format_objects_17>>
+    <<xhtml_format_objects_18>>
+    <<xhtml_format_objects_19>>
+    <<xhtml_format_objects_20>>
+    <<xhtml_format_objects_21>>
+    <<xhtml_format_objects_22>>
+    <<xhtml_format_objects_23>>
+    <<xhtml_format_objects_24>>
+    <<xhtml_format_objects_25>>
+    <<xhtml_format_objects_26>>
+    <<xhtml_format_objects_27>>
+    <<xhtml_format_objects_28>>
+    <<xhtml_format_objects_29>>
+    <<xhtml_format_objects_30>>
+    <<xhtml_format_objects_31>>
+    <<xhtml_format_objects_32>>
+    <<xhtml_format_objects_33>>
+    <<xhtml_format_objects_34>>
+    <<xhtml_format_objects_35>>
+    <<xhtml_format_objects_36>>
+    <<xhtml_format_objects_37>>
+    <<xhtml_format_objects_38>>
     <<xhtml_format_objects_code>>
   }
 }
@@ -71,7 +110,7 @@ import
 *** misc
 **** div delimiter
 
-#+NAME: xhtml_format_objects
+#+NAME: xhtml_format_objects_0
 #+BEGIN_SRC d
 @safe string div_delimit(
              string  part,
@@ -107,7 +146,7 @@ import
 
 **** special characters text
 
-#+NAME: xhtml_format_objects
+#+NAME: xhtml_format_objects_1
 #+BEGIN_SRC d
 @safe string special_characters_text(string _txt) {
   _txt = _txt
@@ -122,7 +161,7 @@ import
 
 **** special characters
 
-#+NAME: xhtml_format_objects
+#+NAME: xhtml_format_objects_2
 #+BEGIN_SRC d
 @safe string special_characters(O)(
   const  O         obj,
@@ -138,7 +177,7 @@ import
 
 **** font_face
 
-#+NAME: xhtml_format_objects
+#+NAME: xhtml_format_objects_3
 #+BEGIN_SRC d
 @safe string font_face(string _txt) {
   _txt = _txt
@@ -158,7 +197,7 @@ import
 
 **** anchor tags
 
-#+NAME: xhtml_format_objects
+#+NAME: xhtml_format_objects_4
 #+BEGIN_SRC d
 @safe string _xhtml_anchor_tags(O)(O obj) {
   const(string[]) anchor_tags = obj.tags.anchor_tags;
@@ -177,7 +216,7 @@ import
 **** doc head & tails
 ***** metadata
 
-#+NAME: xhtml_format_objects
+#+NAME: xhtml_format_objects_5
 #+BEGIN_SRC d
 @safe string header_metadata(M)(
   M  doc_matters,
@@ -220,7 +259,7 @@ import
 
 ***** site info button
 
-#+NAME: xhtml_format_objects
+#+NAME: xhtml_format_objects_6
 #+BEGIN_SRC d
 @safe string site_info_button(M)(
   M  doc_matters,
@@ -250,7 +289,7 @@ import
 
 ***** search form
 
-#+NAME: xhtml_format_objects
+#+NAME: xhtml_format_objects_7
 #+BEGIN_SRC d
 @safe string inline_search_form(M)(
   M  doc_matters,
@@ -289,7 +328,7 @@ import
 
 ***** html head & head banner
 
-#+NAME: xhtml_format_objects
+#+NAME: xhtml_format_objects_8
 #+BEGIN_SRC d
 @safe string html_head(M)(
   M  doc_matters,
@@ -346,7 +385,7 @@ import
 
 ***** epub seg head
 
-#+NAME: xhtml_format_objects
+#+NAME: xhtml_format_objects_9
 #+BEGIN_SRC d
 @safe string epub3_seg_head(M)(
   M  doc_matters,
@@ -420,7 +459,7 @@ import
 
 ***** xhtml tail
 
-#+NAME: xhtml_format_objects
+#+NAME: xhtml_format_objects_10
 #+BEGIN_SRC d
 @safe string tail() {
   string o;
@@ -436,7 +475,7 @@ import
 *** inline markup
 **** images
 
-#+NAME: xhtml_format_objects
+#+NAME: xhtml_format_objects_11
 #+BEGIN_SRC d
 @safe string inline_images(O,M)(
   string          _txt,
@@ -469,7 +508,7 @@ import
 **** links
 ***** scroll, seg, epub
 
-#+NAME: xhtml_format_objects
+#+NAME: xhtml_format_objects_12
 #+BEGIN_SRC d
 @safe string inline_links(O,M)(
   string          _txt,
@@ -567,7 +606,7 @@ import
 **** notes
 ***** scroll
 
-#+NAME: xhtml_format_objects
+#+NAME: xhtml_format_objects_13
 #+BEGIN_SRC d
 @safe string inline_notes_scroll(O,M)(
   string          _txt,
@@ -604,7 +643,7 @@ import
 
 ***** seg
 
-#+NAME: xhtml_format_objects
+#+NAME: xhtml_format_objects_14
 #+BEGIN_SRC d
 @safe Tuple!(string, string[]) inline_notes_seg(O,M)(
             string  _txt,
@@ -675,7 +714,7 @@ import
 **** inline markup
 ***** scroll
 
-#+NAME: xhtml_format_objects
+#+NAME: xhtml_format_objects_15
 #+BEGIN_SRC d
 @safe string inline_markup_scroll(O,M)(
   string          _txt,
@@ -697,7 +736,7 @@ import
 
 ***** seg
 
-#+NAME: xhtml_format_objects
+#+NAME: xhtml_format_objects_16
 #+BEGIN_SRC d
 @safe auto inline_markup_seg(O,M)(
   string          _txt,
@@ -724,7 +763,7 @@ import
 *** toc
 **** subtoc
 
-#+NAME: xhtml_format_objects
+#+NAME: xhtml_format_objects_17
 #+BEGIN_SRC d
 @safe string lev4_heading_subtoc(O,M)(
   const        O  obj,
@@ -757,7 +796,7 @@ import
 
 **** navigation pre next svg
 
-#+NAME: xhtml_format_objects
+#+NAME: xhtml_format_objects_18
 #+BEGIN_SRC d
 @safe auto nav_pre_next_svg(O,M)(
   const        O  obj,
@@ -838,7 +877,7 @@ import
 *** heading
 **** heading
 
-#+NAME: xhtml_format_objects
+#+NAME: xhtml_format_objects_19
 #+BEGIN_SRC d
 @safe string heading(O,M)(
         string _txt,
@@ -909,7 +948,7 @@ import
 
 **** scroll
 
-#+NAME: xhtml_format_objects
+#+NAME: xhtml_format_objects_20
 #+BEGIN_SRC d
 @safe string heading_scroll(O,M)(
   string          _txt,
@@ -925,7 +964,7 @@ import
 
 **** seg
 
-#+NAME: xhtml_format_objects
+#+NAME: xhtml_format_objects_21
 #+BEGIN_SRC d
 @safe Tuple!(string, string[]) heading_seg(O,M)(
   string          _txt,
@@ -949,7 +988,7 @@ import
 *** para
 **** para
 
-#+NAME: xhtml_format_objects
+#+NAME: xhtml_format_objects_22
 #+BEGIN_SRC d
 @safe string para(O,M)(
         string _txt,
@@ -1005,7 +1044,7 @@ import
 
 **** scroll
 
-#+NAME: xhtml_format_objects
+#+NAME: xhtml_format_objects_23
 #+BEGIN_SRC d
 @safe string para_scroll(O,M)(
   string          _txt,
@@ -1024,7 +1063,7 @@ import
 
 **** seg
 
-#+NAME: xhtml_format_objects
+#+NAME: xhtml_format_objects_24
 #+BEGIN_SRC d
 @safe Tuple!(string, string[]) para_seg(O,M)(
   string          _txt,
@@ -1048,7 +1087,7 @@ import
 *** quote
 **** quote
 
-#+NAME: xhtml_format_objects
+#+NAME: xhtml_format_objects_25
 #+BEGIN_SRC d
 @safe string quote(O,M)(
         string _txt,
@@ -1090,7 +1129,7 @@ import
 
 **** scroll
 
-#+NAME: xhtml_format_objects
+#+NAME: xhtml_format_objects_26
 #+BEGIN_SRC d
 @safe string quote_scroll(O,M)(
   string          _txt,
@@ -1106,7 +1145,7 @@ import
 
 **** seg
 
-#+NAME: xhtml_format_objects
+#+NAME: xhtml_format_objects_27
 #+BEGIN_SRC d
 @safe Tuple!(string, string[]) quote_seg(O,M)(
   string          _txt,
@@ -1130,7 +1169,7 @@ import
 *** group
 **** group
 
-#+NAME: xhtml_format_objects
+#+NAME: xhtml_format_objects_28
 #+BEGIN_SRC d
 @safe string group(O,M)(
         string _txt,
@@ -1174,7 +1213,7 @@ import
 
 **** scroll
 
-#+NAME: xhtml_format_objects
+#+NAME: xhtml_format_objects_29
 #+BEGIN_SRC d
 @safe string group_scroll(O,M)(
   string          _txt,
@@ -1191,7 +1230,7 @@ import
 
 **** seg
 
-#+NAME: xhtml_format_objects
+#+NAME: xhtml_format_objects_30
 #+BEGIN_SRC d
 @safe Tuple!(string, string[]) group_seg(O,M)(
   string          _txt,
@@ -1215,7 +1254,7 @@ import
 *** block
 **** block
 
-#+NAME: xhtml_format_objects
+#+NAME: xhtml_format_objects_31
 #+BEGIN_SRC d
 @safe string block(O,M)(
         string _txt,
@@ -1255,7 +1294,7 @@ import
 
 **** scroll
 
-#+NAME: xhtml_format_objects
+#+NAME: xhtml_format_objects_32
 #+BEGIN_SRC d
 @safe string block_scroll(O,M)(
   string          _txt,
@@ -1272,7 +1311,7 @@ import
 
 **** seg
 
-#+NAME: xhtml_format_objects
+#+NAME: xhtml_format_objects_33
 #+BEGIN_SRC d
 @safe Tuple!(string, string[]) block_seg(O,M)(
   string          _txt,
@@ -1296,7 +1335,7 @@ import
 *** poem verse
 **** verse
 
-#+NAME: xhtml_format_objects
+#+NAME: xhtml_format_objects_34
 #+BEGIN_SRC d
 @safe string verse(O,M)(
         string _txt,
@@ -1334,7 +1373,7 @@ import
 
 **** scroll
 
-#+NAME: xhtml_format_objects
+#+NAME: xhtml_format_objects_35
 #+BEGIN_SRC d
 @safe string verse_scroll(O,M)(
   string          _txt,
@@ -1351,7 +1390,7 @@ import
 
 **** seg
 
-#+NAME: xhtml_format_objects
+#+NAME: xhtml_format_objects_36
 #+BEGIN_SRC d
 @safe Tuple!(string, string[]) verse_seg(O,M)(
   string          _txt,
@@ -1446,7 +1485,7 @@ align="left|right|center"
 
 "style=\"text-align:"  ~ "right\""
 
-#+NAME: xhtml_format_objects
+#+NAME: xhtml_format_objects_37
 #+BEGIN_SRC d
 @safe Tuple!(string, string) tablarize(O)(
   string            _txt,
@@ -1485,7 +1524,7 @@ align="left|right|center"
 
 **** table
 
-#+NAME: xhtml_format_objects
+#+NAME: xhtml_format_objects_38
 #+BEGIN_SRC d
 @safe string table(O,M)(
         string _txt,
@@ -1531,8 +1570,22 @@ module doc_reform.io_out.html;
 template outputHTML() {
   <<output_imports_xml>>
   mixin outputXHTMLs;
-  <<output_html_scroll>>
-  <<output_html_seg>>
+  <<output_html_scroll_0>>
+  <<output_html_scroll_1>>
+  <<output_html_scroll_2>>
+  <<output_html_scroll_3>>
+  <<output_html_scroll_4>>
+  <<output_html_scroll_5>>
+  <<output_html_scroll_6>>
+  <<output_html_seg_0>>
+  <<output_html_seg_1>>
+  <<output_html_seg_2>>
+  <<output_html_seg_3>>
+  <<output_html_seg_4>>
+  <<output_html_seg_5>>
+  <<output_html_seg_6>>
+  <<output_html_seg_7>>
+  <<output_html_seg_8>>
   <<output_html_css>>
   <<copy_html_images>>
 }
@@ -1541,7 +1594,7 @@ template outputHTML() {
 ** scroll                                                            :scroll:
 *** ↻ loop & switch (sections & objects) format html output
 
-#+NAME: output_html_scroll
+#+NAME: output_html_scroll_0
 #+BEGIN_SRC d
 @safe void scroll(D,M)(
   const        D    doc_abstraction,
@@ -1559,7 +1612,7 @@ template outputHTML() {
 
 **** ↻ the loops & outer switch (sections & objects) format output
 
-#+NAME: output_html_scroll
+#+NAME: output_html_scroll_1
 #+BEGIN_SRC d
   foreach (part; doc_matters.has.keys_seq.scroll) {
     foreach (obj; doc_abstraction[part]) {
@@ -1570,7 +1623,7 @@ template outputHTML() {
 
 ***** frontmatter
 
-#+NAME: output_html_scroll
+#+NAME: output_html_scroll_2
 #+BEGIN_SRC d
       case "frontmatter":              assert(part == "head" || "toc");
         switch (obj.metainfo.is_of_type) {
@@ -1606,7 +1659,7 @@ template outputHTML() {
 
 ***** body
 
-#+NAME: output_html_scroll
+#+NAME: output_html_scroll_3
 #+BEGIN_SRC d
       case "body":                     assert(part == "body" || "head");
         switch (obj.metainfo.is_of_type) {
@@ -1674,7 +1727,7 @@ template outputHTML() {
 
 ***** backmatter
 
-#+NAME: output_html_scroll
+#+NAME: output_html_scroll_4
 #+BEGIN_SRC d
       case "backmatter":
         assert(part == "endnotes" || "glossary" || "bibliography" || "bookindex" || "blurb" || "tail");
@@ -1735,7 +1788,7 @@ template outputHTML() {
 
 ***** closings & post loop
 
-#+NAME: output_html_scroll
+#+NAME: output_html_scroll_5
 #+BEGIN_SRC d
       }
     }
@@ -1747,7 +1800,7 @@ template outputHTML() {
 
 *** write output file
 
-#+NAME: output_html_scroll
+#+NAME: output_html_scroll_6
 #+BEGIN_SRC d
 @trusted void scroll_write_output(D,M)(
   D doc,
@@ -1777,7 +1830,7 @@ template outputHTML() {
 ** seg                                                                  :seg:
 *** ↻ loop & switch (sections & objects) format html output
 
-#+NAME: output_html_seg
+#+NAME: output_html_seg_0
 #+BEGIN_SRC d
 @safe void seg(D,M)(
   const D    doc_abstraction,
@@ -1799,7 +1852,7 @@ template outputHTML() {
 
 **** ↻ the loop (sections & objects) format output
 
-#+NAME: output_html_seg
+#+NAME: output_html_seg_1
 #+BEGIN_SRC d
   foreach (part; doc_matters.has.keys_seq.seg) {
     foreach (obj; doc_abstraction[part]) {
@@ -1809,7 +1862,7 @@ template outputHTML() {
 
 ***** all headings
 
-#+NAME: output_html_seg
+#+NAME: output_html_seg_2
 #+BEGIN_SRC d
       if (obj.metainfo.is_a == "heading") {
         assert(part == "head" || "toc" || "body" || "endnotes" || "glossary" || "bibliography" || "bookindex" || "blurb" || "tail");
@@ -1882,7 +1935,7 @@ template outputHTML() {
 
 ***** non-heading
 
-#+NAME: output_html_seg
+#+NAME: output_html_seg_3
 #+BEGIN_SRC d
       } else {
         assert(part == "head" || "toc" || "body" || "endnotes" || "glossary" || "bibliography" || "bookindex" || "blurb" || "tail");
@@ -1891,7 +1944,7 @@ template outputHTML() {
 
 ****** frontmatter
 
-#+NAME: output_html_seg
+#+NAME: output_html_seg_4
 #+BEGIN_SRC d
         case "frontmatter":             assert(part == "head" || "toc");
           switch (obj.metainfo.is_of_type) {
@@ -1925,7 +1978,7 @@ template outputHTML() {
 
 ****** body
 
-#+NAME: output_html_seg
+#+NAME: output_html_seg_5
 #+BEGIN_SRC d
         case "body":                    assert(part == "body");
           switch (obj.metainfo.is_of_type) {
@@ -2001,7 +2054,7 @@ template outputHTML() {
 
 ****** backmatter
 
-#+NAME: output_html_seg
+#+NAME: output_html_seg_6
 #+BEGIN_SRC d
         case "backmatter":
           assert(part == "endnotes" || "glossary" || "bibliography" || "bookindex" || "blurb" || "tail");
@@ -2067,7 +2120,7 @@ template outputHTML() {
 
 ***** closings & post loop
 
-#+NAME: output_html_seg
+#+NAME: output_html_seg_7
 #+BEGIN_SRC d
       }
     }
@@ -2078,7 +2131,7 @@ template outputHTML() {
 
 *** write output files
 
-#+NAME: output_html_seg
+#+NAME: output_html_seg_8
 #+BEGIN_SRC d
 @trusted void seg_write_output(D,E,M)( // @system?
   D doc_html,
@@ -2194,10 +2247,22 @@ template outputEPub3() {
   <<output_imports_epub>>
   mixin InternalMarkup;
   mixin outputXHTMLs;
-  <<output_epub3_fixed>>
-  <<output_epub3_constructs>>
+  <<output_epub3_fixed_0>>
+  <<output_epub3_fixed_1>>
+  <<output_epub3_constructs_0>>
+  <<output_epub3_constructs_1>>
+  <<output_epub3_constructs_2>>
   <<output_epub3_xhtml>>
-  <<output_epub3_xhtml_seg>>
+  <<output_epub3_xhtml_seg_0>>
+  <<output_epub3_xhtml_seg_1>>
+  <<output_epub3_xhtml_seg_2>>
+  <<output_epub3_xhtml_seg_3>>
+  <<output_epub3_xhtml_seg_4>>
+  <<output_epub3_xhtml_seg_5>>
+  <<output_epub3_xhtml_seg_6>>
+  <<output_epub3_xhtml_seg_7>>
+  <<output_epub3_xhtml_seg_8>>
+  <<output_epub3_xhtml_seg_9>>
   <<output_epub3_css>>
 }
 #+END_SRC
@@ -2208,7 +2273,7 @@ template outputEPub3() {
 
 - mimetype file indicating that zip file contains an EPUB
 
-#+NAME: output_epub3_fixed
+#+NAME: output_epub3_fixed_0
 #+BEGIN_SRC d
 @safe string epub3_mimetypes() {
   string o;
@@ -2221,7 +2286,7 @@ template outputEPub3() {
 
 - identifies the root package document (so systems can find it), [unchanged from epub2]
 
-#+NAME: output_epub3_fixed
+#+NAME: output_epub3_fixed_1
 #+BEGIN_SRC d
 @safe string epub3_container_xml() {
   string o;
@@ -2243,7 +2308,7 @@ xmlns="urn:oasis:names:tc:opendocument:xmlns:container">
 - provides the default reading order
 - identifies the navigation document
 
-#+NAME: output_epub3_constructs
+#+NAME: output_epub3_constructs_0
 #+BEGIN_SRC d
 @safe string epub3_oebps_content(D,M,P)(D doc_abstraction, M doc_matters, P parts) {
   auto xhtml_format = outputXHTMLs();
@@ -2349,7 +2414,7 @@ xmlns="urn:oasis:names:tc:opendocument:xmlns:container">
 
 - toc_nav.xhtml declared as nav file in content.opf (epub3 navigation document)
 
-#+NAME: output_epub3_constructs
+#+NAME: output_epub3_constructs_1
 #+BEGIN_SRC d
 @safe string epub3_oebps_toc_nav_xhtml(D,I)(D doc_abstraction, I doc_matters) {
   enum DomTags { none, open, close, close_and_open, open_still, }
@@ -2437,7 +2502,7 @@ xmlns="urn:oasis:names:tc:opendocument:xmlns:container">
 - toc.ncx (epub2 navigation document)
   - (replaced in epub3 by a declared xhtml nav file, in our case toc_nav.xhtml)
 
-#+NAME: output_epub3_constructs
+#+NAME: output_epub3_constructs_2
 #+BEGIN_SRC d
 @safe string epub2_oebps_toc_ncx(D,I)(D doc_abstraction, I doc_matters) {
   int counter = 0;
@@ -2533,7 +2598,7 @@ xmlns="urn:oasis:names:tc:opendocument:xmlns:container">
 ** the document contents                                                :seg:
 *** ↻ loop & switch (sections & objects) format epub3 xhtml output
 
-#+NAME: output_epub3_xhtml_seg
+#+NAME: output_epub3_xhtml_seg_0
 #+BEGIN_SRC d
 @system void outputEPub3(D,I)(
   const D    doc_abstraction,
@@ -2564,7 +2629,7 @@ xmlns="urn:oasis:names:tc:opendocument:xmlns:container">
 
 **** ↻ the loop (sections & objects) format output
 
-#+NAME: output_epub3_xhtml_seg
+#+NAME: output_epub3_xhtml_seg_1
 #+BEGIN_SRC d
   foreach (part; doc_matters.has.keys_seq.seg) {
     foreach (obj; doc_abstraction[part]) {
@@ -2573,7 +2638,7 @@ xmlns="urn:oasis:names:tc:opendocument:xmlns:container">
 
 ***** all headings
 
-#+NAME: output_epub3_xhtml_seg
+#+NAME: output_epub3_xhtml_seg_2
 #+BEGIN_SRC d
       if (obj.metainfo.is_a == "heading") {
         assert(part == "head" || "toc" || "body" || "endnotes" || "glossary" || "bibliography" || "bookindex" || "blurb" || "tail");
@@ -2642,7 +2707,7 @@ xmlns="urn:oasis:names:tc:opendocument:xmlns:container">
 
 ***** non-heading
 
-#+NAME: output_epub3_xhtml_seg
+#+NAME: output_epub3_xhtml_seg_3
 #+BEGIN_SRC d
       } else {
         assert(part == "head" || "toc" || "body" || "endnotes" || "glossary" || "bibliography" || "bookindex" || "blurb" || "tail");
@@ -2651,7 +2716,7 @@ xmlns="urn:oasis:names:tc:opendocument:xmlns:container">
 
 ****** frontmatter
 
-#+NAME: output_epub3_xhtml_seg
+#+NAME: output_epub3_xhtml_seg_4
 #+BEGIN_SRC d
         case "frontmatter":             assert(part == "head" || "toc");
           switch (obj.metainfo.is_of_type) {
@@ -2686,7 +2751,7 @@ xmlns="urn:oasis:names:tc:opendocument:xmlns:container">
 
 ****** body
 
-#+NAME: output_epub3_xhtml_seg
+#+NAME: output_epub3_xhtml_seg_5
 #+BEGIN_SRC d
         case "body":                    assert(part == "body");
           switch (obj.metainfo.is_of_type) {
@@ -2762,7 +2827,7 @@ xmlns="urn:oasis:names:tc:opendocument:xmlns:container">
 
 ****** backmatter
 
-#+NAME: output_epub3_xhtml_seg
+#+NAME: output_epub3_xhtml_seg_6
 #+BEGIN_SRC d
         case "backmatter":
           assert(part == "endnotes" || "glossary" || "bibliography" || "bookindex" || "blurb" || "tail");
@@ -2873,7 +2938,7 @@ xmlns="urn:oasis:names:tc:opendocument:xmlns:container">
 
 ***** closings & post loop
 
-#+NAME: output_epub3_xhtml_seg
+#+NAME: output_epub3_xhtml_seg_7
 #+BEGIN_SRC d
       }
     }
@@ -2890,7 +2955,7 @@ xmlns="urn:oasis:names:tc:opendocument:xmlns:container">
 
 ** write output files                                             :write:zip:
 
-#+NAME: output_epub3_xhtml_seg
+#+NAME: output_epub3_xhtml_seg_8
 #+BEGIN_SRC d
 @system void epub3_write_output_files(W,M)(
   W epub_write,
@@ -3086,7 +3151,7 @@ xmlns="urn:oasis:names:tc:opendocument:xmlns:container">
 
 ** zip debug, read zip  archive                                         :zip:
 
-#+NAME: output_epub3_xhtml_seg
+#+NAME: output_epub3_xhtml_seg_9
 #+BEGIN_SRC d
   debug(epub_archive) {
     if (exists(fn_epub)) {
diff --git a/org/out_xmls_css.org b/org/out_xmls_css.org
index be358a6..38bb73d 100644
--- a/org/out_xmls_css.org
+++ b/org/out_xmls_css.org
@@ -7,6 +7,7 @@
 #+COPYRIGHT:   Copyright (C) 2015 - 2020 Ralph Amissah
 #+LANGUAGE:    en
 #+STARTUP:     content hideblocks hidestars noindent entitiespretty
+#+OPTIONS:     H:3 num:nil toc:t \n:nil @:t ::t |:t ^:nil _:nil -:t f:t *:t <:t
 #+PROPERTY:    header-args  :exports code
 #+PROPERTY:    header-args+ :noweb yes
 #+PROPERTY:    header-args+ :eval no
@@ -31,39 +32,90 @@ template spineCss() {
 <<css_insert_shared_insert_variable_indent_values>>
 <<css_insert_shared_insert_variable_ocn_color_values>>
     string _css_light_html_seg = format(q"┃
-<<css_light_shared>>
-<<css_light_html_seg>>
+<<css_light_shared_0>>
+<<css_light_shared_1>>
+<<css_light_shared_2>>
+<<css_light_shared_3>>
+<<css_light_shared_4>>
+<<css_light_shared_5>>
+<<css_light_shared_6>>
+<<css_light_shared_7>>
+<<css_light_shared_8>>
+<<css_light_shared_9>>
+<<css_light_html_seg_0>>
+<<css_light_html_seg_1>>
+<<css_light_html_seg_2>>
 ┃",
     _color_ocn_light,
     _css_indent,
     _color_ocn_light,
 );
     string _css_dark_html_seg = format(q"┃
-<<css_dark_shared>>
-<<css_dark_html_seg>>
+<<css_dark_shared_0>>
+<<css_dark_shared_1>>
+<<css_dark_shared_2>>
+<<css_dark_shared_3>>
+<<css_dark_shared_4>>
+<<css_dark_shared_5>>
+<<css_dark_shared_6>>
+<<css_dark_shared_7>>
+<<css_dark_shared_8>>
+<<css_dark_shared_9>>
+<<css_dark_html_seg_0>>
+<<css_dark_html_seg_1>>
+<<css_dark_html_seg_2>>
 ┃",
     _color_ocn_dark,
     _css_indent,
     _color_ocn_dark,
 );
     string _css_light_html_scroll = format(q"┃
-<<css_light_shared>>
-<<css_light_html_scroll>>
+<<css_light_shared_0>>
+<<css_light_shared_1>>
+<<css_light_shared_2>>
+<<css_light_shared_3>>
+<<css_light_shared_4>>
+<<css_light_shared_5>>
+<<css_light_shared_6>>
+<<css_light_shared_7>>
+<<css_light_shared_8>>
+<<css_light_shared_9>>
+<<css_light_html_scroll_0>>
+<<css_light_html_scroll_1>>
 ┃",
     _color_ocn_light,
     _css_indent,
     _color_ocn_light,
 );
     string _css_dark_html_scroll = format(q"┃
-<<css_dark_shared>>
-<<css_dark_html_scroll>>
+<<css_dark_shared_0>>
+<<css_dark_shared_1>>
+<<css_dark_shared_2>>
+<<css_dark_shared_3>>
+<<css_dark_shared_4>>
+<<css_dark_shared_5>>
+<<css_dark_shared_6>>
+<<css_dark_shared_7>>
+<<css_dark_shared_8>>
+<<css_dark_shared_9>>
+<<css_dark_html_scroll_0>>
+<<css_dark_html_scroll_1>>
 ┃",
     _color_ocn_dark,
     _css_indent,
     _color_ocn_dark,
 );
     string _css_light_epub = format(q"┃
-<<css_light_shared>>
+<<css_light_shared_0>>
+<<css_light_shared_1>>
+<<css_light_shared_2>>
+<<css_light_shared_3>>
+<<css_light_shared_4>>
+<<css_light_shared_5>>
+<<css_light_shared_6>>
+<<css_light_shared_7>>
+<<css_light_shared_8>>
+<<css_light_shared_9>>
 <<css_light_epub>>
 ┃",
     _color_ocn_light,
@@ -71,7 +123,16 @@ template spineCss() {
     _color_ocn_light,
 );
     string _css_dark_epub = format(q"┃
-<<css_dark_shared>>
+<<css_dark_shared_0>>
+<<css_dark_shared_1>>
+<<css_dark_shared_2>>
+<<css_dark_shared_3>>
+<<css_dark_shared_4>>
+<<css_dark_shared_5>>
+<<css_dark_shared_6>>
+<<css_dark_shared_7>>
+<<css_dark_shared_8>>
+<<css_dark_shared_9>>
 <<css_dark_epub>>
 ┃",
     _color_ocn_dark,
@@ -105,7 +166,7 @@ template spineCss() {
 *** html shared
 **** general
 
-#+NAME: css_light_shared
+#+NAME: css_light_shared_0
 #+BEGIN_SRC css
   *{
     padding                  : 0px;
@@ -124,7 +185,7 @@ template spineCss() {
 
 **** link
 
-#+NAME: css_light_shared
+#+NAME: css_light_shared_1
 #+BEGIN_SRC css
   a:link {
     color                    : #003399;
@@ -165,7 +226,7 @@ template spineCss() {
 
 **** div
 
-#+NAME: css_light_shared
+#+NAME: css_light_shared_2
 #+BEGIN_SRC css
   div {
     margin-left              : 0;
@@ -283,7 +344,7 @@ template spineCss() {
 **** paragraphs headings blocks
 ***** misc
 
-#+NAME: css_light_shared
+#+NAME: css_light_shared_3
 #+BEGIN_SRC css
   .norm, .bold, .verse, .group, .block, .alt {
     line-height              : 133%%;
@@ -309,7 +370,7 @@ template spineCss() {
   }
 #+END_SRC
 
-#+NAME: css_light_shared
+#+NAME: css_light_shared_4
 #+BEGIN_SRC css
   img {
     max-width                : 100%%;
@@ -319,7 +380,7 @@ template spineCss() {
 
 ***** code block
 
-#+NAME: css_light_shared
+#+NAME: css_light_shared_5
 #+BEGIN_SRC css
   pre {
     width                    : auto;
@@ -386,7 +447,7 @@ template spineCss() {
 
 ***** paragraph general
 
-#+NAME: css_light_shared
+#+NAME: css_light_shared_6
 #+BEGIN_SRC css
   p.spaced { white-space     : pre; }
   p.block {
@@ -502,14 +563,14 @@ template spineCss() {
 
 ***** paragraph indent
 
-#+NAME: css_light_shared
+#+NAME: css_light_shared_7
 #+BEGIN_SRC css
 %s
 #+END_SRC
 
 ***** misc including tables & lists
 
-#+NAME: css_light_shared
+#+NAME: css_light_shared_8
 #+BEGIN_SRC css
   note { white-space         : pre; }
   label.ocn {
@@ -578,7 +639,7 @@ template spineCss() {
 
 ***** headings
 
-#+NAME: css_light_shared
+#+NAME: css_light_shared_9
 #+BEGIN_SRC css
   h0, h1, h2, h3, h4, h5, h6, h7 {
     font-weight              : bold;
@@ -683,7 +744,7 @@ template spineCss() {
 *** html seg
 **** previous next
 
-#+NAME: css_light_html_seg
+#+NAME: css_light_html_seg_0
 #+BEGIN_SRC css
   .icon-bar {
     width                    : 100%%;
@@ -763,7 +824,7 @@ template spineCss() {
 
 **** flex
 
-#+NAME: css_light_html_seg
+#+NAME: css_light_html_seg_1
 #+BEGIN_SRC css
   /* flex */
   .flex-menu-bar {
@@ -800,7 +861,7 @@ template spineCss() {
 
 Consider what if anything should be used here
 
-#+NAME: css_light_html_seg
+#+NAME: css_light_html_seg_2
 #+BEGIN_SRC css
   /* grid */
   .wrapper {
@@ -889,7 +950,7 @@ Consider what if anything should be used here
 *** html scroll
 **** flex
 
-#+NAME: css_light_html_scroll
+#+NAME: css_light_html_scroll_0
 #+BEGIN_SRC css
   /* flex */
   .flex-menu-bar {
@@ -924,7 +985,7 @@ Consider what if anything should be used here
 
 **** grid
 
-#+NAME: css_light_html_scroll
+#+NAME: css_light_html_scroll_1
 #+BEGIN_SRC css
   /* grid */
   .wrapper {
@@ -1020,7 +1081,7 @@ Consider what if anything should be used here
 *** html shared
 **** general
 
-#+NAME: css_dark_shared
+#+NAME: css_dark_shared_0
 #+BEGIN_SRC css
   *{
     padding                  : 0px;
@@ -1039,7 +1100,7 @@ Consider what if anything should be used here
 
 **** link
 
-#+NAME: css_dark_shared
+#+NAME: css_dark_shared_1
 #+BEGIN_SRC css
   a:link {
     color                    : #FFFFFF;
@@ -1080,7 +1141,7 @@ Consider what if anything should be used here
 
 **** div
 
-#+NAME: css_dark_shared
+#+NAME: css_dark_shared_2
 #+BEGIN_SRC css
   div {
     margin-left              : 0;
@@ -1198,7 +1259,7 @@ Consider what if anything should be used here
 **** paragraphs headings blocks
 ***** misc
 
-#+NAME: css_dark_shared
+#+NAME: css_dark_shared_3
 #+BEGIN_SRC css
   .norm, .bold, .verse, .group, .block, .alt {
     line-height              : 133%%;
@@ -1224,7 +1285,7 @@ Consider what if anything should be used here
   }
 #+END_SRC
 
-#+NAME: css_dark_shared
+#+NAME: css_dark_shared_4
 #+BEGIN_SRC css
   img {
     max-width                : 100%%;
@@ -1234,7 +1295,7 @@ Consider what if anything should be used here
 
 ***** code block
 
-#+NAME: css_dark_shared
+#+NAME: css_dark_shared_5
 #+BEGIN_SRC css
   pre {
     width                    : auto;
@@ -1300,7 +1361,7 @@ Consider what if anything should be used here
 
 ***** paragraph general
 
-#+NAME: css_dark_shared
+#+NAME: css_dark_shared_6
 #+BEGIN_SRC css
   p.spaced { white-space     : pre; }
   p.block {
@@ -1416,14 +1477,14 @@ Consider what if anything should be used here
 
 ***** paragraph indent
 
-#+NAME: css_dark_shared
+#+NAME: css_dark_shared_7
 #+BEGIN_SRC css
 %s
 #+END_SRC
 
 ***** misc including tables & lists
 
-#+NAME: css_dark_shared
+#+NAME: css_dark_shared_8
 #+BEGIN_SRC css
   note { white-space         : pre; }
   label.ocn {
@@ -1492,7 +1553,7 @@ Consider what if anything should be used here
 
 ***** headings
 
-#+NAME: css_dark_shared
+#+NAME: css_dark_shared_9
 #+BEGIN_SRC css
   h0, h1, h2, h3, h4, h5, h6, h7 {
     font-weight              : bold;
@@ -1597,7 +1658,7 @@ Consider what if anything should be used here
 *** html seg
 **** previous next
 
-#+NAME: css_dark_html_seg
+#+NAME: css_dark_html_seg_0
 #+BEGIN_SRC css
   .icon-bar {
     width                    : 100%%;
@@ -1677,7 +1738,7 @@ Consider what if anything should be used here
 
 **** flex
 
-#+NAME: css_dark_html_seg
+#+NAME: css_dark_html_seg_1
 #+BEGIN_SRC css
   /* flex */
   .flex-menu-bar {
@@ -1714,7 +1775,7 @@ Consider what if anything should be used here
 
 Consider what if anything should be used here
 
-#+NAME: css_dark_html_seg
+#+NAME: css_dark_html_seg_2
 #+BEGIN_SRC css
   /* grid */
   .wrapper {
@@ -1803,7 +1864,7 @@ Consider what if anything should be used here
 *** html scroll
 **** flex
 
-#+NAME: css_dark_html_scroll
+#+NAME: css_dark_html_scroll_0
 #+BEGIN_SRC css
   /* flex */
   .flex-menu-bar {
@@ -1838,7 +1899,7 @@ Consider what if anything should be used here
 
 **** grid
 
-#+NAME: css_dark_html_scroll
+#+NAME: css_dark_html_scroll_1
 #+BEGIN_SRC css
   /* grid */
   .wrapper {
diff --git a/org/out_zip.org b/org/out_zip.org
index 8a98638..8af05f8 100644
--- a/org/out_zip.org
+++ b/org/out_zip.org
@@ -6,6 +6,7 @@
 #+COPYRIGHT:   Copyright (C) 2015 - 2020 Ralph Amissah
 #+LANGUAGE:    en
 #+STARTUP:     content hideblocks hidestars noindent entitiespretty
+#+OPTIONS:     H:3 num:nil toc:t \n:nil @:t ::t |:t ^:nil _:nil -:t f:t *:t <:t
 #+PROPERTY:    header-args  :exports code
 #+PROPERTY:    header-args+ :noweb yes
 #+PROPERTY:    header-args+ :eval no
diff --git a/org/output_hub.org b/org/output_hub.org
index 5116c7c..7b8b96c 100644
--- a/org/output_hub.org
+++ b/org/output_hub.org
@@ -7,6 +7,7 @@
 #+COPYRIGHT:   Copyright (C) 2015 - 2020 Ralph Amissah
 #+LANGUAGE:    en
 #+STARTUP:     content hideblocks hidestars noindent entitiespretty
+#+OPTIONS:     H:3 num:nil toc:t \n:nil @:t ::t |:t ^:nil _:nil -:t f:t *:t <:t
 #+PROPERTY:    header-args  :exports code
 #+PROPERTY:    header-args+ :noweb yes
 #+PROPERTY:    header-args+ :eval no
@@ -38,7 +39,15 @@ template outputHub() {
     enum outTask { source_or_pod, sqlite, sqlite_multi, latex, odt, epub, html_scroll, html_seg, html_stuff }
     void Scheduled(D,I)(int sched, D doc_abstraction, I doc_matters) {
       auto msg = Msg!()(doc_matters);
-      <<output_scheduled_task>>
+      <<output_scheduled_task_source_or_pod>>
+      <<output_scheduled_task_epub>>
+      <<output_scheduled_task_html_meta>>
+      <<output_scheduled_task_html_scroll>>
+      <<output_scheduled_task_html_seg>>
+      <<output_scheduled_task_html_out>>
+      <<output_scheduled_task_latex>>
+      <<output_scheduled_task_odt>>
+      <<output_scheduled_task_sqlite>>
     }
     if (!(doc_matters.opt.action.quiet)) {
       writeln(" ", doc_matters.src.filename_base);
@@ -61,7 +70,9 @@ template outputHubOp() {
   @system void outputHubOp(E,O,C)(E env, O opt_action, C config) {
     mixin spineRgxOut;
     static auto rgx = RgxO();
-    <<output_options_op>>
+    <<output_options_op_sqlite_db_drop>>
+    <<output_options_op_sqlite_db_create>>
+    <<output_options_op_cgi_search_form_codegen>>
   }
 }
 #+END_SRC
@@ -82,7 +93,7 @@ import doc_reform.io_out,
 **** source: _dr_src_ &/or _pod_                                     :source:pod:
 - [[./output_pod.org][output_pod]]
 
-#+NAME: output_scheduled_task
+#+NAME: output_scheduled_task_source_or_pod
 #+BEGIN_SRC d
 if (sched == outTask.source_or_pod) {
   if (doc_matters.opt.action.source) {
@@ -104,7 +115,7 @@ if (sched == outTask.source_or_pod) {
 
 **** epub                                                              :epub:
 
-#+NAME: output_scheduled_task
+#+NAME: output_scheduled_task_epub
 #+BEGIN_SRC d
 if (sched == outTask.epub) {
   msg.v("epub3 processing... ");
@@ -117,7 +128,7 @@ if (sched == outTask.epub) {
 **** html                                                              :html:
 ***** metadata                                                     :metadata:
 
-#+NAME: output_scheduled_task
+#+NAME: output_scheduled_task_html_meta
 #+BEGIN_SRC d
 if (sched == outTask.html_stuff) {
   outputMetadata!()(doc_matters);
@@ -127,7 +138,7 @@ if (sched == outTask.html_stuff) {
 
 ***** scroll                                                         :scroll:
 
-#+NAME: output_scheduled_task
+#+NAME: output_scheduled_task_html_scroll
 #+BEGIN_SRC d
 if (sched == outTask.html_scroll) {
   msg.v("html scroll processing... ");
@@ -139,7 +150,7 @@ if (sched == outTask.html_scroll) {
 
 ***** seg                                                               :seg:
 
-#+NAME: output_scheduled_task
+#+NAME: output_scheduled_task_html_seg
 #+BEGIN_SRC d
 if (sched == outTask.html_seg) {
   msg.v("html seg processing... ");
@@ -151,7 +162,7 @@ if (sched == outTask.html_seg) {
 
 ***** css, images etc                                            :css:images:
 
-#+NAME: output_scheduled_task
+#+NAME: output_scheduled_task_html_out
 #+BEGIN_SRC d
 if (sched == outTask.html_stuff) {
   import doc_reform.io_out.html;
@@ -163,7 +174,7 @@ if (sched == outTask.html_stuff) {
 
 **** latex / pdf                                                  :latex:pdf:
 
-#+NAME: output_scheduled_task
+#+NAME: output_scheduled_task_latex
 #+BEGIN_SRC d
 if (sched == outTask.latex) {
   msg.v("latex processing... (available for downstream processing & pdf output");
@@ -175,7 +186,7 @@ if (sched == outTask.latex) {
 
 **** odf / odt                                                      :odf:odt:
 
-#+NAME: output_scheduled_task
+#+NAME: output_scheduled_task_odt
 #+BEGIN_SRC d
 if (sched == outTask.odt) {
   msg.v("odf:odt processing... ");
@@ -187,7 +198,7 @@ if (sched == outTask.odt) {
 
 **** sqlite discrete                                                 :sqlite:
 
-#+NAME: output_scheduled_task
+#+NAME: output_scheduled_task_sqlite
 #+BEGIN_SRC d
 if (sched == outTask.sqlite) {
   msg.v("sqlite processing... ");
@@ -219,7 +230,7 @@ if (doc_matters.opt.action.sqlite_update) {
 ***** no markup source files to process
 ******  drop                                                           :drop:
 
-#+NAME: output_options_op
+#+NAME: output_options_op_sqlite_db_drop
 #+BEGIN_SRC d
 if ((opt_action.sqlite_db_drop)) {
   if ((opt_action.verbose)) {
@@ -235,7 +246,7 @@ if ((opt_action.sqlite_db_drop)) {
 
 ******  create                                                       :create:
 
-#+NAME: output_options_op
+#+NAME: output_options_op_sqlite_db_create
 #+BEGIN_SRC d
 if ((opt_action.sqlite_db_create)) {
   if ((opt_action.verbose)) {
@@ -252,7 +263,7 @@ if ((opt_action.sqlite_db_create)) {
 
 ****  cgi sqlite search form
 
-#+NAME: output_options_op
+#+NAME: output_options_op_cgi_search_form_codegen
 #+BEGIN_SRC d
 if ((opt_action.cgi_search_form_codegen)) {
   if ((opt_action.verbose)) {
diff --git a/org/output_show.org b/org/output_show.org
index ff33803..8550f53 100644
--- a/org/output_show.org
+++ b/org/output_show.org
@@ -7,6 +7,7 @@
 #+COPYRIGHT:   Copyright (C) 2015 - 2020 Ralph Amissah
 #+LANGUAGE:    en
 #+STARTUP:     content hideblocks hidestars noindent entitiespretty
+#+OPTIONS:     H:3 num:nil toc:t \n:nil @:t ::t |:t ^:nil _:nil -:t f:t *:t <:t
 #+PROPERTY:    header-args  :exports code
 #+PROPERTY:    header-args+ :noweb yes
 #+PROPERTY:    header-args+ :eval no
diff --git a/org/spine.org b/org/spine.org
index 82cdeb7..5f39984 100644
--- a/org/spine.org
+++ b/org/spine.org
@@ -7,6 +7,7 @@
 #+COPYRIGHT:   Copyright (C) 2015 - 2020 Ralph Amissah
 #+LANGUAGE:    en
 #+STARTUP:     content hideblocks hidestars noindent entitiespretty
+#+OPTIONS:     H:3 num:nil toc:t \n:nil @:t ::t |:t ^:nil _:nil -:t f:t *:t <:t
 #+PROPERTY:    header-args  :exports code
 #+PROPERTY:    header-args+ :noweb yes
 #+PROPERTY:    header-args+ :eval no
@@ -96,8 +97,16 @@ string project_name = "spine";
 string program_name = "spine";
 @system void main(string[] args) {
   <<spine_mixin>>
-  <<spine_init>>
-  <<spine_args>>
+  <<spine_init_0>>
+  <<spine_init_1>>
+  <<spine_init_2>>
+  <<spine_args_0>>
+  <<spine_args_1>>
+  <<spine_args_2>>
+  <<spine_args_3>>
+  <<spine_args_4>>
+  <<spine_args_5>>
+  <<spine_args_6>>
   if (_manifests.length > 1                            // _manifests[0] initialized dummy element
   && _opt_action.abstraction) {
     if (_opt_action.parallelise) {                     // see else
@@ -106,7 +115,12 @@ string program_name = "spine";
         if (!empty(manifest.src.filename)) {
           <<spine_each_file_do_scope>>
           <<spine_each_file_do_abstraction>>
-          <<spine_each_file_do_debugs_checkdoc>>
+          <<spine_each_file_do_debugs_checkdoc_0>>
+          <<spine_each_file_do_debugs_checkdoc_1>>
+          <<spine_each_file_do_debugs_checkdoc_2>>
+          <<spine_each_file_do_debugs_checkdoc_3>>
+          <<spine_each_file_do_debugs_checkdoc_4>>
+          <<spine_each_file_do_debugs_checkdoc_5>>
           <<spine_each_file_do_selected_output>>
           <<spine_each_file_do_scope_exit>>
         } else {
@@ -121,7 +135,12 @@ string program_name = "spine";
         if (!empty(manifest.src.filename)) {
           <<spine_each_file_do_scope>>
           <<spine_each_file_do_abstraction>>
-          <<spine_each_file_do_debugs_checkdoc>>
+          <<spine_each_file_do_debugs_checkdoc_0>>
+          <<spine_each_file_do_debugs_checkdoc_1>>
+          <<spine_each_file_do_debugs_checkdoc_2>>
+          <<spine_each_file_do_debugs_checkdoc_3>>
+          <<spine_each_file_do_debugs_checkdoc_4>>
+          <<spine_each_file_do_debugs_checkdoc_5>>
           <<spine_each_file_do_selected_output>>
           <<spine_each_file_do_scope_exit>>
         } else {
@@ -307,14 +326,14 @@ mixin outputHub;
 
 **** init                                                              :init:
 
-#+NAME: spine_init
+#+NAME: spine_init_0
 #+BEGIN_SRC d
 auto hvst = spineHarvest!();
 #+END_SRC
 
 **** args                                                              :args:
 
-#+NAME: spine_init
+#+NAME: spine_init_1
 #+BEGIN_SRC d
 string flag_action;
 string arg_unrecognized;
@@ -324,7 +343,7 @@ static auto rgx = RgxI();
 
 *** scope (run complete)                                              :scope:
 
-#+NAME: spine_init
+#+NAME: spine_init_2
 #+BEGIN_SRC d
 scope(success) {
   writefln(
@@ -349,7 +368,7 @@ scope(failure) {
 - set getopt options
 ***** initialize
 
-#+NAME: spine_args
+#+NAME: spine_args_0
 #+BEGIN_SRC d
 bool[string] opts = [
   "abstraction"                 : false,
@@ -427,7 +446,7 @@ string[string] settings = [
 
 ***** set & describe
 
-#+NAME: spine_args
+#+NAME: spine_args_1
 #+BEGIN_SRC d
 auto helpInfo = getopt(args,
   std.getopt.config.passThrough,
@@ -509,7 +528,7 @@ if (helpInfo.helpWanted) {
 **** getopt hash to struct
 - move getopt options to struct
 
-#+NAME: spine_args
+#+NAME: spine_args_2
 #+BEGIN_SRC d
 enum outTask { source_or_pod, sqlite, sqlite_multi, latex, odt, epub, html_scroll, html_seg, html_stuff }
 struct OptActions {
@@ -830,7 +849,7 @@ OptActions _opt_action = OptActions();
 **** env
 - environmental info
 
-#+NAME: spine_args
+#+NAME: spine_args_3
 #+BEGIN_SRC d
 @safe auto program_info() {
   struct ProgramInfo {
@@ -862,7 +881,7 @@ auto _env = [
 
 *** get/read site config
 
-#+NAME: spine_args
+#+NAME: spine_args_4
 #+BEGIN_SRC d
 auto _manifested = PathMatters!()(_opt_action, _env, "");
 auto _manifests = [ _manifested ];
@@ -897,7 +916,7 @@ if (_opt_action.show_config) {
 
 *** use config for operations that do not require file processing
 
-#+NAME: spine_args
+#+NAME: spine_args_5
 #+BEGIN_SRC d
 if (!(_opt_action.skip_output)) {
   if ((_opt_action.debug_do)
@@ -916,7 +935,7 @@ if (!(_opt_action.skip_output)) {
 
 *** opt action on processing files (loop args)
 
-#+NAME: spine_args
+#+NAME: spine_args_6
 #+BEGIN_SRC d
 ConfComposite _make_and_meta_struct = _config;
 destroy(_config);
@@ -1153,7 +1172,7 @@ if ((doc_matters.opt.action.debug_do)
 ***** show document summary - abstraction _print summary_ (to screen) :abstraction:summary:
 --show-summary (abstraction summary)
 
-#+NAME: spine_each_file_do_debugs_checkdoc
+#+NAME: spine_each_file_do_debugs_checkdoc_0
 #+BEGIN_SRC d
 /+ ↓ debugs +/
 if (doc_matters.opt.action.verbose
@@ -1167,7 +1186,7 @@ if (doc_matters.opt.action.verbose
 ***** show metadata (doc headers metadata)
 --show-metadata
 
-#+NAME: spine_each_file_do_debugs_checkdoc
+#+NAME: spine_each_file_do_debugs_checkdoc_1
 #+BEGIN_SRC d
 /+ ↓ debugs +/
 if (doc_matters.opt.action.show_metadata) {
@@ -1179,7 +1198,7 @@ if (doc_matters.opt.action.show_metadata) {
 ***** show make (make files & doc headers)
 --show-make
 
-#+NAME: spine_each_file_do_debugs_checkdoc
+#+NAME: spine_each_file_do_debugs_checkdoc_2
 #+BEGIN_SRC d
 /+ ↓ debugs +/
 if (doc_matters.opt.action.show_make) {
@@ -1191,7 +1210,7 @@ if (doc_matters.opt.action.show_make) {
 ***** show config (config files & doc headers)
 --show-config
 
-#+NAME: spine_each_file_do_debugs_checkdoc
+#+NAME: spine_each_file_do_debugs_checkdoc_3
 #+BEGIN_SRC d
 /+ ↓ debugs +/
 if (doc_matters.opt.action.show_config) {
@@ -1203,7 +1222,7 @@ if (doc_matters.opt.action.show_config) {
 ***** abstraction harvest                               :abstraction:harvest:
 - abstraction harvest
 
-#+NAME: spine_each_file_do_debugs_checkdoc
+#+NAME: spine_each_file_do_debugs_checkdoc_4
 #+BEGIN_SRC d
 if (doc_matters.opt.action.harvest) {
   auto _hvst = spineMetaDocHarvest!()(doc_matters, hvst);
@@ -1225,7 +1244,7 @@ if (doc_matters.opt.action.harvest) {
 **** 1. _debug_ (document parts, checkdoc)                     :debug:checkdoc:
 - [[./meta_output_debugs.org][meta_output_debugs]]
 
-#+NAME: spine_each_file_do_debugs_checkdoc
+#+NAME: spine_each_file_do_debugs_checkdoc_5
 #+BEGIN_SRC d
 /+ ↓ debugs +/
 if (doc_matters.opt.action.debug_do) {
@@ -1304,6 +1323,14 @@ template spineAbstraction() {
     <<spine_each_file_do_split_dr_markup_file_header_into_make_and_meta_structs>>
     <<spine_each_file_do_document_abstraction>>
     <<spine_each_file_do_document_matters>>
+    <<spine_each_file_do_document_matters_0>>
+    <<spine_each_file_do_document_matters_1>>
+    <<spine_each_file_do_document_matters_2>>
+    <<spine_each_file_do_document_matters_3>>
+    <<spine_each_file_do_document_matters_4>>
+    <<spine_each_file_do_document_matters_5>>
+    <<spine_each_file_do_document_matters_6>>
+    <<spine_each_file_do_document_matters_7>>
     auto t = tuple(doc_abstraction, doc_matters);
     return t;
   }
@@ -1454,14 +1481,14 @@ if ((_opt_action.debug_do)
 
 **** DocumentMatters struct {
 
-#+NAME: spine_each_file_do_document_matters
+#+NAME: spine_each_file_do_document_matters_0
 #+BEGIN_SRC d
 struct DocumentMatters {
 #+END_SRC
 
 **** generator related
 
-#+NAME: spine_each_file_do_document_matters
+#+NAME: spine_each_file_do_document_matters_1
 #+BEGIN_SRC d
   @safe auto generator_program() {
     struct Prog_ {
@@ -1510,7 +1537,7 @@ struct DocumentMatters {
 
 **** config make & meta
 
-#+NAME: spine_each_file_do_document_matters
+#+NAME: spine_each_file_do_document_matters_2
 #+BEGIN_SRC d
   @safe auto conf_make_meta() {
     return _make_and_meta_struct;
@@ -1522,7 +1549,7 @@ struct DocumentMatters {
 
 **** env related
 
-#+NAME: spine_each_file_do_document_matters
+#+NAME: spine_each_file_do_document_matters_3
 #+BEGIN_SRC d
   @safe auto env() {
     struct Env_ {
@@ -1539,7 +1566,7 @@ struct DocumentMatters {
 
 **** opt
 
-#+NAME: spine_each_file_do_document_matters
+#+NAME: spine_each_file_do_document_matters_4
 #+BEGIN_SRC d
   @safe auto opt() {
     struct Opt_ {
@@ -1557,7 +1584,7 @@ struct DocumentMatters {
 
 **** output related
 
-#+NAME: spine_each_file_do_document_matters
+#+NAME: spine_each_file_do_document_matters_5
 #+BEGIN_SRC d
   @safe auto src() {
     return _manifest.src;
@@ -1618,7 +1645,7 @@ struct DocumentMatters {
 
 **** } close
 
-#+NAME: spine_each_file_do_document_matters
+#+NAME: spine_each_file_do_document_matters_6
 #+BEGIN_SRC d
 }
 auto doc_matters = DocumentMatters();
@@ -1626,7 +1653,7 @@ auto doc_matters = DocumentMatters();
 
 **** step complete message
 
-#+NAME: spine_each_file_do_document_matters
+#+NAME: spine_each_file_do_document_matters_7
 #+BEGIN_SRC d
 if ((_opt_action.debug_do)
 || (_opt_action.very_verbose)
diff --git a/org/spine_build_scaffold.org b/org/spine_build_scaffold.org
index c18b599..542e8e3 100644
--- a/org/spine_build_scaffold.org
+++ b/org/spine_build_scaffold.org
@@ -7,6 +7,7 @@
 #+COPYRIGHT:   Copyright (C) 2015 - 2020 Ralph Amissah
 #+LANGUAGE:    en
 #+STARTUP:     content hideblocks hidestars noindent entitiespretty
+#+OPTIONS:     H:3 num:nil toc:t \n:nil @:t ::t |:t ^:nil _:nil -:t f:t *:t <:t
 #+PROPERTY:    header-args  :exports code
 #+PROPERTY:    header-args+ :noweb yes
 #+PROPERTY:    header-args+ :eval no
@@ -14,27 +15,86 @@
 #+PROPERTY:    header-args+ :cache no
 #+PROPERTY:    header-args+ :padline no
 
-[[./org/spine.org][spine.org]]  [[./org/][org/]]
+[[./spine.org][spine.org]]  [[../org/][org/]]
+[[./spine_info.org][spine_info.org]]
 
 * makefile                                                         :makefile:
+** tangle
+
+#+BEGIN_SRC makefile :tangle ../makefile
+<<makefile_var_0>>
+<<makefile_var_1>>
+<<makefile_var_2>>
+<<makefile_var_3>>
+<<makefile_var_4>>
+<<makefile_var_5>>
+<<makefile_a_0>>
+<<makefile_a_1>>
+<<makefile_a_2>>
+<<makefile_b_0>>
+<<makefile_b_1>>
+<<makefile_b_2>>
+<<makefile_b_3>>
+<<makefile_b_4>>
+<<makefile_meson>>
+<<makefile_c_0>>
+<<makefile_c_1>>
+<<makefile_c_2>>
+<<makefile_dmd_0>>
+<<makefile_dmd_1>>
+<<makefile_dmd_2>>
+<<makefile_dmd_3>>
+<<makefile_gdc_0>>
+<<makefile_gdc_1>>
+<<makefile_gdc_2>>
+<<makefile_gdc_3>>
+<<makefile_ldc_0>>
+<<makefile_ldc_1>>
+<<makefile_ldc_2>>
+<<makefile_ldc_3>>
+<<makefile_d_0>>
+<<makefile_d_1>>
+<<makefile_d_2>>
+<<makefile_testrun_0>>
+<<makefile_testrun_1>>
+<<makefile_testrun_2>>
+<<makefile_testrun_3>>
+<<makefile_testrun_4>>
+<<makefile_testrun_5>>
+<<makefile_testrun_6>>
+<<makefile_testrun_7>>
+<<makefile_testrun_8>>
+<<makefile_testrun_9>>
+<<makefile_testrun_10>>
+<<makefile_testrun_11>>
+<<makefile_testrun_12>>
+<<makefile_tangle_0>>
+<<makefile_tangle_1>>
+<<makefile_git_snapshot>>
+<<makefile_phony>>
+#+END_SRC
+
 ** settings [+2]                                                   :settings:
 *** git version stamp                                           :git:version:
 
-#+BEGIN_SRC makefile :tangle ../makefile
+#+NAME: makefile_var_0
+#+BEGIN_SRC makefile
 PROG_VER_GIT :=$(shell echo `git describe --long --tags | sed -e "s/^[ a-z_-]\+\([0-9.]\+\)/\1/;s/\([^-]*-g\)/r\1/;s/-/./g"`)
 PROG_VER_DECLARED :=$(shell echo `cat ./views/version.txt | grep --color=never "enum" | sed 's/.\+(\([0-9]\+\),[ \t]\+\([0-9]\+\),[ \t]\+\([0-9]\+\)[ \t]*).\+/\1.\2.\3/g'`)
 #+END_SRC
 
 *** dub (build tool)                                                    :dub:
 
-#+BEGIN_SRC makefile :tangle ../makefile
+#+NAME: makefile_var_1
+#+BEGIN_SRC makefile
 DUB=dub
 DUB_FLAGS=-v --force --compiler=
 #+END_SRC
 
 *** Project Details                                           :project:spine:
 
-#+BEGIN_SRC makefile :tangle ../makefile
+#+NAME: makefile_var_2
+#+BEGIN_SRC makefile
 PRG_NAME=doc-reform
 PRG_NICKAME=spine
 PRG_NAME_DIR=$(shell echo `echo $(PRG_NAME) | sed -e "s/-/_/g"`)
@@ -47,7 +107,8 @@ PRG_DOCDIR=./docs
 
 *** Emacs Org settings                            :settings:emacs:org:tangle:
 
-#+BEGIN_SRC makefile :tangle ../makefile
+#+NAME: makefile_var_3
+#+BEGIN_SRC makefile
 EMACSLISP=/usr/share/emacs/site-lisp
 ORG_VER_AVAILABLE=$(shell echo `ls -d ~/.emacs.d/elpa/org-???????? | cut -d '-' -f2`)
 EMACSLISP_ORG=~/.emacs.d/elpa/org-$($(shell echo $(ORG_VER_AVAILABLE)))
@@ -61,7 +122,8 @@ ORGDIR :=$(shell echo `pwd`)
 *** Markup Samples
 **** pods
 
-#+BEGIN_SRC makefile :tangle ../makefile
+#+NAME: makefile_var_4
+#+BEGIN_SRC makefile
 SiSU_MARKUP_SAMPLES_FIND_PODS= \
 find data/pod -maxdepth 2 -name pod.manifest | cut -f 1-3 -d / | sort
 
@@ -96,7 +158,8 @@ data/pod/viral_spiral.david_bollier
 
 **** dir
 
-#+BEGIN_SRC makefile :tangle ../makefile
+#+NAME: makefile_var_5
+#+BEGIN_SRC makefile
 SiSU_MARKUP_SAMPLES_DIR_FILES_FOUND = \
 find data/sisudir/media/text -name *.ss[tm] | sort | xargs
 
@@ -129,6 +192,27 @@ data/sisudir/media/text/un_contracts_international_sale_of_goods_convention_1980
 data/sisudir/media/text/viral_spiral.david_bollier.sst
 #+END_SRC
 
+******* sample markup file list
+
+#+NAME: makefile_a_0
+#+BEGIN_SRC makefile
+markup_samples:
+	find data/pod -name pod.manifest | cut -f 1-3 -d / | sort; \
+find data/sisudir/media/text -name *.ss[tm] | sort
+#+END_SRC
+
+#+NAME: makefile_a_1
+#+BEGIN_SRC makefile
+markup_pod_samples:
+	find data/pod -name pod.manifest | cut -f 1-3 -d / | sort
+#+END_SRC
+
+#+NAME: makefile_a_2
+#+BEGIN_SRC makefile
+markup_dir_samples:
+	find data/sisudir/media/text -name *.ss[tm] | sort
+#+END_SRC
+
 ** _make_ commands [+2]                                         :make:commands:
 
 - build commands
@@ -152,49 +236,36 @@ data/sisudir/media/text/viral_spiral.david_bollier.sst
 ****** all builds
 ******* default
 
-#+BEGIN_SRC makefile :tangle ../makefile
+#+NAME: makefile_b_0
+#+BEGIN_SRC makefile
 dub_upgrade:
 	$(DUB) upgrade
 #+END_SRC
 
-#+BEGIN_SRC makefile :tangle ../makefile
+#+NAME: makefile_b_1
+#+BEGIN_SRC makefile
 default: ldc
 #+END_SRC
 
-******* sample markup file list
-
-#+BEGIN_SRC makefile :tangle ../makefile
-markup_samples:
-	find data/pod -name pod.manifest | cut -f 1-3 -d / | sort; \
-find data/sisudir/media/text -name *.ss[tm] | sort
-#+END_SRC
-
-#+BEGIN_SRC makefile :tangle ../makefile
-markup_pod_samples:
-	find data/pod -name pod.manifest | cut -f 1-3 -d / | sort
-#+END_SRC
-
-#+BEGIN_SRC makefile :tangle ../makefile
-markup_dir_samples:
-	find data/sisudir/media/text -name *.ss[tm] | sort
-#+END_SRC
-
 ******* quick                                                         :quick:
 ******** default                                                    :default:
 
-#+BEGIN_SRC makefile :tangle ../makefile
+#+NAME: makefile_b_2
+#+BEGIN_SRC makefile
 all: dmd ldc gdc
 #+END_SRC
 
 ******** version                                                    :version:
 
-#+BEGIN_SRC makefile :tangle ../makefile
+#+NAME: makefile_b_3
+#+BEGIN_SRC makefile
 all_ver: dmd_ver ldc_ver gdc_ver
 #+END_SRC
 
 ******** debug                                                        :debug:
 
-#+BEGIN_SRC makefile :tangle ../makefile
+#+NAME: makefile_b_4
+#+BEGIN_SRC makefile
 all_debug: dmd_debug gdc_debug ldc_debug
 #+END_SRC
 
@@ -204,7 +275,8 @@ meson using dub
 - works & looks pretty clean
 - but subprojects built externally & not suitable for debian packaging
 
-#+BEGIN_SRC makefile :tangle ../makefile
+#+NAME: makefile_meson
+#+BEGIN_SRC makefile
 meson_clean_build_dir:
 	rm -r build; mkdir build
 meson_build: meson_clean_build_dir
@@ -219,19 +291,22 @@ meson: meson_clean_build_dir dub_upgrade meson_build
 ******* clean & tangle                                         :clean:tangle:
 ******** default                                                    :default:
 
-#+BEGIN_SRC makefile :tangle ../makefile
+#+NAME: makefile_c_0
+#+BEGIN_SRC makefile
 all_clean: clean tangle dmd ldc gdc
 #+END_SRC
 
 ******** version                                                    :version:
 
-#+BEGIN_SRC makefile :tangle ../makefile
+#+NAME: makefile_c_1
+#+BEGIN_SRC makefile
 all_ver_clean: clean tangle dmd_ver ldc_ver gdc_ver
 #+END_SRC
 
 ******** debug                                                        :debug:
 
-#+BEGIN_SRC makefile :tangle ../makefile
+#+NAME: makefile_c_2
+#+BEGIN_SRC makefile
 all_debug_ver: dmd_debug_ver gdc_debug_ver ldc_debug_ver
 all_debug_clean_ver: clean tangle dmd_debug_ver gdc_debug_ver ldc_debug_ver
 #+END_SRC
@@ -241,7 +316,8 @@ all_debug_clean_ver: clean tangle dmd_debug_ver gdc_debug_ver ldc_debug_ver
 ******* quick                                                         :quick:
 ******** default                                                    :default:
 
-#+BEGIN_SRC makefile :tangle ../makefile
+#+NAME: makefile_dmd_0
+#+BEGIN_SRC makefile
 dmd: dub_upgrade
 	$(DUB) --compiler=dmd --config=dmd --build=release-nobounds
 	notify-send -t 0 'D dmd compiled test release executable ready' 'spine-dmd'
@@ -249,7 +325,8 @@ dmd: dub_upgrade
 
 ******** debug                                                        :debug:
 
-#+BEGIN_SRC makefile :tangle ../makefile
+#+NAME: makefile_dmd_1
+#+BEGIN_SRC makefile
 dmd_debug:
 	$(DUB) --compiler=dmd --config=dmd --build=debug
 #+END_SRC
@@ -258,7 +335,8 @@ dmd_debug:
 
 - assumes git tags with program version
 
-#+BEGIN_SRC makefile :tangle ../makefile
+#+NAME: makefile_dmd_2
+#+BEGIN_SRC makefile
 dmd_ver: dub_upgrade
 	$(DUB) --compiler=dmd --config=dmd-version
 	mv bin/spine-dmd-ver bin-archive/spine-$(PROG_VER_DECLARED)-tag-$(PROG_VER_GIT)-dmd
@@ -268,7 +346,8 @@ dmd_clean_ver: clean tangle dmd_ver
 
 ******* clean & tangle                                         :clean:tangle:
 
-#+BEGIN_SRC makefile :tangle ../makefile
+#+NAME: makefile_dmd_3
+#+BEGIN_SRC makefile
 dmd_rel: expunge skel tangle
 	$(DUB) --compiler=dmd --config=spine-release
 dmd_rel_tangle: tangle
@@ -282,7 +361,8 @@ dmd_debug_tangle: tangle
 ******* quick                                                         :quick:
 ******** default                                                    :default:
 
-#+BEGIN_SRC makefile :tangle ../makefile
+#+NAME: makefile_gdc_0
+#+BEGIN_SRC makefile
 gdc: dub_upgrade
 	$(DUB) --compiler=gdc --config=gdc
 	notify-send -t 0 'D gdc compiled test release executable ready' 'spine-gdc'
@@ -290,7 +370,8 @@ gdc: dub_upgrade
 
 ******** debug                                                        :debug:
 
-#+BEGIN_SRC makefile :tangle ../makefile
+#+NAME: makefile_gdc_1
+#+BEGIN_SRC makefile
 gdc_debug:
 	$(DUB) --compiler=gdc --config=gdc --build=debug
 #+END_SRC
@@ -299,7 +380,8 @@ gdc_debug:
 
 - assumes git tags with program version
 
-#+BEGIN_SRC makefile :tangle ../makefile
+#+NAME: makefile_gdc_2
+#+BEGIN_SRC makefile
 gdc_ver: dub_upgrade
 	$(DUB) --compiler=gdc --config=gdc-version
 	mv bin/spine-gdc-ver bin-archive/spine-$(PROG_VER_DECLARED)-tag-$(PROG_VER_GIT)-gdc
@@ -309,7 +391,8 @@ gdc_clean_ver: clean tangle gdc_ver
 
 ******* clean & tangle                                         :clean:tangle:
 
-#+BEGIN_SRC makefile :tangle ../makefile
+#+NAME: makefile_gdc_3
+#+BEGIN_SRC makefile
 gdc_rel: expunge skel tangle
 	$(DUB) --compiler=gdc --config=spine-release
 gdc_rel_tangle: tangle
@@ -323,7 +406,8 @@ gdc_debug_tangle: tangle
 ******* quick                                                         :quick:
 ******** default                                                    :default:
 
-#+BEGIN_SRC makefile :tangle ../makefile
+#+NAME: makefile_ldc_0
+#+BEGIN_SRC makefile
 ldc: dub_upgrade
 	$(DUB) --compiler=ldc2 --config=ldc --build=release
 	notify-send -t 0 'D ldc compiled test release executable ready' 'spine-ldc'
@@ -331,7 +415,8 @@ ldc: dub_upgrade
 
 ******** debug                                                        :debug:
 
-#+BEGIN_SRC makefile :tangle ../makefile
+#+NAME: makefile_ldc_1
+#+BEGIN_SRC makefile
 ldc_debug:
 	$(DUB) --compiler=ldc2 --config=ldc --build=debug
 #+END_SRC
@@ -340,7 +425,8 @@ ldc_debug:
 
 - assumes git tags with program version
 
-#+BEGIN_SRC makefile :tangle ../makefile
+#+NAME: makefile_ldc_2
+#+BEGIN_SRC makefile
 ldc_ver: dub_upgrade
 	$(DUB) --compiler=ldc2 --config=ldc-version
 	mv bin/spine-ldc-ver bin-archive/spine-$(PROG_VER_DECLARED)-tag-$(PROG_VER_GIT)-ldc
@@ -350,7 +436,8 @@ ldc_clean_ver: clean tangle ldc_ver
 
 ******* clean & tangle                                         :clean:tangle:
 
-#+BEGIN_SRC makefile :tangle ../makefile
+#+NAME: makefile_ldc_3
+#+BEGIN_SRC makefile
 ldc_rel: expunge skel tangle
 	$(DUB) --compiler=ldc2 --config=spine-release
 ldc_rel_tangle: tangle
@@ -363,7 +450,8 @@ ldc_debug_tangle: tangle
 ***** generic
 ****** init clean distclean etc.                                      :clean:
 
-#+BEGIN_SRC makefile :tangle ../makefile
+#+NAME: makefile_d_0
+#+BEGIN_SRC makefile
 reinit: clean skel tangle
 skel:
 	mkdir -p $(PRG_BINDIR); \
@@ -420,14 +508,16 @@ distclean_and_init: expunge
 
 ****** version                                                      :version:
 
-#+BEGIN_SRC makefile :tangle ../makefile
+#+NAME: makefile_d_1
+#+BEGIN_SRC makefile
 ver:
 	echo spine-$(PROG_VER_DECLARED)-tag-$(PROG_VER_GIT)
 #+END_SRC
 
 ****** tangle build rebuild                              :clean:tangle:build:
 
-#+BEGIN_SRC makefile :tangle ../makefile
+#+NAME: makefile_d_2
+#+BEGIN_SRC makefile
 clean_tangle_build: clean tangle build
 tangle_build: tangle build
 build: $(PRG_SRCDIR)/$(PRG_SRC)
@@ -444,7 +534,8 @@ restart: clean tangle
 **** pods
 ****** find files
 
-#+BEGIN_SRC makefile :tangle ../makefile
+#+NAME: makefile_testrun_0
+#+BEGIN_SRC makefile
 find_pods:
 	$(SiSU_MARKUP_SAMPLES_FIND_PODS)
 #+END_SRC
@@ -452,7 +543,8 @@ find_pods:
 ***** dmd
 ****** find files
 
-#+BEGIN_SRC makefile :tangle ../makefile
+#+NAME: makefile_testrun_1
+#+BEGIN_SRC makefile
 dmd_testrun_find:
 	./bin/spine-dmd -v --source --html --epub --sqlite-discrete \
 --sqlite-create --sqlite-update \
@@ -483,7 +575,8 @@ dmd_testrun_find_pod_all:
 
 ****** path list
 
-#+BEGIN_SRC makefile :tangle ../makefile
+#+NAME: makefile_testrun_2
+#+BEGIN_SRC makefile
 dmd_testrun_paths_pod_source:
 	./bin/spine-dmd -v --source \
 --output-dir=tmp/program_output_pod \
@@ -510,7 +603,8 @@ $(SiSU_MARKUP_SAMPLES_POD)
 ***** gdc
 ****** find files
 
-#+BEGIN_SRC makefile :tangle ../makefile
+#+NAME: makefile_testrun_3
+#+BEGIN_SRC makefile
 gdc_testrun_find:
 	./bin/spine-gdc -v --source --html --epub --sqlite-discrete \
 --sqlite-create --sqlite-update \
@@ -541,7 +635,8 @@ gdc_testrun_find_pod_all:
 
 ****** path list
 
-#+BEGIN_SRC makefile :tangle ../makefile
+#+NAME: makefile_testrun_4
+#+BEGIN_SRC makefile
 gdc_testrun_paths:
 	./bin/spine-gdc -v --source --html --epub --sqlite-discrete \
 --sqlite-create --sqlite-update \
@@ -573,7 +668,8 @@ $(SiSU_MARKUP_SAMPLES_POD)
 ***** ldc
 ****** find files
 
-#+BEGIN_SRC makefile :tangle ../makefile
+#+NAME: makefile_testrun_5
+#+BEGIN_SRC makefile
 ldc_testrun_find:
 	./bin/spine-ldc -v --source --html --epub --sqlite-discrete \
 --sqlite-create --sqlite-update \
@@ -604,7 +700,8 @@ ldc_testrun_find_pod_all:
 
 ****** path list
 
-#+BEGIN_SRC makefile :tangle ../makefile
+#+NAME: makefile_testrun_6
+#+BEGIN_SRC makefile
 ldc_testrun_paths:
 	./bin/spine-ldc -v --source --html --epub --sqlite-discrete \
 --sqlite-create --sqlite-update \
@@ -637,7 +734,8 @@ $(SiSU_MARKUP_SAMPLES_POD)
 ***** dmd
 ****** find files
 
-#+BEGIN_SRC makefile :tangle ../makefile
+#+NAME: makefile_testrun_7
+#+BEGIN_SRC makefile
 dmd_testrun_find_dir_source:
 	$(SiSU_MARKUP_SAMPLES_DIR_FILES_FOUND) \
 ./bin/spine-dmd -v --source \
@@ -663,7 +761,8 @@ dmd_testrun_find_dir_all:
 
 ****** file list
 
-#+BEGIN_SRC makefile :tangle ../makefile
+#+NAME: makefile_testrun_8
+#+BEGIN_SRC makefile
 dmd_testrun_filelist_dir_source:
 	./bin/spine-dmd -v --source \
 --output-dir=tmp/program_output_dir \
@@ -690,7 +789,8 @@ $(SiSU_MARKUP_SAMPLES_DIR)
 ***** gdc
 ****** find files
 
-#+BEGIN_SRC makefile :tangle ../makefile
+#+NAME: makefile_testrun_9
+#+BEGIN_SRC makefile
 gdc_testrun_find_dir_source:
 	./bin/spine-gdc -v --source \
 --output-dir=tmp/program_output_dir \
@@ -716,7 +816,8 @@ gdc_testrun_find_dir_all:
 
 ****** file list
 
-#+BEGIN_SRC makefile :tangle ../makefile
+#+NAME: makefile_testrun_10
+#+BEGIN_SRC makefile
 gdc_testrun_filelist_dir_source:
 	./bin/spine-gdc -v --source \
 --output-dir=tmp/program_output_dir \
@@ -743,7 +844,8 @@ $(SiSU_MARKUP_SAMPLES_DIR)
 ***** ldc
 ****** find files
 
-#+BEGIN_SRC makefile :tangle ../makefile
+#+NAME: makefile_testrun_11
+#+BEGIN_SRC makefile
 ldc_testrun_find_dir_source:
 	$(SiSU_MARKUP_SAMPLES_DIR_FILES_FOUND) \
 ./bin/spine-ldc -v --source \
@@ -769,7 +871,8 @@ ldc_testrun_find_dir_all:
 
 ****** file list
 
-#+BEGIN_SRC makefile :tangle ../makefile
+#+NAME: makefile_testrun_12
+#+BEGIN_SRC makefile
 ldc_testrun_filelist_dir_source:
 	./bin/spine-ldc -v --source \
 --output-dir=tmp/program_output_dir \
@@ -796,7 +899,8 @@ $(SiSU_MARKUP_SAMPLES_DIR)
 *** org babel tangle batch process command                           :tangle:
 **** tangle: org babel tangle *.org
 
-#+BEGIN_SRC makefile :tangle ../makefile
+#+NAME: makefile_tangle_0
+#+BEGIN_SRC makefile
 tangle: skel
 	for f in $(ORGFILELIST); do \
 		ORGFILES="$$ORGFILES \"$$f\""; \
@@ -819,7 +923,8 @@ tangle: skel
 
 **** tangle maker: org babel tangle maker.org, makefile new
 
-#+BEGIN_SRC makefile :tangle ../makefile
+#+NAME: makefile_tangle_1
+#+BEGIN_SRC makefile
 tangle_maker:
 	for f in $(ORGFILELIST); do \
 		ORGFILES="\"org/dr_build_scaffold.org\""; \
@@ -842,14 +947,16 @@ tangle_maker:
 
 *** git snapshot
 
-#+BEGIN_SRC makefile :tangle ../makefile
+#+NAME: makefile_git_snapshot
+#+BEGIN_SRC makefile
 gitsnapshot: distclean tangle
 	git commit -a
 #+END_SRC
 
 ** phony                                                              :phony:
 
-#+BEGIN_SRC makefile :tangle ../makefile
+#+NAME: makefile_phony
+#+BEGIN_SRC makefile
 .PHONY : all build rebuild debug release \
 	distclean init \
 	tangle gitsnapshot
@@ -1406,8 +1513,9 @@ tinyendian_dep = declare_dependency(
 #./.dub/**
 *
 !.gitignore
+!README.md
 !COPYRIGHT
-!README
+!CHANGELOG
 !makefile
 !version.txt
 !dub.json
diff --git a/org/spine_doc.org b/org/spine_doc.org
deleted file mode 100644
index 49e7313..0000000
--- a/org/spine_doc.org
+++ /dev/null
@@ -1,4548 +0,0 @@
--*- mode: org -*-
-#+TITLE:       spine (doc_reform) hub
-#+DESCRIPTION: documents - structuring, various output representations & search
-#+FILETAGS:    :spine:hub:
-#+AUTHOR:      Ralph Amissah
-#+EMAIL:       [[mailto:ralph.amissah@gmail.com][ralph.amissah@gmail.com]]
-#+COPYRIGHT:   Copyright (C) 2015 - 2020 Ralph Amissah
-#+LANGUAGE:    en
-#+STARTUP:     content hideblocks hidestars noindent entitiespretty
-#+PROPERTY:    header-args  :exports code
-#+PROPERTY:    header-args+ :noweb yes
-#+PROPERTY:    header-args+ :eval no
-#+PROPERTY:    header-args+ :results no
-#+PROPERTY:    header-args+ :cache no
-#+PROPERTY:    header-args+ :padline no
-
-* README
-** tangle
-
-#+BEGIN_SRC text  :tangle "../README"
-<<sisu_spine_readme_info>>
-<<sisu_spine_readme_description>>
-<<sisu_spine_readme_install>>
-<<sisu_spine_readme_configuration>>
-<<sisu_spine_readme_commands>>
-<<sisu_spine_readme_examples>>
-#+END_SRC
-
-** project name
-
-#+NAME: sisu_spine_readme_info
-#+BEGIN_SRC text
-project_name:  Spine, Doc Reform
-  description: [
-      "documents, structuring, processing, publishing",
-      search,
-      object numbering,
-      static content generator,
-      sisu markup
-    ]
-
-    author:
-      name:    Ralph Amissah
-      email:   ralph.amissah@gmail.com
-
-    copyright: "(C) 2015 - 2020 Ralph Amissah, All Rights Reserved."
-
-    license:   "AGPL 3 or later"
-
-    hompage: [
-        "http://www.doc_reform.org",
-        "http://www.sisudoc.org"
-      ]
-#+END_SRC
-
-** short description
-
-#+NAME: sisu_spine_readme_description
-#+BEGIN_SRC text
-#+END_SRC
-
-** installation
-
-#+NAME: sisu_spine_readme_install
-#+BEGIN_SRC text
-# Installation, Compilation
-
-SiSU spine is written in the programming language D for which there are 3 compilers:
-
-- dmd
-- ldc
-- gdc
-
-D projects tend to use dub as project manager
-https://code.dlang.org/packages/dub
-https://code.dlang.org/packages/dub
-https://github.com/dlang/dub/blob/master/source/dub/commandline.d
-
-  dub --compiler=ldc2 -color --config=ldc -b release
-
-  dub --compiler=dmd -color --config=dmd
-
-  dub --compiler=gdc-10 -color --config=gdc -b release
-
-  make ldc
-
-  make dmd
-
-there has been some coalescence around the Meson build system
-https://mesonbuild.com/
-
-  meson
-
-  ninja -C build
-
-  meson setup --wipe build && ninja -v -C build
-
-  make meson
-
-dub --force --compiler=ldc2 && sudo cp -v cgi-bin/spine-search /usr/lib/cgi-bin/.
-
-#+END_SRC
-
-** configuration
-
-#+NAME: sisu_spine_readme_configuration
-#+BEGIN_SRC text
-# Configuration
-
-Configuration files are yaml files
-
-The following paths are searched:
-
-  ~/.dr/config_local_site
-  ~/path_to_pod_root/.dr/config_local_site
-
-e.g. processing
-
-  ~spineMarkupSamples/pod/*
-
-will search:
-
-  ~spineMarkupSamples/pod/.dr/config_local_site
-
-  ~/.dr/config_local_site
-
-to specify an alternative configuration file to use on the command line (in this
-example named "my_config"):
-
-  spine -v --html --config=~spineMarkupSamples/pod/.dr/my_config
-
-here is a sample configuration file:
-
-flag:
-  act0:                        "--html"
-  act1:                        "--html --epub"
-output:
-  path:                        "/var/www/html"
-default:
-  language:                    "en"
-  papersize:                   "a4"
-  text_wrap:                   "80"
-  digest:                      "sha256"
-webserv:
-  http:                        "http"
-  domain:                      "localhost"
-  data_http:                   "http"
-  data_domain:                 "localhost"
-  data_root_url:               "http://localhost"
-  data_root_path:              "/var/www/html"
-  data_root_part:              ""
-  images_root_part:            "image"
-  cgi_title:                   "≅ SiSU Spine search"
-  cgi_http:                    "http"
-  cgi_domain:                  "localhost"
-  cgi_bin_url:                 "http://localhost/cgi-bin"
-  cgi_bin_part:                "cgi-bin"
-  cgi_bin_path:                "/usr/lib/cgi-bin"
-  cgi_search_script:           "spine-search"
-  cgi_search_script_raw_fn_d:  "spine_search.d"
-  cgi_port:                    ""
-  cgi_user:                    ""
-  cgi_action:                  "http://localhost/cgi-bin/spine-search"
-  db_sqlite:                   "spine.search.db"
-  db_pg_table:                 ""
-  db_pg_user:                  ""
-
-#+END_SRC
-
-** commands help
-
-#+NAME: sisu_spine_readme_commands
-#+BEGIN_SRC text
-# Commands
-
-for a list of commands from the program type:
-
-  spine -h
-
-at the time of writing this provides the following output:
-
-                  --abstraction document abstraction
-                       --assert set optional assertions on
-      --cgi-search-form-codegen generates (pre-compiled) d code for search of specified db
-   --cgi-sqlite-search-filename =[filename]
-                  --concordance file for document
-                       --config =/path/to/config/file/including/filename
-                         --dark alternative dark theme
-                        --debug debug
-                       --digest hash digest for each object
-                         --epub process epub output
-                      --harvest extract info on authors & topics from document header metadata
-              --harvest-authors extract info on authors from document header metadata
-               --harvest-topics extract info on topics from document header metadata
-                     --hide-ocn object cite numbers
-                         --html process html output
-            --html-link-harvest place links back to harvest in segmented html
-             --html-link-search html embedded search submission
-                     --html-seg process html output
-                  --html-scroll process html output
-                         --lang =[lang code e.g. =en or =en,es]
-                        --latex output for pdfs
-            --latex-color-links mono or color links for pdfs
-                        --light default light theme
-                     --manifest process manifest output
-                      --ocn-off object cite numbers
-                          --odf open document format text (--odt)
-                          --odt open document format text
-                       --output =/path/to/output/dir specify where to place output
-                     --parallel parallelisation
-        --parallel-subprocesses nested parallelisation
-                          --pdf latex output for pdfs
-              --pdf-color-links mono or color links for pdfs
-                          --pod spine (doc reform) pod source content bundled
--q                      --quiet output to terminal
-           --section-backmatter document backmatter (default)
-               --section-biblio document biblio (default)
-                --section-blurb document blurb (default)
-                 --section-body document body (default)
-            --section-bookindex document bookindex (default)
-             --section-endnotes document endnotes (default)
-             --section-glossary document glossary (default)
-                  --section-toc table of contents (default)
-                       --serial serial processing
-                  --skip-output skip output
-                  --show-config show config
-                    --show-make show make
-                --show-metadata show metadata
-                 --show-summary show summary
-                       --source document markup source
-              --sqlite-discrete process discrete sqlite output
-             --sqlite-db-create create db, create tables
-               --sqlite-db-drop drop tables & db
-           --sqlite-db-recreate create db, create tables
-                --sqlite-delete sqlite output
-              --sqlite-db-filename =[filename].sql.db
-                --sqlite-insert sqlite output
-                --sqlite-update sqlite output
-                         --text text output
-                   --theme-dark alternative dark theme
-                  --theme-light default light theme
-                          --txt text output
--v                    --verbose output to terminal
-                 --very-verbose output to terminal
-                       --workon (reserved for some matters under development & testing)
-                        --xhtml xhtml output
--h                       --help This help information.
-
-#+END_SRC
-
-** command examples
-
-#+NAME: sisu_spine_readme_examples
-#+BEGIN_SRC text
-# Examples
-
-if configuartion has been set specify just
-- the desired output and
-- the markup document/pod(s) to process
-
-  spine -v --html ~spineMarkupSamples/markup/pod/sisu-manual
-
-if configuartion has not been set or to overide the set configration specify
-- the output path as well as
-- the desired output and
-- the markup document/pod(s) to process
-
-note: ~webDocRoot should be the path to web doc root, provide a suitable output path.
-
-  spine -v --html --html-link-search --html-link-harvest  --output=`echo ~webDocRoot` ~spineMarkupSamples/pod/*
-
-  spine -v --html --html-link-search --html-link-harvest --epub --output=`echo ~webDocRoot` ~spineMarkupSamples/pod/*
-
-  spine -v --html --epub --latex --odt --harvest --output=`echo ~webDocRoot` ~spineMarkupSamples/pod/*
-
-## harvest
-
-if you have a document collection with documents that have metadata headers a
-summary of the collection can be made using the harvest command
-
-  spine -v --harvest --output=`echo ~webDocRoot` ~spineMarkupSamples/pod/*
-
-  spine -v --harvest ~spineMarkupSamples/pod/*
-
-  spine -v --html --html-link-search --html-link-harvest --harvest --output=`echo ~webDocRoot` ~spineMarkupSamples/pod/*
-
-  spine -v --html --html-link-search --html-link-harvest --harvest ~spineMarkupSamples/pod/*
-
-## sqlite
-
-### create db
-
-if there is no sqlite db you first need to create one, to do so
-- the name of the db and
-- the root path for document output
-must be specified:
-
-  spine -v \
-    --sqlite-db-create --sqlite-db-filename="spine.search.db" \
-    --output=/var/www/html \
-    ~spineMarkupSamples/pod/*
-
-  spine -v --sqlite-db-create --sqlite-db-filename="spine.search.db" --output=`echo ~webDocRoot`
-
-if you have a configration file providing this information that is to be used
-for a document collection you can point to the document collection:
-
-  spine -v --sqlite-db-create ~spineMarkupSamples/pod
-
-### populate db
-
-must specify:
-- the name of the db and
-- the root path for document output
-
-  spine -v --sqlite-update \
-    --sqlite-db-filename="spine.search.db" \
-    --output=/var/www/html \
-    ~spineMarkupSamples/pod/*
-
-  spine -v --sqlite-update --sqlite-db-filename="spine.search.db" --output=`echo ~webDocRoot` ~spineMarkupSamples/pod/*
-
-if you have a configration file providing this information that is to be used
-for a document collection you can point to the document collection:
-
-  spine -v --sqlite-update ~spineMarkupSamples/pod/*
-
-### generate a cgi search form in d
-
-  spine -v --cgi-search-form-codegen \
-    --output=/var/www/html \
-    ~spineMarkupSamples/pod
-
-  spine -v --cgi-search-form-codegen --config=~spineMarkupSamples/pod
-
-  spine -v --cgi-search-form-codegen --config=~spineMarkupSamples/pod/.dr/config_local_site
-
-  spine --cgi-search-form-codegen --output=`echo ~webDocRoot` ~spineMarkupSamples/pod
-
-  spine --cgi-search-form-codegen --cgi-sqlite-search-filename="spine_search" --output=`echo ~webDocRoot`
-
-  spine -v --cgi-search-form-codegen \
-    --sqlite-db-filename="spine.search.db" \
-    --cgi-sqlite-search-filename="spine-search" \
-    --output=/var/www/html \
-    ~spineMarkupSamples/pod
-
-#### compile the cgi search form
-
-  cd /var/www/html/cgi # /var/www/html (default document root)
-
-  cd ~webDocRoot/cgi
-
-the directory ~webDocRoot/cgi/src should contain two files
-- spine_search.d (or whatever you named it)
-- cgi.d (by Adam Rupee)
-
-  dub --force --compiler=ldc2 && sudo cp -v cgi-bin/spine-search /usr/lib/cgi-bin/.
-
-should compile spine-search in ~webDocRoot/cgi/cgi-bin and copy it to the
-cgi-bin directory
-
-  spine -v  --sqlite-db-create --sqlite-db-filename="spine.search.db" --cgi-sqlite-search-filename="spine-search" --output=`echo ~webDocRoot`
-
-  spine -v  --sqlite-db-create  ~spineMarkupSamples/pod
-
-  spine -v --html --html-link-search --cgi-sqlite-search-filename="spine-search" --output=`echo ~webDocRoot` ~spineMarkupSamples/pod/*
-
-  spine -v --html --html-link-search --output=`echo ~webDocRoot` ~spineMarkupSamples/pod/*
-
-  spine -v --html --html-link-search --cgi-sqlite-search-filename="spine-search" --html-link-harvest --harvest --output=`echo ~webDocRoot` ~spineMarkupSamples/pod/*
-
-### create db & search form
-
-  spine -v \
-    --sqlite-db-create --sqlite-db-filename="spine.search.db" \
-    --cgi-search-form-codegen --cgi-sqlite-search-filename="spine-search" \
-    --output=/var/www/html \
-    ~spineMarkupSamples/pod/*
-
-### html with links to search form
-
-  spine -v --html \
-    --html-link-search \
-    --output=`echo ~webDocRoot` \
-    ~spineMarkupSamples/pod/*
-
-#+END_SRC
-
-* manpage
-** tangle
-
-#+BEGIN_SRC  man  :tangle "../doc/man/man1/spine.1"
-<<sisu_spine_manpage_head>>
-<<sisu_spine_manpage_description>>
-<<sisu_spine_manpage_flags>>
-<<sisu_spine_manpage_flags_db>>
-<<sisu_spine_manpage_config>>
-<<sisu_spine_manpage_pod_dir_structure>>
-<<sisu_spine_manpage_cli_examples>>
-<<sisu_spine_manpage_docs>>
-<<sisu_spine_manpage_markup>>
-#+END_SRC
-
-** manpage
-*** head
-
-#+NAME: sisu_spine_manpage_head
-#+BEGIN_SRC  man
-.TH "spine" "1" "2020-04-05" "0.10.0" "Spine"
-.br
-.SH NAME
-.br
-sisu - documents: markup, structuring, publishing in multiple standard formats, and search
-.br
-.SH SYNOPSIS
-.br
-sisu [--options] [filename/wildcard]
-
-.br
-sisu --txt --html --epub --odt --pdf --wordmap --sqlite --manpage --texinfo --sisupod --source --qrcode [filename/wildcard]
-
-.br
-sisu --pg (--createdb|update [filename/wildcard]|--dropall)
-
-#+END_SRC
-
-*** description
-
-#+NAME: sisu_spine_manpage_description
-#+BEGIN_SRC  man
-.SH SISU - MANUAL,
-RALPH AMISSAH
-
-.SH WHAT IS SISU?
-
-.SH INTRODUCTION - WHAT IS SISU?
-
-.BR
-
-.B SiSU
-is a lightweight markup based document creation and publishing framework that
-is controlled from the command line. Prepare documents for
-.B SiSU
-using your text editor of choice, then use
-.B SiSU
-to generate various output document formats.
-
-.BR
-From a single lightly prepared document (plain-text
-.I UTF-8
-) sisu custom builds several standard output formats which share a common (text
-object) numbering system for citation of content within a document (that also
-has implications for search). The sisu engine works with an abstraction of the
-document's structure and content from which it is possible to generate
-different forms of representation of the document.
-.B SiSU
-produces: plain-text,
-.I HTML,
-.I XHTML,
-.I XML,
-.I EPUB,
-.I ODF:
-.I ODT
-(Opendocument),
-.I LaTeX,
-.I PDF,
-and populates an
-.I SQL
-database (
-.I PostgreSQL
-or
-.I SQLite
-) with text objects, roughly, paragraph sized chunks so that document searches
-are done at this level of granularity.
-
-.BR
-Outputs share a common citation numbering system, associated with text objects
-and any semantic meta-data provided about the document.
-
-.BR
-
-.B SiSU
-also provides concordance files, document content certificates and manifests of
-generated output. Book indexes may be made.
-
-.BR
-Some document markup samples are provided in the package sisu -markup-samples.
-Homepages:
-
-- <http://www.sisudoc.org/>
-
-- <http://www.jus.uio.no/sisu>
-
-.SH COMMANDS SUMMARY
-
-.SH DESCRIPTION
-
-.BR
-
-.B SiSU
-is a document publishing system, that from a simple single marked-up document,
-produces multiple output formats including:
-.I plaintext,
-.I HTML,
-.I XHTML,
-.I XML,
-.I EPUB,
-.I ODT
-(
-.I OpenDocument
-(
-.I ODF
-) text),
-.I LaTeX,
-.I PDF,
-info, and
-.I SQL
-(
-.I PostgreSQL
-and
-.I SQLite
-) , which share text object numbers ("object citation numbering") and the same
-document structure information. For more see: <http://sisudoc.org> or
-<http://www.jus.uio.no/sisu>
-#+END_SRC
-
-** flags
-*** general
-
-#+NAME: sisu_spine_manpage_flags
-#+BEGIN_SRC  man
-.SH DOCUMENT PROCESSING COMMAND FLAGS
-
-.TP
-.B --abstraction [path + filename]
-run document abstraction
-.TP
-.B --act[s0-9] [path + filename]
---act0 to --act9 configurable shortcuts for multiple flags, -0 to -9 synonyms,
-configure in sisurc.yml; sisu default action on a specified file where no flag
-is provided is --act0; --act or --acts for information on current actions
-ascribed to --act0 to --act9
-.TP
-.B --asciidoc [path + filename]
-asciidoc, smart text (not available)
-.TP
-.B --cgi-search-form-codegen
- generate d code search form to search db specfied needs --output=[path] and
---sqlite-db-filename=[cgi search form name] or path to configuration file
---config=[full path to config file]
-.TP
-.B --cgi-sqlite-search-filename=[filename]
-name to give cgi-search form, (it generates a [filename].d file that requires
-subsequent compilation) also required is the name of the sqlite db to be
-searched by the form.
-.TP
-.B --concordance [path + filename]
-(not implemented)
-.TP
-.B --config=[path to config file + filename]
-.TP
-.B --dark
- alternative theme for html and epub output, a light (default) theme is
- also provided
-.TP
-.B --digest (not implemented)
-.TP
-.B --delete [path + filename]
-see --zap
-.TP
-.B --digests [path + filename]
-not implemented
-.TP
-.B --epub [path + filename]
-produces an epub document
-.TP
-.B --harvest [path to files]
-extract and present info on authors & topics from document header metadata.
-makes two lists of sisu output based on the sisu markup documents in a
-directory: list of author and authors works (year and titles), and; list by
-topic with titles and author. Makes use of header metadata fields (author,
-title, date, topic_register).
-.TP
-.B --harvest-authors [path to files]
-extract and present info on authors from metadata in document headers
-.TP
-.B --harvest-topics [path to files]
-extract and present info on topics from metadata in document headers
-.TP
-.B --hide-ocn
-turn visibility of object numbers off
-.TP
-.B --html [path + filename]
-produces html output in two forms (i) segmented text with table of contents
-(toc.html and index.html) and (ii) the document in a single file (scroll.html).
-.TP
-.B --html-link-harvest
-within html output creates link to the document set metadata harvest output
-part of --html output instruction and assumes that --harvest has been or will
- be run
-.TP
-.B --html-link-search
-within html output creates a search form for submission, requires information
-on the name of the search form --search part of --html output instruction it
-assumes there is a cgi search form and related document database
-.TP
-.B --html-scroll [path + filename]
-produces html output, the document in a single file (scroll.html) only. Compare
---html-seg and --html
-.TP
-.B --html-seg [path + filename]
-produces html output, segmented text with table of contents (toc.html and
-index.html). Compare --html-scroll and --html
-.TP
-.B --lang=[language code, e.g. =en or =en,es]
-provide language code of document
-.TP
-.B --latex [path + filename]
-.I LaTeX
-output for different document sizes (a4, a5, b4, letter) and orientations
-(portrait, landscape) for downstream (processing and) conversion to pdf, (used
-with xetex no direct link between programs provided as this is a much slower
-process)
-.TP
-.B --latex-color-links
-monochrome or color links within pdf, toggle (mono better for printing),
-the default is mono for portrait and color for landscape documents
-.TP
-.B --light theme
-for html and epub output, default, a dark alternative is provided
-.TP
-.B --manifest [path + filename]
-produces an html summary of output generated (hyperlinked to content) and
-document specific metadata (sisu_manifest.html). This step is assumed for most
-processing flags.
-.TP
-.B --markdown [path + filename]
-markdown smart text (not available)
-.TP
-.B --no-*
-negate a toggle
-.TP
-.B --ocn-off
-object numbers off (the c in ocn is for citation). See --hide-ocn
-.TP
-.B --odf [path + filename]
-see --odt
-.TP
-.B --odt [path + filename]
-produce open document output
-.TP
-.B --output=[path to output directories]
-where to place document output
-.TP
-.B --parallel
-parallelization on (the default except for sqlite)
-.TP
-.B --parallel-subprocesses
-nested parallelization on (the default except for sqlite)
-.TP
-.B --papersize-(a4|a5|b5|letter|legal)
-in conjunction with --pdf set pdf papersize, overriding any configuration
-settings, to set more than one papersize repeat the option --pdf --papersize-a4
---papersize-letter. See also --papersize=* (NOT implemented)
-.BR
-.B --papersize=a4,a5,b5,letter,legal
-in conjunction with --pdf set pdf papersize, overriding any configuration
-settings, to set more than one papersize list after the equal sign with a comma
-separator --papersize=a4,letter. See also --papersize-* (NOT implemented)
-.TP
-.B --pdf [path + filename]
-produces
-.I LaTeX
-see --latex
-.TP
-.B --pdf-color-links
-monochrome or color links within latex for pdf. See --latex-color-links
-.TP
-.B --pod
-markup source bundled in a zip file.
-Produces a zipped file of the prepared document specified along with associated
-images This provides a quick way of gathering the relevant
-parts of a sisu document which can then for example be emailed. A sisupod
-includes sisu markup source file, (along with associated documents if a master
-file, or available in multilingual versions), together with related images.
-(it should be possible in future to run spine commands directly against a pod).
-.TP
-.B --qrcode [path + filename]
-generate QR code image of metadata (used in manifest). (not implemented)
-.TP
-.B --quiet
-quiet less output to terminal.
-.TP
-.B --section-*
-provides finer grain control over which parts of the document are processed
-to produce output, toc, body, endnotes, glossary, biblio, bookindex and blurb
-.TP
-.B --section-biblio
-produce document bibliography output, toggle
-.TP
-.B --section-blurb
-produce document blurb output, toggle
-.TP
-.B --section-body
-produce document body output, toggle
-.TP
-.B --section-bookindex
-produce document bookindex output, toggle
-.TP
-.B --section-endnotes
-produce document endnotes output, toggle
-.TP
-.B --section-endnotes
-produce document glossary output, toggle
-.TP
-.B --serial
-serial processing --no-parallel
-.TP
-.B --show-config
-show site and document configuration instructions. Requires path to
-configuration file or path to documents to be processed.
-.TP
-.B --show-make
-show document make instructions
-.TP
-.B --show-metadata
-show document metadata
-.TP
-.B --show-summary
-show document summary
-.TP
-.B --source [path + filename]
-document markup source
-.TP
-.B --sha256
-set hash digest where used to sha256 (not implemented)
-.TP
-.B --sha512
-set hash digest where used to sha512 (not implemented)
-.TP
-.B --sqlite-discrete [path + filename]
-create a per document sqlite db
-.TP
-.B --sqlite-db-create --sqlite-db-filename="[db filename]" --output="[output path]"
-create a shared db and its tables. Requires a db filename, which may be set in the configuration file or on the command line as shown
-.TP
-.B --sqlite-db-drop [path + db filename]
-drop (remove) db and its tables
-.TP
-.B --sqlite-db-recreate [path + filename]
-drop and re-create a shared db and its tables. Requires a db filename, which may be set in the configuration file or on the command line with --sqlite-db-filename="[db name]"
-.TP
-.B --sqlite-db-filename="[db name]"
-provide name of sqlite db, to be created, dropped, populated or for which a search form is to be made. This information may also be set in the configuration file.
-.TP
-.B --sqlite-delete [path + filename]
-process sqlite output, remove file
-.TP
-.B --sqlite-insert [path + filename]
-process sqlite output, insert file. See --sqlite-update
-.TP
-.B --sqlite-update [path + filename]
-process sqlite output, update file
-.TP
-.B --source [filename/wildcard]
-copies sisu markup file to output directory. Alias -s
-.TP
-.B --text [filename/wildcard]
-produces
-.I plaintext
-output
-(not implemented)
-.TP
-.B --theme-dark
-See --dark
-.TP
-.B --theme-light
-See --light
-.TP
-.B --txt [filename/wildcard]
-produces
-.I plaintext
-output
-(not implemented)
-.TP
-.B --txt-asciidoc [filename/wildcard]
-see --asciidoc
-(not implemented)
-.TP
-.B --txt-markdown [filename/wildcard]
-see --markdown
-(not implemented)
-.TP
-.B --txt-rst [filename/wildcard]
-see --rst
-(not implemented)
-.TP
-.B --txt-textile [filename/wildcard]
-see --textile
-(not implemented)
-.TP
-.B -v
-on its own, provides
-.B SiSU
-version information
-.TP
-.B -v [filename/wildcard]
-see --verbose
-.TP
-.B --verbose [filename/wildcard]
-provides verbose output of what is being generated, where output is placed (and
-error messages if any). Alias -v
-.TP
-.B --very-verbose [filename/wildcard]
-provides more verbose output of what is being generated. See --verbose. Alias
--V
-.TP
-.B --version
-spine version
-(not implemented)
-.TP
-.B --xhtml
-xhtml output
-(not implemented)
-
-.SH COMMAND LINE MODIFIERS
-
-.TP
-.B --no-ocn
-[with --html --pdf or --epub] switches off
-.I object citation numbering.
-Produce output without identifying numbers in margins of html or
-.I LaTeX
-/pdf output.
-#+END_SRC
-
-*** db flags
-
-#+NAME: sisu_spine_manpage_flags_db
-#+BEGIN_SRC  man
-.SH DATABASE COMMANDS
-
-.BR
-
-.B dbi - database interface
-
-.BR
-
-.B --pg or --pgsql
-set for
-.I PostgreSQL
-.B --sqlite
-default set for
-.I SQLite
--d is modifiable with --db=[database type (PgSQL or
-.I SQLite
-) ]
-.TP
-.B --pg -v --createall
-initial step, creates required relations (tables, indexes) in existing
-.I PostgreSQL
-database (a database should be created manually and given the same name as
-working directory, as requested) (rb.dbi) [ -dv --createall
-.I SQLite
-equivalent] it may be necessary to run sisu -Dv --createdb initially NOTE: at
-the present time for
-.I PostgreSQL
-it may be necessary to manually create the database. The command would be
-'createdb [database name]' where database name would be SiSU_[present working
-directory name (without path)]. Please use only alphanumerics and underscores.
-.TP
-.B --pg -v --import
-[filename/wildcard] imports data specified to
-.I PostgreSQL
-db (rb.dbi) [ -dv --import
-.I SQLite
-equivalent]
-.TP
-.B --pg -v --update
-[filename/wildcard] updates/imports specified data to
-.I PostgreSQL
-db (rb.dbi) [ -dv --update
-.I SQLite
-equivalent]
-.TP
-.B --pg --remove
-[filename/wildcard] removes specified data to
-.I PostgreSQL
-db (rb.dbi) [ -d --remove
-.I SQLite
-equivalent]
-.TP
-.B --pg --dropall
-kills data" and drops (
-.I PostgreSQL
-or
-.I SQLite
-) db, tables & indexes [ -d --dropall
-.I SQLite
-equivalent]
-
-.BR
-The -v is for verbose output.
-#+END_SRC
-
-** configuration file
-
-#+NAME: sisu_spine_manpage_config
-#+BEGIN_SRC  man
-.SH CONFIGURATION
-
-.BR
-
-default location:
-.TP
-~/.dr/config_local_site
-.TP
-.nf
-flag:
-  act0:                        "--html"
-  act1:                        "--html --epub"
-output:
-  path:                        "/var/www/html"
-default:
-  language:                    "en"
-  papersize:                   "a4"
-  text_wrap:                   "80"
-  digest:                      "sha256"
-webserv:
-  http:                        "http"
-  domain:                      "localhost"
-  data_http:                   "http"
-  data_domain:                 "localhost"
-  data_root_url:               "http://localhost"
-  data_root_path:              "/var/www/html"
-  data_root_part:              ""
-  images_root_part:            "image"
-  cgi_title:                   "≅ SiSU Spine search"
-  cgi_http:                    "http"
-  cgi_domain:                  "localhost"
-  cgi_bin_url:                 "http://localhost/cgi-bin"
-  cgi_bin_part:                "cgi-bin"
-  cgi_bin_path:                "/usr/lib/cgi-bin"
-  cgi_search_script:           "spine-search"
-  cgi_search_script_raw_fn_d:  "spine_search.d"
-  cgi_port:                    ""
-  cgi_user:                    ""
-  cgi_action:                  "http://localhost/cgi-bin/spine-search"
-  db_sqlite:                   "spine.search.db"
-  db_pg_table:                 ""
-  db_pg_user:                  ""
-.fi
-
-.BR
-#+END_SRC
-
-** sample pod directory
-
-#+NAME: sisu_spine_manpage_pod_dir_structure
-#+BEGIN_SRC  man
-.SH SAMPLE POD DIRECTORY STRUCTURE
-.BR
-.TP
-.nf
-
-pod (directory may contain multiple documents)
- └── the_wealth_of_networks.yochai_benkler
-     ├── conf
-     │   └── sisu_document_make
-     ├── media
-     │   ├── image
-     │   │   ├── won_benkler_2_1.png
-     │   │   ├── won_benkler_6_1.png
-     │   │   ├── won_benkler_7_1.png
-     │   │   ├── won_benkler_7_2.png
-     │   │   ├── won_benkler_7_3a.png
-     │   │   ├── won_benkler_7_3b.png
-     │   │   ├── won_benkler_7_4.png
-     │   │   ├── won_benkler_7_5.png
-     │   │   ├── won_benkler_7_6.png
-     │   │   └── won_benkler_9_1.png
-     │   └── text
-     │       └── en
-     │           └── the_wealth_of_networks.yochai_benkler.sst
-     └── pod.manifest
-
-.fi
-#+END_SRC
-
-** examples
-
-#+NAME: sisu_spine_manpage_cli_examples
-#+BEGIN_SRC  man
-.SH COMMAND LINE EXAMPLES
-
-.TP
-note: ~webDocRoot should be the path to web doc root, provide a suitable output path.
-.TP
-spine -v --html --html-link-search --html-link-harvest --harvest --output=`echo ~webDocRoot` ~spineMarkupSamples/pod/*
-.TP
-spine -v --html --html-link-search --html-link-harvest --epub --harvest --output=`echo ~webDocRoot` ~spineMarkupSamples/pod/*
-.TP
-spine -v --sqlite-db-create --sqlite-db-filename="spine.search.db" --output=`echo ~webDocRoot` ~spineMarkupSamples/pod
-.TP
-spine -v --sqlite-db-create ~spineMarkupSamples/pod
-.TP
-spine -v --sqlite-update --sqlite-db-filename="spine.search.db" --output=`echo ~webDocRoot` ~spineMarkupSamples/pod/*
-.TP
-spine -v --sqlite-update ~spineMarkupSamples/pod/*
-.TP
-spine -v --show-config
-.TP
-spine -v --show-config --config= ~spineMarkupSamples/pod/.dr/config_local_site_test
-.TP
-spine -v --show-config --config=~spineMarkupSamples/pod/.dr
-.TP
-spine -v --cgi-search-form-codegen --config=~spineMarkupSamples/pod/.dr/config_local
-.TP
-cd ~webDocRoot/cgi
-.TP
-dub --force --compiler=ldc2 && sudo cp -v cgi-bin/spine-search /usr/lib/cgi-bin/.
-.TP
-#+END_SRC
-
-** docs
-*** sources
-
-#+NAME: sisu_spine_manpage_docs
-#+BEGIN_SRC  man
-
-.BR
-Running sisu (alone without any flags, filenames or wildcards) brings up the
-interactive help, as does any sisu command that is not recognised. Enter to
-escape.
-.SH HELP
-
-.SH SISU MANUAL
-
-
-.BR
-The most up to date information on sisu should be contained in the sisu_manual,
-available at:
-
-.BR
-  <http://sisudoc.org/sisu/sisu_manual/>
-
-.BR
-The manual can be generated from source, found respectively, either within the
-.B SiSU
-tarball or installed locally at:
-
-.BR
-  ./data/doc/sisu/markup-samples/sisu_manual
-
-.BR
-  /usr/share/doc/sisu/markup-samples/sisu_manual
-
-.BR
-move to the respective directory and type e.g.:
-
-.BR
-  sisu sisu_manual.ssm
-.SH SISU MAN PAGES
-
-
-.BR
-If
-.B SiSU
-is installed on your system usual man commands should be available, try:
-
-.BR
-  man sisu
-
-.BR
-Most
-.B SiSU
-man pages are generated directly from sisu documents that are used to prepare
-the sisu manual, the sources files for which are located within the
-.B SiSU
-tarball at:
-
-.BR
-  ./data/doc/sisu/markup-samples/sisu_manual
-
-.BR
-Once installed, directory equivalent to:
-
-.BR
-  /usr/share/doc/sisu/markup-samples/sisu_manual
-
-.BR
-Available man pages are converted back to html using man2html:
-
-.BR
-  /usr/share/doc/sisu/html/
-
-.BR
-  ./data/doc/sisu/html
-
-.BR
-An online version of the sisu man page is available here:
-
-.BR
-
-- various sisu man pages <http://www.jus.uio.no/sisu/man/> [^1]
-
-.BR
-- sisu.1 <http://www.jus.uio.no/sisu/man/sisu.1.html> [^2]
-.SH SISU BUILT-IN INTERACTIVE HELP, [DISCONTINUED]
-
-
-.BR
-This fell out of date and has been discontinued.
-#+END_SRC
-
-*** markup
-
-#+NAME: sisu_spine_manpage_markup
-#+BEGIN_SRC  man
-.SH INTRODUCTION TO SISU MARKUP[^3]
-
-.SH SUMMARY
-
-.BR
-
-.B SiSU
-source documents are
-.I plaintext
-(
-.I UTF-8
-)[^4] files
-
-.BR
-All paragraphs are separated by an empty line.
-
-.BR
-Markup is comprised of:
-
-.BR
-- at the top of a document, the document header made up of semantic meta-data
-about the document and if desired additional processing instructions (such an
-instruction to automatically number headings from a particular level down)
-
-.BR
-- followed by the prepared substantive text of which the most important single
-characteristic is the markup of different heading levels, which define the
-primary outline of the document structure. Markup of substantive text includes:
-
-.BR
-  * heading levels defines document structure
-
-.BR
-  * text basic attributes, italics, bold etc.
-
-.BR
-  * grouped text (objects), which are to be treated differently, such as code
-  blocks or poems.
-
-.BR
-  * footnotes/endnotes
-
-.BR
-  * linked text and images
-
-.BR
-  * paragraph actions, such as indent, bulleted, numbered-lists, etc.
-.SH MARKUP RULES, DOCUMENT STRUCTURE AND METADATA REQUIREMENTS
-
-
-.BR
-minimal content/structure requirement:
-
-.BR
-[metadata]
-.nf
-A~ (level A [title])
-
-1~ (at least one level 1 [segment/(chapter)])
-.fi
-
-
-.BR
-structure rules (document heirarchy, heading levels):
-
-.BR
-there are two sets of heading levels ABCD (title & parts if any) and 123
-(segment & subsegments if any)
-
-.BR
-sisu has the fllowing levels:
-.nf
-A~ [title]              .
-   required (== 1)   followed by B~ or 1~
-B~ [part]               *
-   followed by C~ or 1~
-C~ [subpart]            *
-   followed by D~ or 1~
-D~ [subsubpart]         *
-   followed by 1~
-1~ [segment (chapter)]  +
-   required (>= 1)   followed by text or 2~
-text                    *
-   followed by more text or 1~, 2~
-   or relevant part *()
-2~ [subsegment]         *
-   followed by text or 3~
-text                    *
-   followed by more text or 1~, 2~ or 3~
-   or relevant part, see *()
-3~ [subsubsegment]      *
-   followed by text
-text                    *
-   followed by more text or 1~, 2~ or 3~ or relevant part, see *()
-
-*(B~ if none other used;
-  if C~ is last used: C~ or B~;
-  if D~ is used: D~, C~ or B~)
-.fi
-
-.nf
-- level A~ is the tile and is mandatory
-- there can only be one level A~
-
-- heading levels BCD, are optional and there may be several of each
-  (where all three are used corresponding to e.g. Book Part Section)
-  * sublevels that are used must follow each other sequentially
-    (alphabetically),
-- heading levels A~ B~ C~ D~ are followed by other heading levels rather
-  than substantive text
-  which may be the subsequent sequential (alphabetic) heading part level
-  or a heading (segment) level 1~
-- there must be at least one heading (segment) level 1~
-  (the level on which the text is segmented, in a book would correspond
-  to the Chapter level)
-- additional heading levels 1~ 2~ 3~ are optional and there may be several
-  of each
-- heading levels 1~ 2~ 3~ are followed by text (which may be followed by
-  the same heading level)
-  and/or the next lower numeric heading level (followed by text)
-  or indeed return to the relevant part level
-  (as a corollary to the rules above substantive text/ content
-  must be preceded by a level 1~ (2~ or 3~) heading)
-.fi
-
-.SH MARKUP EXAMPLES
-
-.SH ONLINE
-
-
-.BR
-Online markup examples are available together with the respective outputs
-produced from <http://www.jus.uio.no/sisu/SiSU/examples.html> or from
-<http://www.jus.uio.no/sisu/sisu_examples/>
-
-.BR
-There is of course this document, which provides a cursory overview of sisu
-markup and the respective output produced:
-<http://www.jus.uio.no/sisu/sisu_markup/>
-
-.BR
-an alternative presentation of markup syntax:
-/usr/share/doc/sisu/on_markup.txt.gz
-.SH INSTALLED
-
-
-.BR
-With
-.B SiSU
-installed sample skins may be found in: /usr/share/doc/sisu/markup-samples (or
-equivalent directory) and if sisu -markup-samples is installed also under:
-/usr/share/doc/sisu/markup-samples-non-free
-
-.SH MARKUP OF HEADERS
-
-.BR
-Headers contain either: semantic meta-data about a document, which can be used
-by any output module of the program, or; processing instructions.
-
-.BR
-Note: the first line of a document may include information on the markup
-version used in the form of a comment. Comments are a percentage mark at the
-start of a paragraph (and as the first character in a line of text) followed by
-a space and the comment:
-.nf
-% this would be a comment
-.fi
-
-.SH SAMPLE HEADER
-
-
-.BR
-This current document is loaded by a master document that has a header similar
-to this one:
-.nf
-% SiSU master 4.0
-
-title: SiSU
-  subtitle: Manual
-
-creator:
-  author: Amissah, Ralph
-
-publisher: [publisher name]
-
-rights: Copyright (C) Ralph Amissah 2007, part of SiSU documentation, License GPL 3
-
-classify:
-  topic_register: SiSU:manual;electronic documents:SiSU:manual
-  subject: ebook, epublishing, electronic book, electronic publishing,
-    electronic document, electronic citation, data structure,
-     citation systems, search
-
-% used_by: manual
-
-date:
-  published: 2008-05-22
-  created: 2002-08-28
-  issued: 2002-08-28
-  available: 2002-08-28
-  modified: 2010-03-03
-
-make:
-  num_top: 1
-  breaks: new=C; break=1
-  bold: /Gnu|Debian|Ruby|SiSU/
-  home_button_text: {SiSU}http://sisudoc.org; {git}http://git.sisudoc.org
-  footer: {SiSU}http://sisudoc.org; {git}http://git.sisudoc.org
-  manpage: name=sisu - documents: markup, structuring, publishing in multiple standard formats, and search;
-     synopsis=sisu [-abcDdeFhIiMmNnopqRrSsTtUuVvwXxYyZz0-9] [filename/wildcard ]
-     . sisu [-Ddcv] [instruction]
-     . sisu [-CcFLSVvW]
-
-@links:
-  { SiSU Homepage }http://www.sisudoc.org/
-  { SiSU Manual }http://www.sisudoc.org/sisu/sisu_manual/
-  { Book Samples & Markup Examples }http://www.jus.uio.no/sisu/SiSU/examples.html
-  { SiSU Download }http://www.jus.uio.no/sisu/SiSU/download.html
-  { SiSU Changelog }http://www.jus.uio.no/sisu/SiSU/changelog.html
-  { SiSU Git repo }http://git.sisudoc.org/gitweb/?p=code/sisu.git;a=summary
-  { SiSU List Archives }http://lists.sisudoc.org/pipermail/sisu/
-  { SiSU @ Debian }http://packages.qa.debian.org/s/sisu.html
-  { SiSU Project @ Debian }http://qa.debian.org/developer.php?login=sisu@lists.sisudoc.org
-  { SiSU @ Wikipedia }http://en.wikipedia.org/wiki/SiSU
-.fi
-
-.SH AVAILABLE HEADERS
-
-
-.BR
-Header tags appear at the beginning of a document and provide meta information
-on the document (such as the
-.I Dublin Core
-) , or information as to how the document as a whole is to be processed. All
-header instructions take the form @headername: or on the next line and indented
-by once space :subheadername: All
-.I Dublin Core
-meta tags are available
-
-.BR
-
-.B @identifier:
-information or instructions
-
-.BR
-where the "identifier" is a tag recognised by the program, and the
-"information" or "instructions" belong to the tag/identifier specified
-
-.BR
-Note: a header where used should only be used once; all headers apart from
-@title: are optional; the @structure: header is used to describe document
-structure, and can be useful to know.
-
-.BR
-This is a sample header
-.nf
-% SiSU 2.0 [declared file-type identifier with markup version]
-.fi
-
-.nf
-@title: [title text] [this header is the only one that is mandatory]
-  subtitle: [subtitle if any]
-  language: English
-.fi
-
-.nf
-creator:
-  author: [Lastname, First names]
-  illustrator: [Lastname, First names]
-  translator: [Lastname, First names]
-  prepared_by: [Lastname, First names]
-.fi
-
-.nf
-date:
-  published: [year or yyyy-mm-dd]
-  created: [year or yyyy-mm-dd]
-  issued: [year or yyyy-mm-dd]
-  available: [year or yyyy-mm-dd]
-  modified: [year or yyyy-mm-dd]
-  valid: [year or yyyy-mm-dd]
-  added_to_site: [year or yyyy-mm-dd]
-  translated: [year or yyyy-mm-dd]
-.fi
-
-.nf
-rights:
-  copyright: Copyright (C) [Year and Holder]
-  license: [Use License granted]
-  text: [Year and Holder]
-  translation: [Name, Year]
-  illustrations: [Name, Year]
-.fi
-
-.nf
-classify:
-  topic_register: SiSU:markup sample:book;book:novel:fantasy
-  type:
-  subject:
-  description:
-  keywords:
-  abstract:
-  loc: [Library of Congress classification]
-  dewey: [Dewey classification
-.fi
-
-.nf
-identify:
-  :isbn: [ISBN]
-  :oclc:
-.fi
-
-.nf
-links: { SiSU }http://www.sisudoc.org
-  { FSF }http://www.fsf.org
-.fi
-
-.nf
-make:
-  num_top: 1
-  headings: [text to match for each level
-   (e.g. PART; Chapter; Section; Article; or another: none; BOOK|FIRST|SECOND; none; CHAPTER;)
-  breaks: new=:C; break=1
-  promo: sisu, ruby, sisu_search_libre, open_society
-  bold: [regular expression of words/phrases to be made bold]
-  italics: [regular expression of words/phrases to italicise]
-  home_button_text: {SiSU}http://sisudoc.org; {git}http://git.sisudoc.org
-  footer: {SiSU}http://sisudoc.org; {git}http://git.sisudoc.org
-.fi
-
-.nf
-original:
-  language: [language]
-.fi
-
-.nf
-notes:
-  comment:
-  prefix: [prefix is placed just after table of contents]
-.fi
-
-.SH MARKUP OF SUBSTANTIVE TEXT
-
-.SH HEADING LEVELS
-
-
-.BR
-Heading levels are :A~ ,:B~ ,:C~ ,1~ ,2~ ,3~ ... :A - :C being part / section
-headings, followed by other heading levels, and 1 -6 being headings followed by
-substantive text or sub-headings. :A~ usually the title :A~? conditional level
-1 heading (used where a stand-alone document may be imported into another)
-
-.BR
-
-.B :A~ [heading text]
-Top level heading [this usually has similar content to the title @title: ]
-NOTE: the heading levels described here are in 0.38 notation, see heading
-
-.BR
-
-.B :B~ [heading text]
-Second level heading [this is a heading level divider]
-
-.BR
-
-.B :C~ [heading text]
-Third level heading [this is a heading level divider]
-
-.BR
-
-.B 1~ [heading text]
-Top level heading preceding substantive text of document or sub-heading 2, the
-heading level that would normally be marked 1. or 2. or 3. etc. in a document,
-and the level on which sisu by default would break html output into named
-segments, names are provided automatically if none are given (a number),
-otherwise takes the form 1~my_filename_for_this_segment
-
-.BR
-
-.B 2~ [heading text]
-Second level heading preceding substantive text of document or sub-heading 3 ,
-the heading level that would normally be marked 1.1 or 1.2 or 1.3 or 2.1 etc.
-in a document.
-
-.BR
-
-.B 3~ [heading text]
-Third level heading preceding substantive text of document, that would normally
-be marked 1.1.1 or 1.1.2 or 1.2.1 or 2.1.1 etc. in a document
-.nf
-1~filename level 1 heading,
-
-% the primary division such as Chapter that is followed by substantive text, and may be further subdivided (this is the level on which by default html segments are made)
-.fi
-
-.SH FONT ATTRIBUTES
-
-.BR
-
-.B markup example:
-.nf
-normal text, *{emphasis}*, !{bold text}!, /{italics}/, _{underscore}_, "{citation}",
-^{superscript}^, ,{subscript},, +{inserted text}+, -{strikethrough}-, #{monospace}#
-
-normal text
-
-*{emphasis}* [note: can be configured to be represented by bold, italics or underscore]
-
-!{bold text}!
-
-/{italics}/
-
-_{underscore}_
-
-"{citation}"
-
-^{superscript}^
-
-,{subscript},
-
-+{inserted text}+
-
--{strikethrough}-
-
-#{monospace}#
-.fi
-
-
-.BR
-
-.B resulting output:
-
-.BR
-normal text,
-.B emphasis,
-.B bold text
-,
-.I italics,
-.I underscore,
-"citation", ^superscript^, [subscript], ++inserted text++, --strikethrough--,
-monospace
-
-.BR
-normal text
-
-.BR
-
-.B emphasis
-[note: can be configured to be represented by bold, italics or underscore]
-
-.BR
-
-.B bold text
-
-.BR
-
-.I italics
-
-.BR
-.I underscore
-
-.BR
-"citation"
-
-.BR
-^superscript^
-
-.BR
-[subscript]
-
-.BR
-++inserted text++
-
-.BR
---strikethrough--
-
-.BR
-monospace
-.SH INDENTATION AND BULLETS
-
-
-.BR
-
-.B markup example:
-.nf
-ordinary paragraph
-
-_1 indent paragraph one step
-
-_2 indent paragraph two steps
-
-_9 indent paragraph nine steps
-.fi
-
-
-.BR
-
-.B resulting output:
-
-.BR
-ordinary paragraph
-
-.BR
-  indent paragraph one step
-
-.BR
-    indent paragraph two steps
-
-.BR
-                  indent paragraph nine steps
-
-.BR
-
-.B markup example:
-.nf
-_* bullet text
-
-_1* bullet text, first indent
-
-_2* bullet text, two step indent
-.fi
-
-
-.BR
-
-.B resulting output:
-
-.BR
-- bullet text
-
-.BR
-  * bullet text, first indent
-
-.BR
-    * bullet text, two step indent
-
-.BR
-Numbered List (not to be confused with headings/titles, (document structure))
-
-.BR
-
-.B markup example:
-.nf
-# numbered list                numbered list 1., 2., 3, etc.
-
-_# numbered list numbered list indented a., b., c., d., etc.
-.fi
-
-.SH HANGING INDENTS
-
-
-.BR
-
-.B markup example:
-.nf
-_0_1 first line no indent,
-rest of paragraph indented one step
-
-_1_0 first line indented,
-rest of paragraph no indent
-
-in each case level may be 0-9
-.fi
-
-
-.BR
-
-.B resulting output:
-
-.BR
-first line no indent, rest of paragraph indented one step; first line no
-  indent, rest of paragraph indented one step; first line no indent, rest of
-  paragraph indented one step; first line no indent, rest of paragraph indented
-  one step; first line no indent, rest of paragraph indented one step; first
-  line no indent, rest of paragraph indented one step; first line no indent,
-  rest of paragraph indented one step; first line no indent, rest of paragraph
-  indented one step; first line no indent, rest of paragraph indented one step;
-
-.BR
-A regular paragraph.
-
-.BR
-first line indented, rest of paragraph no indent first line indented, rest of
-paragraph no indent first line indented, rest of paragraph no indent first line
-indented, rest of paragraph no indent first line indented, rest of paragraph no
-indent first line indented, rest of paragraph no indent first line indented,
-rest of paragraph no indent first line indented, rest of paragraph no indent
-first line indented, rest of paragraph no indent first line indented, rest of
-paragraph no indent first line indented, rest of paragraph no indent
-
-.BR
-in each case level may be 0-9
-
-.BR
-
-.B live-build
-  A collection of scripts used to build customized
-.B Debian
-  Livesystems.
-  .I live-build
-  was formerly known as live-helper, and even earlier known as live-package.
-
-.BR
-
-.B live-build
-
-  A collection of scripts used to build customized
-.B Debian
-  Livesystems.
-.I live-build
-  was formerly known as live-helper, and even earlier known as live-package.
-.SH FOOTNOTES / ENDNOTES
-
-
-.BR
-Footnotes and endnotes are marked up at the location where they would be
-indicated within a text. They are automatically numbered. The output type
-determines whether footnotes or endnotes will be produced
-
-.BR
-
-.B markup example:
-.nf
-~{ a footnote or endnote }~
-.fi
-
-
-.BR
-
-.B resulting output:
-
-.BR
-[^5]
-
-.BR
-
-.B markup example:
-.nf
-normal text~{ self contained endnote marker & endnote in one }~ continues
-.fi
-
-
-.BR
-
-.B resulting output:
-
-.BR
-normal text[^6] continues
-
-.BR
-
-.B markup example:
-.nf
-normal text ~{* unnumbered asterisk footnote/endnote, insert multiple asterisks if required }~ continues
-
-normal text ~{** another unnumbered asterisk footnote/endnote }~ continues
-.fi
-
-
-.BR
-
-.B resulting output:
-
-.BR
-normal text [^*] continues
-
-.BR
-normal text [^**] continues
-
-.BR
-
-.B markup example:
-.nf
-normal text ~[* editors notes, numbered asterisk footnote/endnote series ]~ continues
-
-normal text ~[+ editors notes, numbered plus symbol footnote/endnote series ]~ continues
-.fi
-
-
-.BR
-
-.B resulting output:
-
-.BR
-normal text [^*3] continues
-
-.BR
-normal text [^+2] continues
-
-.BR
-
-.B Alternative endnote pair notation for footnotes/endnotes:
-.nf
-% note the endnote marker "~^"
-
-normal text~^ continues
-
-^~ endnote text following the paragraph in which the marker occurs
-.fi
-
-
-.BR
-the standard and pair notation cannot be mixed in the same document
-.SH LINKS
-
-.SH NAKED URLS WITHIN TEXT, DEALING WITH URLS
-
-
-.BR
-urls found within text are marked up automatically. A url within text is
-automatically hyperlinked to itself and by default decorated with angled
-braces, unless they are contained within a code block (in which case they are
-passed as normal text), or escaped by a preceding underscore (in which case the
-decoration is omitted).
-
-.BR
-
-.B markup example:
-.nf
-normal text http://www.sisudoc.org/ continues
-.fi
-
-
-.BR
-
-.B resulting output:
-
-.BR
-normal text <http://www.sisudoc.org/> continues
-
-.BR
-An escaped url without decoration
-
-.BR
-
-.B markup example:
-.nf
-normal text _http://www.sisudoc.org/ continues
-
-deb _http://www.jus.uio.no/sisu/archive unstable main non-free
-.fi
-
-
-.BR
-
-.B resulting output:
-
-.BR
-normal text <_http://www.sisudoc.org/> continues
-
-.BR
-deb <_http://www.jus.uio.no/sisu/archive> unstable main non-free
-
-.BR
-where a code block is used there is neither decoration nor hyperlinking, code
-blocks are discussed later in this document
-
-.BR
-
-.B resulting output:
-.nf
-deb http://www.jus.uio.no/sisu/archive unstable main non-free
-deb-src http://www.jus.uio.no/sisu/archive unstable main non-free
-.fi
-
-.SH LINKING TEXT
-
-
-.BR
-To link text or an image to a url the markup is as follows
-
-.BR
-
-.B markup example:
-.nf
-about { SiSU }http://url.org markup
-.fi
-
-
-.BR
-
-.B resulting output:
-
-.BR
-aboutSiSU <http://www.sisudoc.org/> markup
-
-.BR
-A shortcut notation is available so the url link may also be provided
-automatically as a footnote
-
-.BR
-
-.B markup example:
-.nf
-about {~^ SiSU }http://url.org markup
-.fi
-
-
-.BR
-
-.B resulting output:
-
-.BR
-aboutSiSU <http://www.sisudoc.org/> [^7] markup
-
-.BR
-Internal document links to a tagged location, including an ocn
-
-.BR
-
-.B markup example:
-.nf
-about { text links }#link_text
-.fi
-
-
-.BR
-
-.B resulting output:
-
-.BR
-about ⌠text links⌡⌈link_text⌋
-
-.BR
-Shared document collection link
-
-.BR
-
-.B markup example:
-.nf
-about { SiSU book markup examples }:SiSU/examples.html
-.fi
-
-
-.BR
-
-.B resulting output:
-
-.BR
-about ⌠
-.B SiSU
-book markup examples⌡⌈:SiSU/examples.html⌋
-.SH LINKING IMAGES
-
-
-.BR
-
-.B markup example:
-.nf
-{ tux.png 64x80 }image
-
-% various url linked images
-
-{tux.png 64x80 "a better way" }http://www.sisudoc.org/
-
-{GnuDebianLinuxRubyBetterWay.png 100x101 "Way Better - with Gnu/Linux, Debian and Ruby" }http://www.sisudoc.org/
-
-{~^ ruby_logo.png "Ruby" }http://www.ruby-lang.org/en/
-.fi
-
-
-.BR
-
-.B resulting output:
-
-.BR
-[ tux.png ]
-
-.BR
-tux.png 64x80 "Gnu/Linux - a better way" <http://www.sisudoc.org/>
-
-.BR
-GnuDebianLinuxRubyBetterWay.png 100x101 "Way Better - with Gnu/Linux, Debian
-and Ruby" <http://www.sisudoc.org/>
-
-.BR
-ruby_logo.png 70x90 "Ruby" <http://www.ruby-lang.org/en/> [^8]
-
-.BR
-
-.B linked url footnote shortcut
-.nf
-{~^ [text to link] }http://url.org
-
-% maps to: { [text to link] }http://url.org ~{ http://url.org }~
-
-% which produces hyper-linked text within a document/paragraph, with an endnote providing the url for the text location used in the hyperlink
-.fi
-
-.nf
-text marker *~name
-.fi
-
-
-.BR
-note at a heading level the same is automatically achieved by providing names
-to headings 1, 2 and 3 i.e. 2~[name] and 3~[name] or in the case of
-auto-heading numbering, without further intervention.
-.SH LINK SHORTCUT FOR MULTIPLE VERSIONS OF A SISU DOCUMENT IN THE SAME DIRECTORY
-TREE
-
-
-.BR
-
-.B markup example:
-.nf
-!_ /{"Viral Spiral"}/, David Bollier
-
-{ "Viral Spiral", David Bollier [3sS]}viral_spiral.david_bollier.sst
-.fi
-
-
-.BR
-
-.B
-.I "Viral Spiral",
-David Bollier
-"Viral Spiral", David Bollier <http://corundum/sisu_manual/en/manifest/viral_spiral.david_bollier.html>
-     document manifest <http://corundum/sisu_manual/en/manifest/viral_spiral.david_bollier.html>
-      ⌠html, segmented text⌡「http://corundum/sisu_manual/en/html/viral_spiral.david_bollier.html」
-      ⌠html, scroll, document in one⌡「http://corundum/sisu_manual/en/html/viral_spiral.david_bollier.html」
-      ⌠epub⌡「http://corundum/sisu_manual/en/epub/viral_spiral.david_bollier.epub」
-      ⌠pdf, landscape⌡「http://corundum/sisu_manual/en/pdf/viral_spiral.david_bollier.pdf」
-      ⌠pdf, portrait⌡「http://corundum/sisu_manual/en/pdf/viral_spiral.david_bollier.pdf」
-      ⌠odf: odt, open document text⌡「http://corundum/sisu_manual/en/odt/viral_spiral.david_bollier.odt」
-      ⌠xhtml scroll⌡「http://corundum/sisu_manual/en/xhtml/viral_spiral.david_bollier.xhtml」
-      ⌠xml, sax⌡「http://corundum/sisu_manual/en/xml/viral_spiral.david_bollier.xml」
-      ⌠xml, dom⌡「http://corundum/sisu_manual/en/xml/viral_spiral.david_bollier.xml」
-      ⌠concordance⌡「http://corundum/sisu_manual/en/html/viral_spiral.david_bollier.html」
-      ⌠dcc, document content certificate (digests)⌡「http://corundum/sisu_manual/en/digest/viral_spiral.david_bollier.txt」
-      ⌠markup source text⌡「http://corundum/sisu_manual/en/src/viral_spiral.david_bollier.sst」
-      ⌠markup source (zipped) pod⌡「http://corundum/sisu_manual/en/pod/viral_spiral.david_bollier.sst.zip」
-
-.SH GROUPED TEXT / BLOCKED TEXT
-
-
-.BR
-There are two markup syntaxes for blocked text, using curly braces or using
-tics
-.SH BLOCKED TEXT CURLY BRACE SYNTAX
-
-
-.BR
-at the start of a line on its own use name of block type with an opening curly
-brace, follow with the content of the block, and close with a closing curly
-brace and the name of the block type, e.g.
-.nf
-code{
-
-this is a code block
-
-}code
-.fi
-
-.nf
-
-poem{
-
-this here is a poem
-
-}poem
-.fi
-
-.SH BLOCKED TEXT TIC SYNTAX
-
-.nf
-``` code
-this is a code block
-
-```
-
-``` poem
-this here is a poem
-
-```
-.fi
-
-
-.BR
-start a line with three backtics, a space followed by the name of the name of
-block type, follow with the content of the block, and close with three back
-ticks on a line of their own, e.g.
-.SH TABLES
-
-
-.BR
-Tables may be prepared in two either of two forms
-
-.BR
-
-.B markup example:
-.nf
-table{ c3; 40; 30; 30;
-
-This is a table
-this would become column two of row one
-column three of row one is here
-
-And here begins another row
-column two of row two
-column three of row two, and so on
-
-}table
-.fi
-
-
-.BR
-
-.B resulting output:
-This is a table|this would become column two of row one|column three of row one is here』And here begins another row|column two of row two|column three of row two, and so on』
-
-
-.BR
-a second form may be easier to work with in cases where there is not much
-information in each column
-
-.BR
-
-.B markup example:
-[^9]
-.nf
-!_ Table 3.1: Contributors to Wikipedia, January 2001 - June 2005
-
-{table~h 24; 12; 12; 12; 12; 12; 12;}
-                                |Jan. 2001|Jan. 2002|Jan. 2003|Jan. 2004|July 2004|June 2006
-Contributors*                   |       10|      472|    2,188|    9,653|   25,011|   48,721
-Active contributors**           |        9|      212|      846|    3,228|    8,442|   16,945
-Very active contributors***     |        0|       31|      190|      692|    1,639|    3,016
-No. of English language articles|       25|   16,000|  101,000|  190,000|  320,000|  630,000
-No. of articles, all languages  |       25|   19,000|  138,000|  490,000|  862,000|1,600,000
-
-- Contributed at least ten times; ** at least 5 times in last month; *** more than 100 times in last month.
-.fi
-
-
-.BR
-
-.B resulting output:
-
-.BR
-
-.B Table 3.1: Contributors to Wikipedia, January 2001 - June 2005
-|Jan. 2001|Jan. 2002|Jan. 2003|Jan. 2004|July 2004|June 2006』Contributors*|10|472|2,188|9,653|25,011|48,721』Active contributors**|9|212|846|3,228|8,442|16,945』Very active contributors***|0|31|190|692|1,639|3,016』No. of English language articles|25|16,000|101,000|190,000|320,000|630,000』No. of articles, all languages|25|19,000|138,000|490,000|862,000|1,600,000』
-
-
-.BR
-- Contributed at least ten times; ** at least 5 times in last month; *** more
-than 100 times in last month.
-.SH POEM
-
-
-.BR
-
-.B basic markup:
-.nf
-poem{
-
-  Your poem here
-
-}poem
-
-Each verse in a poem is given an object number.
-.fi
-
-
-.BR
-
-.B markup example:
-.nf
-poem{
-
-                    `Fury said to a
-                   mouse, That he
-                 met in the
-               house,
-            "Let us
-              both go to
-                law:  I will
-                  prosecute
-                    YOU.  --Come,
-                       I'll take no
-                        denial; We
-                     must have a
-                 trial:  For
-              really this
-           morning I've
-          nothing
-         to do."
-           Said the
-             mouse to the
-               cur, "Such
-                 a trial,
-                   dear Sir,
-                         With
-                     no jury
-                  or judge,
-                would be
-              wasting
-             our
-              breath."
-               "I'll be
-                 judge, I'll
-                   be jury,"
-                         Said
-                    cunning
-                      old Fury:
-                     "I'll
-                      try the
-                         whole
-                          cause,
-                             and
-                        condemn
-                       you
-                      to
-                       death."'
-
-}poem
-.fi
-
-
-.BR
-
-.B resulting output:
-                    `Fury said to a
-                   mouse, That he
-                 met in the
-               house,
-            "Let us
-              both go to
-                law:  I will
-                  prosecute
-                    YOU.  --Come,
-                       I'll take no
-                        denial; We
-                     must have a
-                 trial:  For
-              really this
-           morning I've
-          nothing
-         to do."
-           Said the
-             mouse to the
-               cur, "Such
-                 a trial,
-                   dear Sir,
-                         With
-                     no jury
-                  or judge,
-                would be
-              wasting
-             our
-              breath."
-               "I'll be
-                 judge, I'll
-                   be jury,"
-                         Said
-                    cunning
-                      old Fury:
-                     "I'll
-                      try the
-                         whole
-                          cause,
-                             and
-                        condemn
-                       you
-                      to
-                       death."'
-
-
-.SH GROUP
-
-
-.BR
-
-.B basic markup:
-.nf
-group{
-
-  Your grouped text here
-
-}group
-
-A group is treated as an object and given a single object number.
-.fi
-
-
-.BR
-
-.B markup example:
-.nf
-group{
-
-                    `Fury said to a
-                   mouse, That he
-                 met in the
-               house,
-            "Let us
-              both go to
-                law:  I will
-                  prosecute
-                    YOU.  --Come,
-                       I'll take no
-                        denial; We
-                     must have a
-                 trial:  For
-              really this
-           morning I've
-          nothing
-         to do."
-           Said the
-             mouse to the
-               cur, "Such
-                 a trial,
-                   dear Sir,
-                         With
-                     no jury
-                  or judge,
-                would be
-              wasting
-             our
-              breath."
-               "I'll be
-                 judge, I'll
-                   be jury,"
-                         Said
-                    cunning
-                      old Fury:
-                     "I'll
-                      try the
-                         whole
-                          cause,
-                             and
-                        condemn
-                       you
-                      to
-                       death."'
-
-}group
-.fi
-
-
-.BR
-
-.B resulting output:
-                    `Fury said to a
-                   mouse, That he
-                 met in the
-               house,
-            "Let us
-              both go to
-                law:  I will
-                  prosecute
-                    YOU.  --Come,
-                       I'll take no
-                        denial; We
-                     must have a
-                 trial:  For
-              really this
-           morning I've
-          nothing
-         to do."
-           Said the
-             mouse to the
-               cur, "Such
-                 a trial,
-                   dear Sir,
-                         With
-                     no jury
-                  or judge,
-                would be
-              wasting
-             our
-              breath."
-               "I'll be
-                 judge, I'll
-                   be jury,"
-                         Said
-                    cunning
-                      old Fury:
-                     "I'll
-                      try the
-                         whole
-                          cause,
-                             and
-                        condemn
-                       you
-                      to
-                       death."'
-
-
-.SH CODE
-
-
-.BR
-Code tags code{ ... }code (used as with other group tags described above) are
-used to escape regular sisu markup, and have been used extensively within this
-document to provide examples of
-.B SiSU
-markup. You cannot however use code tags to escape code tags. They are however
-used in the same way as group or poem tags.
-
-.BR
-A code-block is treated as an object and given a single object number. [an
-option to number each line of code may be considered at some later time]
-
-.BR
-
-.B use of code tags instead of poem compared, resulting output:
-.nf
-                    `Fury said to a
-                   mouse, That he
-                 met in the
-               house,
-            "Let us
-              both go to
-                law:  I will
-                  prosecute
-                    YOU.  --Come,
-                       I'll take no
-                        denial; We
-                     must have a
-                 trial:  For
-              really this
-           morning I've
-          nothing
-         to do."
-           Said the
-             mouse to the
-               cur, "Such
-                 a trial,
-                   dear Sir,
-                         With
-                     no jury
-                  or judge,
-                would be
-              wasting
-             our
-              breath."
-               "I'll be
-                 judge, I'll
-                   be jury,"
-                         Said
-                    cunning
-                      old Fury:
-                     "I'll
-                      try the
-                         whole
-                          cause,
-                             and
-                        condemn
-                       you
-                      to
-                       death."'
-.fi
-
-
-.BR
-From
-.B SiSU
-2.7.7 on you can number codeblocks by placing a hash after the opening code tag
-code{# as demonstrated here:
-.nf
-1  |                    `Fury said to a
-2  |                   mouse, That he
-3  |                 met in the
-4  |               house,
-5  |            "Let us
-6  |              both go to
-7  |                law:  I will
-8  |                  prosecute
-9  |                    YOU.  --Come,
-10 |                       I'll take no
-11 |                        denial; We
-12 |                     must have a
-13 |                 trial:  For
-14 |              really this
-15 |           morning I've
-16 |          nothing
-17 |         to do."
-18 |           Said the
-19 |             mouse to the
-20 |               cur, "Such
-21 |                 a trial,
-22 |                   dear Sir,
-23 |                         With
-24 |                     no jury
-25 |                  or judge,
-26 |                would be
-27 |              wasting
-28 |             our
-29 |              breath."
-30 |               "I'll be
-31 |                 judge, I'll
-32 |                   be jury,"
-33 |                         Said
-34 |                    cunning
-35 |                      old Fury:
-36 |                     "I'll
-37 |                      try the
-38 |                         whole
-39 |                          cause,
-40 |                             and
-41 |                        condemn
-42 |                       you
-43 |                      to
-44 |                       death."'
-.fi
-
-.SH ADDITIONAL BREAKS - LINEBREAKS WITHIN OBJECTS, COLUMN AND PAGE-BREAKS
-
-.SH LINE-BREAKS
-
-
-.BR
-To break a line within a "paragraph object", two backslashes \e\e
-with a space before and a space or newline after them
-may be used.
-.nf
-To break a line within a "paragraph object",
-two backslashes \e\e with a space before
-and a space or newline after them \e\e
-may be used.
-.fi
-
-
-.BR
-The html break br enclosed in angle brackets (though undocumented) is available
-in versions prior to 3.0.13 and 2.9.7 (it remains available for the time being,
-but is depreciated).
-
-.BR
-To draw a dividing line dividing paragraphs, see the section on page breaks.
-.SH PAGE BREAKS
-
-
-.BR
-Page breaks are only relevant and honored in some output formats. A page break
-or a new page may be inserted manually using the following markup on a line on
-its own:
-
-.BR
-page new =\e= breaks the page, starts a new page.
-
-.BR
-page break -\- breaks a column, starts a new column, if using columns, else
-breaks the page, starts a new page.
-
-.BR
-page break line across page -..- draws a dividing line, dividing paragraphs
-
-.BR
-page break:
-.nf
--\e\e-
-.fi
-
-
-.BR
-page (break) new:
-.nf
-=\e\e=
-.fi
-
-
-.BR
-page (break) line across page (dividing paragraphs):
-.nf
--..-
-.fi
-
-.SH BIBLIOGRAPHY / REFERENCES
-
-
-.BR
-There are three ways to prepare a bibliography using sisu (which are mutually
-exclusive): (i) manually preparing and marking up as regular text in sisu a
-list of references, this is treated as a regular document segment (and placed
-before endnotes if any); (ii) preparing a bibliography, marking a heading level
-1~!biblio (note the exclamation mark) and preparing a bibliography using
-various metadata tags including for author: title: year: a list of which is
-provided below, or; (iii) as an assistance in preparing a bibliography, marking
-a heading level 1~!biblio and tagging citations within footnotes for inclusion,
-identifying citations and having a parser attempt to extract them and build a
-bibliography of the citations provided.
-
-.BR
-For the heading/section sequence: endnotes, bibliography then book index to
-occur, the name biblio or bibliography must be given to the bibliography
-section, like so:
-.nf
-1~!biblio~ [Note: heading marker::required title missing]
-.fi
-
-.SH A MARKUP TAGGED METADATA BIBLIOGRAPHY SECTION
-
-
-.BR
-Here instead of writing your full citations directly in footnotes, each time
-you have new material to cite, you add it to your bibliography section (if it
-has not been added yet) providing the information you need against an available
-list of tags (provided below).
-
-.BR
-The required tags are au: ti: and year: [^10] an short quick example might be
-as follows:
-.nf
-1~!biblio~ [Note: heading marker::required title missing]
-
-au: von Hippel, E.
-ti: Perspective: User Toolkits for Innovation
-lng: (language)
-jo: Journal of Product Innovation Management
-vo: 18
-ed: (editor)
-yr: 2001
-note:
-sn: Hippel, /{User Toolkits}/ (2001)
-id: vHippel_2001
-% form:
-
-au: Benkler, Yochai
-ti: The Wealth of Networks
-st: How Social Production Transforms Markets and Freedom
-lng: (language)
-pb: Harvard University Press
-edn: (edition)
-yr: 2006
-pl: U.S.
-url: http://cyber.law.harvard.edu/wealth_of_networks/Main_Page
-note:
-sn: Benkler, /{Wealth of Networks}/ (2006)
-id: Benkler2006
-
-au: Quixote, Don; Panza, Sancho
-ti: Taming Windmills, Keeping True
-jo: Imaginary Journal
-yr: 1605
-url: https://en.wikipedia.org/wiki/Don_Quixote
-note: made up to provide an example of author markup for an article with two authors
-sn: Quixote & Panza, /{Taming Windmills}/ (1605)
-id: quixote1605
-.fi
-
-
-.BR
-Note that the section name !biblio (or !bibliography) is required for the
-bibliography to be treated specially as such, and placed after the
-auto-generated endnote section.
-
-.BR
-Using this method, work goes into preparing the bibliography, the tags author
-or editor, year and title are required and will be used to sort the
-bibliography that is placed under the Bibliography section
-
-.BR
-The metadata tags may include shortname (sn:) and id, if provided, which are
-used for substitution within text. Every time the given id is found within the
-text it will be replaced by the given short title of the work (it is for this
-reason the short title has sisu markup to italicize the title), it should work
-with any page numbers to be added, the short title should be one that can
-easily be used to look up the full description in the bibliography.
-.nf
-The following footnote~{ quixote1605, pp 1000 - 1001, also Benkler2006 p 1. }~
-.fi
-
-
-.BR
-would be presented as:
-
-.BR
-Quixote and Panza,
-.I Taming Windmills
-(1605), pp 1000 - 1001 also, Benkler,
-.I Wealth of Networks,
-(2006) p 1 or rather[^11]
-.nf
-au: author Surname, FirstNames (if multiple semi-colon separator)
-    (required unless editor to be used instead)
-ti: title  (required)
-st: subtitle
-jo: journal
-vo: volume
-ed: editor (required if author not provided)
-tr: translator
-src: source (generic field where others are not appropriate)
-in: in (like src)
-pl: place/location (state, country)
-pb: publisher
-edn: edition
-yr: year (yyyy or yyyy-mm or yyyy-mm-dd) (required)
-pg: pages
-url: http://url
-note: note
-id: create_short_identifier e.g. authorSurnameYear
-    (used in substitutions: when found within text will be
-    replaced by the short name provided)
-sn: short name e.g. Author, /{short title}/, Year
-    (used in substitutions: when an id is found within text
-    the short name will be used to replace it)
-.fi
-
-.SH TAGGING CITATIONS FOR INCLUSION IN THE BIBLIOGRAPHY
-
-
-.BR
-Here whenever you make a citation that you wish be included in the
-bibliography, you tag the citation as such using special delimiters (which are
-subsequently removed from the final text produced by sisu)
-
-.BR
-Here you would write something like the following, either in regular text or a
-footnote
-.nf
-See .: Quixote, Don; Panza, Sancho /{Taming Windmills, Keeping True}/ (1605) :.
-.fi
-
-
-.BR
-
-.B SiSU
-will parse for a number of patterns within the delimiters to try make out the
-authors, title, date etc. and from that create a Bibliography. This is more
-limited than the previously described method of preparing a tagged
-bibliography, and using an id within text to identify the work, which also
-lends itself to greater consistency.
-.SH GLOSSARY
-
-
-.BR
-Using the section name 1~!glossary results in the Glossary being treated
-specially as such, and placed after the auto-generated endnote section (before
-the bibliography/list of references if there is one).
-
-.BR
-The Glossary is ordinary text marked up in a manner deemed suitable for that
-purpose. e.g. with the term in bold, possibly with a hanging indent.
-.nf
-1~!glossary~ [Note: heading marker::required title missing]
-
-_0_1 *{GPL}* An abbreviation that stands for "General Purpose License." ...
-
-_0_1 [provide your list of terms and definitions]
-.fi
-
-
-.BR
-In the given example the first line is not indented subsequent lines are by one
-level, and the term to be defined is in bold text.
-.SH BOOK INDEX
-
-
-.BR
-To make an index append to paragraph the book index term relates to it, using
-an equal sign and curly braces.
-
-.BR
-Currently two levels are provided, a main term and if needed a sub-term.
-Sub-terms are separated from the main term by a colon.
-.nf
-  Paragraph containing main term and sub-term.
-  ={Main term:sub-term}
-.fi
-
-
-.BR
-The index syntax starts on a new line, but there should not be an empty line
-between paragraph and index markup.
-
-.BR
-The structure of the resulting index would be:
-.nf
-  Main term, 1
-    sub-term, 1
-.fi
-
-
-.BR
-Several terms may relate to a paragraph, they are separated by a semicolon. If
-the term refers to more than one paragraph, indicate the number of paragraphs.
-.nf
-  Paragraph containing main term, second term and sub-term.
-  ={first term; second term: sub-term}
-.fi
-
-
-.BR
-The structure of the resulting index would be:
-.nf
-  First term, 1,
-  Second term, 1,
-    sub-term, 1
-.fi
-
-
-.BR
-If multiple sub-terms appear under one paragraph, they are separated under the
-main term heading from each other by a pipe symbol.
-.nf
-  Paragraph containing main term, second term and sub-term.
-  ={Main term:
-      sub-term+2|second sub-term;
-    Another term
-   }
-
-  A paragraph that continues discussion of the first sub-term
-.fi
-
-
-.BR
-The plus one in the example provided indicates the first sub-term spans one
-additional paragraph. The logical structure of the resulting index would be:
-.nf
-  Main term, 1,
-    sub-term, 1-3,
-    second sub-term, 1,
-  Another term, 1
-.fi
-
-.SH COMPOSITE DOCUMENTS MARKUP
-
-
-.BR
-It is possible to build a document by creating a master document that requires
-other documents. The documents required may be complete documents that could be
-generated independently, or they could be markup snippets, prepared so as to be
-easily available to be placed within another text. If the calling document is a
-master document (built from other documents), it should be named with the
-suffix
-.B .ssm
-Within this document you would provide information on the other documents that
-should be included within the text. These may be other documents that would be
-processed in a regular way, or markup bits prepared only for inclusion within a
-master document
-.B .sst
-regular markup file, or
-.B .ssi
-(insert/information) A secondary file of the composite document is built prior
-to processing with the same prefix and the suffix
-.B ._sst
-
-.BR
-basic markup for importing a document into a master document
-.nf
-<< filename1.sst
-
-<< filename2.ssi
-.fi
-
-
-.BR
-The form described above should be relied on. Within the
-.I Vim
-editor it results in the text thus linked becoming hyperlinked to the document
-it is calling in which is convenient for editing.
-.SH SUBSTITUTIONS
-
-
-.BR
-
-.B markup example:
-.nf
-The current Debian is ${debian_stable} the next debian will be ${debian_testing}
-
-Configure substitution in _sisu/sisu_document_make
-
-make:
-  substitute: /${debian_stable}/,'*{Wheezy}*' /${debian_testing}/,'*{Jessie}*'
-.fi
-
-
-.BR
-
-.B resulting output:
-
-.BR
-The current
-.B Debian
-is
-.B Jessie
-the next debian will be
-.B Stretch
-
-.BR
-Configure substitution in _sisu/sisu_document_make
-.SH SISU FILETYPES
-
-
-.BR
-
-.B SiSU
-has
-.I plaintext
-and binary filetypes, and can process either type of document.
-.SH .SST .SSM .SSI MARKED UP PLAIN TEXT
-
-.TP
-.B SiSU
-documents are prepared as plain-text (utf-8) files with
-.B SiSU
-markup. They may make reference to and contain images (for example), which are
-stored in the directory beneath them _sisu/image. 〔b¤SiSU
-.I plaintext
-markup files are of three types that may be distinguished by the file extension
-used: regular text .sst; master documents, composite documents that incorporate
-other text, which can be any regular text or text insert; and inserts the
-contents of which are like regular text except these are marked .ssi and are
-not processed.
-
-.BR
-
-.B SiSU
-processing can be done directly against a sisu documents; which may be located
-locally or on a remote server for which a url is provided.
-
-.BR
-
-.B SiSU
-source markup can be shared with the command:
-
-.BR
-  sisu -s [filename]
-.SH SISU TEXT - REGULAR FILES (.SST)
-
-
-.BR
-The most common form of document in
-.B SiSU,
-see the section on
-.B SiSU
-markup.
-.SH SISU MASTER FILES (.SSM)
-
-
-.BR
-Composite documents which incorporate other
-.B SiSU
-documents which may be either regular
-.B SiSU
-text .sst which may be generated independently, or inserts prepared solely for
-the purpose of being incorporated into one or more master documents.
-
-.BR
-The mechanism by which master files incorporate other documents is described as
-one of the headings under under
-.B SiSU
-markup in the
-.B SiSU
-manual.
-
-.BR
-Note: Master documents may be prepared in a similar way to regular documents,
-and processing will occur normally if a .sst file is renamed .ssm without
-requiring any other documents; the .ssm marker flags that the document may
-contain other documents.
-
-.BR
-Note: a secondary file of the composite document is built prior to processing
-with the same prefix and the suffix ._sst
-.SH SISU INSERT FILES (.SSI)
-
-
-.BR
-Inserts are documents prepared solely for the purpose of being incorporated
-into one or more master documents. They resemble regular
-.B SiSU
-text files (.sst). Since sisu -5.5.0 (6.1.0) .ssi files can like .ssm files
-include other .sst or .ssm files. .ssi files cannot be called by the sisu
-processor directly and can only be incorporated in other documents. Making a
-file a .ssi file is a quick and convenient way of breaking up a document that
-is to be included in a master document, and flagging that the file to be
-incorporated .ssi is not intended that the file should be processed on its own.
-.SH SISUPOD, ZIPPED BINARY CONTAINER (SISUPOD.ZIP, .SSP)
-
-
-.BR
-A sisupod is a zipped
-.B SiSU
-text file or set of
-.B SiSU
-text files and any associated images that they contain (this will be extended
-to include sound and multimedia-files)
-.TP
-.B SiSU
-.I plaintext
-files rely on a recognised directory structure to find contents such as images
-associated with documents, but all images for example for all documents
-contained in a directory are located in the sub-directory _sisu/image. Without
-the ability to create a sisupod it can be inconvenient to manually identify all
-other files associated with a document. A sisupod automatically bundles all
-associated files with the document that is turned into a pod.
-
-.BR
-The structure of the sisupod is such that it may for example contain a single
-document and its associated images; a master document and its associated
-documents and anything else; or the zipped contents of a whole directory of
-prepared
-.B SiSU
-documents.
-
-.BR
-The command to create a sisupod is:
-
-.BR
-  sisu -S [filename]
-
-.BR
-Alternatively, make a pod of the contents of a whole directory:
-
-.BR
-  sisu -S
-
-.BR
-
-.B SiSU
-processing can be done directly against a sisupod; which may be located locally
-or on a remote server for which a url is provided.
-
-.BR
-<http://www.sisudoc.org/sisu/sisu_commands>
-
-.BR
-<http://www.sisudoc.org/sisu/sisu_manual>
-.SH CONFIGURATION
-
-.SH CONFIGURATION FILES
-
-.SH CONFIG.YML
-
-
-.BR
-
-.B SiSU
-configration parameters are adjusted in the configuration file, which can be
-used to override the defaults set. This includes such things as which directory
-interim processing should be done in and where the generated output should be
-placed.
-
-.BR
-The
-.B SiSU
-configuration file is a yaml file, which means indentation is significant.
-
-.BR
-
-.B SiSU
-resource configuration is determined by looking at the following files if they
-exist:
-
-.BR
-  ./_sisu/v7/sisurc.yml
-
-.BR
-  ./_sisu/sisurc.yml
-
-.BR
-  ~/.sisu/v7/sisurc.yml
-
-.BR
-  ~/.sisu/sisurc.yml
-
-.BR
-  /etc/sisu/v7/sisurc.yml
-
-.BR
-  /etc/sisu/sisurc.yml
-
-.BR
-The search is in the order listed, and the first one found is used.
-
-.BR
-In the absence of instructions in any of these it falls back to the internal
-program defaults.
-
-.BR
-Configuration determines the output and processing directories and the database
-access details.
-
-.BR
-If
-.B SiSU
-is installed a sample sisurc.yml may be found in /etc/sisu/sisurc.yml
-.SH SISU_DOCUMENT_MAKE
-
-
-.BR
-Most sisu document headers relate to metadata, the exception is the @make:
-header which provides processing related information. The default contents of
-the @make header may be set by placing them in a file sisu_document_make.
-
-.BR
-The search order is as for resource configuration:
-
-.BR
-  ./_sisu/v7/sisu_document_make
-
-.BR
-  ./_sisu/sisu_document_make
-
-.BR
-  ~/.sisu/v7/sisu_document_make
-
-.BR
-  ~/.sisu/sisu_document_make
-
-.BR
-  /etc/sisu/v7/sisu_document_make
-
-.BR
-  /etc/sisu/sisu_document_make
-
-.BR
-A sample sisu_document_make can be found in the _sisu/ directory under along
-with the provided sisu markup samples.
-.SH CSS - CASCADING STYLE SHEETS (FOR HTML, XHTML AND XML)
-
-
-.BR
-CSS files to modify the appearance of
-.B SiSU
-html,
-.I XHTML
-or
-.I XML
-may be placed in the configuration directory: ./_sisu/css ; ~/.sisu/css or;
-/etc/sisu/css and these will be copied to the output directories with the
-command sisu -CC.
-
-.BR
-The basic CSS file for html output is html. css, placing a file of that name in
-directory _sisu/css or equivalent will result in the default file of that name
-being overwritten.
-
-.BR
-
-.I HTML:
-html. css
-
-.BR
-
-.I XML
-DOM: dom.css
-
-.BR
-
-.I XML
-SAX: sax.css
-
-.BR
-
-.I XHTML:
-xhtml. css
-
-.BR
-The default homepage may use homepage.css or html. css
-
-.BR
-Under consideration is to permit the placement of a CSS file with a different
-name in directory _sisu/css directory or equivalent.[^12]
-.SH ORGANISING CONTENT - DIRECTORY STRUCTURE AND MAPPING
-
-
-.BR
-
-.B SiSU
-v3 has new options for the source directory tree, and output directory
-structures of which there are 3 alternatives.
-.SH DOCUMENT SOURCE DIRECTORY
-
-
-.BR
-The document source directory is the directory in which sisu processing
-commands are given. It contains the sisu source files (.sst .ssm .ssi), or (for
-sisu v3 may contain) subdirectories with language codes which contain the sisu
-source files, so all English files would go in subdirectory en/, French in fr/,
-Spanish in es/ and so on. ISO 639-1 codes are used (as varied by po4a). A list
-of available languages (and possible sub-directory names) can be obtained with
-the command "sisu --help lang" The list of languages is limited to langagues
-supported by XeTeX polyglosia.
-.SH GENERAL DIRECTORIES
-
-.nf
- ./subject_name/
-
-% files stored at this level e.g. sisu_manual.sst or
-% for sisu v3 may be under language sub-directories
-% e.g.
-
- ./subject_name/en
-
- ./subject_name/fr
-
- ./subject_name/es
-
- ./subject_name/_sisu
-
- ./subject_name/_sisu/css
-
- ./subject_name/_sisu/image
-.fi
-
-.SH DOCUMENT OUTPUT DIRECTORY STRUCTURES
-
-.SH OUTPUT DIRECTORY ROOT
-
-
-.BR
-The output directory root can be set in the sisurc.yml file. Under the root,
-subdirectories are made for each directory in which a document set resides. If
-you have a directory named poems or conventions, that directory will be created
-under the output directory root and the output for all documents contained in
-the directory of a particular name will be generated to subdirectories beneath
-that directory (poem or conventions). A document will be placed in a
-subdirectory of the same name as the document with the filetype identifier
-stripped (.sst .ssm)
-
-.BR
-The last part of a directory path, representing the sub-directory in which a
-document set resides, is the directory name that will be used for the output
-directory. This has implications for the organisation of document collections
-as it could make sense to place documents of a particular subject, or type
-within a directory identifying them. This grouping as suggested could be by
-subject (sales_law, english_literature); or just as conveniently by some other
-classification (X University). The mapping means it is also possible to place
-in the same output directory documents that are for organisational purposes
-kept separately, for example documents on a given subject of two different
-institutions may be kept in two different directories of the same name, under a
-directory named after each institution, and these would be output to the same
-output directory. Skins could be associated with each institution on a
-directory basis and resulting documents will take on the appropriate different
-appearance.
-.SH ALTERNATIVE OUTPUT STRUCTURES
-
-
-.BR
-There are 3 possibile output structures described as being, by language, by
-filetype or by filename, the selection is made in sisurc.yml
-.nf
-#% output_dir_structure_by: language; filetype; or filename
-output_dir_structure_by: language   #(language & filetype, preferred?)
-#output_dir_structure_by: filetype
-#output_dir_structure_by: filename  #(default, closest to original v1 & v2)
-.fi
-
-.SH BY LANGUAGE
-
-
-.BR
-The by language directory structure places output files
-
-.BR
-The by language directory structure separates output files by language code
-(all files of a given language), and within the language directory by filetype.
-
-.BR
-Its selection is configured in sisurc.yml
-
-.BR
-output_dir_structure_by: language
-.nf
-    |-- en
-    |-- epub
-    |-- hashes
-    |-- html
-    | |-- viral_spiral.david_bollier
-    | |-- manifest
-    | |-- qrcode
-    | |-- odt
-    | |-- pdf
-    | |-- sitemaps
-    | |-- txt
-    | |-- xhtml
-    | `-- xml
-    |-- po4a
-    | `-- live-manual
-    |     |-- po
-    |     |-- fr
-    |     `-- pot
-    `-- _sisu
-        |-- css
-        |-- image
-        |-- image_sys -> ../../_sisu/image_sys
-        `-- xml
-            |-- rnc
-            |-- rng
-            `-- xsd
-.fi
-
-
-.BR
-#by: language subject_dir/en/manifest/filename.html
-.SH BY FILETYPE
-
-
-.BR
-The by filetype directory structure separates output files by filetype, all
-html files in one directory pdfs in another and so on. Filenames are given a
-language extension.
-
-.BR
-Its selection is configured in sisurc.yml
-
-.BR
-output_dir_structure_by: filetype
-.nf
-    |-- epub
-    |-- hashes
-    |-- html
-    |-- viral_spiral.david_bollier
-    |-- manifest
-    |-- qrcode
-    |-- odt
-    |-- pdf
-    |-- po4a
-    |-- live-manual
-    |     |-- po
-    |     |-- fr
-    |     `-- pot
-    |-- _sisu
-    | |-- css
-    | |-- image
-    | |-- image_sys -> ../../_sisu/image_sys
-    | `-- xml
-    |     |-- rnc
-    |     |-- rng
-    |     `-- xsd
-    |-- sitemaps
-    |-- txt
-    |-- xhtml
-    `-- xml
-.fi
-
-
-.BR
-#by: filetype subject_dir/html/filename/manifest.en.html
-.SH BY FILENAME
-
-
-.BR
-The by filename directory structure places most output of a particular file
-(the different filetypes) in a common directory.
-
-.BR
-Its selection is configured in sisurc.yml
-
-.BR
-output_dir_structure_by: filename
-.nf
-    |-- epub
-    |-- po4a
-    |-- live-manual
-    |     |-- po
-    |     |-- fr
-    |     `-- pot
-    |-- _sisu
-    | |-- css
-    | |-- image
-    | |-- image_sys -> ../../_sisu/image_sys
-    | `-- xml
-    |     |-- rnc
-    |     |-- rng
-    |     `-- xsd
-    |-- sitemaps
-    |-- src
-    |-- pod
-    `-- viral_spiral.david_bollier
-.fi
-
-
-.BR
-#by: filename subject_dir/filename/manifest.en.html
-.SH REMOTE DIRECTORIES
-
-.nf
- ./subject_name/
-
-% containing sub_directories named after the generated files from which they are made
-
- ./subject_name/src
-
-% contains shared source files text and binary e.g. sisu_manual.sst and sisu_manual.sst.zip
-
- ./subject_name/_sisu
-
-% configuration file e.g. sisurc.yml
-
- ./subject_name/_sisu/skin
-
-% skins in various skin directories doc, dir, site, yml
-
- ./subject_name/_sisu/css
-
- ./subject_name/_sisu/image
-
-% images for documents contained in this directory
-
- ./subject_name/_sisu/mm
-.fi
-
-.SH SISUPOD
-
-.nf
- ./sisupod/
-
-% files stored at this level e.g. sisu_manual.sst
-
- ./sisupod/_sisu
-
-% configuration file e.g. sisurc.yml
-
- ./sisupod/_sisu/skin
-
-% skins in various skin directories doc, dir, site, yml
-
- ./sisupod/_sisu/css
-
- ./sisupod/_sisu/image
-
-% images for documents contained in this directory
-
- ./sisupod/_sisu/mm
-.fi
-
-.SH HOMEPAGES
-
-
-.BR
-
-.B SiSU
-is about the ability to auto-generate documents. Home pages are regarded as
-custom built items, and are not created by
-.B SiSU.
-More accurately,
-.B SiSU
-has a default home page, which will not be appropriate for use with other
-sites, and the means to provide your own home page instead in one of two ways
-as part of a site's configuration, these being:
-
-.BR
-1. through placing your home page and other custom built documents in the
-subdirectory _sisu/home/ (this probably being the easier and more convenient
-option)
-
-.BR
-2. through providing what you want as the home page in a skin,
-
-.BR
-Document sets are contained in directories, usually organised by site or
-subject. Each directory can/should have its own homepage. See the section on
-directory structure and organisation of content.
-.SH HOME PAGE AND OTHER CUSTOM BUILT PAGES IN A SUB-DIRECTORY
-
-
-.BR
-Custom built pages, including the home page index.html may be placed within the
-configuration directory _sisu/home/ in any of the locations that is searched
-for the configuration directory, namely ./_sisu ; ~/_sisu ; /etc/sisu From
-there they are copied to the root of the output directory with the command:
-
-.BR
-  sisu -CC
-.SH MARKUP AND OUTPUT EXAMPLES
-
-.SH MARKUP EXAMPLES
-
-
-.BR
-Current markup examples and document output samples are provided off
-<http://sisudoc.org> or <http://www.jus.uio.no/sisu> and in the sisu
--markup-sample package available off <http://git.sisudoc.org>
-
-.BR
-For some documents hardly any markup at all is required at all, other than a
-header, and an indication that the levels to be taken into account by the
-program in generating its output are.
-.SH SISU MARKUP SAMPLES
-
-
-.BR
-A few additional sample books prepared as sisu markup samples, output formats
-to be generated using
-.B SiSU
-are contained in a separate package sisu -markup-samples. sisu -markup-samples
-contains books (prepared using sisu markup), that were released by their
-authors various licenses mostly different Creative Commons licences that do not
-permit inclusion in the
-.B Debian
-Project as they have requirements that do not meet the
-.B Debian
-Free Software Guidelines for various reasons, most commonly that they require
-that the original substantive text remain unchanged, and sometimes that the
-works be used only non-commercially.
-
-.BR
-
-.I Accelerando,
-Charles Stross (2005)
-accelerando.charles_stross.sst
-
-.BR
-
-.I Alice's Adventures in Wonderland,
-Lewis Carroll (1865)
-alices_adventures_in_wonderland.lewis_carroll.sst
-
-.BR
-
-.I CONTENT,
-Cory Doctorow (2008)
-content.cory_doctorow.sst
-
-.BR
-
-.I Democratizing Innovation,
-Eric von Hippel (2005)
-democratizing_innovation.eric_von_hippel.sst
-
-.BR
-
-.I Down and Out in the Magic Kingdom,
-Cory Doctorow (2003)
-down_and_out_in_the_magic_kingdom.cory_doctorow.sst
-
-.BR
-
-.I For the Win,
-Cory Doctorow (2010)
-for_the_win.cory_doctorow.sst
-
-.BR
-
-.I Free as in Freedom - Richard Stallman's Crusade for Free Software,
-Sam Williams (2002)
-free_as_in_freedom.richard_stallman_crusade_for_free_software.sam_williams.sst
-
-.BR
-
-.I Free as in Freedom 2.0 - Richard Stallman and the Free Software Revolution,
-Sam Williams (2002), Richard M. Stallman (2010)
-free_as_in_freedom_2.richard_stallman_and_the_free_software_revolution.sam_williams.richard_stallman.sst
-
-.BR
-
-.I Free Culture - How Big Media Uses Technology and the Law to Lock Down
-Culture and Control Creativity,
-Lawrence Lessig (2004)
-free_culture.lawrence_lessig.sst
-
-.BR
-
-.I Free For All - How Linux and the Free Software Movement Undercut the High
-Tech Titans,
-Peter Wayner (2002)
-free_for_all.peter_wayner.sst
-
-.BR
-
-.I GNU GENERAL PUBLIC LICENSE v2,
-Free Software Foundation (1991)
-gpl2.fsf.sst
-
-.BR
-
-.I GNU GENERAL PUBLIC LICENSE v3,
-Free Software Foundation (2007)
-gpl3.fsf.sst
-
-.BR
-
-.I Gulliver's Travels,
-Jonathan Swift (1726 / 1735)
-gullivers_travels.jonathan_swift.sst
-
-.BR
-
-.I Little Brother,
-Cory Doctorow (2008)
-little_brother.cory_doctorow.sst
-
-.BR
-
-.I The Cathederal and the Bazaar,
-Eric Raymond (2000)
-the_cathedral_and_the_bazaar.eric_s_raymond.sst
-
-.BR
-
-.I The Public Domain - Enclosing the Commons of the Mind,
-James Boyle (2008)
-the_public_domain.james_boyle.sst
-
-.BR
-
-.I The Wealth of Networks - How Social Production Transforms Markets and
-Freedom,
-Yochai Benkler (2006)
-the_wealth_of_networks.yochai_benkler.sst
-
-.BR
-
-.I Through the Looking Glass,
-Lewis Carroll (1871)
-through_the_looking_glass.lewis_carroll.sst
-
-.BR
-
-.I Two Bits - The Cultural Significance of Free Software,
-Christopher Kelty (2008)
-two_bits.christopher_kelty.sst
-
-.BR
-
-.I UN Contracts for International Sale of Goods,
-UN (1980)
-un_contracts_international_sale_of_goods_convention_1980.sst
-
-.BR
-
-.I Viral Spiral,
-David Bollier (2008)
-viral_spiral.david_bollier.sst
-.SH SISU SEARCH - INTRODUCTION
-
-
-.BR
-Because the document structure of sites created is clearly defined, and the
-text
-.I object citation system
-is available hypothetically at least, for all forms of output, it is possible
-to search the sql database, and either read results from that database, or map
-the results to the html or other output, which has richer text markup.
-
-.BR
-
-.B SiSU
-can populate a relational sql type database with documents at an object level,
-including objects numbers that are shared across different output types. Making
-a document corpus searchable with that degree of granularity. Basically, your
-match criteria is met by these documents and at these locations within each
-document, which can be viewed within the database directly or in various output
-formats.
-
-.BR
-
-.B SiSU
-can populate an sql database (sqlite3 or postgresql) with documents made up of
-their objects. It also can generate a cgi search form that can be used to query
-the database.
-
-.BR
-In order to use the built in search functionality you would take the following
-steps.
-
-.BR
-- use sisu to populate an sql database with with a sisu markup content
-
-.BR
-  * sqlite3 should work out of the box
-
-.BR
-  * postgresql may require some initial database configuration
-
-.BR
-- provide a way to query the database, which sisu can assist with by
-
-.BR
-  * generating a sample ruby cgi search form, required (sisu configuration
-  recommended)
-
-.BR
-  * adding a query field for this search form to be added to all html files
-  (sisu configuration required)
-.SH SQL
-
-.SH POPULATE THE DATABASE
-
-
-.BR
-TO populate the sql database, run sisu against a sisu markup file with one of
-the following sets of flags
-.nf
-sisu --sqlite filename.sst
-.fi
-
-
-.BR
-creates an sqlite3 database containing searchable content of just the sisu
-markup document selected
-.nf
-sisu --sqlite --update filename.sst
-.fi
-
-
-.BR
-creates an sqlite3 database containing searchable content of marked up
-document(s) selected by the user from a common directory
-.nf
-sisu --pg --update filename.sst
-.fi
-
-
-.BR
-fills a postgresql database with searchable content of marked up document(s)
-selected by the user from a common directory
-
-.BR
-For postgresql the first time the command is run in a given directory the user
-will be prompted to create the requisite database, at the time of writing the
-prompt sisu provides is as follows:
-.nf
-no connection with pg database established, you may need to run:
-    createdb "SiSU.7a.current"
-  after that don't forget to run:
-    sisu --pg --createall
-  before attempting to populate the database
-.fi
-
-
-.BR
-The named database that sisu expects to find must exist and if necessary be
-created using postgresql tools. If the database exist but the database tables
-do not, sisu will attempt to create the tables it needs, the equivalent of the
-requested sisu --pg --createall command.
-
-.BR
-Once this is done, the sql database is populated and ready to be queried.
-.SH SQL TYPE DATABASES
-
-
-.BR
-
-.B SiSU
-feeds sisu markup documents into sql type databases
-.I PostgreSQL
-[^13] and/or
-.I SQLite
-[^14] database together with information related to document structure.
-
-.BR
-This is one of the more interesting output forms, as all the structural data of
-the documents are retained (though can be ignored by the user of the database
-should they so choose). All site texts/documents are (currently) streamed to
-four tables:
-
-.BR
-  * one containing semantic (and other) headers, including, title, author,
-  subject, (the
-  .I Dublin Core.
-  ..);
-
-.BR
-  * another the substantive texts by individual "paragraph" (or object) - along
-  with structural information, each paragraph being identifiable by its
-  paragraph number (if it has one which almost all of them do), and the
-  substantive text of each paragraph quite naturally being searchable (both in
-  formatted and clean text versions for searching); and
-
-.BR
-  * a third containing endnotes cross-referenced back to the paragraph from
-  which they are referenced (both in formatted and clean text versions for
-  searching).
-
-.BR
-  * a fourth table with a one to one relation with the headers table contains
-  full text versions of output, eg. pdf, html, xml, and
-  .I ascii.
-
-.BR
-There is of course the possibility to add further structures.
-
-.BR
-At this level
-.B SiSU
-loads a relational database with documents chunked into objects, their smallest
-logical structurally constituent parts, as text objects, with their object
-citation number and all other structural information needed to construct the
-document. Text is stored (at this text object level) with and without
-elementary markup tagging, the stripped version being so as to facilitate ease
-of searching.
-
-.BR
-Being able to search a relational database at an object level with the
-.B SiSU
-citation system is an effective way of locating content generated by
-.B SiSU.
-As individual text objects of a document stored (and indexed) together with
-object numbers, and all versions of the document have the same numbering,
-complex searches can be tailored to return just the locations of the search
-results relevant for all available output formats, with live links to the
-precise locations in the database or in html/xml documents; or, the structural
-information provided makes it possible to search the full contents of the
-database and have headings in which search content appears, or to search only
-headings etc. (as the
-.I Dublin Core
-is incorporated it is easy to make use of that as well).
-.SH POSTGRESQL
-
-.SH NAME
-
-
-.BR
-
-.B SiSU
-- Structured information, Serialized Units - a document publishing system,
-postgresql dependency package
-.SH DESCRIPTION
-
-
-.BR
-Information related to using postgresql with sisu (and related to the
-sisu_postgresql dependency package, which is a dummy package to install
-dependencies needed for
-.B SiSU
-to populate a postgresql database, this being part of
-.B SiSU
-- man sisu) .
-.SH SYNOPSIS
-
-
-.BR
-  sisu -D [instruction] [filename/wildcard if required]
-
-.BR
-  sisu -D --pg --[instruction] [filename/wildcard if required]
-.SH COMMANDS
-
-
-.BR
-Mappings to two databases are provided by default, postgresql and sqlite, the
-same commands are used within sisu to construct and populate databases however
--d (lowercase) denotes sqlite and -D (uppercase) denotes postgresql,
-alternatively --sqlite or --pgsql may be used
-
-.BR
-
-.B -D or --pgsql
-may be used interchangeably.
-.SH CREATE AND DESTROY DATABASE
-
-.TP
-.B --pgsql --createall
-initial step, creates required relations (tables, indexes) in existing
-(postgresql) database (a database should be created manually and given the same
-name as working directory, as requested) (rb.dbi)
-.TP
-.B sisu -D --createdb
-creates database where no database existed before
-.TP
-.B sisu -D --create
-creates database tables where no database tables existed before
-.TP
-.B sisu -D --Dropall
-destroys database (including all its content)! kills data and drops tables,
-indexes and database associated with a given directory (and directories of the
-same name).
-.TP
-.B sisu -D --recreate
-destroys existing database and builds a new empty database structure
-.SH IMPORT AND REMOVE DOCUMENTS
-
-.TP
-.B sisu -D --import -v [filename/wildcard]
-populates database with the contents of the file. Imports documents(s)
-specified to a postgresql database (at an object level).
-.TP
-.B sisu -D --update -v [filename/wildcard]
-updates file contents in database
-.TP
-.B sisu -D --remove -v [filename/wildcard]
-removes specified document from postgresql database.
-.SH SQLITE
-
-.SH NAME
-
-
-.BR
-
-.B SiSU
-- Structured information, Serialized Units - a document publishing system.
-.SH DESCRIPTION
-
-
-.BR
-Information related to using sqlite with sisu (and related to the sisu_sqlite
-dependency package, which is a dummy package to install dependencies needed for
-.B SiSU
-to populate an sqlite database, this being part of
-.B SiSU
-- man sisu) .
-.SH SYNOPSIS
-
-
-.BR
-  sisu -d [instruction] [filename/wildcard if required]
-
-.BR
-  sisu -d --(sqlite|pg) --[instruction] [filename/wildcard if required]
-.SH COMMANDS
-
-
-.BR
-Mappings to two databases are provided by default, postgresql and sqlite, the
-same commands are used within sisu to construct and populate databases however
--d (lowercase) denotes sqlite and -D (uppercase) denotes postgresql,
-alternatively --sqlite or --pgsql may be used
-
-.SH CREATE AND DESTROY DATABASE
-
-.TP
-.B --sqlite --createall
-initial step, creates required relations (tables, indexes) in existing (sqlite)
-database (a database should be created manually and given the same name as
-working directory, as requested) (rb.dbi)
-.TP
-.B sisu -d --createdb
-creates database where no database existed before
-.TP
-.B sisu -d --create
-creates database tables where no database tables existed before
-.TP
-.B sisu -d --dropall
-destroys database (including all its content)! kills data and drops tables,
-indexes and database associated with a given directory (and directories of the
-same name).
-.TP
-.B sisu -d --recreate
-destroys existing database and builds a new empty database structure
-.SH IMPORT AND REMOVE DOCUMENTS
-
-.TP
-.B sisu -d --import -v [filename/wildcard]
-populates database with the contents of the file. Imports documents(s)
-specified to an sqlite database (at an object level).
-.TP
-.B sisu -d --update -v [filename/wildcard]
-updates file contents in database
-.TP
-.B sisu -d --remove -v [filename/wildcard]
-removes specified document from sqlite database.
-.SH CGI SEARCH FORM
-
-
-.BR
-For the search form, which is a single search page
-
-.BR
-- configure the search form
-
-.BR
-- generate the sample search form with the sisu command, (this will be based on
-the configuration settings and existing found sisu databases)
-
-.BR
-For postgresql web content you may need to edit the search cgi script. Two
-things to look out for are that the user is set as needed, and that the any
-different databases that you wish to be able to query are listed.
-
-.BR
-correctly, you may want www-data rather than your username.
-.nf
-@user='www-data'
-.fi
-
-
-.BR
-- check the search form, copy it to the appropriate cgi directory and set the
-correct permissions
-
-.BR
-For a search form to appear on each html page, you need to:
-
-.BR
-- rely on the above mentioned configuration of the search form
-
-.BR
-- configure the html search form to be on
-
-.BR
-- run the html command
-.SH SETUP SEARCH FORM
-
-
-.BR
-You will need a web server, httpd with cgi enabled, and a postgresql database
-to which you are able to create databases.
-
-.BR
-Setup postgresql, make sure you are able to create and write to the database,
-e.g.:
-.nf
-sudo su postgres
-  createuser -d -a ralph
-.fi
-
-
-.BR
-You then need to create the database that sisu will use, for sisu manual in the
-directory manual/en for example, (when you try to populate a database that does
-not exist sisu prompts as to whether it exists):
-.nf
-createdb SiSU.7a.manual
-.fi
-
-
-.BR
-
-.B SiSU
-is then able to create the required tables that allow you to populate the
-database with documents in the directory for which it has been created:
-.nf
-sisu --pg --createall -v
-.fi
-
-
-.BR
-You can then start to populate the database, in this example with a single
-document:
-.nf
-sisu --pg --update -v en/sisu_manual.ssm
-.fi
-
-
-.BR
-To create a sample search form, from within the same directory run:
-.nf
-sisu --sample-search-form --db-pg
-.fi
-
-
-.BR
-and copy the resulting cgi form to your cgi-bin directory
-
-.BR
-A sample setup for nginx is provided that assumes data will be stored under
-/srv/www and cgi scripts under /srv/cgi
-.SH SEARCH - DATABASE FRONTEND SAMPLE, UTILISING DATABASE AND SISU FEATURES,
-INCLUDING OBJECT CITATION NUMBERING (BACKEND CURRENTLY POSTGRESQL)
-
-
-.BR
-Sample search frontend <http://search.sisudoc.org> [^15] A small database and
-sample query front-end (search from) that makes use of the citation system, .I
-object citation numbering
-to demonstrates functionality.[^16]
-
-.BR
-
-.B SiSU
-can provide information on which documents are matched and at what locations
-within each document the matches are found. These results are relevant across
-all outputs using
-.I object citation numbering,
-which includes html,
-.I XML,
-.I EPUB,
-.I LaTeX,
-.I PDF
-and indeed the
-.I SQL
-database. You can then refer to one of the other outputs or in the
-.I SQL
-database expand the text within the matched objects (paragraphs) in the
-documents matched.
-
-.BR
-Note you may set results either for documents matched and object number
-locations within each matched document meeting the search criteria; or display
-the names of the documents matched along with the objects (paragraphs) that
-meet the search criteria.[^17]
-.TP
-.B sisu -F --webserv-webrick
-builds a cgi web search frontend for the database created
-
-.BR
-The following is feedback on the setup on a machine provided by the help
-command:
-
-.BR
-  sisu --help sql
-.nf
-Postgresql
-  user:             ralph
-  current db set:   SiSU_sisu
-  port:             5432
-  dbi connect:      DBI:Pg:database=SiSU_sisu;port=5432
-
-sqlite
-  current db set:   /home/ralph/sisu_www/sisu/sisu_sqlite.db
-  dbi connect       DBI:SQLite:/home/ralph/sisu_www/sisu/sisu_sqlite.db
-.fi
-
-.BR
-Note on databases built
-
-.BR
-By default, [unless otherwise specified] databases are built on a directory
-basis, from collections of documents within that directory. The name of the
-directory you choose to work from is used as the database name, i.e. if you are
-working in a directory called /home/ralph/ebook the database SiSU_ebook is
-used. [otherwise a manual mapping for the collection is necessary]
-
-.SH SEARCH FORM
-
-.TP
-.B sisu -F
-generates a sample search form, which must be copied to the web-server cgi
-directory
-.TP
-.B sisu -F --webserv-webrick
-generates a sample search form for use with the webrick server, which must be
-copied to the web-server cgi directory
-.TP
-.B sisu -W
-starts the webrick server which should be available wherever sisu is properly
-installed
-
-.BR
-The generated search form must be copied manually to the webserver directory as
-instructed
-.SH SISU_WEBRICK
-
-.SH NAME
-
-
-.BR
-
-.B SiSU
-- Structured information, Serialized Units - a document publishing system
-.SH SYNOPSIS
-
-
-.BR
-sisu_webrick [port]
-
-.BR
-or
-
-.BR
-sisu -W [port]
-.SH DESCRIPTION
-
-
-.BR
-sisu_webrick is part of
-.B SiSU
-(man sisu) sisu_webrick starts
-.B Ruby
-' s Webrick web-server and points it to the directories to which
-.B SiSU
-output is written, providing a list of these directories (assuming
-.B SiSU
-is in use and they exist).
-
-.BR
-The default port for sisu_webrick is set to 8081, this may be modified in the
-yaml file: ~/.sisu/sisurc.yml a sample of which is provided as
-/etc/sisu/sisurc.yml (or in the equivalent directory on your system).
-.SH SUMMARY OF MAN PAGE
-
-
-.BR
-sisu_webrick, may be started on it's own with the command: sisu_webrick [port]
-or using the sisu command with the -W flag: sisu -W [port]
-
-.BR
-where no port is given and settings are unchanged the default port is 8081
-.SH DOCUMENT PROCESSING COMMAND FLAGS
-
-
-.BR
-sisu -W [port] starts
-.B Ruby
-Webrick web-server, serving
-.B SiSU
-output directories, on the port provided, or if no port is provided and the
-defaults have not been changed in ~/.sisu/sisurc.yaml then on port 8081
-.SH SUMMARY OF FEATURES
-
-
-.BR
-- sparse/minimal markup (clean utf-8 source texts). Documents are prepared in a
-single
-.I UTF-8
-file using a minimalistic mnemonic syntax. Typical literature, documents like
-"War and Peace" require almost no markup, and most of the headers are optional.
-
-.BR
-- markup is easily readable/parsable by the human eye, (basic markup is simpler
-and more sparse than the most basic
-.I HTML
-) , [this may also be converted to
-.I XML
-representations of the same input/source document].
-
-.BR
-- markup defines document structure (this may be done once in a header
-pattern-match description, or for heading levels individually); basic text
-attributes (bold, italics, underscore, strike-through etc.) as required; and
-semantic information related to the document (header information, extended
-beyond the Dublin core and easily further extended as required); the headers
-may also contain processing instructions.
-.B SiSU
-markup is primarily an abstraction of document structure and document metadata
-to permit taking advantage of the basic strengths of existing alternative
-practical standard ways of representing documents [be that browser viewing,
-paper publication, sql search etc.] (html, epub, xml, odf, latex, pdf, sql)
-
-.BR
-- for output produces reasonably elegant output of established industry and
-institutionally accepted open standard formats.[3] takes advantage of the
-different strengths of various standard formats for representing documents,
-amongst the output formats currently supported are:
-
-.BR
-*
-.I HTML
-- both as a single scrollable text and a segmented document
-
-.BR
-*
-.I XHTML
-
-.BR
-*
-.I EPUB
-
-.BR
-*
-.I XML
-- both in sax and dom style xml structures for further development as required
-
-.BR
-*
-.I ODT
-- Open Document Format text, the iso standard for document storage
-
-.BR
-*
-.I LaTeX
-- used to generate pdf
-
-.BR
-*
-.I PDF
-(via
-.I LaTeX
-)
-
-.BR
-*
-.I SQL
-- population of an sql database (
-.I PostgreSQL
-or
-.I SQLite
-) , (at the same object level that is used to cite text within a document)
-
-.BR
-Also produces: concordance files; document content certificates (md5 or sha256
-digests of headings, paragraphs, images etc.) and html manifests (and sitemaps
-of content). (b) takes advantage of the strengths implicit in these very
-different output types, (e.g. PDFs produced using typesetting of
-.I LaTeX,
-databases populated with documents at an individual object/paragraph level,
-making possible
-.I granular search
-(and related possibilities))
-
-.BR
-- ensuring content can be cited in a meaningful way regardless of selected
-output format. Online publishing (and publishing in multiple document formats)
-lacks a useful way of citing text internally within documents (important to
-academics generally and to lawyers) as page numbers are meaningless across
-browsers and formats. sisu seeks to provide a common way of pinpoint the text
-within a document, (which can be utilized for citation and by search engines).
-The outputs share a common numbering system that is meaningful (to man and
-machine) across all digital outputs whether paper, screen, or database
-oriented, (pdf,
-.I HTML,
-.I EPUB,
-xml, sqlite, postgresql) , this numbering system can be used to reference
-content.
-
-.BR
-- Granular search within documents.
-.I SQL
-databases are populated at an object level (roughly headings, paragraphs,
-verse, tables) and become searchable with that degree of granularity, the
-output information provides the object/paragraph numbers which are relevant
-across all generated outputs; it is also possible to look at just the matching
-paragraphs of the documents in the database; [output indexing also work well
-with search indexing tools like hyperestraier].
-
-.BR
-- long term maintainability of document collections in a world of changing
-formats, having a very sparsely marked-up source document base. there is a
-considerable degree of future-proofing, output representations are
-"upgradeable", and new document formats may be added. e.g. addition of odf
-(open document text) module in 2006, epub in 2009 and in future html5 output
-sometime in future, without modification of existing prepared texts
-
-.BR
-*
-.I SQL
-search aside, documents are generated as required and static once generated.
-
-.BR
-- documents produced are static files, and may be batch processed, this needs
-to be done only once but may be repeated for various reasons as desired
-(updated content, addition of new output formats, updated technology document
-presentations/representations)
-
-.BR
-- document source (
-.I plaintext
-utf-8) if shared on the net may be used as input and processed locally to
-produce the different document outputs
-
-.BR
-- document source may be bundled together (automatically) with associated
-documents (multiple language versions or master document with inclusions) and
-images and sent as a zip file called a sisupod, if shared on the net these too
-may be processed locally to produce the desired document outputs
-
-.BR
-- generated document outputs may automatically be posted to remote sites.
-
-.BR
-- for basic document generation, the only software dependency is
-.B Ruby,
-and a few standard Unix tools (this covers
-.I plaintext,
-.I HTML,
-.I EPUB,
-.I XML,
-.I ODF,
-.I LaTeX
-) . To use a database you of course need that, and to convert the
-.I LaTeX
-generated to pdf, a latex processor like tetex or texlive.
-
-.BR
-- as a developers tool it is flexible and extensible
-
-.BR
-Syntax highlighting for
-.B SiSU
-markup is available for a number of text editors.
-
-.BR
-
-.B SiSU
-is less about document layout than about finding a way with little markup to be
-able to construct an abstract representation of a document that makes it
-possible to produce multiple representations of it which may be rather
-different from each other and used for different purposes, whether layout and
-publishing, or search of content
-
-.BR
-i.e. to be able to take advantage from this minimal preparation starting point
-of some of the strengths of rather different established ways of representing
-documents for different purposes, whether for search (relational database, or
-indexed flat files generated for that purpose whether of complete documents, or
-say of files made up of objects), online viewing (e.g. html, xml, pdf) , or
-paper publication (e.g. pdf) ...
-
-.BR
-the solution arrived at is by extracting structural information about the
-document (about headings within the document) and by tracking objects (which
-are serialized and also given hash values) in the manner described. It makes
-possible representations that are quite different from those offered at
-present. For example objects could be saved individually and identified by
-their hashes, with an index of how the objects relate to each other to form a
-document.
-.TP
-.BI *1.
-square brackets
-
-.BR
-.TP
-.BI *2.
-square brackets
-
-.BR
-.TP
-.BI +1.
-square brackets
-
-.BR
-.TP
-.BI 1.
-<http://www.jus.uio.no/sisu/man/>
-
-.BR
-.TP
-.BI 2.
-<http://www.jus.uio.no/sisu/man/sisu.1.html>
-
-.BR
-.TP
-.BI 3.
-From sometime after SiSU 0.58 it should be possible to describe SiSU markup
-using SiSU, which though not an original design goal is useful.
-
-.BR
-.TP
-.BI 4.
-files should be prepared using UTF-8 character encoding
-
-.BR
-.TP
-.BI 5.
-a footnote or endnote
-
-.BR
-.TP
-.BI 6.
-self contained endnote marker & endnote in one
-
-.BR
-.TP
-.BI *.
-unnumbered asterisk footnote/endnote, insert multiple asterisks if required
-
-.BR
-.TP
-.BI **.
-another unnumbered asterisk footnote/endnote
-
-.BR
-.TP
-.BI *3.
-editors notes, numbered asterisk footnote/endnote series
-
-.BR
-.TP
-.BI +2.
-editors notes, numbered plus symbol footnote/endnote series
-
-.BR
-.TP
-.BI 7.
-<http://www.sisudoc.org/>
-
-.BR
-.TP
-.BI 8.
-<http://www.ruby-lang.org/en/>
-
-.BR
-.TP
-.BI 9.
-Table from the Wealth of Networks by Yochai Benkler
-<http://www.jus.uio.no/sisu/the_wealth_of_networks.yochai_benkler>
-
-.BR
-.TP
-.BI 10.
-for which you may alternatively use the full form author: title: and year:
-
-.BR
-.TP
-.BI 11.
-Quixote and Panza, Taming Windmills (1605), pp 1000 - 1001 also, Benkler, Wealth of Networks (2006), p 1
-
-.BR
-.TP
-.BI 12.
-SiSU has worked this way in the past, though this was dropped as it was
-thought the complexity outweighed the flexibility, however, the balance was
-rather fine and this behaviour could be reinstated.
-
-.BR
-.TP
-.BI 13.
-<http://www.postgresql.org/> <http://advocacy.postgresql.org/>
-<http://en.wikipedia.org/wiki/Postgresql>
-
-.BR
-.TP
-.BI 14.
-<http://www.hwaci.com/sw/sqlite/> <http://en.wikipedia.org/wiki/Sqlite>
-
-.BR
-.TP
-.BI 15.
-<http://search.sisudoc.org>
-
-.BR
-.TP
-.BI 16.
-(which could be extended further with current back-end). As regards scaling
-of the database, it is as scalable as the database (here Postgresql) and
-hardware allow.
-
-.BR
-.TP
-.BI 17.
-of this feature when demonstrated to an IBM software innovations evaluator
-in 2004 he said to paraphrase: this could be of interest to us. We have large
-document management systems, you can search hundreds of thousands of documents
-and we can tell you which documents meet your search criteria, but there is no
-way we can tell you without opening each document where within each your
-matches are found.
-
-.BR
-
-.TP
-.SH SEE ALSO
-       sisu(1),
-       sisu-epub(1),
-       sisu-harvest(1),
-       sisu-html(1),
-       sisu-odf(1),
-       sisu-pdf(1),
-       sisu-pg(1),
-       sisu-sqlite(1),
-       sisu-txt(1).
-       sisu_vim(7)
-.TP
-.SH HOMEPAGE
-       More information about SiSU can be found at <http://www.sisudoc.org/> or <http://www.jus.uio.no/sisu/>
-.TP
-.SH SOURCE
-       <http://git.sisudoc.org/>
-.TP
-.SH AUTHOR
-       SiSU is written by Ralph Amissah <ralph@amissah.com>
-#+END_SRC
diff --git a/org/spine_info.org b/org/spine_info.org
index 3dc942c..798836e 100644
--- a/org/spine_info.org
+++ b/org/spine_info.org
@@ -7,6 +7,7 @@
 #+COPYRIGHT:   Copyright (C) 2015 - 2020 Ralph Amissah
 #+LANGUAGE:    en
 #+STARTUP:     content hideblocks hidestars noindent entitiespretty
+#+OPTIONS:     H:3 num:nil toc:t \n:nil @:t ::t |:t ^:nil _:nil -:t f:t *:t <:t
 #+PROPERTY:    header-args  :exports code
 #+PROPERTY:    header-args+ :noweb yes
 #+PROPERTY:    header-args+ :eval no
@@ -14,6 +15,9 @@
 #+PROPERTY:    header-args+ :cache no
 #+PROPERTY:    header-args+ :padline no
 
+[[./spine.org][spine.org]]  [[../org/][org/]]
+[[./spine_build_scaffold.org][spine_build_scaffold.org]]
+
 * README
 
 #+BEGIN_SRC txt  :NO-tangle "../README"
@@ -142,7 +146,6 @@ project_name:  Spine, Doc Reform
   - Hompages:
     [http://www.sisudoc.org]
 
-
 #+END_SRC
 
 #+BEGIN_SRC txt
diff --git a/org/util_cgi_d_sqlite_search.org b/org/util_cgi_d_sqlite_search.org
index 86242f4..e2f3cfd 100644
--- a/org/util_cgi_d_sqlite_search.org
+++ b/org/util_cgi_d_sqlite_search.org
@@ -7,6 +7,7 @@
 #+COPYRIGHT:   Copyright (C) 2015 - 2020 Ralph Amissah
 #+LANGUAGE:    en
 #+STARTUP:     content hideblocks hidestars noindent entitiespretty
+#+OPTIONS:     H:3 num:nil toc:t \n:nil @:t ::t |:t ^:nil _:nil -:t f:t *:t <:t
 #+PROPERTY:    header-args  :exports code
 #+PROPERTY:    header-args+ :noweb yes
 #+PROPERTY:    header-args+ :eval no
@@ -27,13 +28,30 @@ dub --force --compiler=ldc2 && sudo cp -v cgi-bin/spine-search /usr/lib/cgi-bin/
 <<cgi_sqlite_head>>
 <<cgi_sqlite_imports>>
 void cgi_function_intro(Cgi cgi) {
-  <<cgi_sqlite_initialize>>
+  <<cgi_sqlite_initialize_0>>
+  <<cgi_sqlite_initialize_1>>
+  <<cgi_sqlite_initialize_2>>
+  <<cgi_sqlite_initialize_3>>
+  <<cgi_sqlite_initialize_4>>
+  <<cgi_sqlite_initialize_5>>
+  <<cgi_sqlite_initialize_6>>
+  <<cgi_sqlite_initialize_7>>
+  <<cgi_sqlite_initialize_8>>
+  <<cgi_sqlite_initialize_9>>
+  <<cgi_sqlite_initialize_10>>
 <<cgi_sqlite_header>>
 <<cgi_sqlite_table>>
-<<cgi_sqlite_form>>
+<<cgi_sqlite_form_0>>
+<<cgi_sqlite_form_1>>
+<<cgi_sqlite_form_2>>
+<<cgi_sqlite_form_3>>
+<<cgi_sqlite_form_4>>
+<<cgi_sqlite_form_5>>
   <<cgi_sqlite_write>>
   <<cgi_sqlite_set_db>>
 <<cgi_sqlite_select_statement_0>>
+<<cgi_sqlite_select_statement_1>>
+<<cgi_sqlite_select_statement_2>>
   <<cgi_sqlite_db_close>>
 <<cgi_sqlite_db_tail>>
 }
@@ -65,7 +83,7 @@ import std.process : environment;
 ** void main
 *** initialize
 
-#+NAME: cgi_sqlite_initialize
+#+NAME: cgi_sqlite_initialize_0
 #+BEGIN_SRC d
 string header;
 string table;
@@ -74,7 +92,7 @@ string form;
 
 **** config
 
-#+NAME: cgi_sqlite_initialize
+#+NAME: cgi_sqlite_initialize_1
 #+BEGIN_SRC d
 struct Config {
   string http_request_type;
@@ -106,7 +124,7 @@ conf.request_method       = environment.get("REQUEST_METHOD",        "POST");
 
 **** cgi val
 
-#+NAME: cgi_sqlite_initialize
+#+NAME: cgi_sqlite_initialize_2
 #+BEGIN_SRC d
 struct CGI_val {
   string db_selected      = "";
@@ -128,7 +146,7 @@ cv.db_selected = "spine.search.db"; // config, set db name
 **** text fields
 ***** open
 
-#+NAME: cgi_sqlite_initialize
+#+NAME: cgi_sqlite_initialize_3
 #+BEGIN_SRC d
 auto text_fields() {
   string canned_query_str = environment.get("QUERY_STRING", "");
@@ -151,7 +169,7 @@ auto text_fields() {
 
 ***** rgx
 
-#+NAME: cgi_sqlite_initialize
+#+NAME: cgi_sqlite_initialize_4
 #+BEGIN_SRC d
   static struct Rgx {
     // static canned_query   = ctRegex!(`\A(?P<matched>.+)\Z`,                            "m");
@@ -187,7 +205,7 @@ auto text_fields() {
 
 ***** searchfields
 
-#+NAME: cgi_sqlite_initialize
+#+NAME: cgi_sqlite_initialize_5
 #+BEGIN_SRC d
   struct searchFields {
     string canned_query      = ""; // GET  canned_query     == cq
@@ -231,7 +249,7 @@ auto text_fields() {
 ***** env
 ****** POST
 
-#+NAME: cgi_sqlite_initialize
+#+NAME: cgi_sqlite_initialize_6
 #+BEGIN_SRC d
   if (environment.get("REQUEST_METHOD", "POST") == "POST") {
     if ("sf" in cgi.post) {
@@ -383,7 +401,7 @@ auto text_fields() {
 
 ****** GET
 
-#+NAME: cgi_sqlite_initialize
+#+NAME: cgi_sqlite_initialize_7
 #+BEGIN_SRC d
   } else if (environment.get("REQUEST_METHOD", "POST") == "GET") {
     got.canned_query = environment.get("QUERY_STRING", "");
@@ -495,7 +513,7 @@ auto text_fields() {
 
 ***** tail
 
-#+NAME: cgi_sqlite_initialize
+#+NAME: cgi_sqlite_initialize_8
 #+BEGIN_SRC d
 }
 auto tf = text_fields; //
@@ -503,7 +521,7 @@ auto tf = text_fields; //
 
 **** SQL select
 
-#+NAME: cgi_sqlite_initialize
+#+NAME: cgi_sqlite_initialize_9
 #+BEGIN_SRC d
 struct SQL_select {
   string the_body         = "";
@@ -514,7 +532,7 @@ auto sql_select = SQL_select();
 
 **** misc
 
-#+NAME: cgi_sqlite_initialize
+#+NAME: cgi_sqlite_initialize_10
 #+BEGIN_SRC d
 string base                  ; // = "";
 string tip                   ; // = "";
@@ -683,7 +701,7 @@ string previous_next () {
 
 *** cgi html form
 
-#+NAME: cgi_sqlite_form
+#+NAME: cgi_sqlite_form_0
 #+BEGIN_SRC d
   {
     string post_value(string field_name, string type="box", string set="on") {
@@ -726,7 +744,7 @@ string previous_next () {
 
 **** canned search
 
-#+NAME: cgi_sqlite_form
+#+NAME: cgi_sqlite_form_1
 #+BEGIN_SRC d
     string the_can(string fv) {
       string show_the_can = post_value("url");
@@ -764,7 +782,7 @@ string previous_next () {
 
 **** provide tip
 
-#+NAME: cgi_sqlite_form
+#+NAME: cgi_sqlite_form_2
 #+BEGIN_SRC d
     string provide_tip() {
       string searched_tip = post_value("se");
@@ -801,7 +819,7 @@ string previous_next () {
 **** the form
 ***** form html
 
-#+NAME: cgi_sqlite_form
+#+NAME: cgi_sqlite_form_3
 #+BEGIN_SRC d
     form = format(q"┃
 <form action="%s" id="SubmitForm" method="post" accept-charset="UTF-8">
@@ -846,7 +864,7 @@ string previous_next () {
 
 ***** form values
 
-#+NAME: cgi_sqlite_form
+#+NAME: cgi_sqlite_form_4
 #+BEGIN_SRC d
       "spine-search",
       (post_value("ec") == "checked") ? post_value("sf", "field") : "",
@@ -870,7 +888,7 @@ string previous_next () {
 
 **** set value (debug)
 
-#+NAME: cgi_sqlite_form
+#+NAME: cgi_sqlite_form_5
 #+BEGIN_SRC d
     {
       string set_value(string field_name, string default_val) {
@@ -999,7 +1017,7 @@ auto db = Database(conf.db_path ~ cv.db_selected);
 **** db select statement
 ***** the body
 
-#+NAME: cgi_sqlite_select_statement_0
+#+NAME: cgi_sqlite_select_statement_1
 #+BEGIN_SRC d
       sql_select.the_body ~= format(q"┃
 SELECT
@@ -1042,7 +1060,7 @@ LIMIT %s OFFSET %s
 ***** html write selected
 ****** ocn index
 
-#+NAME: cgi_sqlite_select_statement_0
+#+NAME: cgi_sqlite_select_statement_2
 #+BEGIN_SRC d
       (cv.checked_sql)
       ? cgi.write(previous_next ~ "<hr><font size=\"2\" color=\"#666666\">" ~ sql_select.the_body.split("\n  ").join(" ").split("\n").join("<br>") ~ "</font>\n")
diff --git a/org/util_cgi_rb_fcgi_sqlite_search.org b/org/util_cgi_rb_fcgi_sqlite_search.org
index 124ac25..d10c163 100644
--- a/org/util_cgi_rb_fcgi_sqlite_search.org
+++ b/org/util_cgi_rb_fcgi_sqlite_search.org
@@ -7,6 +7,7 @@
 #+COPYRIGHT:   Copyright (C) 2015 - 2020 Ralph Amissah
 #+LANGUAGE:    en
 #+STARTUP:     content hideblocks hidestars noindent entitiespretty
+#+OPTIONS:     H:3 num:nil toc:t \n:nil @:t ::t |:t ^:nil _:nil -:t f:t *:t <:t
 #+PROPERTY:    header-args  :exports code
 #+PROPERTY:    header-args+ :noweb yes
 #+PROPERTY:    header-args+ :eval no
diff --git a/org/util_spine_markup_conversion_from_sisu.org b/org/util_spine_markup_conversion_from_sisu.org
index 21a5ffb..4204560 100644
--- a/org/util_spine_markup_conversion_from_sisu.org
+++ b/org/util_spine_markup_conversion_from_sisu.org
@@ -7,6 +7,7 @@
 #+COPYRIGHT:   Copyright (C) 2015 - 2020 Ralph Amissah
 #+LANGUAGE:    en
 #+STARTUP:     content hideblocks hidestars noindent entitiespretty
+#+OPTIONS:     H:3 num:nil toc:t \n:nil @:t ::t |:t ^:nil _:nil -:t f:t *:t <:t
 #+PROPERTY:    header-args  :exports code
 #+PROPERTY:    header-args+ :noweb yes
 #+PROPERTY:    header-args+ :eval no
@@ -207,7 +208,9 @@ if (endnotes.length == endnote_ref_count) {
 void main(string[] args) {
   <<from_sisu_rb_init>>
   <<from_sisu_rb_body_format>>
-  <<from_sisu_rb_header_format>>
+  <<from_sisu_rb_header_format_0>>
+  <<from_sisu_rb_header_format_1>>
+  <<from_sisu_rb_header_format_2>>
   foreach(arg; args[1..$]) {
     if (
       !(arg.match(regex(r"--\w+")))
@@ -310,7 +313,7 @@ string format_body_string(string s) {
 *** header format
 **** format header string
 
-#+NAME: from_sisu_rb_header_format
+#+NAME: from_sisu_rb_header_format_0
 #+BEGIN_SRC d
 string format_header_string(string s) {
   string o;
@@ -324,7 +327,7 @@ string format_header_string(string s) {
 
 **** format main header
 
-#+NAME: from_sisu_rb_header_format
+#+NAME: from_sisu_rb_header_format_1
 #+BEGIN_SRC d
 string format_main_header(string hm, string hs = "", string c = "") {
   string o;
@@ -341,7 +344,7 @@ string format_main_header(string hm, string hs = "", string c = "") {
 
 **** format sub header
 
-#+NAME: from_sisu_rb_header_format
+#+NAME: from_sisu_rb_header_format_2
 #+BEGIN_SRC d
 string format_sub_header(string hs, string c) {
   string o;
diff --git a/org/util_spine_syntax_highlighting_emacs.org b/org/util_spine_syntax_highlighting_emacs.org
index 0007e48..e161b8f 100644
--- a/org/util_spine_syntax_highlighting_emacs.org
+++ b/org/util_spine_syntax_highlighting_emacs.org
@@ -7,6 +7,7 @@
 #+COPYRIGHT:   Copyright (C) 2015 - 2020 Ralph Amissah
 #+LANGUAGE:    en
 #+STARTUP:     content hideblocks hidestars noindent entitiespretty
+#+OPTIONS:     H:3 num:nil toc:t \n:nil @:t ::t |:t ^:nil _:nil -:t f:t *:t <:t
 #+PROPERTY:    header-args  :exports code
 #+PROPERTY:    header-args+ :noweb yes
 #+PROPERTY:    header-args+ :eval no
diff --git a/org/util_spine_syntax_highlighting_vim.org b/org/util_spine_syntax_highlighting_vim.org
index 137d734..2c4f131 100644
--- a/org/util_spine_syntax_highlighting_vim.org
+++ b/org/util_spine_syntax_highlighting_vim.org
@@ -7,6 +7,7 @@
 #+COPYRIGHT:   Copyright (C) 2015 - 2020 Ralph Amissah
 #+LANGUAGE:    en
 #+STARTUP:     content hideblocks hidestars noindent entitiespretty
+#+OPTIONS:     H:3 num:nil toc:t \n:nil @:t ::t |:t ^:nil _:nil -:t f:t *:t <:t
 #+PROPERTY:    header-args  :exports code
 #+PROPERTY:    header-args+ :noweb yes
 #+PROPERTY:    header-args+ :eval no
diff --git a/src/doc_reform/io_out/epub3.d b/src/doc_reform/io_out/epub3.d
index 14c328b..f435418 100644
--- a/src/doc_reform/io_out/epub3.d
+++ b/src/doc_reform/io_out/epub3.d
@@ -295,7 +295,7 @@ template outputEPub3() {
   </ncx>┃");
     return toc;
   }
-  
+
   @system void outputEPub3(D,I)(
     const D    doc_abstraction,
           I    doc_matters,
@@ -809,5 +809,5 @@ template outputEPub3() {
       }
     }
   }
-  
+
 }
diff --git a/src/doc_reform/io_out/html.d b/src/doc_reform/io_out/html.d
index 6a15614..e898bb8 100644
--- a/src/doc_reform/io_out/html.d
+++ b/src/doc_reform/io_out/html.d
@@ -510,7 +510,7 @@ template outputHTML() {
     M    doc_matters,
   ) {
     { /+ (copy html images) +/
-  
+
       auto pth_html = spinePathsHTML!()(doc_matters.output_path, doc_matters.src.language);
       if (!exists(pth_html.image)) {
         pth_html.image.mkdirRecurse;
diff --git a/src/doc_reform/io_out/odt.d b/src/doc_reform/io_out/odt.d
index d3377dc..e12f93f 100644
--- a/src/doc_reform/io_out/odt.d
+++ b/src/doc_reform/io_out/odt.d
@@ -839,7 +839,7 @@ template outputODT() {
     }
     return doc_odt;
   }
-  
+
   @safe string odt_tail() {
     string _odt_tail = format(q"┃<text:p text:style-name="P_normal">spine: &lt;<text:a xl:type="simple" xl:href="http://www.doc_reform.org">www.doc_reform.org</text:a>&gt; and &lt;<text:a xl:type="simple" xl:href="http://www.sisudoc.org">www.sisudoc.org</text:a>&gt;</text:p>
   </office:text></office:body></office:document-content>┃",);
@@ -2038,7 +2038,7 @@ template outputODT() {
       pth_odt.manifest_rdf("fs"); /+ (manifest.rdf) +/
       pth_odt.settings_xml("fs"); /+ (settings.xml) +/
       pth_odt.styles_xml("fs");   /+ (styles_xml) +/
-  
+
       pth_odt.content_xml("fs");
       pth_odt.manifest_xml("fs");
       pth_odt.meta_xml("fs");
diff --git a/src/doc_reform/io_out/source_pod.d b/src/doc_reform/io_out/source_pod.d
index 5a0fd47..36a86e2 100644
--- a/src/doc_reform/io_out/source_pod.d
+++ b/src/doc_reform/io_out/source_pod.d
@@ -371,7 +371,7 @@ template spinePod() {
           // Handle errors
         }
       }
-      
+
     } catch (ErrnoException ex) {
       // Handle error
     }
diff --git a/src/doc_reform/meta/conf_make_meta_yaml.d b/src/doc_reform/meta/conf_make_meta_yaml.d
index 1f22dc8..4d1fdb1 100644
--- a/src/doc_reform/meta/conf_make_meta_yaml.d
+++ b/src/doc_reform/meta/conf_make_meta_yaml.d
@@ -180,7 +180,7 @@ template contentYAMLtoSpineStruct() {
       _struct_composite.make.substitute               = _mk.substitute(_struct_composite.make_str.substitute);
       _struct_composite.make.texpdf_font              = _mk.texpdf_font(_struct_composite.make_str.texpdf_font);
     }
-    
+
     /+ conf ------------------------------------------------------------------- +/
     if ("webserv" in _yaml
       && _yaml["webserv"].type.sequence
diff --git a/src/doc_reform/meta/metadoc_from_src.d b/src/doc_reform/meta/metadoc_from_src.d
index bde1a5c..859acc5 100644
--- a/src/doc_reform/meta/metadoc_from_src.d
+++ b/src/doc_reform/meta/metadoc_from_src.d
@@ -2422,7 +2422,7 @@ template docAbstraction() {
     dom_structure_markedup_tags_status_buffer   = [ 0, 0, 0, 0, 0, 0, 0, 0, 0,];
     dom_structure_collapsed_tags_status         = [ 0, 0, 0, 0, 0, 0, 0, 0, 0,];
     dom_structure_collapsed_tags_status_buffer  = [ 0, 0, 0, 0, 0, 0, 0, 0, 0,];
-    
+
     @safe auto doc_has() {
       struct DocHas_ {
         uint inline_links() {
-- 
cgit v1.2.3